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);