summaryrefslogtreecommitdiff
path: root/LedgerSMB
diff options
context:
space:
mode:
authoreinhverfr <einhverfr@4979c152-3d1c-0410-bac9-87ea11338e46>2007-03-07 21:28:19 +0000
committereinhverfr <einhverfr@4979c152-3d1c-0410-bac9-87ea11338e46>2007-03-07 21:28:19 +0000
commitf02f244549e2806ca03f2899d1193055ad19d544 (patch)
treece3d0cbbd4fee6fa89a17a106f9eefd3e6bcc5de /LedgerSMB
parent3a1283ded34845438a3c11b1fb9543dd7166a98d (diff)
First draft of DBObject and LedgerSMB namespace
git-svn-id: https://ledger-smb.svn.sourceforge.net/svnroot/ledger-smb/trunk@858 4979c152-3d1c-0410-bac9-87ea11338e46
Diffstat (limited to 'LedgerSMB')
-rw-r--r--LedgerSMB/DBObject.pm69
1 files changed, 69 insertions, 0 deletions
diff --git a/LedgerSMB/DBObject.pm b/LedgerSMB/DBObject.pm
new file mode 100644
index 00000000..fed0a8e6
--- /dev/null
+++ b/LedgerSMB/DBObject.pm
@@ -0,0 +1,69 @@
+=head1 NAME
+
+LedgerSMB::DBObject - LedgerSMB class for building objects from db relations
+
+=head1 SYOPSIS
+
+This module creates object instances based on LedgerSMB's in-database ORM.
+
+=head1 METHODS
+
+Most methods are dynamically created. The following methods are static, however.
+
+=item make_object hashref, string,
+
+This creates a new data object instance based on information in the PostgreSQL
+catalogs.
+
+=back
+
+=cut
+
+use LedgerSMB;
+package LedgerSMB::DBObject;
+use strict;
+no strict 'refs';
+use warnings;
+
+sub make_object {
+ my ($request, $name, $package_name) = @_;
+ my $self = {};
+ $self->{__dbh} = $request->{dbh};
+ $self->{__name} = $name;
+ $self->{__methods} = [];
+
+ my $query =
+ "SELECT proname, proargnames FROM pg_proc
+ WHERE proname ilike ?";
+ my $sth = $self->{__dbh}->prepare($query);
+ $sth->execute("$name".'_%');
+ my $ref;
+
+ while ($ref = $sth->fetchrow_hashref(NAME_lc)){
+ my $m_name = $ref->{proname};
+ my $args = $ref->{proargnames};
+ my $subcode
+ if ($m_name ~= s/$name\_//){
+ push @{$self->{__methods}}, $m_name;
+ if ($args){
+ $subcode = "sub {
+ LedgerSMB::callproc($self->{proname}"
+ for $arg (@$args){
+ if ($arg =~ s/in_//){
+ $subcode .= ", \$self->{$arg}";
+ }
+ }
+ $subcode .= "); }"
+ *{$package_name . "::" . $m_name}
+ = eval $subcode;
+
+ }
+ else {
+ $subcode = "sub {
+ LedgerSMB::callproc($self->{proname}, ".
+ "\@_); }"
+ }
+ }
+ *{$package_name . "::" . $m_name} = eval $subcode;
+ }
+}