X-Git-Url: http://git.equinoxoli.org/?p=migration-tools.git;a=blobdiff_plain;f=mig-bin%2FMig.pm;fp=mig-bin%2FMig.pm;h=6600cfda6b4af77f0c9426224424fa76cccc8f32;hp=0000000000000000000000000000000000000000;hb=f9201dc2d1699f5161e5e29690a1634e8063bb85;hpb=d1812fa8c4c9e220978d650adb3611c978a2a56b diff --git a/mig-bin/Mig.pm b/mig-bin/Mig.pm new file mode 100644 index 0000000..6600cfd --- /dev/null +++ b/mig-bin/Mig.pm @@ -0,0 +1,261 @@ +package Mig; + +use strict; +use Exporter; +use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); + +$VERSION = 1.00; +@ISA = qw(Exporter); +@EXPORT = (); +@EXPORT_OK = qw(); +%EXPORT_TAGS = ( + DEFAULT => [] +); + +use DBI; +use Env qw( + HOME PGHOST PGPORT PGUSER PGDATABASE MIGSCHEMA + MIGBASEWORKDIR MIGBASEGITDIR MIGGITDIR MIGWORKDIR +); + +sub db_connect { + my $dbh = DBI->connect( + "dbi:Pg:host=$PGHOST;dbname=$PGDATABASE;port=$PGPORT" + ,$PGUSER + ,undef + ) || die "Unable to connect to $PGHOST:$PGPORT:$PGDATABASE:$PGUSER : $!\n"; + return $dbh; +} +sub db_disconnect { + my $dbh = shift; + $dbh->disconnect; +} + +sub sql { + my $sql = shift; + chomp $sql; + $sql =~ s/\n//g; + print "\n$sql\n"; + return $sql; +} + +sub die_if_no_env_migschema { + die "MIGSCHEMA environment variable not set. See 'mig env help'\n" + unless $MIGSCHEMA; +} + +sub check_for_db_migschema { + my $dbh = db_connect(); + my $sth = $dbh->prepare(" + SELECT EXISTS( + SELECT 1 + FROM pg_namespace + WHERE nspname = ? + );" + ); + my $rv = $sth->execute($MIGSCHEMA) + || die "Error checking for migration schema ($MIGSCHEMA): $!"; + my @cols = $sth->fetchrow_array; + $sth->finish; + my $found; + if ($cols[0]) { + print "Found migration schema ($MIGSCHEMA) at $PGHOST:$PGPORT:$PGDATABASE:$PGUSER\n"; + $found = 1; + } else { + print "Migration schema ($MIGSCHEMA) does not exist at $PGHOST:$PGPORT:$PGDATABASE:$PGUSER\n"; + $found = 0; + } + db_disconnect($dbh); + return $found; +} + +sub check_db_migschema_for_migration_tables { + my $found = check_db_migschema_for_specific_table('asset_copy'); + if (!$found) { + print "Missing migration tables (such as $MIGSCHEMA.asset_copy)\n"; + } + return $found; +} + +sub check_db_migschema_for_specific_table { + my $table = shift; + my $dbh = db_connect(); + my $sth = $dbh->prepare(" + SELECT EXISTS( + SELECT 1 + FROM information_schema.tables + WHERE table_schema = " . $dbh->quote( $MIGSCHEMA ) . " + AND table_name = " . $dbh->quote( $table ) . " + );" + ); + my $rv = $sth->execute() + || die "Error checking migration schema ($MIGSCHEMA) for table ($table): $!"; + my @cols = $sth->fetchrow_array; + $sth->finish; + my $found; + if ($cols[0]) { + $found = 1; + } else { + $found = 0; + } + db_disconnect($dbh); + return $found; +} + +sub check_for_migration_tools { + my $dbh = db_connect(); + my $sth = $dbh->prepare(" + SELECT EXISTS( + SELECT 1 + FROM pg_namespace + WHERE nspname = 'migration_tools' + );" + ); + my $rv = $sth->execute() + || die "Error checking for migration_tools schema: $!"; + my @cols = $sth->fetchrow_array; + $sth->finish; + db_disconnect($dbh); + return $cols[0]; +} + +sub die_if_no_migration_tools { + if (check_for_migration_tools()) { + print "Found migration_tools schema\n"; + } else { + die "Missing migration_tools schema\n"; + } +} + +sub check_for_mig_tracking_table { + my $dbh = db_connect(); + my $sth = $dbh->prepare(" + SELECT EXISTS( + SELECT 1 + FROM information_schema.tables + WHERE table_schema = " . $dbh->quote( $MIGSCHEMA ) . " + AND table_name = 'tracked_file' + );" + ); + my $rv = $sth->execute() + || die "Error checking for table (tracked_file): $!"; + my @cols = $sth->fetchrow_array; + $sth->finish; + db_disconnect($dbh); + return $cols[0]; +} + +sub die_if_mig_tracking_table_exists { + if (check_for_mig_tracking_table()) { + die "Table $MIGSCHEMA.tracked_file already exists. Bailing init...\n"; + } +} + +sub die_if_mig_tracking_table_does_not_exist { + if (!check_for_mig_tracking_table()) { + die "Table $MIGSCHEMA.tracked_file does not exist. Bailing...\n"; + } +} + +sub check_for_mig_column_tracking_table { + my $dbh = db_connect(); + my $sth = $dbh->prepare(" + SELECT EXISTS( + SELECT 1 + FROM information_schema.tables + WHERE table_schema = " . $dbh->quote( $MIGSCHEMA ) . " + AND table_name = 'tracked_column' + );" + ); + my $rv = $sth->execute() + || die "Error checking for table (tracked_column): $!"; + my @cols = $sth->fetchrow_array; + $sth->finish; + db_disconnect($dbh); + return $cols[0]; +} + +sub die_if_mig_column_tracking_table_exists { + if (check_for_mig_column_tracking_table()) { + die "Table $MIGSCHEMA.tracked_column already exists. Bailing init...\n"; + } +} + +sub die_if_mig_column_tracking_table_does_not_exist { + if (!check_for_mig_column_tracking_table()) { + die "Table $MIGSCHEMA.tracked_column does not exist. Bailing...\n"; + } +} + +sub check_for_tracked_file { + my $file = shift; + my $options = shift; + if (! -e $file) { + die "file not found: $file\n" unless $options && $options->{'allow_missing'}; + } + my $dbh = db_connect(); + my $sth = $dbh->prepare(" + SELECT id + FROM $MIGSCHEMA.tracked_file + WHERE base_filename = " . $dbh->quote( $file ) . ";" + ); + my $rv = $sth->execute() + || die "Error checking table (tracked_file) for base_filename ($file): $!"; + my @cols = $sth->fetchrow_array; + $sth->finish; + db_disconnect($dbh); + return $cols[0]; +} + +sub check_for_tracked_column { + my ($table,$column,$options) = (shift,shift,shift); + my $dbh = db_connect(); + my $sth = $dbh->prepare(" + SELECT id + FROM $MIGSCHEMA.tracked_column + WHERE staged_table = " . $dbh->quote( $table ) . " + AND staged_column = " . $dbh->quote( $column ) . ";" + ); + my $rv = $sth->execute() + || die "Error checking table (tracked_column) for $table.$column: $!"; + my @cols = $sth->fetchrow_array; + $sth->finish; + db_disconnect($dbh); + return $cols[0]; +} + +sub status_this_file { + my $file = shift; + my $dbh = db_connect(); + my $sth = $dbh->prepare(" + SELECT * + FROM $MIGSCHEMA.tracked_file + WHERE base_filename = " . $dbh->quote( $file ) . ";" + ); + my $rv = $sth->execute() + || die "Error retrieving data from table (tracked_file) for base_filename ($file): $!"; + my $data = $sth->fetchrow_hashref; + $sth->finish; + db_disconnect($dbh); + return $data; +} + +sub status_this_column { + my ($table,$column) = (shift,shift); + my $dbh = db_connect(); + my $sth = $dbh->prepare(" + SELECT * + FROM $MIGSCHEMA.tracked_column + WHERE staged_table = " . $dbh->quote( $table ) . " + AND staged_column = " . $dbh->quote( $column ) . ";" + ); + my $rv = $sth->execute() + || die "Error checking table (tracked_column) for $table.$column: $!"; + my $data = $sth->fetchrow_hashref; + $sth->finish; + db_disconnect($dbh); + return $data; +} + +1; +