mig-env: set PGOPTIONS for search_path
[migration-tools.git] / mig-bin / mig-init
1 #!/usr/bin/perl -w
2 ###############################################################################
3 =pod
4
5 =head1 NAME
6
7 mig-init - This will add or recreate tracking tables for the B<mig> toolset to
8 the migration schema specified by the MIGSCHEMA environment variable, in the
9 PostgreSQL database specified by various PG environment variables.
10
11 In practice, you should invoke 'mig env use schema_name' prior to calling
12 B<init>
13
14 =head1 SYNOPSIS
15
16 B<mig-init>
17
18 B<mig-init> <help>
19
20 =cut
21
22 ###############################################################################
23
24 use strict;
25 use Switch;
26 use Env qw(
27     HOME PGHOST PGPORT PGUSER PGDATABASE MIGSCHEMA
28     MIGBASEWORKDIR MIGBASEGITDIR MIGGITDIR MIGWORKDIR
29 );
30 use Pod::Usage;
31 use DBI;
32 use FindBin;
33 my $mig_bin = "$FindBin::Bin/";
34 use lib "$FindBin::Bin/";
35 use Mig;
36
37 pod2usage(-verbose => 2) if $ARGV[0];
38
39 Mig::die_if_no_env_migschema();
40
41 if (! Mig::check_for_db_migschema()) {
42     try_to_create_schema();
43 }
44
45 if (! Mig::check_db_migschema_for_migration_tables()) {
46     try_to_init_schema_with_migration_tools();
47 }
48 vivicate_mig_tracking_tables();
49
50 exit 0;
51
52 ###############################################################################
53
54 sub try_to_create_schema {
55     if ($MIGSCHEMA =~ /[^\w_]/) {
56         die "$MIGSCHEMA is not suitable for a schema name in PostgreSQL\n";
57     }
58     my $dbh = Mig::db_connect();
59     my $rv = $dbh->do("CREATE SCHEMA $MIGSCHEMA;")
60         || die "Error creating migration schema ($MIGSCHEMA): $!\n";
61     print "Created schema $MIGSCHEMA\n";
62     Mig::db_disconnect($dbh);
63 }
64
65 sub try_to_init_schema_with_migration_tools {
66     Mig::die_if_no_migration_tools();
67     print "Calling migration_tools.init() and .build()\n";
68     my $dbh = Mig::db_connect();
69     my $rv = $dbh->do("SELECT migration_tools.init(" . $dbh->quote($MIGSCHEMA) . ");")
70         || die "Error running migration_tools.init($MIGSCHEMA): $!\n";
71     print "migration_tools.init() finished\n";
72     my $rv2 = $dbh->do("SELECT migration_tools.build(" . $dbh->quote($MIGSCHEMA) . ");")
73         || die "Error running migration_tools.build($MIGSCHEMA): $!\n";
74     print "migration_tools.build() finished\n";
75     Mig::db_disconnect($dbh);
76 }
77
78 sub vivicate_mig_tracking_tables {
79     Mig::die_if_mig_tracking_table_exists();
80     print "Creating table $MIGSCHEMA.tracked_file...\n";
81     my $dbh = Mig::db_connect();
82     my $rv = $dbh->do("
83         CREATE TABLE $MIGSCHEMA.tracked_file (
84              id                 serial
85             ,base_filename      TEXT UNIQUE
86             ,has_headers        BOOLEAN
87             ,headers_file       TEXT
88             ,utf8_filename      TEXT
89             ,clean_filename     TEXT
90             ,stage_sql_filename TEXT
91             ,map_sql_filename   TEXT
92             ,prod_sql_filename  TEXT
93             ,parent_table       TEXT
94             ,staged_table       TEXT
95         );
96     ") || die "Error creating table $MIGSCHEMA.tracked_file: $!\n";
97     Mig::die_if_mig_column_tracking_table_exists();
98     my $rv2 = $dbh->do("
99         CREATE TABLE $MIGSCHEMA.tracked_column (
100              id                 serial
101             ,base_filename      TEXT
102             ,parent_table       TEXT
103             ,staged_table       TEXT
104             ,staged_column      TEXT
105             ,comment            TEXT
106             ,target_table       TEXT
107             ,target_column      TEXT
108             ,transform          TEXT
109             ,summarize          BOOLEAN
110         );
111     ") || die "Error creating table $MIGSCHEMA.tracked_column: $!\n";
112     my $rv3 = $dbh->do("
113         CREATE INDEX ON $MIGSCHEMA.tracked_column(target_table,target_column);
114     ") || die "Error creating index on $MIGSCHEMA.tracked_column: $!\n";
115     my $rv4 = $dbh->do("
116         CREATE INDEX ON $MIGSCHEMA.tracked_column(base_filename);
117     ") || die "Error creating index on $MIGSCHEMA.tracked_column: $!\n";
118     Mig::db_disconnect($dbh);
119 }
120
121