--- ./modules/taxonomy_access/taxonomy_access_admin.inc	2007-06-26 18:59:45.000000000 -0400
+++ ./modules/taxonomy_access/taxonomy_access_admin.inc.fixed	2007-11-22 09:59:27.949436000 -0500
@@ -72,9 +72,11 @@ function theme_taxonomy_access_admin() {
 function taxonomy_access_admin_delete_role($rid) {
   if (is_numeric($rid) AND $rid > 2 AND db_fetch_array(db_query('SELECT rid FROM {term_access_defaults} WHERE vid=0 AND rid=%d', $rid))) {
     if ($_POST['confirm']) {
+      $affected_nodes = _taxonomy_access_get_nodes_for_role($rid);
       db_query('DELETE FROM {term_access} WHERE rid=%d', $rid);
       db_query('DELETE FROM {term_access_defaults} WHERE rid=%d', $rid);
-      node_access_rebuild();
+      _taxonomy_access_node_access_update($affected_nodes);            
+      //node_access_rebuild();
       drupal_set_message("All term access rules deleted for role $rid.");
       drupal_goto('admin/user/taxonomy_access');
     }
@@ -278,18 +280,22 @@ function taxonomy_access_admin_form_subm
     if (is_array($form_values['selected_terms'])) {
       foreach($form_values['selected_terms'] as $tid => $enabled) {
         if ($enabled) {
+          $affected_nodes = _taxonomy_access_get_nodes_for_term($tid);
           db_query('DELETE FROM {term_access} WHERE rid = %d AND tid = %d', $form_values['rid'], $tid);
+          _taxonomy_access_node_access_update($affected_nodes);
         }
       }
     }
     if (is_array($form_values['selected_defaults'])) {
       foreach($form_values['selected_defaults'] as $vid => $enabled) {
         if ($enabled) {
+          $affected_nodes = _taxonomy_access_get_nodes_for_vocabulary($vid, $form_values['rid']);
           db_query('DELETE FROM {term_access_defaults} WHERE rid = %d AND vid = %d', $form_values['rid'], $vid);
+          _taxonomy_access_node_access_update($affected_nodes);
         }
       }
     }
-    node_access_rebuild();
+    //node_access_rebuild();
     break;
   case t('Add'):
     $new = $form_values['new'];
@@ -299,7 +305,7 @@ function taxonomy_access_admin_form_subm
     } elseif ($type == 'default') {
       taxonomy_access_defaults_update($id, $form_values['rid'], $new['grants']);
     }
-    node_access_rebuild();
+    //node_access_rebuild();
     break;
   case t('Save all'):
     foreach($form_values['grants'] as $vid => $rows) {
@@ -311,7 +317,7 @@ function taxonomy_access_admin_form_subm
         }
       }
     }
-    node_access_rebuild();
+    //node_access_rebuild();
     drupal_goto('admin/user/taxonomy_access');
   }
 }
@@ -352,8 +358,10 @@ function taxonomy_access_grant_update($t
   }
   $ta_sql .= $sql . $ta_sql_values;
 
+  $affected_nodes = _taxonomy_access_get_nodes_for_term($tid);
   db_query("DELETE FROM {term_access} WHERE tid=%d AND rid=%d", $tid, ($rid));
   db_query($ta_sql);  // insert into term_access
+  _taxonomy_access_node_access_update($affected_nodes);
 }
 
 /**
@@ -392,8 +400,10 @@ function taxonomy_access_defaults_update
   }
   $ta_sql .= $sql . $ta_sql_values;
 
+  $affected_nodes = _taxonomy_access_get_nodes_for_vocabulary($vid, $form_values['rid']);
   db_query("DELETE FROM {term_access_defaults} WHERE vid=%d AND rid=%d", $vid, $rid);
   db_query($ta_sql);  // insert into term_access_defaults
+  _taxonomy_access_node_access_update($affected_nodes);
 }
 
 /**
@@ -462,3 +472,52 @@ function taxonomy_access_get_default_gra
   return $grants;
 }
 
+/*
+ * new functions by klance
+ */
+
+function _taxonomy_access_get_nodes_for_term($tid) {
+  $nid = array();
+  $result = db_query("SELECT nid FROM {term_node} WHERE tid = '$tid'");
+  
+  while($node = db_fetch_object($result)) {
+    $nid[] = $node->nid;
+  }
+  return $nid;
+}
+
+function _taxonomy_access_get_nodes_for_vocabulary($vid, $rid) {
+  $nid = array();
+  $result = db_query("
+    SELECT nid FROM {term_node} WHERE tid = '$tid'
+    AND tid IN (SELECT tid FROM {term_data} WHERE vid = '$vid')
+    AND tid IN (SELECT tid FROM {term_access} WHERE rid = '$rid')
+  ");
+  
+  while($node = db_fetch_object($result)) {
+    $nid[] = $node->nid;
+  }
+  return $nid;
+}
+
+function _taxonomy_access_get_nodes_for_role($rid) {
+  $nid = array();
+  $result = db_query("
+    SELECT nid FROM {term_node} WHERE tid IN (SELECT tid FROM {term_access} WHERE rid = '$rid')
+  ");
+  
+  while($node = db_fetch_object($result)) {
+    $nid[] = $node->nid;
+  }
+  return $nid;
+}
+
+function _taxonomy_access_node_access_update($nid) {
+  foreach($nid as $node) {
+    $loaded_node = node_load($node, NULL, TRUE);
+    if (!empty($loaded_node)) {
+      node_access_acquire_grants($loaded_node);
+    }
+  }
+  return TRUE;
+}
\ No newline at end of file
