delete swp
[webpac2] / sql / mkindex.pl
index 8872492..2cb05e6 100755 (executable)
@@ -1,15 +1,19 @@
 #!/usr/bin/perl -w
 
 # Helper script to produce alter tables for inherited tables and
-# indexes from source shema
+# indexes from source shema like this:
+#
+# ./mkindex schema.sql | psql database_name
 
 use strict;
-#use Data::Dumper;
+use Data::Dumper;
 
 my $out;
 
 my ($table, $inherit);
 
+print "begin;\n";
+
 while (<>) {
        chomp;
 
@@ -26,17 +30,25 @@ while (<>) {
                $out->{index}->{$2}->{$table} = $1;
        }
 
-       if (/\s*inherits\s*\(\s*(\S+)\s*\)/) {
+       if (/\s*inherits\s*\(\s*(\S+)\s*\)/i) {
                $out->{inherits}->{$table} = $1;
        }
 
+       if (s/^\s*(\S+)(.+?)references\s+(\S+)\s*\((\S+)\)([^,]*)([,\s]*)$/\t$1$2$6/i) {
+#      if (/^\s*(\S+)(.+?)references\s+(\S+)\s*\((\S+)\)/) {
+               @{ $out->{references}->{$table}->{$1} } = ( $3, $4, $5 );
+       }
+
+       print "$_\n";
+       print STDERR "# $_\n";
+
 }
 
-#print STDERR Dumper($out);
+print STDERR Dumper($out);
 
 foreach my $table (keys %{ $out->{inherits} }) {
-       my $parent = $out->{inherits}->{$table} || die;
-       my $pk = $out->{table_pk}->{$parent} || die;
+       my $parent = $out->{inherits}->{$table} || die "$table doesn't inherit anything";
+       my $pk = $out->{table_pk}->{$parent} || die "$parent doesn't have primary key";
        my $seq = $parent . '_' . $pk . '_seq';
        print qq{alter table $table alter column $pk set default nextval('$seq');\n};
 }
@@ -49,4 +61,25 @@ foreach my $type (keys %{ $out->{index} }) {
        }
 }
 
-       
+foreach my $table (keys %{ $out->{references} }) {
+       foreach my $field (keys %{ $out->{references}->{$table} }) {
+               my $fk = $out->{references}->{$table}->{$field} || die;
+               my $func = $table . '_' . $field . '_fkey';
+               print qq{
+create or replace function $func() returns TRIGGER AS
+\$\$
+DECLARE
+BEGIN
+IF NEW.$field IN (select $fk->[1] from $fk->[0]) THEN
+       RETURN NEW;
+ELSE
+       RAISE EXCEPTION 'insert or update on table "%" violates foreign key constraint for "$table" table', TG_RELNAME;
+END IF;
+END;
+\$\$ language 'plpgsql';
+CREATE TRIGGER $func BEFORE INSERT ON $table FOR EACH ROW EXECUTE PROCEDURE $func();
+};
+       }
+}
+
+print "commit;\n";