function node_access_rebuild

Same name in other branches
  1. 9 core/modules/node/node.module \node_access_rebuild()
  2. 8.9.x core/modules/node/node.module \node_access_rebuild()
  3. 10 core/modules/node/node.module \node_access_rebuild()
  4. 11.x core/modules/node/node.module \node_access_rebuild()

Rebuilds the node access database.

This is occasionally needed by modules that make system-wide changes to access levels. When the rebuild is required by an admin-triggered action (e.g module settings form), calling node_access_needs_rebuild(TRUE) instead of node_access_rebuild() lets the user perform his changes and actually rebuild only once he is done.

Note: As of Drupal 6, node access modules are not required to (and actually should not) call node_access_rebuild() in hook_enable/disable anymore.

Parameters

$batch_mode: Set to TRUE to process in 'batch' mode, spawning processing over several HTTP requests (thus avoiding the risk of PHP timeout if the site has a large number of nodes). hook_update_N and any form submit handler are safe contexts to use the 'batch mode'. Less decidable cases (such as calls from hook_user, hook_taxonomy, etc...) might consider using the non-batch mode.

See also

node_access_needs_rebuild()

Related topics

12 calls to node_access_rebuild()
BookTestCase::setUp in modules/book/book.test
Sets up a Drupal site for running functional and integration tests.
CommentNodeAccessTest::setUp in modules/comment/comment.test
Sets up a Drupal site for running functional and integration tests.
FilePrivateTestCase::setUp in modules/file/tests/file.test
Sets up a Drupal site for running functional and integration tests.
module_disable in includes/module.inc
Disables a given set of modules.
NodeAccessBaseTableTestCase::setUp in modules/node/node.test
Sets up a Drupal site for running functional and integration tests.

... See full list

File

modules/node/node.module, line 3625

Code

function node_access_rebuild($batch_mode = FALSE) {
    db_delete('node_access')->execute();
    // Only recalculate if the site is using a node_access module.
    if (count(module_implements('node_grants'))) {
        if ($batch_mode) {
            $batch = array(
                'title' => t('Rebuilding content access permissions'),
                'operations' => array(
                    array(
                        '_node_access_rebuild_batch_operation',
                        array(),
                    ),
                ),
                'finished' => '_node_access_rebuild_batch_finished',
            );
            batch_set($batch);
        }
        else {
            // Try to allocate enough time to rebuild node grants
            drupal_set_time_limit(240);
            // Rebuild newest nodes first so that recent content becomes available quickly.
            $nids = db_query("SELECT nid FROM {node} ORDER BY nid DESC")->fetchCol();
            foreach ($nids as $nid) {
                $node = node_load($nid, NULL, TRUE);
                // To preserve database integrity, only acquire grants if the node
                // loads successfully.
                if (!empty($node)) {
                    node_access_acquire_grants($node);
                }
            }
        }
    }
    else {
        // Not using any node_access modules. Add the default grant.
        db_insert('node_access')->fields(array(
            'nid' => 0,
            'realm' => 'all',
            'gid' => 0,
            'grant_view' => 1,
            'grant_update' => 0,
            'grant_delete' => 0,
        ))
            ->execute();
    }
    if (!isset($batch)) {
        drupal_set_message(t('Content permissions have been rebuilt.'));
        node_access_needs_rebuild(FALSE);
        cache_clear_all();
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.