Database-facing routines for the PGObject OO/PostgreSQL interfaces in perl
Perl 6 Perl
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
lib
t
.travis.yml
Changes
LICENSE
MANIFEST
MANIFEST.SKIP
Makefile.PL
README
README.md
ignore.txt

README.md

PGObject

PGObject is a module intended to be a base for object class frameworks which map PostgreSQL stored procedures to object methods in a relatively loosely coupled way. PGObject provides the bare-bones infrastructure required to make it happen. This module is primarily of interest to individuals writing such frameworks, and very little in here is likely to be used directly outside of such frameworks.

The initial release, 1.0.0 is based on our six years of experience using essentially the same approach in LedgerSMB (starting with the beginnings of the 1.3 codebase in 2007). This release is largely based on the code I wrote for LedgerSMB but it cleans up and refactors such work based on the lessons learned.

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

You can also look for information at:

RT, CPAN's request tracker (report bugs here)
    http://rt.cpan.org/NoAuth/Bugs.html?Dist=PGObject

AnnoCPAN, Annotated CPAN documentation
    http://annocpan.org/dist/PGObject

CPAN Ratings
    http://cpanratings.perl.org/d/PGObject

Search CPAN
    http://search.cpan.org/dist/PGObject/

WRITING PGOBJECT-AWARE PERL CLASSES

One of the powerful features of PGObject is the ability to declare methods in types which can be dynamically detected and used to serialize data for query purposes. Objects which contain a pgobject_to_db(), that method will be called and the return value used in place of the object. This can allow arbitrary types to serialize themselves in arbitrary ways.

For example a date object could be set up with such a method which would export a string in yyyy-mm-dd format. An object could look up its own definition and return something like :

{ cast => 'dbtypename', value => '("A","List","Of","Properties")'}

If a scalar is returned that is used as the serialized value. If a hashref is returned, it must follow the type format:

type => variable binding type, cast => db cast type value => literal representation of type, as intelligible by DBD::Pg

WRITING TOP-HALF OBJECT FRAMEWORKS FOR PGOBJECT

PGObject is intended to be the database-facing side of a framework for objects. The intended structure is for three tiers of logic:

  1. Database facing, low-level API's
  2. Object management modules
  3. Application handlers with things like database connection management.

By top half, we are referring to the second tier. The third tier exists in the client application.

The PGObject module provides only low-level API's in that first tier. The job of this module is to provide database function information to the upper level modules.

We do not supply type information, If your top-level module needs this, please check out https://code.google.com/p/typeutils/ which could then be used via our function mapping APIs here.

LICENSE AND COPYRIGHT

Copyright (C) 2013 Chris Travers

Redistribution and use in source and compiled forms with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code (Perl) must retain the above copyright notice, this list of conditions and the following disclaimer as the first lines of this file unmodified.

  • Redistributions in compiled form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the source code, documentation, and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) "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 AUTHOR(S) 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.