X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2FRecord.pm;h=4a0fe3fd2089b20e5494dacbfd9b2ab4740a9a5c;hb=7066204f45124e0100d5330cce63584ff9e4bacb;hp=21100045e584a163e1cd3a6270e8924b2dbebab6;hpb=4b2ee72b32274f78c1c8a859b34e0d49dfb6cd4b;p=freeside.git diff --git a/FS/FS/Record.pm b/FS/FS/Record.pm index 21100045e..4a0fe3fd2 100644 --- a/FS/FS/Record.pm +++ b/FS/FS/Record.pm @@ -250,7 +250,7 @@ sub qsearch { my $table = $cache ? $cache->table : $stable; my $dbdef_table = dbdef->table($table) or die "No schema for table $table found - ". - "do you need to create it or run dbdef-create?"; + "do you need to run freeside-upgrade?"; my $pkey = $dbdef_table->primary_key; my @real_fields = grep exists($record->{$_}), real_fields($table); @@ -745,14 +745,26 @@ sub insert { $sth->execute or return $sth->errstr; - my $insertid = ''; - if ( $db_seq ) { # get inserted id from the database, if applicable + # get inserted id from the database, if applicable & needed + if ( $db_seq && ! $self->getfield($primary_key) ) { warn "[debug]$me retreiving sequence from database\n" if $DEBUG; + + my $insertid = ''; + if ( driver_name eq 'Pg' ) { #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; @@ -784,11 +796,15 @@ sub insert { } } else { + dbh->rollback if $FS::UID::AutoCommit; return "don't know how to retreive inserted ids from ". driver_name. ", try using counterfiles (maybe run dbdef-create?)"; + } + $self->setfield($primary_key, $insertid); + } my @virtual_fields = @@ -961,6 +977,11 @@ sub replace { warn "[debug]$me $new ->replace $old\n" if $DEBUG; + if ( $new->can('replace_check') ) { + my $error = $new->replace_check($old); + return $error if $error; + } + return "Records not in same table!" unless $new->table eq $old->table; my $primary_key = $old->dbdef_table->primary_key;