summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorivan <ivan>2005-12-07 23:48:58 +0000
committerivan <ivan>2005-12-07 23:48:58 +0000
commit5d03c5bf1e774050bbdad9964408f248855ec317 (patch)
tree97ba36df5191922a22de262b5a3798153ce42f23
parent4b2ee72b32274f78c1c8a859b34e0d49dfb6cd4b (diff)
for fetching inserted keys without pg_oid_status, look up the actual sequence name from dbdef rather than assuming ${table}_${column}_seq
-rw-r--r--FS/FS/Record.pm11
-rwxr-xr-xFS/bin/freeside-setup14
2 files changed, 23 insertions, 2 deletions
diff --git a/FS/FS/Record.pm b/FS/FS/Record.pm
index 2110004..7f64d84 100644
--- a/FS/FS/Record.pm
+++ b/FS/FS/Record.pm
@@ -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;
diff --git a/FS/bin/freeside-setup b/FS/bin/freeside-setup
index 14c5a84..a16e517 100755
--- a/FS/bin/freeside-setup
+++ b/FS/bin/freeside-setup
@@ -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";
}