The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!/usr/bin/env perl

use strict;
use warnings;
use utf8;

#use Smart::Comments;
use FindBin;
use lib "$FindBin::Bin/../lib";
use OpenResty::Dispatcher;

eval {
    OpenResty::Dispatcher->init();
};
warn $@ if $@;

#my $dump_file = 'metamodel.sql';
my $host_suffix = shift || '';
my $backend = $OpenResty::Backend;
my $backend_name = $OpenResty::BackendName;

my @accounts = $backend->get_all_accounts;
### @accounts

#my @tables = qw(
#_views _models _columns _feeds _roles _access _general
#);
if ( ! -d 'metamodel' ) { mkdir 'metamodel' }
elsif (glob 'metamodel/*.sql') {
    system("mv metamodel metamodel.old");
    mkdir 'metamodel';
}
#system("mv $dump_file $dump_file.old");
my $db = $OpenResty::Config{'backend.database'};
my $user = $OpenResty::Config{'backend.user'};
my $password = $OpenResty::Config{'backend.password'};
my $host = 'localhost';

for my $account ('_global', @accounts) {
    $backend->set_user($account);
    my $machine = $backend->has_user($account);
    if ($backend_name eq 'PgFarm') {
        $db = $machine;
        $host = $machine . $host_suffix;
    }
    my $sql = <<'_EOC_';
SELECT
c.relname
FROM pg_catalog.pg_class c
    JOIN pg_catalog.pg_roles r ON r.oid = c.relowner
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'r'
    AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
AND pg_catalog.pg_table_is_visible(c.oid)
AND c.relname ~ '^_'
_EOC_
    my $res;
    eval {
        $res = $backend->select($sql);
    };
    if ($@) { warn "select pg_catalog failed!!!\n"; warn $@; next }
    my @tables = map { $_->[0] } @$res;
    ### @tables
    #else {dump_res($res);
    my $tables = join ' ', map { "-t '$account.$_'" } @tables;
    my $cmd = "pg_dump -iOx -h $host -U $user $tables -f metamodel/$account.sql $db";
    #warn $cmd;
    warn "Dumping account $account to metamodel/$account.sql...\n";
    if (system($cmd) != 0) {
        warn "Failed to dump metamodel from $account\n";
    }
    #system("cat tmp.sql >> $dump_file");
}