diff options
Diffstat (limited to 'LedgerSMB/DBObject.pm')
-rw-r--r-- | LedgerSMB/DBObject.pm | 95 |
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; |