2 ###############################################################################
9 Load the SQL-converted version of the specified file into the migration schema.
11 Extra arguments are passed to the underlying call to psql
13 If the tracked file was previously staged with a different table, drop that
19 B<mig-stage> <file> [other arguments...]
23 ###############################################################################
28 HOME MYSQL_HOST MYSQL_TCP_PORT MYSQL_USER MYSQL_DATABASE MYSQL_PW
29 MIGSCHEMA MIGBASEWORKDIR MIGBASEGITDIR MIGGITDIR MIGWORKDIR
35 my $mig_bin = "$FindBin::Bin/";
36 use lib "$FindBin::Bin/";
39 pod2usage(-verbose => 2) if ! $ARGV[0] || $ARGV[0] eq '--help';
41 KMig::die_if_no_env_migschema();
42 KMig::die_if_mig_tracking_table_does_not_exist();
44 my $file = abs_path($ARGV[0]);
45 if ($file =~ /^$MIGBASEWORKDIR/) {
48 print "File falls outside of MIGWORKDIR ($MIGWORKDIR): $file\n";
53 ###############################################################################
56 my $file = abs_path(shift);
59 my $tracked_file_id = KMig::check_for_tracked_file($file);
60 if ($tracked_file_id) {
61 my $data = KMig::status_this_file($file);
63 if (! $data->{'utf8_filename'}) {
64 die "mig-iconv or mig-skip-iconv needed for UTF8 version of file: $file\n";
67 if (! $data->{'clean_filename'}) {
68 die "mig-clean or mig-skip-clean needed for .clean version of file: $file\n";
71 if (! $data->{'stage_sql_filename'}) {
72 die "mig-convert needed for .stage.sql version of file: $file\n";
75 my $stage_sql_filename = $data->{'stage_sql_filename'};
76 if (! -e $stage_sql_filename) {
77 die "missing file: $stage_sql_filename\n";
80 my $table = `grep 'CREATE TABLE' $stage_sql_filename | cut -f3 -d\\ | head -1`;
83 if (defined $data->{'staged_table'} && $data->{'staged_table'} ne $table) {
84 if ($data->{staged_table} !~ '^m_') {
85 die "Previously staged table $data->{staged_table} does not have a m_ prefix; afraid to drop.";
87 my $dbh2 = KMig::db_connect();
88 print "dropping previously staged table: $data->{staged_table}\n";
90 DROP TABLE $data->{staged_table};
91 ") || die "Error dropping table $data->{staged_table}: $!\n";
92 print "changing references to old tables\n";
94 UPDATE m_tracked_column
95 SET staged_table = " . $dbh2->quote($table) . "
96 WHERE staged_table = " . $dbh2->quote($data->{staged_table}) . "
97 ") || die "Error changing references to $data->{staged_table}: $!\n";
99 UPDATE m_tracked_column
100 SET target_table = " . $dbh2->quote($table) . "
101 WHERE target_table = " . $dbh2->quote($data->{staged_table}) . "
102 ") || die "Error changing references to $data->{staged_table}: $!\n";
103 KMig::db_disconnect($dbh2);
106 print "running staging SQL: $stage_sql_filename\n";
108 system($mig_bin . 'mig-sql', @args, '-e', ("SOURCE $stage_sql_filename;"));
110 if (! KMig::check_db_migschema_for_specific_table($table)) {
111 die "Missing staged table: $table\n";
113 print "table staged: $table\n";
116 my $dbh = KMig::db_connect();
118 UPDATE m_tracked_file
119 SET staged_table = " . $dbh->quote($table) . "
120 WHERE base_filename = " . $dbh->quote($file) . "
122 ") || die "Error updating table m_tracked_file: $!\n";
123 KMig::db_disconnect($dbh);
125 print "File not currently tracked: $file\n";