Index: nodeaccess_nodereference.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodeaccess_nodereference/nodeaccess_nodereference.module,v
retrieving revision 1.1.2.5
diff -u -r1.1.2.5 nodeaccess_nodereference.module
--- nodeaccess_nodereference.module	22 Aug 2009 09:50:12 -0000	1.1.2.5
+++ nodeaccess_nodereference.module	21 Oct 2009 05:00:28 -0000
@@ -24,7 +24,7 @@
         // To preserve database integrity, only aquire grants if the node
         // loads successfully.
         if (!empty($loaded_node)) {
-          nodeaccess_nodereference_acquire_grants($loaded_node);
+          node_access_acquire_grants($loaded_node);
         }
         if (empty($list)) {
           variable_del('nodeaccess_nodereference_nodelist');
@@ -94,7 +94,7 @@
  * Implementation of hook_node_grants().
  */
 function nodeaccess_nodereference_node_grants($account, $op) {
-  if ($account->uid) {
+  if (isset($account->uid)) {
     $grants['nodeaccess_nodereference'][] = $account->uid;
     return $grants;
   }
@@ -174,8 +174,6 @@
       
       // Go through each user.
       foreach ($uids as $uid) {
-        // Ensure they are not anonymous
-        if ($uid) {
           // Load the user object
           $user_account = user_load($uid);
 
@@ -245,8 +243,6 @@
               $grants[$uid]['grant_delete'] = 1;
             }
           }
-
-        }
       }
     }
     if (!empty($grants)) {
@@ -255,10 +251,15 @@
   }
   else {
     $list = variable_get('nodeaccess_nodereference_nodelist', array());
-    $list[] = $node->nid;
+    // If this node is referenced by other nodes, update them as well
+    $referring_nids = nodeaccess_nodereference_is_node_referenced($node);
+    foreach ($referring_nids as $referring_nid) {
+      $list[] = $referring_nid;
+    }
     variable_set('nodeaccess_nodereference_nodelist', $list);
   }
-  return NULL;
+  return NULL;  
+ 
 }
 
 /**
@@ -360,7 +361,7 @@
       $grants_sql = 'AND ('. implode(' OR ', $grants) .')';
     }
 
-    $sql = "SELECT COUNT(*) FROM {nodeaccess_nodereference} WHERE (nid = 0 OR nid = %d) $grants_sql AND grant_$op >= 1";
+    $sql = "SELECT COUNT(*) FROM {node_access} WHERE (nid = 0 OR nid = %d) $grants_sql AND grant_$op >= 1";
     $result = db_query($sql, $node->nid);
     return (db_result($result));
   }
@@ -422,7 +423,7 @@
       // To preserve database integrity, only aquire grants if the node
       // loads successfully.
       if (!empty($loaded_node)) {
-        nodeaccess_nodereference_acquire_grants($loaded_node);
+        node_access_acquire_grants($loaded_node);
       }
     }
 
@@ -458,7 +459,7 @@
     // To preserve database integrity, only aquire grants if the node
     // loads successfully.
     if (!empty($loaded_node)) {
-      nodeaccess_nodereference_acquire_grants($loaded_node);
+      node_access_acquire_grants($loaded_node);
     }
     $context['sandbox']['progress']++;
     //$context['sandbox']['current_node'] = $loaded_node->nid;
@@ -502,26 +503,6 @@
 }
 
 /**
- * A version of node_access_acquire_grants().
- */
-function nodeaccess_nodereference_acquire_grants($node) {
-  $grants = module_invoke('nodeaccess_nodereference', 'node_access_records', $node);
-
-  if (!empty($grants)) {
-    // retain grants by highest priority
-    $grant_by_priority = array();
-    foreach ($grants as $g) {
-      $grant_by_priority[intval($g['priority'])][] = $g;
-    }
-    krsort($grant_by_priority);
-    $grants = array_shift($grant_by_priority);
-
-    node_access_write_grants($node, $grants, NULL, FALSE);
-  }
-
-}
-
-/**
  * Build SQL to fetch nodes that have nodereferences.
  */
 function nodeaccess_nodereference_fetch_nodes_sql() {
@@ -551,18 +532,41 @@
 }
 
 /**
- * Implementation of hook_form_FORM_ID_alter().
+ * Generate SQL to return NID's that refer to $nid on $field_name
  */
-function nodeaccess_nodereference_form_node_configure_rebuild_confirm_alter(&$form, $form_state) {
-  array_unshift($form['#submit'], 'nodeaccess_nodereference_rebuild_submit');
+function nodeaccess_nodereference_is_node_referenced_sql($nid,$field_name) {
+  $sql = 'SELECT nid FROM {content_'. $field_name .'} ';
+  $sql .= 'WHERE '. $field_name.'_nid = '. $nid;  
+  return $sql;
 }
 
 /**
- * Copy the table when someone presses that rebuild button.
+ * Is this node referenced by other nodes?
  */
-function nodeaccess_nodereference_rebuild_submit($form, &$form_state) {
-  nodeaccess_nodereference_table();
-  nodeaccess_nodereference_status('needs_rebuild', TRUE);
+function nodeaccess_nodereference_is_node_referenced($node) {
+  $data = nodeaccess_nodereference_field_settings();
+  if (!$data) {
+    return array();
+  }
+  $referring_nids = array();
+  foreach (array_keys($data) as $content_type) {
+    foreach (array_keys($data[$content_type]) as $field_name) {
+      if (($data[$content_type][$field_name]['view'] || $data[$content_type][$field_name]['update'] || $data[$content_type][$field_name]['delete'])) {
+        $result = db_query(nodeaccess_nodereference_is_node_referenced_sql($node->nid,$field_name));
+        while ($referring_node = db_fetch_object($result)) {
+          $referring_nids[] = $referring_node->nid;
+        }
+      }
+    }
+  }
+  return $referring_nids;
+}
+
+/**
+ * Implementation of hook_form_FORM_ID_alter().
+ */
+function nodeaccess_nodereference_form_node_configure_rebuild_confirm_alter(&$form, $form_state) {
+  array_unshift($form['#submit'], 'nodeaccess_nodereference_rebuild_submit');
 }
 
 /**
@@ -584,11 +588,6 @@
           if ($field['type'] == 'nodereference') {
             // Get the data about this nodereference field
             $data = nodeaccess_nodereference_field_settings($node->type, $field['field_name']);
-            // Check if this nodereference allows any access
-            if (($data['view'] || $data['update'] || $data['delete'])) {
-              nodeaccess_nodereference_table();
-              return;
-            }
           }
         }
       }
@@ -608,10 +607,13 @@
  * @return
  *   The stored or updated value of the settings for this field.
  */
-function nodeaccess_nodereference_field_settings($type_name, $field_name, $variable = NULL) {
+function nodeaccess_nodereference_field_settings($type_name = NULL, $field_name = NULL, $variable = NULL) {
 
   // 'get' the variable
   $data = variable_get('nodeaccess_nodereference', NULL);
+  if (!isset($type_name) && !isset($field_name)) {
+    return $data;
+  }
   if (!$data || !isset($data[$type_name][$field_name])) {
     // Attempt to get result from old variables.
     $old_varname = substr('nodeaccess_nodereference_'. $field_name .'_'. $type_name, 0, 48);
