default to a session cookie instead of setting an explicit timeout, weird timezone...
[freeside.git] / bin / fix-sequences
1 #!/usr/bin/perl -Tw
2
3 # run dbdef-create first!
4
5 use strict;
6 use FS::UID qw(adminsuidsetup driver_name);
7 use FS::Record qw(dbdef);
8
9 my $user = shift or die &usage;
10 my $dbh = adminsuidsetup $user;
11
12 my $schema = dbdef();
13
14 #false laziness w/fs-setup
15 my @tables = scalar(@ARGV)
16                ? @ARGV
17                #: grep { ! /^h_/ } $schema->tables;
18                : $schema->tables;
19 foreach my $table ( @tables ) {
20
21   my $tableobj = $schema->table($table)
22     or die "unknown table $table (did you run dbdef-create?)\n";
23
24   my $primary_key = $tableobj->primary_key;
25   next unless $primary_key;
26
27   my $col = $tableobj->column($primary_key);
28
29 #warn $col->type;
30 my $default = ref($col->default) ? ${ $col->default } : $col->default;
31 #use Data::Dumper;
32 #warn Dumper $col;
33
34   next unless uc($col->type) eq 'SERIAL'
35               || ( driver_name eq 'Pg'
36                      && defined($default)
37                      && $default =~ /^nextval\(/i
38                  )
39               || ( driver_name eq 'mysql'
40                      && defined($col->local)
41                      && $col->local =~ /AUTO_INCREMENT/i
42                  );
43
44   my $suffix = '_seq';
45   if ( $table =~ /^(objectcustomfields|objectcustomfieldvalues)$/ ) {
46     $suffix = '_s';
47   }
48
49   my $seq = "${table}_${primary_key}$suffix";
50   if ( driver_name eq 'Pg'
51        && defined($default) 
52        && $default =~ /^nextval\('"(public\.)?(\w+_seq)"'::(text|regclass)\)$/
53      ) {
54     $seq = $2;
55   }
56
57   warn "fixing sequence for $table\n";
58
59
60   my $sql = "SELECT setval( '$seq',
61                             ( SELECT max($primary_key) FROM $table ) );";
62
63   #warn $col->default. " $seq\n$sql\n";
64   $dbh->do( $sql ) or die $dbh->errstr;
65
66 }
67
68 $dbh->commit or die $dbh->errstr;
69 $dbh->disconnect or die $dbh->errstr;
70
71 sub usage {
72   die "Usage:\n  fix-sequences user [ table table ... ] \n";
73 }
74