All pastes #535906 Raw Edit

Anonymous

public text v1 · immutable
·published 2007-06-04 06:41 UTC
rendered paste body
<?php

define('NEEDS_PROCESSING', 0);
define('PROCESSING', 1);
define('PROCESSED', 2);

include './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

function dfs(&$state, $adj, $key) {
  static $ordered = array(), $error = FALSE;
  global $fk;
  if (!$error) {
    $state[$key] = PROCESSING;
    foreach (array_keys($adj[$key]) as $new_key) {
      switch ($state[$new_key]) {
        case NEEDS_PROCESSING:
          dfs($state, $adj, $new_key);
          break;
        case PROCESSING:
          $error = TRUE;
          break 2;
      }
    }
    $state[$key] = PROCESSED;
    $ordered[$fk[$key]][] = $key;
  }
  return $error ? array() : $ordered;
}

$schema = drupal_get_schema();

$adj = array();
$state = array();
foreach ($schema as $table => $table_definition) {
  foreach ($table_definition['fields'] as $field => $row_definition) {
    if (isset($row_definition['foreign key'])) {
      $f = $row_definition['foreign key'];
      $index = $f['table'] .'.'. $f['field'];
      $adj[$index][$table .'.'. $field] = 1;
      $fk[$table .'.'. $field] = $index;
      $fk[$index] = $index;
      $state[$index] = NEEDS_PROCESSING;
    }
  }
}

foreach (array_keys($adj) as $key) {
  if ($state[$key] == NEEDS_PROCESSING) {
    $ordered = dfs($state, $adj, $key);
  }
}
echo '<pre>';
var_dump($ordered);