for fetching inserted keys without pg_oid_status, look up the actual sequence name...
authorivan <ivan>
Wed, 7 Dec 2005 23:48:58 +0000 (23:48 +0000)
committerivan <ivan>
Wed, 7 Dec 2005 23:48:58 +0000 (23:48 +0000)
FS/FS/Record.pm
FS/bin/freeside-setup

index 2110004..7f64d84 100644 (file)
@@ -752,7 +752,16 @@ sub insert {
 
       #my $oid = $sth->{'pg_oid_status'};
       #my $i_sql = "SELECT $primary_key FROM $table WHERE oid = ?";
-      my $i_sql = "SELECT currval('${table}_${primary_key}_seq')";
+
+      my $default = $self->dbdef_table->column($primary_key)->default;
+      unless ( $default =~ /^nextval\('"?([\w\.]+)"?'/i ) {
+        dbh->rollback if $FS::UID::AutoCommit;
+        return "can't parse $table.$primary_key default value".
+               " for sequence name: $default";
+      }
+      my $sequence = $1;
+
+      my $i_sql = "SELECT currval('$sequence')";
       my $i_sth = dbh->prepare($i_sql) or do {
         dbh->rollback if $FS::UID::AutoCommit;
         return dbh->errstr;
index 14c5a84..a16e517 100755 (executable)
@@ -9,7 +9,7 @@ use Getopt::Std;
 use Locale::Country;
 use Locale::SubCountry;
 use FS::UID qw(adminsuidsetup datasrc checkeuid getsecrets);
-use FS::Schema qw( dbdef_dist );
+use FS::Schema qw( dbdef_dist reload_dbdef );
 use FS::Record;
 use FS::cust_main_county;
 #use FS::raddb;
@@ -98,6 +98,12 @@ foreach my $statement ( $dbdef->sql($dbh) ) {
     or die "CREATE error: ". $dbh->errstr. "\ndoing statement: $statement";
 }
 
+#now go back and reverse engineer the db
+#so we pick up the correct column DEFAULTs for #oidless inserts
+dbdef_create($dbh, $dbdef_file);
+delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
+reload_dbdef($dbdef_file);
+
 #cust_main_county
 foreach my $country ( sort map uc($_), all_country_codes ) {
 
@@ -162,6 +168,12 @@ $dbh->disconnect or die $dbh->errstr;
 
 #print "Freeside database initialized sucessfully\n";
 
+sub dbdef_create { # reverse engineer the schema from the DB and save to file
+  my( $dbh, $file ) = @_;
+  my $dbdef = new_native DBIx::DBSchema $dbh;
+  $dbdef->save($file);
+}
+
 sub usage {
   die "Usage:\n  freeside-setup user\n"; 
 }