summaryrefslogtreecommitdiff
path: root/LedgerSMB/DBObject.pm
diff options
context:
space:
mode:
Diffstat (limited to 'LedgerSMB/DBObject.pm')
-rw-r--r--LedgerSMB/DBObject.pm95
1 files changed, 95 insertions, 0 deletions
diff --git a/LedgerSMB/DBObject.pm b/LedgerSMB/DBObject.pm
index d91c4899..17e4e4b0 100644
--- a/LedgerSMB/DBObject.pm
+++ b/LedgerSMB/DBObject.pm
@@ -82,4 +82,99 @@ sub exec_method {
$self->callproc($funcname, @call_args);
}
+sub run_custom_queries {
+ my ($self, $tablename, $query_type, $linenum) = @_;
+ my $dbh = $self->{dbh};
+ if ($query_type !~ /^(select|insert|update)$/i){
+ $self->error($locale->text(
+ "Passed incorrect query type to run_custom_queries."
+ ));
+ }
+ my @rc;
+ my %temphash;
+ my @templist;
+ my @elements;
+ my $query;
+ my $ins_values;
+ if ($linenum){
+ $linenum = "_$linenum";
+ }
+
+ $query_type = uc($query_type);
+ for (@{$self->{custom_db_fields}{$tablename}}){
+ @elements = split (/:/, $_);
+ push @{$temphash{$elements[0]}}, $elements[1];
+ }
+ for (keys %temphash){
+ my @data;
+ my $ins_values;
+ $query = "$query_type ";
+ if ($query_type eq 'UPDATE'){
+ $query = "DELETE FROM $_ WHERE row_id = ?";
+ my $sth = $dbh->prepare($query);
+ $sth->execute->($self->{"id"."$linenum"})
+ || $self->dberror($query);
+ } elsif ($query_type eq 'INSERT'){
+ $query .= " INTO $_ (";
+ }
+ my $first = 1;
+ for (@{$temphash{$_}}){
+ $query .= "$_";
+ if ($query_type eq 'UPDATE'){
+ $query .= '= ?';
+ }
+ $ins_values .= "?, ";
+ $query .= ", ";
+ $first = 0;
+ if ($query_type eq 'UPDATE' or $query_type eq 'INSERT'){
+ push @data, $self->{"$_$linenum"};
+ }
+ }
+ if ($query_type ne 'INSERT'){
+ $query =~ s/, $//;
+ }
+ if ($query_type eq 'SELECT'){
+ $query .= " FROM $_";
+ }
+ if ($query_type eq 'SELECT' or $query_type eq 'UPDATE'){
+ $query .= " WHERE row_id = ?";
+ }
+ if ($query_type eq 'INSERT'){
+ $query .= " row_id) VALUES ($ins_values ?)";
+ }
+ if ($query_type eq 'SELECT'){
+ push @rc, [ $query ];
+ } else {
+ unshift (@data, $query);
+ push @rc, [ @data ];
+ }
+ }
+ if ($query_type eq 'INSERT'){
+ for (@rc){
+ $query = shift (@{$_});
+ $sth = $dbh->prepare($query)
+ || $self->db_error($query);
+ $sth->execute(@{$_}, $self->{id})
+ || $self->dberror($query);;
+ $sth->finish;
+ $did_insert = 1;
+ }
+ } elsif ($query_type eq 'UPDATE'){
+ @rc = $self->run_custom_queries(
+ $tablename, 'INSERT', $linenum);
+ } elsif ($query_type eq 'SELECT'){
+ for (@rc){
+ $query = shift @{$_};
+ $sth = $self->{dbh}->prepare($query);
+ $sth->execute($self->{id});
+ $ref = $sth->fetchrow_hashref(NAME_lc);
+ for (keys %{$ref}){
+ $self->{$_} = $ref->{$_};
+ }
+ }
+ }
+ @rc;
+}
+
+
1;