Skip to content
Snippets Groups Projects
Commit 318f3bad authored by Dionisio Fernandez's avatar Dionisio Fernandez
Browse files

Issue #3141220: port to Drupal 9

parent ff9942eb
No related branches found
No related tags found
No related merge requests found
name: 'Node Access Rebuild Progressive'
description: 'Rebuild node access grants in chunks'
core: 8.x
type: module
core_version_requirement: ^8 || ^9
......@@ -5,6 +5,9 @@
* Provides ability to rebuild node access silently.
*/
use Drush\Drush;
use Consolidation\SiteAlias\SiteAliasManager;
/**
* Implements hook_cron().
*/
......@@ -28,6 +31,7 @@ function node_access_rebuild_progressive_cron() {
* Initiate the full rebuild.
*/
function node_access_rebuild_progressive_trigger() {
$database = \Drupal::database();
// Prevents default message/behaviour.
node_access_needs_rebuild(FALSE);
// Add default grants in the unlikely case
......@@ -37,12 +41,13 @@ function node_access_rebuild_progressive_trigger() {
return node_access_rebuild_progressive_finished();
}
// Clean up possible mismatches.
db_query("DELETE FROM {node_access} WHERE nid NOT IN (SELECT nid FROM {node})");
$database->query("DELETE FROM {node_access} WHERE nid NOT IN (SELECT nid FROM {node})");
// We only need the current one, nodes created afterward would get processed
// at save time.
$highest = db_query("SELECT nid FROM {node} ORDER BY nid DESC LIMIT 0,1")->fetchField();
$count = db_query("SELECT count(nid) FROM {node}")->fetchField();
$highest = $database->query("SELECT nid FROM {node} ORDER BY nid DESC LIMIT 0,1")->fetchField();
$count = $database->query("SELECT count(nid) FROM {node}")->fetchField();
\Drupal::state()->set('node_access_rebuild_progressive.current', $highest + 1);
\Drupal::state()->set('node_access_rebuild_progressive.processed', 0);
\Drupal::logger('node_access_rebuild_progressive')->info('%count nodes queued for node access rebuild.', ['%count' => $count]);
}
......@@ -50,7 +55,7 @@ function node_access_rebuild_progressive_trigger() {
* Reset grants to a clean state.
*/
function node_access_rebuild_progressive_set_default() {
$access_control_handler = \Drupal::entityManager()->getAccessControlHandler('node');
$access_control_handler = \Drupal::service('entity_type.manager')->getAccessControlHandler('node');
$access_control_handler->deleteGrants();
$access_control_handler->writeDefaultGrant();
}
......@@ -76,12 +81,14 @@ function node_access_rebuild_progressive_process_cron() {
function node_access_rebuild_progressive_process_chunk() {
$current = \Drupal::state()->get('node_access_rebuild_progressive.current');
$chunk_size = \Drupal::config('node_access_rebuild_progressive.settings')->get('chunk');
$nids = db_query("SELECT nid FROM {node} WHERE nid < :current ORDER BY nid DESC LIMIT 0,$chunk_size", [':current' => $current])->fetchCol();
$nids = \Drupal::database()->query("SELECT nid FROM {node} WHERE nid < :current ORDER BY nid DESC LIMIT 0, $chunk_size", [':current' => $current])
->fetchCol();
$total = count($nids);
$processed = 0;
if ($total) {
$access_control_handler = \Drupal::entityManager()->getAccessControlHandler('node');
$node_storage = \Drupal::entityManager()->getStorage('node');
$access_control_handler = \Drupal::service("entity_type.manager")->getAccessControlHandler('node');
$node_storage = \Drupal::service("entity_type.manager")->getStorage('node');
$nodes = $node_storage->loadMultiple($nids);
$node_storage->resetCache();
foreach ($nodes as $node) {
......@@ -114,14 +121,20 @@ function node_access_rebuild_progressive_finished() {
*/
function _drush_node_access_rebuild_progressive_rebuild() {
node_access_rebuild_progressive_trigger();
$self_record = new SiteAliasManager();
$finished = FALSE;
$total = db_query("SELECT count(nid) FROM {node}")->fetchField();
$processed = 0;
$total = \Drupal::database()->query("SELECT count(nid) FROM {node}")->fetchField();
while (!$finished) {
$cmd = '_drush_node_access_rebuild_progressive_process(' . $total . ',' . $processed . ');';
$data = drush_invoke_process('@self', 'php-eval', [$cmd]);
$processed = $data['context']['_drush_node_access_rebuild_progressive_processed'];
$finished = drush_get_error() || !$data || (isset($data['context']['_drush_node_access_rebuild_progressive_finished']) && $data['context']['_drush_node_access_rebuild_progressive_finished'] === TRUE);
$cmd = '_drush_node_access_rebuild_progressive_process(' . $total . ');';
$process = Drush::drush($self_record->getSelf(), 'php-eval', [$cmd], ['format' => 'json']);
// We capture the output to print it here and check if it finished.
$process->run($process->showRealtime()->hideStdout());
if (!$process->isSuccessful() || empty($process->getOutput())) {
$finished = TRUE;
}
else {
\Drupal::logger('node_access_rebuild_progressive')->notice($process->getOutput(), []);
}
}
}
......@@ -133,21 +146,23 @@ function _drush_node_access_rebuild_progressive_rebuild() {
* @param int $processed
* Number of nodes processed.
*/
function _drush_node_access_rebuild_progressive_process(int $total, int $processed) {
function _drush_node_access_rebuild_progressive_process(int $total) {
$processed = \Drupal::state()->get('node_access_rebuild_progressive.processed', 0);
$pass = node_access_rebuild_progressive_process_chunk();
$processed += $pass['processed'];
drush_set_option('_drush_node_access_rebuild_progressive_processed', $processed);
\Drupal::state()->set('node_access_rebuild_progressive.processed', $processed);
$figures = [
'@pass' => $pass['processed'],
'@nodes' => $pass['total'],
'@processed' => $processed,
'@total' => $total,
];
if (empty($pass['total'])) {
drush_set_option('_drush_node_access_rebuild_progressive_finished', TRUE);
return;
}
drush_print(dt('Processed @pass of @nodes nodes (@processed/@total).', $figures));
print dt('Processed @pass of @nodes nodes (@processed/@total).', $figures);
}
/**
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment