hi,
When the increase in the number of nodes, node_access the mysql query will become lengthy. In my opinion, at hook_node_grants delivery $ node, are better methods of treatment. Such as:

function hook_node_grants($ac, $op, $node) (
   if($node->nid){
     $result = db_query("SELECT u.acl_id FROM {acl_user} u INNER JOIN {acl_node} n u.acl_id = n.acl_id WHERE u.uid = %d AND n.nid = %d", $account->uid, $node->nid);
     //Return less data, so that node_access SQL becomes simple.
     //............
  }else{
    //........
  }
  return grants;
}

The results of Devel module. Lengthy sql:

SELECT COUNT(*) FROM node_access WHERE (nid = 0 OR nid = 134) AND ((gid = 0 AND realm = 'all') OR (gid = 1 AND realm = 'acl') OR (gid = 2 AND realm = 'acl') OR (gid = 3 AND realm = 'acl') OR (gid = 4 AND realm = 'acl') OR (gid = 5 AND realm = 'acl') OR (gid = 6 AND realm = 'acl') OR (gid = 7 AND realm = 'acl') OR (gid = 8 AND realm = 'acl') OR (gid = 9 AND realm = 'acl') OR (gid = 10 AND realm = 'acl') OR (gid = 11 AND realm = 'acl') OR (gid = 12 AND realm = 'acl') OR (gid = 13 AND realm = 'acl') OR (gid = 14 AND realm = 'acl') OR (gid = 15 AND realm = 'acl') OR (gid = 16 AND realm = 'acl') OR (gid = 17 AND realm = 'acl') OR (gid = 18 AND realm = 'acl') OR (gid = 19 AND realm = 'acl') OR (gid = 20 AND realm = 'acl') OR (gid = 21 AND realm = 'acl') OR (gid = 7 AND realm = 'content_access_author') OR (gid = 2 AND realm = 'content_access_rid') OR (gid = 3 AND realm = 'acl_node_access') OR (gid = 5 AND realm = 'acl_node_access') OR (gid = 5 AND realm = 'acl_node_access') OR (gid = 6 AND realm = 'acl_node_access') OR (gid = 9 AND realm = 'acl_node_access') OR (gid = 7 AND realm = 'acl_node_access') OR (gid = 8 AND realm = 'acl_node_access') OR (gid = 9 AND realm = 'acl_node_access') OR (gid = 13 AND realm = 'acl_node_access') OR (gid = 11 AND realm = 'acl_node_access') OR (gid = 13 AND realm = 'acl_node_access') OR (gid = 14 AND realm = 'acl_node_access') OR (gid = 17 AND realm = 'acl_node_access') OR (gid = 15 AND realm = 'acl_node_access') OR (gid = 18 AND realm = 'acl_node_access') OR (gid = 19 AND realm = 'acl_node_access') OR (gid = 21 AND realm = 'acl_node_access') OR (gid = 20 AND realm = 'acl_node_access') OR (gid = 20 AND realm = 'acl_node_access') OR (gid = 22 AND realm = 'acl_node_access') OR (gid = 23 AND realm = 'acl_node_access') OR (gid = 23 AND realm = 'acl_node_access') OR (gid = 26 AND realm = 'acl_node_access') OR (gid = 26 AND realm = 'acl_node_access') OR (gid = 29 AND realm = 'acl_node_access') OR (gid = 30 AND realm = 'acl_node_access') OR (gid = 29 AND realm = 'acl_node_access') OR (gid = 30 AND realm = 'acl_node_access') OR (gid = 32 AND realm = 'acl_node_access') OR (gid = 31 AND realm = 'acl_node_access') OR (gid = 35 AND realm = 'acl_node_access') OR (gid = 35 AND realm = 'acl_node_access') OR (gid = 34 AND realm = 'acl_node_access') OR (gid = 37 AND realm = 'acl_node_access') OR (gid = 39 AND realm = 'acl_node_access') OR (gid = 40 AND realm = 'acl_node_access') OR (gid = 38 AND realm = 'acl_node_access') OR (gid = 40 AND realm = 'acl_node_access') OR (gid = 41 AND realm = 'acl_node_access') OR (gid = 44 AND realm = 'acl_node_access') OR (gid = 42 AND realm = 'acl_node_access') OR (gid = 44 AND realm = 'acl_node_access') OR (gid = 44 AND realm = 'acl_node_access') OR (gid = 48 AND realm = 'acl_node_access') OR (gid = 49 AND realm = 'acl_node_access') OR (gid = 47 AND realm = 'acl_node_access') OR (gid = 50 AND realm = 'acl_node_access') OR (gid = 51 AND realm = 'acl_node_access') OR (gid = 51 AND realm = 'acl_node_access') OR (gid = 53 AND realm = 'acl_node_access') OR (gid = 52 AND realm = 'acl_node_access') OR (gid = 56 AND realm = 'acl_node_access') OR (gid = 55 AND realm = 'acl_node_access') OR (gid = 57 AND realm = 'acl_node_access') OR (gid = 57 AND realm = 'acl_node_access') OR (gid = 60 AND realm = 'acl_node_access') OR (gid = 58 AND realm = 'acl_node_access') OR (gid = 60 AND realm = 'acl_node_access') OR (gid = 61 AND realm = 'acl_node_access') OR (gid = 63 AND realm = 'acl_node_access') OR (gid = 64 AND realm = 'acl_node_access') OR (gid = 63 AND realm = 'acl_node_access') OR (gid = 65 AND realm = 'acl_node_access') OR (gid = 66 AND realm = 'acl_node_access') OR (gid = 68 AND realm = 'acl_node_access') OR (gid = 67 AND realm = 'acl_node_access') OR (gid = 68 AND realm = 'acl_node_access') OR (gid = 69 AND realm = 'acl_node_access') OR (gid = 73 AND realm = 'acl_node_access') OR (gid = 71 AND realm = 'acl_node_access') OR (gid = 73 AND realm = 'acl_node_access') OR (gid = 76 AND realm = 'acl_node_access') OR (gid = 74 AND realm = 'acl_node_access') OR (gid = 75 AND realm = 'acl_node_access') OR (gid = 78 AND realm = 'acl_node_access') OR (gid = 80 AND realm = 'acl_node_access') OR (gid = 81 AND realm = 'acl_node_access') OR (gid = 80 AND realm = 'acl_node_access') OR (gid = 81 AND realm = 'acl_node_access') OR (gid = 81 AND realm = 'acl_node_access') OR (gid = 85 AND realm = 'acl_node_access') OR (gid = 84 AND realm = 'acl_node_access') OR (gid = 87 AND realm = 'acl_node_access') OR (gid = 87 AND realm = 'acl_node_access') OR (gid = 86 AND realm = 'acl_node_access') OR (gid = 89 AND realm = 'acl_node_access') OR (gid = 90 AND realm = 'acl_node_access') OR (gid = 91 AND realm = 'acl_node_access') OR (gid = 90 AND realm = 'acl_node_access') OR (gid = 91 AND realm = 'acl_node_access') OR (gid = 93 AND realm = 'acl_node_access') OR (gid = 93 AND realm = 'acl_node_access') OR (gid = 96 AND realm = 'acl_node_access') OR (gid = 97 AND realm = 'acl_node_access') OR (gid = 97 AND realm = 'acl_node_access') OR (gid = 99 AND realm = 'acl_node_access') OR (gid = 98 AND realm = 'acl_node_access') OR (gid = 99 AND realm = 'acl_node_access') OR (gid = 100 AND realm = 'acl_node_access') OR (gid = 102 AND realm = 'acl_node_access')) AND grant_view >= 1

Does this help to improve the efficiency?

In D:\TWAPMS\htdocs\drupalcvs\modules\node: "C:\Program Files\CVSNT\cvs.exe" -q diff 
-u -r 1.947.2.15 node.module
CVSROOT=:pserver:anonymous@cvs.drupal.org:/cvs/drupal

Index: node.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.module,v
retrieving revision 1.947.2.15
diff -u -r1.947.2.15 node.module
--- node.module   16 Feb 2009 14:39:40 -0000   1.947.2.15
+++ node.module   1 Mar 2009 07:31:54 -0000
@@ -2034,7 +2034,7 @@
   // node_access table.
   if ($op != 'create' && $node->nid && $node->status) {
     $grants = array();
-    foreach (node_access_grants($op, $account) as $realm => $gids) {
+    foreach (node_access_grants($op, $account, $node) as $realm => $gids) {
       foreach ($gids as $gid) {
         $grants[] = "(gid = $gid AND realm = '$realm')";
       }
@@ -2129,7 +2129,7 @@
  *   An associative array in which the keys are realms, and the values are
  *   arrays of grants for those realms.
  */
-function node_access_grants($op, $account = NULL) {
+function node_access_grants($op, $account = NULL, $node = NULL) {
 
   if (!isset($account)) {
     $account = $GLOBALS['user'];

Success, CVS operation completed

Greetings
thanks

Comments

eastcn’s picture

sorry, it should be this way

In D:\TWAPMS\htdocs\drupalcvs\modules\node: "C:\Program Files\CVSNT\cvs.exe" -q diff 
-u -r 1.947.2.15 node.module
CVSROOT=:pserver:anonymous@cvs.drupal.org:/cvs/drupal

Index: node.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.module,v
retrieving revision 1.947.2.15
diff -u -r1.947.2.15 node.module
--- node.module   16 Feb 2009 14:39:40 -0000   1.947.2.15
+++ node.module   1 Mar 2009 07:40:51 -0000
@@ -2034,7 +2034,7 @@
   // node_access table.
   if ($op != 'create' && $node->nid && $node->status) {
     $grants = array();
-    foreach (node_access_grants($op, $account) as $realm => $gids) {
+    foreach (node_access_grants($op, $account, $node) as $realm => $gids) {
       foreach ($gids as $gid) {
         $grants[] = "(gid = $gid AND realm = '$realm')";
       }
@@ -2129,13 +2129,17 @@
  *   An associative array in which the keys are realms, and the values are
  *   arrays of grants for those realms.
  */
-function node_access_grants($op, $account = NULL) {
+function node_access_grants($op, $account = NULL, $node = NULL) {
 
   if (!isset($account)) {
     $account = $GLOBALS['user'];
   }
-
-  return array_merge(array('all' => array(0)), module_invoke_all('node_grants', $account, $op));
+  
+  if(!isset($node)){
+    return array_merge(array('all' => array(0)), module_invoke_all('node_grants', $account, $op));
+  }else{
+    return array_merge(array('all' => array(0)), module_invoke_all('node_grants', $account, $op));
+  }
 }
 
 /**

Success, CVS operation completed

mdupont’s picture

Status: Active » Closed (won't fix)

Old issue, D6 is only receiving critical fixes now, so closing.