123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- #!/usr/local/bin/php
- <?php
- define('INSTALL_DIR', dirname(__DIR__));
- require INSTALL_DIR . '/vendor/autoload.php';
- use App\Util\Common;
- use App\Util\HTML as H;
- use Functional as F;
- $template = '
- graph database {
- %tables%
- %edges%
- }
- ';
- $files = glob(INSTALL_DIR . '/src/Entity/*.php');
- $tables = [];
- $edges = [];
- foreach ($files as $file) {
- require_once $file;
- $declared = get_declared_classes();
- $class = end($declared);
- $schema = $class::schemaDef();
- $table = $schema['name'];
- $fields = [['name' => $table, 'type' => '']];
- foreach ($schema['fields'] as $name => $opts) {
- $fields[] = [
- 'name' => $name,
- 'type' => ": {$opts['type']}" . ($opts['type'] == 'varchar' ? "({$opts['length']})" : ''),
- ];
- }
- if (isset($schema['foreign keys'])) {
- foreach ($schema['foreign keys'] as $name => $map) {
- // Patern matching like above would be nice
- list($foreign_table,
- $keys) = $map;
- $local_key = array_keys($keys)[0];
- $foreign_key = $keys[$local_key];
- $edges[] = "{$table}:{$local_key} -- {$foreign_table}:{$foreign_key}";
- }
- }
- $cell = function ($field) {
- $def = $field['name'] . $field['type'];
- return ['tr' => ['td' => ['attrs' => ['port' => $field['name']], $def]]];
- };
- $html = ['table' => array_merge(
- ['attrs' => ['border' => '0', 'cellborder' => '1', 'cellspacing' => '0']],
- F\map($fields, $cell)),
- ];
- $tables[] = Common::indent("{$table} [shape=none, label=<\n" . Common::indent(H::html($html)) . "\n>]");
- }
- $replace = [
- '/%tables%/' => Common::indent(implode("\n", $tables)),
- '/%edges%/' => Common::indent(implode("\n", $edges)),
- // '/_/' => '\textunderscore ',
- ];
- $out = $template;
- foreach ($replace as $from => $to) {
- $out = preg_replace($from, $to, $out);
- }
- $path = dirname(__DIR__) . '/DOCUMENTATION/database';
- $outfile = $path . '/database.dot';
- file_put_contents($outfile, $out);
- system("neato -Goverlap=false -Gsplines=true -Tpdf {$path}/database.dot -o {$path}/database.pdf");
- echo "Generated database diagram. See {$path}/database.pdf\n";
|