added location for added page file to be miggitdir
[migration-tools.git] / mig-bin / mig-stage
1 #!/usr/bin/perl -w
2 ###############################################################################
3 =pod
4
5 =head1 NAME
6
7 mig-stage 
8
9 Load the SQL-converted version of the specified file into the migration schema.
10
11 Extra arguments are passed to the underlying call to psql
12
13 If the tracked file was previously staged with a different table, drop that
14 table.
15
16
17 =head1 SYNOPSIS
18
19 B<mig-stage> <file> [other arguments...]
20
21 =cut
22
23 ###############################################################################
24
25 use strict;
26 use Switch;
27 use Env qw(
28     HOME PGHOST PGPORT PGUSER PGDATABASE MIGSCHEMA
29     MIGBASEWORKDIR MIGBASEGITDIR MIGGITDIR MIGWORKDIR
30 );
31 use Pod::Usage;
32 use DBI;
33 use Cwd 'abs_path';
34 use FindBin;
35 my $mig_bin = "$FindBin::Bin/";
36 use lib "$FindBin::Bin/";
37 use Mig;
38
39 pod2usage(-verbose => 2) if ! $ARGV[0] || $ARGV[0] eq '--help';
40
41 Mig::die_if_no_env_migschema();
42 Mig::die_if_mig_tracking_table_does_not_exist();
43
44 my $file = abs_path($ARGV[0]);
45 if ($file =~ /^$MIGBASEWORKDIR/) {
46     stage_csv(@ARGV);
47 } else {
48     print "File falls outside of MIGWORKDIR ($MIGWORKDIR): $file\n";
49 }
50
51 exit 0;
52
53 ###############################################################################
54
55 sub stage_csv {
56     my $file = abs_path(shift);
57     my @args = @_;
58
59     my $tracked_file_id = Mig::check_for_tracked_file($file);
60     if ($tracked_file_id) {
61         my $data = Mig::status_this_file($file);
62
63         if (! $data->{'utf8_filename'}) {
64             die "mig-iconv or mig-skip-iconv needed for UTF8 version of file: $file\n";
65         }
66
67         if (! $data->{'clean_filename'}) {
68             die "mig-clean or mig-skip-clean needed for .clean version of file: $file\n";
69         }
70
71         if (! $data->{'stage_sql_filename'}) {
72             die "mig-convert needed for .stage.sql version of file: $file\n";
73         }
74
75         my $stage_sql_filename = $data->{'stage_sql_filename'};
76         if (! -e $stage_sql_filename) {
77             die "missing file: $stage_sql_filename\n";
78         }
79
80         my $schema_table = `grep 'CREATE UNLOGGED TABLE' $stage_sql_filename  | cut -f4 -d\\  | head -1`;
81         chomp $schema_table;
82         my ($schema,$table) = split /\./, $schema_table;
83
84         if (defined $data->{'staged_table'} && $data->{'staged_table'} ne $table) {
85             my $dbh2 = Mig::db_connect();
86             print "dropping previously staged table: $MIGSCHEMA.$data->{staged_table}\n";
87             my $rv2 = $dbh2->do("
88                 DROP TABLE $MIGSCHEMA.$data->{staged_table};
89             ") || die "Error dropping table $data->{staged_table}: $!\n";
90             print "changing references to old tables\n";
91             my $rv3 = $dbh2->do("
92                 UPDATE $MIGSCHEMA.tracked_column
93                 SET staged_table = " . $dbh2->quote($table) . "
94                 WHERE staged_table = " . $dbh2->quote($data->{staged_table}) . "
95             ") || die "Error changing references to $data->{staged_table}: $!\n";
96             my $rv4 = $dbh2->do("
97                 UPDATE $MIGSCHEMA.tracked_column
98                 SET target_table = " . $dbh2->quote($table) . "
99                 WHERE target_table = " . $dbh2->quote($data->{staged_table}) . "
100             ") || die "Error changing references to $data->{staged_table}: $!\n";
101             Mig::db_disconnect($dbh2);
102         }
103
104         print "running staging SQL: $stage_sql_filename\n";
105
106         system('psql', @args, '-f', $stage_sql_filename);
107
108         if ($schema ne $MIGSCHEMA) {
109             die "Schema mismatch: env => $MIGSCHEMA sql => $schema\n";
110         }
111         if (! Mig::check_db_migschema_for_specific_table($table)) {
112             die "Missing staged table: $schema_table\n";
113         } else {
114             print "table staged: $schema_table\n";
115         }
116
117         my $dbh = Mig::db_connect();
118         my $rv = $dbh->do("
119             UPDATE $MIGSCHEMA.tracked_file
120             SET staged_table = " . $dbh->quote($table) . "
121             WHERE base_filename = " . $dbh->quote($file) . "
122             ;
123         ") || die "Error updating table $MIGSCHEMA.tracked_file: $!\n";
124         Mig::db_disconnect($dbh);
125     } else {
126         print "File not currently tracked: $file\n";
127     }
128 }