This is an automated email from the git hooks/post-receive script. jame-guest pushed a commit to branch master in repository libpgobject-simple-perl.
commit 682e95c2ed6100c03d1bd3b3ae2f64033a5ebec3 Author: Robert James Clay <j...@rocasa.us> Date: Mon Apr 14 21:47:43 2014 -0400 Imported Upstream version 1.6 --- Changes | 14 +++++++++++ LICENSE | 23 +++++++++++++++++++ MANIFEST | 4 ++++ MANIFEST.SKIP | 45 ++++++++++++++++++++++++++++++++++++ META.json | 11 ++++----- META.yml | 9 ++++---- META.json => MYMETA.json | 13 +++++------ Makefile.PL | 4 +++- README.md | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ ignore.txt | 1 + lib/PGObject/Simple.pm | 55 ++++++++++++++++++++++++++++++++++---------- t/02-call_procedure.t | 37 ++++++++++++++++++++++++++--- 12 files changed, 242 insertions(+), 34 deletions(-) diff --git a/Changes b/Changes index 964fe8f..c8b3253 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,19 @@ Revision history for PGObject-Simple +1.6 2014-02-24 + 1. Added per class schema handling (overridden by per call handling). + 2. Re-arranged requirements in Makefile.PL + 3. DB tests now use DB_TESTING=1 to set on, consistent with other + PGObject modules + +1.5 2014-02-16 + 1. Added contextual return handling so that db procedure calls can + return either the first row of the set (usually useful where that is + the only row) or the full set. + +1.4 2013-11-12 + 1. Fixed __PACKAGE__->call_dbmethod interface so it works. + 1.3 2013-06-07 1. Fixed test case that caused thins to bomb diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..5de41ee --- /dev/null +++ b/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2013, Chris Travers +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/MANIFEST b/MANIFEST index 6b7d695..f2c26f3 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1,9 +1,13 @@ Changes ignore.txt lib/PGObject/Simple.pm +LICENSE Makefile.PL MANIFEST This list of files +MANIFEST.SKIP +MYMETA.json README +README.md t/00-load.t t/01-constructor.t t/02-call_procedure.t diff --git a/MANIFEST.SKIP b/MANIFEST.SKIP new file mode 100644 index 0000000..f509077 --- /dev/null +++ b/MANIFEST.SKIP @@ -0,0 +1,45 @@ + +#!start included /usr/lib/perl5/5.10/ExtUtils/MANIFEST.SKIP +# Avoid version control files. +\B\.svn\b +\B\.git\b +\B\.gitignore\b +\B\.hg\b + +# Avoid Makemaker generated and utility files. +\bMANIFEST\.bak +\bMakefile$ +\bblib/ +\bMakeMaker-\d +\bpm_to_blib\.ts$ +\bpm_to_blib$ +\bblibdirs\.ts$ # 6.18 through 6.25 generated this + +# Avoid Module::Build generated and utility files. +\bBuild$ +\b_build/ + +# Avoid temp and backup files. +~$ +\.old$ +\#$ +\b\.# +\.bak$ + +# Avoid Devel::Cover files. +\bcover_db\b +#!end included /usr/lib/perl5/5.10/ExtUtils/MANIFEST.SKIP + +^extlib +^Su-.+\.tar\.gz$ +^work +^tmp +\bTAGS$ +^MYMETA.yml$ + +\bSu-[\d\.\_]+ + +\bt_util/ + +Debian_CPANTS.txt +\blib/Su/Procs/ diff --git a/META.json b/META.json index 70126f5..126a018 100644 --- a/META.json +++ b/META.json @@ -4,9 +4,9 @@ "Chris Travers <chris.trav...@gmail.com>" ], "dynamic_config" : 1, - "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.120921", + "generated_by" : "ExtUtils::MakeMaker version 6.6302, CPAN::Meta::Converter version 2.120921", "license" : [ - "perl_5" + "bsd" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", @@ -22,7 +22,7 @@ "prereqs" : { "build" : { "requires" : { - "ExtUtils::MakeMaker" : "0" + "Test::More" : "0" } }, "configure" : { @@ -32,11 +32,10 @@ }, "runtime" : { "requires" : { - "PGObject" : "1.1", - "Test::More" : "0" + "PGObject" : "1.1" } } }, "release_status" : "stable", - "version" : "1.3" + "version" : "1.6" } diff --git a/META.yml b/META.yml index 9a21a4f..9bfc7f4 100644 --- a/META.yml +++ b/META.yml @@ -3,12 +3,12 @@ abstract: "Minimalist stored procedure mapper based on LedgerSMB's DBObject" author: - 'Chris Travers <chris.trav...@gmail.com>' build_requires: - ExtUtils::MakeMaker: 0 + Test::More: 0 configure_requires: ExtUtils::MakeMaker: 0 dynamic_config: 1 -generated_by: 'ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.120921' -license: perl +generated_by: 'ExtUtils::MakeMaker version 6.6302, CPAN::Meta::Converter version 2.120921' +license: bsd meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 @@ -19,5 +19,4 @@ no_index: - inc requires: PGObject: 1.1 - Test::More: 0 -version: 1.3 +version: 1.6 diff --git a/META.json b/MYMETA.json similarity index 75% copy from META.json copy to MYMETA.json index 70126f5..0b1b82a 100644 --- a/META.json +++ b/MYMETA.json @@ -3,10 +3,10 @@ "author" : [ "Chris Travers <chris.trav...@gmail.com>" ], - "dynamic_config" : 1, - "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.120921", + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.6302, CPAN::Meta::Converter version 2.120921", "license" : [ - "perl_5" + "bsd" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", @@ -22,7 +22,7 @@ "prereqs" : { "build" : { "requires" : { - "ExtUtils::MakeMaker" : "0" + "Test::More" : "0" } }, "configure" : { @@ -32,11 +32,10 @@ }, "runtime" : { "requires" : { - "PGObject" : "1.1", - "Test::More" : "0" + "PGObject" : "1.1" } } }, "release_status" : "stable", - "version" : "1.3" + "version" : "1.6" } diff --git a/Makefile.PL b/Makefile.PL index 6508acd..d51c863 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -9,11 +9,13 @@ WriteMakefile( VERSION_FROM => 'lib/PGObject/Simple.pm', ABSTRACT_FROM => 'lib/PGObject/Simple.pm', ($ExtUtils::MakeMaker::VERSION >= 6.3002 - ? ('LICENSE'=> 'perl') + ? ('LICENSE'=> 'BSD') : ()), PL_FILES => {}, PREREQ_PM => { 'PGObject' => 1.1, + }, + BUILD_REQUIRES => { 'Test::More' => 0, }, dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', }, diff --git a/README.md b/README.md new file mode 100644 index 0000000..566ae5f --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ +PGObject-Simple + +PBObject::Simple is a minimalist framework for mapping stored procedures in +PostgreSQL to object methods. The framework is truly minimalist and hence the +"Simple" designation (in fact the module contains less than 50 lines of code, +and the code is dwarfed by both POD and test cases). +It is intended to be of use for developers wishing for such a minimalist +framework and those who may want to have a reference for how to build such a +mapping framework themselves. + +The framework lends itself to a few specific antipatterns. Objects can become +ill-formed, overly nebulous, or the like. It is thus very important when using +this for actual development to ensure that acceptable data structures are well +documented and that these are adhered to. + +This module is based on a simple idea, namely that stored procedures can tell +application classes how to call them. See the POD for specific information and +guidelines. + +INSTALLATION + +To install this module, run the following commands: + + perl Makefile.PL + make + make test + make install + +SUPPORT AND DOCUMENTATION + +After installing, you can find documentation for this module with the +perldoc command. + + perldoc PGObject::Simple + +You can also look for information at: + + RT, CPAN's request tracker (report bugs here) + http://rt.cpan.org/NoAuth/Bugs.html?Dist=PGObject-Simple + + AnnoCPAN, Annotated CPAN documentation + http://annocpan.org/dist/PGObject-Simple + + CPAN Ratings + http://cpanratings.perl.org/d/PGObject-Simple + + Search CPAN + http://search.cpan.org/dist/PGObject-Simple/ + + +LICENSE AND COPYRIGHT + +Copyright (C) 2013 Chris Travers + +This program is free software; you can redistribute it and/or modify it +under the terms of either: the GNU General Public License as published +by the Free Software Foundation; or the Artistic License. + +See http://dev.perl.org/licenses/ for more information. + diff --git a/ignore.txt b/ignore.txt index fffd222..bd1ad6f 100644 --- a/ignore.txt +++ b/ignore.txt @@ -10,3 +10,4 @@ pm_to_blib* cover_db pod2htm*.tmp PGObject-Simple-* +.git* diff --git a/lib/PGObject/Simple.pm b/lib/PGObject/Simple.pm index c575e95..b5c51fb 100644 --- a/lib/PGObject/Simple.pm +++ b/lib/PGObject/Simple.pm @@ -12,11 +12,11 @@ PGObject::Simple - Minimalist stored procedure mapper based on LedgerSMB's DBObj =head1 VERSION -Version 1.3 +Version 1.6 =cut -our $VERSION = '1.3'; +our $VERSION = '1.6'; =head1 SYNOPSIS @@ -133,6 +133,19 @@ sub _set_funcprefix { $self->{_func_prefix} = $funcprefix; } +=head2 _set_funcschema + +This sets the default funcschema for future calls. This is overwridden by +per-call arguments, (PGObject::Util::DBMethod provides for such overrides on a +per-method basis). + +=cut + +sub _set_funcschema { + my ($self, $funcschema) = @_; + $self->{_func_schema} = $funcschema; +} + =head2 _set_registry This sets the registry for future calls. The idea here is that this allows for @@ -155,24 +168,30 @@ object property. The $args{args} hashref can be used to override arguments by name. Unknown properties are handled simply by passing a NULL in, so the stored procedures should be prepared to handle these. +As with call_procedure below, this returns a single hashref when called in a +scalar context, and a list of hashrefs when called in a list context. + =cut sub call_dbmethod { my ($self) = shift @_; my %args = @_; croak 'No function name provided' unless $args{funcname}; - $args{dbh} = $self->{_DBH} if $self->{_DBH} and !$args{dbh}; + if (eval { $self->isa(__PACKAGE__) } and ref $self){ + $args{dbh} = $self->{_DBH} if $self->{_DBH} and !$args{dbh}; - $args{funcprefix} = $self->{_func_prefix} if !defined $args{funcprefix}; + $args{funcprefix} = $self->{_func_prefix} if !defined $args{funcprefix}; + $args{funcschema} = $self->{_func_schema} if !defined $args{funcschema}; + } $args{funcprefix} ||= ''; my $info = PGObject->function_info(%args); my $dbargs = []; for my $arg (@{$info->{args}}){ $arg->{name} =~ s/^in_//; - my $db_arg = $self->{$arg->{name}}; + my $db_arg = $self->{$arg->{name}} if ref $self; if ($args{args}->{$arg->{name}}){ - $db_arg = $args{args}->{$arg->{name}}; + $db_arg = $args{args}->{$arg->{name}}; } if (eval {$db_arg->can('to_db')}){ $db_arg = $db_arg->to_db; @@ -183,7 +202,10 @@ sub call_dbmethod { push @$dbargs, $db_arg; } $args{args} = $dbargs; - return $self->call_procedure(%args); + # The conditional return is necessary since the object may carry a registry + # --CT + return $self->call_procedure(%args) if ref $self; + return __PACKAGE__->call_procedure(%args); } =head2 call_procedure @@ -193,19 +215,28 @@ passes the currently attached db connection in. We use the previously set funcprefix and dbh by default but other values can be passed in to override the default object's values. +This returns a single hashref when called in a scalar context, and a list of +hashrefs when called in a list context. When called in a scalar context it +simply returns the single first row returned. + =cut sub call_procedure { my ($self) = shift @_; my %args = @_; - $args{funcprefix} = $self->{_func_prefix} if !defined $args{funcprefix}; - $args{funcprefix} ||= ''; - $args{registry} = $self->{_registry} if !defined $args{registry}; + if (eval { $self->isa(__PACKAGE__) } and ref $self ){ + $args{funcprefix} = $self->{_func_prefix} if !defined $args{funcprefix}; + $args{funcschema} = $self->{_func_schema} if !defined $args{funcschema}; + $args{registry} = $self->{_registry} if !defined $args{registry}; - $args{dbh} = $self->{_DBH} if $self->{_DBH} and !$args{dbh}; + $args{dbh} = $self->{_DBH} if $self->{_DBH} and !$args{dbh}; + } + $args{funcprefix} ||= ''; croak 'No DB handle provided' unless $args{dbh}; - PGObject->call_procedure(%args); + my @rows = PGObject->call_procedure(%args); + return shift @rows unless wantarray; + return @rows; } =head1 WRITING CLASSES WITH PGObject::Simple diff --git a/t/02-call_procedure.t b/t/02-call_procedure.t index 0c72495..e47da4a 100644 --- a/t/02-call_procedure.t +++ b/t/02-call_procedure.t @@ -9,8 +9,8 @@ my %hash = ( id => '33', ); -plan skip_all => 'Not set up for db tests' unless $ENV{TEST_DB}; -plan tests => 6; +plan skip_all => 'Not set up for db tests' unless $ENV{DB_TESTING}; +plan tests => 9; my $dbh1 = DBI->connect('dbi:Pg:dbname=postgres', 'postgres'); $dbh1->do('CREATE DATABASE pgobject_test_db') if $dbh1; @@ -23,10 +23,19 @@ $dbh->do(' $$; ') if $dbh; +$dbh->do('CREATE SCHEMA test;'); + +$dbh->do(' + CREATE FUNCTION test.foobar (in_foo text, in_bar text, in_baz int, in_id int) + RETURNS int language sql as $$ + SELECT 2 * (char_length($1) + char_length($2) + $3 * $4); + $$; +') if $dbh; + my $answer = 72; SKIP: { - skip 'No database connection', 6 unless $dbh; + skip 'No database connection', 8 unless $dbh; my $obj = PGObject::Simple->new(%hash); $obj->set_dbh($dbh); my ($ref) = $obj->call_procedure( @@ -35,6 +44,14 @@ SKIP: { ); is ($ref->{foobar}, 159, 'Correct value returned, call_procedure'); + ($ref) = PGObject::Simple->call_procedure( + dbh => $dbh, + funcname => 'foobar', + args => ['text', 'text2', '5', '30'] + ); + is ($ref->{foobar}, 159, 'Correct value returned, call_procedure, package invocation'); + + ($ref) = $obj->call_procedure( funcname => 'foobar', funcschema => 'public', @@ -48,6 +65,13 @@ SKIP: { ); is ($ref->{foobar}, $answer, 'Correct value returned, call_dbmethod'); + ($ref) = PGObject::Simple->call_dbmethod( + funcname => 'foobar', + args => \%hash, + dbh => $dbh, + ); + is ($ref->{foobar}, $answer, 'Correct value returned, call_dbmethod'); + ($ref) = $obj->call_dbmethod( funcname => 'foobar', @@ -68,6 +92,13 @@ SKIP: { ); is ($ref->{foobar}, 14, 'Correct value returned, call_dbmethod w/exp. pre.'); + $obj->_set_funcschema('test'); + $obj->_set_funcprefix(''); + ($ref) = $obj->call_dbmethod( + funcname => 'foobar' + ); + + is ($ref->{foobar}, $answer * 2, 'Correct value returned, call_dbmethod'); } $dbh->disconnect if $dbh; -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libpgobject-simple-perl.git _______________________________________________ Pkg-perl-cvs-commits mailing list Pkg-perl-cvs-commits@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-perl-cvs-commits