diff options
Diffstat (limited to 'LedgerSMB/DBObject.pm')
-rw-r--r-- | LedgerSMB/DBObject.pm | 70 |
1 files changed, 56 insertions, 14 deletions
diff --git a/LedgerSMB/DBObject.pm b/LedgerSMB/DBObject.pm index f3094dff..d50c300c 100644 --- a/LedgerSMB/DBObject.pm +++ b/LedgerSMB/DBObject.pm @@ -50,17 +50,24 @@ sub AUTOLOAD { 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 $mode = $args{copy}; - my @mergelist = @{$args{merge}}; + my $args = shift @_; + my $base = $args->{base}; + my $mode = $args->{copy}; my $self = bless {}, $class; + my @mergelist; + if (defined $args->{merge}){ + @mergelist = @{$args->{merge}}; + } elsif (defined $mode && ( $mode eq 'list')) { + $self->error('Mergelist not set'); + } + else { + @mergelist = []; + } if ( !$base->isa('LedgerSMB') ) { $self->error("Constructor called without LedgerSMB object arg"); } @@ -93,19 +100,23 @@ sub exec_method { my $self = shift @_; my %args = @_; my $funcname = $args{funcname}; - my @in_args = @{ $args{args} }; + my @in_args; + @in_args = @{ $args{args}} if $args{args}; my @call_args; - my $query = "SELECT proname, proargnames FROM pg_proc WHERE proname = ?"; + my $query = "SELECT proname, pronargs, 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; - + my @proc_args; + $ref->{pronargs} = 0 unless defined $ref->{pronargs}; + if ($ref->{pronargs}){ + $args =~ s/\{(.*)\}/$1/; + @proc_args = split /,/, $args if $args; + } if ( !$ref ) { # no such function $self->error( "No such function: ", $funcname ); die; @@ -119,10 +130,10 @@ sub exec_method { } } } - else { - @call_args = @_; - } - $self->call_procedure( procname => $funcname, args => \@call_args ); + for (@in_args) { push @call_args, $_ } ; + $self->{call_args} = \@call_args; + $self->debug({file => '/tmp/dbobject'}); + $self->call_procedure( procname => $funcname, args => @call_args ); } sub run_custom_queries { @@ -224,4 +235,35 @@ sub run_custom_queries { @rc; } +sub _parse_array { + my ($self, $value) = @_; + my $next; + my $separator; + my @return_array; + + while ($value ne '{}') { + my $next = ""; + my $separator = ""; + if ($value =~ /^\{"/){ + while ($next eq "" or ($next =~ /\\".$/)){ + $value =~ s/^\{("[^"]*".)/\{/; + $next .= $1; + $next =~ /(.)$/; + $separator = $1; + } + $next =~ s/"(.*)"$separator$/$1/; + + } else { + $value =~ s/^\{([^,]*)(,|\})/\{/; + $next = $1; + $separator = $2; + } + $value .= '}' if $separator eq '}'; + $next =~ s/\\\\/\\/g; + $next =~ s/\\"/"/g; + push @return_array, $next; + } + return @return_array; +} + 1; |