seed kmig-init from mig-init
authorJason Etheridge <jason@equinoxinitiative.org>
Fri, 10 Apr 2020 02:31:01 +0000 (22:31 -0400)
committerJason Etheridge <jason@equinoxinitiative.org>
Fri, 10 Apr 2020 02:31:01 +0000 (22:31 -0400)
kmig.d/bin/kmig-init [new file with mode: 0755]

diff --git a/kmig.d/bin/kmig-init b/kmig.d/bin/kmig-init
new file mode 100755 (executable)
index 0000000..98f92b5
--- /dev/null
@@ -0,0 +1,93 @@
+#!/usr/bin/perl -w
+###############################################################################
+=pod
+
+=head1 NAME
+
+mig-init - This will add or recreate tracking tables for the B<mig> toolset to
+the migration schema specified by the MIGSCHEMA environment variable, in the
+PostgreSQL database specified by various PG environment variables.
+
+In practice, you should invoke 'mig env use schema_name' prior to calling
+B<init>
+
+=head1 SYNOPSIS
+
+B<mig-init>
+
+B<mig-init> <help>
+
+=cut
+
+###############################################################################
+
+use strict;
+use Switch;
+use Env qw(
+    HOME PGHOST PGPORT PGUSER PGDATABASE MIGSCHEMA
+    MIGBASEWORKDIR MIGBASEGITDIR MIGGITDIR MIGWORKDIR
+);
+use Pod::Usage;
+use DBI;
+use FindBin;
+my $mig_bin = "$FindBin::Bin/";
+my $mig_sql = $mig_bin . "../mig-sql/init/";
+use lib "$FindBin::Bin/";
+use Mig;
+
+pod2usage(-verbose => 2) if $ARGV[0];
+
+Mig::die_if_no_env_migschema();
+
+if (! Mig::check_for_db_migschema()) {
+    try_to_create_schema();
+}
+
+if (! Mig::check_db_migschema_for_migration_tables()) {
+    try_to_init_schema_with_migration_tools();
+}
+Mig::die_if_mig_tracking_table_exists();
+Mig::die_if_mig_column_tracking_table_exists();
+loop_through_mig_sql_templates();
+
+exit 0;
+
+###############################################################################
+
+sub try_to_create_schema {
+    if ($MIGSCHEMA =~ /[^\w_]/) {
+        die "$MIGSCHEMA is not suitable for a schema name in PostgreSQL\n";
+    }
+    my $dbh = Mig::db_connect();
+    my $rv = $dbh->do("CREATE SCHEMA $MIGSCHEMA;")
+        || die "Error creating migration schema ($MIGSCHEMA): $!\n";
+    print "Created schema $MIGSCHEMA\n";
+    Mig::db_disconnect($dbh);
+}
+
+sub try_to_init_schema_with_migration_tools {
+    Mig::die_if_no_migration_tools();
+    print "Calling migration_tools.init() and .build()\n";
+    my $dbh = Mig::db_connect();
+    my $rv = $dbh->do("SELECT migration_tools.init(" . $dbh->quote($MIGSCHEMA) . ");")
+        || die "Error running migration_tools.init($MIGSCHEMA): $!\n";
+    print "migration_tools.init() finished\n";
+    my $rv2 = $dbh->do("SELECT migration_tools.build(" . $dbh->quote($MIGSCHEMA) . ");")
+        || die "Error running migration_tools.build($MIGSCHEMA): $!\n";
+    print "migration_tools.build() finished\n";
+    Mig::db_disconnect($dbh);
+}
+
+sub loop_through_mig_sql_templates {
+    print "Looping through mig-sql/init/ templates\n";
+    opendir my $dir, $mig_sql or die "Cannot open directory: $!";
+    my @files = sort readdir $dir;
+    closedir $dir;
+    foreach my $file (@files) {
+        if ($file =~ /.sql$/) {
+            print "executing $file:\n";
+            system( $mig_bin . "mig-sql", ('-f',$mig_sql . $file) )
+        }
+    }
+}
+