#!/usr/bin/perl # # $Header: /Users/claude/fuzz/lib/Genezzo/Row/RCS/RSDual.pm,v 7.1 2005/07/19 07:49:03 claude Exp claude $ # # copyright (c) 2005 Jeffrey I Cohen, all rights reserved, worldwide # # use strict; use warnings; package Genezzo::Row::RSDual; use Genezzo::Util; use Genezzo::PushHash::PushHash; use Genezzo::PushHash::PHArray; use Carp; use warnings::register; our @ISA = "Genezzo::PushHash::PushHash" ; our $GZERR = sub { my %args = (@_); return unless (exists($args{msg})); if (exists($args{self})) { my $self = $args{self}; if (defined($self) && exists($self->{GZERR})) { my $err_cb = $self->{GZERR}; return &$err_cb(%args); } } my $warn = 0; if (exists($args{severity})) { my $sev = uc($args{severity}); $sev = 'WARNING' if ($sev =~ m/warn/i); # don't print 'INFO' prefix if ($args{severity} !~ m/info/i) { printf ("%s: ", $sev); $warn = 1; } } # XXX XXX XXX print __PACKAGE__, ": ", $args{msg}; # print $args{msg}; # carp $args{msg} # if (warnings::enabled() && $warn); }; sub _init { # whoami; #greet @_; my $self = shift; my %required = ( # rs => "no rowsource!" ); my %args = (@_); return 0 unless (Validate(\%args, \%required)); # $self->{rs} = $args{rs}; my %one_row; $self->{rs} = tie %one_row, 'Genezzo::PushHash::PHArray'; $self->{rs}->HPush("a"); if (defined($args{select_list})) { # greet $args{select_list}; $self->{select_list} = $args{select_list}; } return 1; } sub TIEHASH { #sub new # greet @_; # whoami; my $invocant = shift; my $class = ref($invocant) || $invocant ; # my $self = $class->SUPER::TIEHASH(@_); my $self = {}; my %args = (@_); return undef unless (_init($self,%args)); if ((exists($args{GZERR})) && (defined($args{GZERR})) && (length($args{GZERR}))) { # NOTE: don't supply our GZERR here - will get # recursive failure... $self->{GZERR} = $args{GZERR}; } return bless $self, $class; } # end new # HPush public method (not part of standard hash) sub HPush { my $self = shift; my $rs = $self->{rs}; # whoami; # return ($rs->HPush(@_)); return undef; } sub HCount { my $self = shift; my $rs = $self->{rs}; whoami; return ($rs->HCount(@_)); } # standard hash methods follow sub STORE { my $self = shift; my $rs = $self->{rs}; whoami; # return ($rs->STORE(@_)); return undef; } sub FETCH { my $self = shift; my $rs = $self->{rs}; whoami; return ($rs->FETCH(@_)); } sub FIRSTKEY { my $self = shift; my $rs = $self->{rs}; whoami; return ($rs->FIRSTKEY(@_)); } sub NEXTKEY { my $self = shift; my $rs = $self->{rs}; whoami; return ($rs->NEXTKEY(@_)); } sub EXISTS { my $self = shift; my $rs = $self->{rs}; # whoami; return ($rs->EXISTS(@_)); } sub DELETE { my $self = shift; my $rs = $self->{rs}; # whoami; # return ($rs->DELETE(@_)); return undef; } sub CLEAR { my $self = shift; my $rs = $self->{rs}; # whoami; # return ($rs->CLEAR(@_)); return undef; } sub AUTOLOAD { my $self = shift; my $rs = $self->{rs}; our $AUTOLOAD; my $newfunc = $AUTOLOAD; $newfunc =~ s/.*:://; return if $newfunc eq 'DESTROY'; # greet $newfunc; return ($rs->$newfunc(@_)); } sub SQLPrepare # get a DBI-style statement handle { my $self = shift; my %args = @_; $args{pushhash} = $self; $args{rs} = $self->{rs}; if ((exists($self->{GZERR})) && (defined($self->{GZERR}))) { $args{GZERR} = $self->{GZERR}; } my $sth = Genezzo::Row::SQL_RSDual->new(%args); return $sth; } package Genezzo::Row::SQL_RSDual; use strict; use warnings; use Genezzo::Util; sub _init { my $self = shift; my %args = (@_); return 0 unless (defined($args{pushhash})); $self->{pushhash} = $args{pushhash}; return 0 unless (defined($args{rs})); my $rs = $args{rs}; if (defined($args{select_list})) { # greet $args{select_list}; $self->{select_list} = $args{select_list}; } $self->{rownum} = 0; $self->{use_select_list} = $args{use_select_list}; return 1; } sub new { # whoami; my $invocant = shift; my $class = ref($invocant) || $invocant ; my $self = { }; my %args = (@_); if ((exists($args{GZERR})) && (defined($args{GZERR})) && (length($args{GZERR}))) { # NOTE: don't supply our GZERR here - will get # recursive failure... $self->{GZERR} = $args{GZERR}; } return undef unless (_init($self,%args)); return bless $self, $class; } # end new # SQL-style execute and fetch functions sub SQLExecute { my ($self, $filter) = @_; $self->{SQLFetchKey} = $self->{pushhash}->FIRSTKEY(); greet $self; return (1); } sub SQLFetch { my $self = shift; whoami ; while (defined($self->{SQLFetchKey})) { my $currkey = $self->{SQLFetchKey}; my $outarr = $self->{pushhash}->FETCH($currkey); # save the value of the key because we pre-advance to the next one $self->{SQLFetchKey} = $self->{pushhash}->NEXTKEY($currkey); greet $currkey, $self->{SQLFetchKey}; $self->{rownum} += 1; # Note: always return the rid return ($currkey, $outarr); } return undef; } sub AUTOLOAD { my $self = shift; my $rs = $self->{sql_rs}; our $AUTOLOAD; my $newfunc = $AUTOLOAD; $newfunc =~ s/.*:://; return if $newfunc eq 'DESTROY'; # greet $newfunc; return ($rs->$newfunc(@_)); } END { } if (0) { my %foo; my $tv = tie %foo, 'Genezzo::Row::RSDual'; my $sth = $tv->SQLPrepare(); #greet $sth; greet $sth->SQLExecute(); my @foo = $sth->SQLFetch(); #greet @foo; while (scalar(@foo) > 1) { print join(" ", @foo), "\n"; @foo = $sth->SQLFetch(); } } 1; __END__ # Below is stub documentation for your module. You better edit it! =head1 NAME Genezzo::Row::RSDual - Row Source Dual (single row) table =head1 SYNOPSIS =head1 DESCRIPTION =head1 ARGUMENTS =head1 FUNCTIONS =head2 EXPORT =head1 LIMITATIONS various =head1 #TODO =over 4 =back =head1 AUTHOR Jeffrey I. Cohen, jcohen@genezzo.com =head1 SEE ALSO L. Copyright (c) 2005 Jeffrey I Cohen. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Address bug reports and comments to: jcohen@genezzo.com For more information, please visit the Genezzo homepage at L =cut