<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">{
    package DBD::NullP;

    require DBI;
    require Carp;

    @EXPORT = qw(); # Do NOT @EXPORT anything.
    $VERSION = sprintf("12.%06d", q$Revision: 14714 $ =~ /(\d+)/o);

#   $Id: NullP.pm 14714 2011-02-22 17:27:07Z timbo $
#
#   Copyright (c) 1994-2007 Tim Bunce
#
#   You may distribute under the terms of either the GNU General Public
#   License or the Artistic License, as specified in the Perl README file.

    $drh = undef;	# holds driver handle once initialised

    sub driver{
	return $drh if $drh;
	my($class, $attr) = @_;
	$class .= "::dr";
	($drh) = DBI::_new_drh($class, {
	    'Name' =&gt; 'NullP',
	    'Version' =&gt; $VERSION,
	    'Attribution' =&gt; 'DBD Example Null Perl stub by Tim Bunce',
	    }, [ qw'example implementors private data']);
	$drh;
    }

    sub CLONE {
        undef $drh;
    }
}


{   package DBD::NullP::dr; # ====== DRIVER ======
    $imp_data_size = 0;
    use strict;

    sub connect { # normally overridden, but a handy default
        my $dbh = shift-&gt;SUPER::connect(@_)
            or return;
        $dbh-&gt;STORE(Active =&gt; 1); 
        $dbh;
    }


    sub DESTROY { undef }
}


{   package DBD::NullP::db; # ====== DATABASE ======
    $imp_data_size = 0;
    use strict;
    use Carp qw(croak);

    sub prepare {
	my ($dbh, $statement)= @_;

	my ($outer, $sth) = DBI::_new_sth($dbh, {
	    'Statement'     =&gt; $statement,
        });

	return $outer;
    }

    sub FETCH {
	my ($dbh, $attrib) = @_;
	# In reality this would interrogate the database engine to
	# either return dynamic values that cannot be precomputed
	# or fetch and cache attribute values too expensive to prefetch.
	return $dbh-&gt;SUPER::FETCH($attrib);
    }

    sub STORE {
	my ($dbh, $attrib, $value) = @_;
	# would normally validate and only store known attributes
	# else pass up to DBI to handle
	if ($attrib eq 'AutoCommit') {
	    Carp::croak("Can't disable AutoCommit") unless $value;
            # convert AutoCommit values to magic ones to let DBI
            # know that the driver has 'handled' the AutoCommit attribute
            $value = ($value) ? -901 : -900;
	}
	return $dbh-&gt;SUPER::STORE($attrib, $value);
    }

    sub ping { 1 }

    sub disconnect {
	shift-&gt;STORE(Active =&gt; 0);
    }

}


{   package DBD::NullP::st; # ====== STATEMENT ======
    $imp_data_size = 0;
    use strict;

    sub bind_param {
        my ($sth, $param, $value, $attr) = @_;
        $sth-&gt;{ParamValues}{$param} = $value;
        $sth-&gt;{ParamAttr}{$param}   = $attr
            if defined $attr; # attr is sticky if not explicitly set
        return 1;
    }       

    sub execute {
	my $sth = shift;
        $sth-&gt;bind_param($_, $_[$_-1]) for (1..@_);
        if ($sth-&gt;{Statement} =~ m/^ \s* SELECT \s+/xmsi) {
            $sth-&gt;STORE(NUM_OF_FIELDS =&gt; 1); 
            $sth-&gt;{NAME} = [ "fieldname" ];
            # just for the sake of returning something, we return the params
            my $params = $sth-&gt;{ParamValues} || {};
            $sth-&gt;{dbd_nullp_data} = [ @{$params}{ sort keys %$params } ];
            $sth-&gt;STORE(Active =&gt; 1); 
        }
        # force a sleep - handy for testing
        elsif ($sth-&gt;{Statement} =~ m/^ \s* SLEEP \s+ (\S+) /xmsi) {
            my $secs = $1;
            if (eval { require Time::HiRes; defined &amp;Time::HiRes::sleep }) {
                Time::HiRes::sleep($secs);
            }
            else {
                sleep $secs;
            }
        }
        # force an error - handy for testing
        elsif ($sth-&gt;{Statement} =~ m/^ \s* ERROR \s+ (\d+) \s* (.*) /xmsi) {
            return $sth-&gt;set_err($1, $2);
        }
        # anything else is silently ignored, sucessfully
	1;
    }

    sub fetchrow_arrayref {
	my $sth = shift;
	my $data = $sth-&gt;{dbd_nullp_data};
        if (!$data || !@$data) {
            $sth-&gt;finish;     # no more data so finish
            return undef;
	}
        return $sth-&gt;_set_fbav(shift @$data);
    }
    *fetch = \&amp;fetchrow_arrayref; # alias

    sub FETCH {
	my ($sth, $attrib) = @_;
	# would normally validate and only fetch known attributes
	# else pass up to DBI to handle
	return $sth-&gt;SUPER::FETCH($attrib);
    }

    sub STORE {
	my ($sth, $attrib, $value) = @_;
	# would normally validate and only store known attributes
	# else pass up to DBI to handle
	return $sth-&gt;SUPER::STORE($attrib, $value);
    }

}

1;
</pre></body></html>