diff options
Diffstat (limited to 'LedgerSMB/DBObject.pm')
-rw-r--r-- | LedgerSMB/DBObject.pm | 294 |
1 files changed, 148 insertions, 146 deletions
diff --git a/LedgerSMB/DBObject.pm b/LedgerSMB/DBObject.pm index 38e96adb..2b4b35da 100644 --- a/LedgerSMB/DBObject.pm +++ b/LedgerSMB/DBObject.pm @@ -1,3 +1,4 @@ + =head1 NAME LedgerSMB::DBObject - LedgerSMB class for building objects from db relations @@ -41,161 +42,162 @@ use warnings; our $AUTOLOAD; sub AUTOLOAD { - my ($self) = shift; - my $type = Scalar::Util::blessed $self; - $type =~ m/::(.*?)$/; - $type = lc $1; - print "Type: $type\n"; - $self->exec_method(procname => "$type" . "_" . $AUTOLOAD, args => \@_); + my ($self) = shift; + my $type = Scalar::Util::blessed $self; + $type =~ m/::(.*?)$/; + $type = lc $1; + print "Type: $type\n"; + $self->exec_method( procname => "$type" . "_" . $AUTOLOAD, args => \@_ ); } sub new { - my $class = shift @_; - my %args = @_; - my $base = $args{base}; - my $self = bless {}, $class; - if (! $base->isa('LedgerSMB')){ - $self->error("Constructor called without LedgerSMB object arg"); - } - - my $attr; - $self->merge($base); - $self; + my $class = shift @_; + my %args = @_; + my $base = $args{base}; + my $self = bless {}, $class; + if ( !$base->isa('LedgerSMB') ) { + $self->error("Constructor called without LedgerSMB object arg"); + } + + my $attr; + $self->merge($base); + $self; } - sub exec_method { - my ($self) = shift @_; - my %args = @_; - my $funcname = $args{funcname}; - my @in_args = @{$args{args}}; - my @call_args; - - my $query = - "SELECT proname, proargnames FROM pg_proc WHERE proname = ?"; - my $sth = $self->{dbh}->prepare($query); - $sth->execute($funcname); - my $ref; - - $ref = $sth->fetchrow_hashref('NAME_lc'); - my $args = $ref->{proargnames}; - $args =~ s/\{(.*)\}/$1/; - my @proc_args = split /,/, $args; - - if (!$ref){ # no such function - $self->error("No such function: ", $funcname); - die; - } - my $m_name = $ref->{proname}; - - - if ($args){ - for my $arg (@proc_args){ - if ($arg =~ s/^in_//){ - push @call_args, $self->{$arg}; - } - } - } - else { - @call_args = @_; - } - $self->call_procedure(procname => $funcname, args => \@call_args); + my ($self) = shift @_; + my %args = @_; + my $funcname = $args{funcname}; + my @in_args = @{ $args{args} }; + my @call_args; + + my $query = "SELECT proname, proargnames FROM pg_proc WHERE proname = ?"; + my $sth = $self->{dbh}->prepare($query); + $sth->execute($funcname); + my $ref; + + $ref = $sth->fetchrow_hashref('NAME_lc'); + my $args = $ref->{proargnames}; + $args =~ s/\{(.*)\}/$1/; + my @proc_args = split /,/, $args; + + if ( !$ref ) { # no such function + $self->error( "No such function: ", $funcname ); + die; + } + my $m_name = $ref->{proname}; + + if ($args) { + for my $arg (@proc_args) { + if ( $arg =~ s/^in_// ) { + push @call_args, $self->{$arg}; + } + } + } + else { + @call_args = @_; + } + $self->call_procedure( procname => $funcname, args => \@call_args ); } sub run_custom_queries { - my ($self, $tablename, $query_type, $linenum) = @_; - my $dbh = $self->{dbh}; - if ($query_type !~ /^(select|insert|update)$/i){ - # Commenting out this next bit until we figure out how the locale object - # will operate. Chris - #$self->error($locale->text( - # "Passed incorrect query type to run_custom_queries." - #)); - } - my @rc; - my %temphash; - my @templist; - my $did_insert; - 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 (@{$_}); - my $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 @{$_}; - my $sth = $self->{dbh}->prepare($query); - $sth->execute($self->{id}); - my $ref = $sth->fetchrow_hashref('NAME_lc'); - $self->merge($ref, keys(%$ref)); - } - } - @rc; + my ( $self, $tablename, $query_type, $linenum ) = @_; + my $dbh = $self->{dbh}; + if ( $query_type !~ /^(select|insert|update)$/i ) { + + # Commenting out this next bit until we figure out how the locale object + # will operate. Chris + #$self->error($locale->text( + # "Passed incorrect query type to run_custom_queries." + #)); + } + my @rc; + my %temphash; + my @templist; + my $did_insert; + 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( @{$_} ); + my $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 @{$_}; + my $sth = $self->{dbh}->prepare($query); + $sth->execute( $self->{id} ); + my $ref = $sth->fetchrow_hashref('NAME_lc'); + $self->merge( $ref, keys(%$ref) ); + } + } + @rc; } - 1; |