summaryrefslogtreecommitdiff
path: root/bdb/perl/BerkeleyDB/BerkeleyDB.pm
diff options
context:
space:
mode:
Diffstat (limited to 'bdb/perl/BerkeleyDB/BerkeleyDB.pm')
-rw-r--r--bdb/perl/BerkeleyDB/BerkeleyDB.pm1506
1 files changed, 0 insertions, 1506 deletions
diff --git a/bdb/perl/BerkeleyDB/BerkeleyDB.pm b/bdb/perl/BerkeleyDB/BerkeleyDB.pm
deleted file mode 100644
index c56390ba71f..00000000000
--- a/bdb/perl/BerkeleyDB/BerkeleyDB.pm
+++ /dev/null
@@ -1,1506 +0,0 @@
-
-package BerkeleyDB;
-
-
-# Copyright (c) 1997-2002 Paul Marquess. All rights reserved.
-# This program is free software; you can redistribute it and/or
-# modify it under the same terms as Perl itself.
-#
-
-# The documentation for this module is at the bottom of this file,
-# after the line __END__.
-
-BEGIN { require 5.004_04 }
-
-use strict;
-use Carp;
-use vars qw($VERSION @ISA @EXPORT $AUTOLOAD
- $use_XSLoader);
-
-$VERSION = '0.20';
-
-require Exporter;
-#require DynaLoader;
-require AutoLoader;
-
-BEGIN {
- $use_XSLoader = 1 ;
- { local $SIG{__DIE__} ; eval { require XSLoader } ; }
-
- if ($@) {
- $use_XSLoader = 0 ;
- require DynaLoader;
- @ISA = qw(DynaLoader);
- }
-}
-
-@ISA = qw(Exporter DynaLoader);
-# Items to export into callers namespace by default. Note: do not export
-# names by default without a very good reason. Use EXPORT_OK instead.
-# Do not simply export all your public functions/methods/constants.
-
-# NOTE -- Do not add to @EXPORT directly. It is written by mkconsts
-@EXPORT = qw(
- DB_AFTER
- DB_AGGRESSIVE
- DB_ALREADY_ABORTED
- DB_APPEND
- DB_APPLY_LOGREG
- DB_APP_INIT
- DB_ARCH_ABS
- DB_ARCH_DATA
- DB_ARCH_LOG
- DB_AUTO_COMMIT
- DB_BEFORE
- DB_BROADCAST_EID
- DB_BTREE
- DB_BTREEMAGIC
- DB_BTREEOLDVER
- DB_BTREEVERSION
- DB_CACHED_COUNTS
- DB_CDB_ALLDB
- DB_CHECKPOINT
- DB_CHKSUM_SHA1
- DB_CLIENT
- DB_CL_WRITER
- DB_COMMIT
- DB_CONSUME
- DB_CONSUME_WAIT
- DB_CREATE
- DB_CURLSN
- DB_CURRENT
- DB_CXX_NO_EXCEPTIONS
- DB_DELETED
- DB_DELIMITER
- DB_DIRECT
- DB_DIRECT_DB
- DB_DIRECT_LOG
- DB_DIRTY_READ
- DB_DONOTINDEX
- DB_DUP
- DB_DUPCURSOR
- DB_DUPSORT
- DB_EID_BROADCAST
- DB_EID_INVALID
- DB_ENCRYPT
- DB_ENCRYPT_AES
- DB_ENV_APPINIT
- DB_ENV_AUTO_COMMIT
- DB_ENV_CDB
- DB_ENV_CDB_ALLDB
- DB_ENV_CREATE
- DB_ENV_DBLOCAL
- DB_ENV_DIRECT_DB
- DB_ENV_DIRECT_LOG
- DB_ENV_FATAL
- DB_ENV_LOCKDOWN
- DB_ENV_LOCKING
- DB_ENV_LOGGING
- DB_ENV_NOLOCKING
- DB_ENV_NOMMAP
- DB_ENV_NOPANIC
- DB_ENV_OPEN_CALLED
- DB_ENV_OVERWRITE
- DB_ENV_PANIC_OK
- DB_ENV_PRIVATE
- DB_ENV_REGION_INIT
- DB_ENV_REP_CLIENT
- DB_ENV_REP_LOGSONLY
- DB_ENV_REP_MASTER
- DB_ENV_RPCCLIENT
- DB_ENV_RPCCLIENT_GIVEN
- DB_ENV_STANDALONE
- DB_ENV_SYSTEM_MEM
- DB_ENV_THREAD
- DB_ENV_TXN
- DB_ENV_TXN_NOSYNC
- DB_ENV_TXN_WRITE_NOSYNC
- DB_ENV_USER_ALLOC
- DB_ENV_YIELDCPU
- DB_EXCL
- DB_EXTENT
- DB_FAST_STAT
- DB_FCNTL_LOCKING
- DB_FILE_ID_LEN
- DB_FIRST
- DB_FIXEDLEN
- DB_FLUSH
- DB_FORCE
- DB_GETREC
- DB_GET_BOTH
- DB_GET_BOTHC
- DB_GET_BOTH_RANGE
- DB_GET_RECNO
- DB_HANDLE_LOCK
- DB_HASH
- DB_HASHMAGIC
- DB_HASHOLDVER
- DB_HASHVERSION
- DB_INCOMPLETE
- DB_INIT_CDB
- DB_INIT_LOCK
- DB_INIT_LOG
- DB_INIT_MPOOL
- DB_INIT_TXN
- DB_INVALID_EID
- DB_JAVA_CALLBACK
- DB_JOINENV
- DB_JOIN_ITEM
- DB_JOIN_NOSORT
- DB_KEYEMPTY
- DB_KEYEXIST
- DB_KEYFIRST
- DB_KEYLAST
- DB_LAST
- DB_LOCKDOWN
- DB_LOCKMAGIC
- DB_LOCKVERSION
- DB_LOCK_CONFLICT
- DB_LOCK_DEADLOCK
- DB_LOCK_DEFAULT
- DB_LOCK_DUMP
- DB_LOCK_EXPIRE
- DB_LOCK_FREE_LOCKER
- DB_LOCK_GET
- DB_LOCK_GET_TIMEOUT
- DB_LOCK_INHERIT
- DB_LOCK_MAXLOCKS
- DB_LOCK_MINLOCKS
- DB_LOCK_MINWRITE
- DB_LOCK_NORUN
- DB_LOCK_NOTEXIST
- DB_LOCK_NOTGRANTED
- DB_LOCK_NOTHELD
- DB_LOCK_NOWAIT
- DB_LOCK_OLDEST
- DB_LOCK_PUT
- DB_LOCK_PUT_ALL
- DB_LOCK_PUT_OBJ
- DB_LOCK_PUT_READ
- DB_LOCK_RANDOM
- DB_LOCK_RECORD
- DB_LOCK_REMOVE
- DB_LOCK_RIW_N
- DB_LOCK_RW_N
- DB_LOCK_SET_TIMEOUT
- DB_LOCK_SWITCH
- DB_LOCK_TIMEOUT
- DB_LOCK_TRADE
- DB_LOCK_UPGRADE
- DB_LOCK_UPGRADE_WRITE
- DB_LOCK_YOUNGEST
- DB_LOGC_BUF_SIZE
- DB_LOGFILEID_INVALID
- DB_LOGMAGIC
- DB_LOGOLDVER
- DB_LOGVERSION
- DB_LOG_DISK
- DB_LOG_LOCKED
- DB_LOG_SILENT_ERR
- DB_MAX_PAGES
- DB_MAX_RECORDS
- DB_MPOOL_CLEAN
- DB_MPOOL_CREATE
- DB_MPOOL_DIRTY
- DB_MPOOL_DISCARD
- DB_MPOOL_EXTENT
- DB_MPOOL_LAST
- DB_MPOOL_NEW
- DB_MPOOL_NEW_GROUP
- DB_MPOOL_PRIVATE
- DB_MULTIPLE
- DB_MULTIPLE_KEY
- DB_MUTEXDEBUG
- DB_MUTEXLOCKS
- DB_NEEDSPLIT
- DB_NEXT
- DB_NEXT_DUP
- DB_NEXT_NODUP
- DB_NOCOPY
- DB_NODUPDATA
- DB_NOLOCKING
- DB_NOMMAP
- DB_NOORDERCHK
- DB_NOOVERWRITE
- DB_NOPANIC
- DB_NORECURSE
- DB_NOSERVER
- DB_NOSERVER_HOME
- DB_NOSERVER_ID
- DB_NOSYNC
- DB_NOTFOUND
- DB_ODDFILESIZE
- DB_OK_BTREE
- DB_OK_HASH
- DB_OK_QUEUE
- DB_OK_RECNO
- DB_OLD_VERSION
- DB_OPEN_CALLED
- DB_OPFLAGS_MASK
- DB_ORDERCHKONLY
- DB_OVERWRITE
- DB_PAD
- DB_PAGEYIELD
- DB_PAGE_LOCK
- DB_PAGE_NOTFOUND
- DB_PANIC_ENVIRONMENT
- DB_PERMANENT
- DB_POSITION
- DB_POSITIONI
- DB_PREV
- DB_PREV_NODUP
- DB_PRINTABLE
- DB_PRIORITY_DEFAULT
- DB_PRIORITY_HIGH
- DB_PRIORITY_LOW
- DB_PRIORITY_VERY_HIGH
- DB_PRIORITY_VERY_LOW
- DB_PRIVATE
- DB_PR_HEADERS
- DB_PR_PAGE
- DB_PR_RECOVERYTEST
- DB_QAMMAGIC
- DB_QAMOLDVER
- DB_QAMVERSION
- DB_QUEUE
- DB_RDONLY
- DB_RDWRMASTER
- DB_RECNO
- DB_RECNUM
- DB_RECORDCOUNT
- DB_RECORD_LOCK
- DB_RECOVER
- DB_RECOVER_FATAL
- DB_REGION_ANON
- DB_REGION_INIT
- DB_REGION_MAGIC
- DB_REGION_NAME
- DB_REGISTERED
- DB_RENAMEMAGIC
- DB_RENUMBER
- DB_REP_CLIENT
- DB_REP_DUPMASTER
- DB_REP_HOLDELECTION
- DB_REP_LOGSONLY
- DB_REP_MASTER
- DB_REP_NEWMASTER
- DB_REP_NEWSITE
- DB_REP_OUTDATED
- DB_REP_PERMANENT
- DB_REP_UNAVAIL
- DB_REVSPLITOFF
- DB_RMW
- DB_RPC_SERVERPROG
- DB_RPC_SERVERVERS
- DB_RUNRECOVERY
- DB_SALVAGE
- DB_SECONDARY_BAD
- DB_SEQUENTIAL
- DB_SET
- DB_SET_LOCK_TIMEOUT
- DB_SET_RANGE
- DB_SET_RECNO
- DB_SET_TXN_NOW
- DB_SET_TXN_TIMEOUT
- DB_SNAPSHOT
- DB_STAT_CLEAR
- DB_SURPRISE_KID
- DB_SWAPBYTES
- DB_SYSTEM_MEM
- DB_TEMPORARY
- DB_TEST_ELECTINIT
- DB_TEST_ELECTSEND
- DB_TEST_ELECTVOTE1
- DB_TEST_ELECTVOTE2
- DB_TEST_ELECTWAIT1
- DB_TEST_ELECTWAIT2
- DB_TEST_POSTDESTROY
- DB_TEST_POSTEXTDELETE
- DB_TEST_POSTEXTOPEN
- DB_TEST_POSTEXTUNLINK
- DB_TEST_POSTLOG
- DB_TEST_POSTLOGMETA
- DB_TEST_POSTOPEN
- DB_TEST_POSTRENAME
- DB_TEST_POSTSYNC
- DB_TEST_PREDESTROY
- DB_TEST_PREEXTDELETE
- DB_TEST_PREEXTOPEN
- DB_TEST_PREEXTUNLINK
- DB_TEST_PREOPEN
- DB_TEST_PRERENAME
- DB_TEST_SUBDB_LOCKS
- DB_THREAD
- DB_TIMEOUT
- DB_TRUNCATE
- DB_TXNMAGIC
- DB_TXNVERSION
- DB_TXN_ABORT
- DB_TXN_APPLY
- DB_TXN_BACKWARD_ALLOC
- DB_TXN_BACKWARD_ROLL
- DB_TXN_CKP
- DB_TXN_FORWARD_ROLL
- DB_TXN_GETPGNOS
- DB_TXN_LOCK
- DB_TXN_LOCK_2PL
- DB_TXN_LOCK_MASK
- DB_TXN_LOCK_OPTIMIST
- DB_TXN_LOCK_OPTIMISTIC
- DB_TXN_LOG_MASK
- DB_TXN_LOG_REDO
- DB_TXN_LOG_UNDO
- DB_TXN_LOG_UNDOREDO
- DB_TXN_NOSYNC
- DB_TXN_NOWAIT
- DB_TXN_OPENFILES
- DB_TXN_POPENFILES
- DB_TXN_PRINT
- DB_TXN_REDO
- DB_TXN_SYNC
- DB_TXN_UNDO
- DB_TXN_WRITE_NOSYNC
- DB_UNKNOWN
- DB_UNRESOLVED_CHILD
- DB_UPDATE_SECONDARY
- DB_UPGRADE
- DB_USE_ENVIRON
- DB_USE_ENVIRON_ROOT
- DB_VERB_CHKPOINT
- DB_VERB_DEADLOCK
- DB_VERB_RECOVERY
- DB_VERB_REPLICATION
- DB_VERB_WAITSFOR
- DB_VERIFY
- DB_VERIFY_BAD
- DB_VERIFY_FATAL
- DB_VERSION_MAJOR
- DB_VERSION_MINOR
- DB_VERSION_PATCH
- DB_VERSION_STRING
- DB_VRFY_FLAGMASK
- DB_WRITECURSOR
- DB_WRITELOCK
- DB_WRITEOPEN
- DB_WRNOSYNC
- DB_XA_CREATE
- DB_XIDDATASIZE
- DB_YIELDCPU
- );
-
-sub AUTOLOAD {
- my($constname);
- ($constname = $AUTOLOAD) =~ s/.*:://;
- my ($error, $val) = constant($constname);
- Carp::croak $error if $error;
- no strict 'refs';
- *{$AUTOLOAD} = sub { $val };
- goto &{$AUTOLOAD};
-}
-
-#bootstrap BerkeleyDB $VERSION;
-if ($use_XSLoader)
- { XSLoader::load("BerkeleyDB", $VERSION)}
-else
- { bootstrap BerkeleyDB $VERSION }
-
-# Preloaded methods go here.
-
-
-sub ParseParameters($@)
-{
- my ($default, @rest) = @_ ;
- my (%got) = %$default ;
- my (@Bad) ;
- my ($key, $value) ;
- my $sub = (caller(1))[3] ;
- my %options = () ;
- local ($Carp::CarpLevel) = 1 ;
-
- # allow the options to be passed as a hash reference or
- # as the complete hash.
- if (@rest == 1) {
-
- croak "$sub: parameter is not a reference to a hash"
- if ref $rest[0] ne "HASH" ;
-
- %options = %{ $rest[0] } ;
- }
- elsif (@rest >= 2) {
- %options = @rest ;
- }
-
- while (($key, $value) = each %options)
- {
- $key =~ s/^-// ;
-
- if (exists $default->{$key})
- { $got{$key} = $value }
- else
- { push (@Bad, $key) }
- }
-
- if (@Bad) {
- my ($bad) = join(", ", @Bad) ;
- croak "unknown key value(s) @Bad" ;
- }
-
- return \%got ;
-}
-
-use UNIVERSAL qw( isa ) ;
-
-sub env_remove
-{
- # Usage:
- #
- # $env = new BerkeleyDB::Env
- # [ -Home => $path, ]
- # [ -Config => { name => value, name => value }
- # [ -Flags => DB_INIT_LOCK| ]
- # ;
-
- my $got = BerkeleyDB::ParseParameters({
- Home => undef,
- Flags => 0,
- Config => undef,
- }, @_) ;
-
- if (defined $got->{Config}) {
- croak("Config parameter must be a hash reference")
- if ! ref $got->{Config} eq 'HASH' ;
-
- @BerkeleyDB::a = () ;
- my $k = "" ; my $v = "" ;
- while (($k, $v) = each %{$got->{Config}}) {
- push @BerkeleyDB::a, "$k\t$v" ;
- }
-
- $got->{"Config"} = pack("p*", @BerkeleyDB::a, undef)
- if @BerkeleyDB::a ;
- }
-
- return _env_remove($got) ;
-}
-
-sub db_remove
-{
- my $got = BerkeleyDB::ParseParameters(
- {
- Filename => undef,
- Subname => undef,
- Flags => 0,
- Env => undef,
- }, @_) ;
-
- croak("Must specify a filename")
- if ! defined $got->{Filename} ;
-
- croak("Env not of type BerkeleyDB::Env")
- if defined $got->{Env} and ! isa($got->{Env},'BerkeleyDB::Env');
-
- return _db_remove($got);
-}
-
-sub db_rename
-{
- my $got = BerkeleyDB::ParseParameters(
- {
- Filename => undef,
- Subname => undef,
- Newname => undef,
- Flags => 0,
- Env => undef,
- }, @_) ;
-
- croak("Env not of type BerkeleyDB::Env")
- if defined $got->{Env} and ! isa($got->{Env},'BerkeleyDB::Env');
-
- croak("Must specify a filename")
- if ! defined $got->{Filename} ;
-
- croak("Must specify a Subname")
- if ! defined $got->{Subname} ;
-
- croak("Must specify a Newname")
- if ! defined $got->{Newname} ;
-
- return _db_rename($got);
-}
-
-sub db_verify
-{
- my $got = BerkeleyDB::ParseParameters(
- {
- Filename => undef,
- Subname => undef,
- Outfile => undef,
- Flags => 0,
- Env => undef,
- }, @_) ;
-
- croak("Env not of type BerkeleyDB::Env")
- if defined $got->{Env} and ! isa($got->{Env},'BerkeleyDB::Env');
-
- croak("Must specify a filename")
- if ! defined $got->{Filename} ;
-
- return _db_verify($got);
-}
-
-package BerkeleyDB::Env ;
-
-use UNIVERSAL qw( isa ) ;
-use Carp ;
-use vars qw( %valid_config_keys ) ;
-
-sub isaFilehandle
-{
- my $fh = shift ;
-
- return ((isa($fh,'GLOB') or isa(\$fh,'GLOB')) and defined fileno($fh) )
-
-}
-
-%valid_config_keys = map { $_, 1 } qw( DB_DATA_DIR DB_LOG_DIR DB_TEMP_DIR
-DB_TMP_DIR ) ;
-
-sub new
-{
- # Usage:
- #
- # $env = new BerkeleyDB::Env
- # [ -Home => $path, ]
- # [ -Mode => mode, ]
- # [ -Config => { name => value, name => value }
- # [ -ErrFile => filename, ]
- # [ -ErrPrefix => "string", ]
- # [ -Flags => DB_INIT_LOCK| ]
- # [ -Set_Flags => $flags,]
- # [ -Cachesize => number ]
- # [ -LockDetect => ]
- # [ -Verbose => boolean ]
- # ;
-
- my $pkg = shift ;
- my $got = BerkeleyDB::ParseParameters({
- Home => undef,
- Server => undef,
- Mode => 0666,
- ErrFile => undef,
- ErrPrefix => undef,
- Flags => 0,
- SetFlags => 0,
- Cachesize => 0,
- LockDetect => 0,
- Verbose => 0,
- Config => undef,
- }, @_) ;
-
- if (defined $got->{ErrFile}) {
- croak("ErrFile parameter must be a file name")
- if ref $got->{ErrFile} ;
- #if (!isaFilehandle($got->{ErrFile})) {
- # my $handle = new IO::File ">$got->{ErrFile}"
-# or croak "Cannot open file $got->{ErrFile}: $!\n" ;
-# $got->{ErrFile} = $handle ;
-# }
- }
-
-
- my %config ;
- if (defined $got->{Config}) {
- croak("Config parameter must be a hash reference")
- if ! ref $got->{Config} eq 'HASH' ;
-
- %config = %{ $got->{Config} } ;
- @BerkeleyDB::a = () ;
- my $k = "" ; my $v = "" ;
- while (($k, $v) = each %config) {
- if ($BerkeleyDB::db_version >= 3.1 && ! $valid_config_keys{$k} ) {
- $BerkeleyDB::Error = "illegal name-value pair: $k $v\n" ;
- croak $BerkeleyDB::Error ;
- }
- push @BerkeleyDB::a, "$k\t$v" ;
- }
-
- $got->{"Config"} = pack("p*", @BerkeleyDB::a, undef)
- if @BerkeleyDB::a ;
- }
-
- my ($addr) = _db_appinit($pkg, $got) ;
- my $obj ;
- $obj = bless [$addr] , $pkg if $addr ;
- if ($obj && $BerkeleyDB::db_version >= 3.1 && keys %config) {
- my ($k, $v);
- while (($k, $v) = each %config) {
- if ($k eq 'DB_DATA_DIR')
- { $obj->set_data_dir($v) }
- elsif ($k eq 'DB_LOG_DIR')
- { $obj->set_lg_dir($v) }
- elsif ($k eq 'DB_TEMP_DIR' || $k eq 'DB_TMP_DIR')
- { $obj->set_tmp_dir($v) }
- else {
- $BerkeleyDB::Error = "illegal name-value pair: $k $v\n" ;
- croak $BerkeleyDB::Error
- }
- }
- }
- return $obj ;
-}
-
-
-sub TxnMgr
-{
- my $env = shift ;
- my ($addr) = $env->_TxnMgr() ;
- my $obj ;
- $obj = bless [$addr, $env] , "BerkeleyDB::TxnMgr" if $addr ;
- return $obj ;
-}
-
-sub txn_begin
-{
- my $env = shift ;
- my ($addr) = $env->_txn_begin(@_) ;
- my $obj ;
- $obj = bless [$addr, $env] , "BerkeleyDB::Txn" if $addr ;
- return $obj ;
-}
-
-sub DESTROY
-{
- my $self = shift ;
- $self->_DESTROY() ;
-}
-
-package BerkeleyDB::Hash ;
-
-use vars qw(@ISA) ;
-@ISA = qw( BerkeleyDB::Common BerkeleyDB::_tiedHash ) ;
-use UNIVERSAL qw( isa ) ;
-use Carp ;
-
-sub new
-{
- my $self = shift ;
- my $got = BerkeleyDB::ParseParameters(
- {
- # Generic Stuff
- Filename => undef,
- Subname => undef,
- #Flags => BerkeleyDB::DB_CREATE(),
- Flags => 0,
- Property => 0,
- Mode => 0666,
- Cachesize => 0,
- Lorder => 0,
- Pagesize => 0,
- Env => undef,
- #Tie => undef,
- Txn => undef,
-
- # Hash specific
- Ffactor => 0,
- Nelem => 0,
- Hash => undef,
- DupCompare => undef,
-
- # BerkeleyDB specific
- ReadKey => undef,
- WriteKey => undef,
- ReadValue => undef,
- WriteValue => undef,
- }, @_) ;
-
- croak("Env not of type BerkeleyDB::Env")
- if defined $got->{Env} and ! isa($got->{Env},'BerkeleyDB::Env');
-
- croak("Txn not of type BerkeleyDB::Txn")
- if defined $got->{Txn} and ! isa($got->{Txn},'BerkeleyDB::Txn');
-
- croak("-Tie needs a reference to a hash")
- if defined $got->{Tie} and $got->{Tie} !~ /HASH/ ;
-
- my ($addr) = _db_open_hash($self, $got);
- my $obj ;
- if ($addr) {
- $obj = bless [$addr] , $self ;
- push @{ $obj }, $got->{Env} if $got->{Env} ;
- $obj->Txn($got->{Txn})
- if $got->{Txn} ;
- }
- return $obj ;
-}
-
-*TIEHASH = \&new ;
-
-
-package BerkeleyDB::Btree ;
-
-use vars qw(@ISA) ;
-@ISA = qw( BerkeleyDB::Common BerkeleyDB::_tiedHash ) ;
-use UNIVERSAL qw( isa ) ;
-use Carp ;
-
-sub new
-{
- my $self = shift ;
- my $got = BerkeleyDB::ParseParameters(
- {
- # Generic Stuff
- Filename => undef,
- Subname => undef,
- #Flags => BerkeleyDB::DB_CREATE(),
- Flags => 0,
- Property => 0,
- Mode => 0666,
- Cachesize => 0,
- Lorder => 0,
- Pagesize => 0,
- Env => undef,
- #Tie => undef,
- Txn => undef,
-
- # Btree specific
- Minkey => 0,
- Compare => undef,
- DupCompare => undef,
- Prefix => undef,
- }, @_) ;
-
- croak("Env not of type BerkeleyDB::Env")
- if defined $got->{Env} and ! isa($got->{Env},'BerkeleyDB::Env');
-
- croak("Txn not of type BerkeleyDB::Txn")
- if defined $got->{Txn} and ! isa($got->{Txn},'BerkeleyDB::Txn');
-
- croak("-Tie needs a reference to a hash")
- if defined $got->{Tie} and $got->{Tie} !~ /HASH/ ;
-
- my ($addr) = _db_open_btree($self, $got);
- my $obj ;
- if ($addr) {
- $obj = bless [$addr] , $self ;
- push @{ $obj }, $got->{Env} if $got->{Env} ;
- $obj->Txn($got->{Txn})
- if $got->{Txn} ;
- }
- return $obj ;
-}
-
-*BerkeleyDB::Btree::TIEHASH = \&BerkeleyDB::Btree::new ;
-
-
-package BerkeleyDB::Recno ;
-
-use vars qw(@ISA) ;
-@ISA = qw( BerkeleyDB::Common BerkeleyDB::_tiedArray ) ;
-use UNIVERSAL qw( isa ) ;
-use Carp ;
-
-sub new
-{
- my $self = shift ;
- my $got = BerkeleyDB::ParseParameters(
- {
- # Generic Stuff
- Filename => undef,
- Subname => undef,
- #Flags => BerkeleyDB::DB_CREATE(),
- Flags => 0,
- Property => 0,
- Mode => 0666,
- Cachesize => 0,
- Lorder => 0,
- Pagesize => 0,
- Env => undef,
- #Tie => undef,
- Txn => undef,
-
- # Recno specific
- Delim => undef,
- Len => undef,
- Pad => undef,
- Source => undef,
- ArrayBase => 1, # lowest index in array
- }, @_) ;
-
- croak("Env not of type BerkeleyDB::Env")
- if defined $got->{Env} and ! isa($got->{Env},'BerkeleyDB::Env');
-
- croak("Txn not of type BerkeleyDB::Txn")
- if defined $got->{Txn} and ! isa($got->{Txn},'BerkeleyDB::Txn');
-
- croak("Tie needs a reference to an array")
- if defined $got->{Tie} and $got->{Tie} !~ /ARRAY/ ;
-
- croak("ArrayBase can only be 0 or 1, parsed $got->{ArrayBase}")
- if $got->{ArrayBase} != 1 and $got->{ArrayBase} != 0 ;
-
-
- $got->{Fname} = $got->{Filename} if defined $got->{Filename} ;
-
- my ($addr) = _db_open_recno($self, $got);
- my $obj ;
- if ($addr) {
- $obj = bless [$addr] , $self ;
- push @{ $obj }, $got->{Env} if $got->{Env} ;
- $obj->Txn($got->{Txn})
- if $got->{Txn} ;
- }
- return $obj ;
-}
-
-*BerkeleyDB::Recno::TIEARRAY = \&BerkeleyDB::Recno::new ;
-*BerkeleyDB::Recno::db_stat = \&BerkeleyDB::Btree::db_stat ;
-
-package BerkeleyDB::Queue ;
-
-use vars qw(@ISA) ;
-@ISA = qw( BerkeleyDB::Common BerkeleyDB::_tiedArray ) ;
-use UNIVERSAL qw( isa ) ;
-use Carp ;
-
-sub new
-{
- my $self = shift ;
- my $got = BerkeleyDB::ParseParameters(
- {
- # Generic Stuff
- Filename => undef,
- Subname => undef,
- #Flags => BerkeleyDB::DB_CREATE(),
- Flags => 0,
- Property => 0,
- Mode => 0666,
- Cachesize => 0,
- Lorder => 0,
- Pagesize => 0,
- Env => undef,
- #Tie => undef,
- Txn => undef,
-
- # Queue specific
- Len => undef,
- Pad => undef,
- ArrayBase => 1, # lowest index in array
- ExtentSize => undef,
- }, @_) ;
-
- croak("Env not of type BerkeleyDB::Env")
- if defined $got->{Env} and ! isa($got->{Env},'BerkeleyDB::Env');
-
- croak("Txn not of type BerkeleyDB::Txn")
- if defined $got->{Txn} and ! isa($got->{Txn},'BerkeleyDB::Txn');
-
- croak("Tie needs a reference to an array")
- if defined $got->{Tie} and $got->{Tie} !~ /ARRAY/ ;
-
- croak("ArrayBase can only be 0 or 1, parsed $got->{ArrayBase}")
- if $got->{ArrayBase} != 1 and $got->{ArrayBase} != 0 ;
-
- $got->{Fname} = $got->{Filename} if defined $got->{Filename} ;
-
- my ($addr) = _db_open_queue($self, $got);
- my $obj ;
- if ($addr) {
- $obj = bless [$addr] , $self ;
- push @{ $obj }, $got->{Env} if $got->{Env} ;
- $obj->Txn($got->{Txn})
- if $got->{Txn} ;
- }
- return $obj ;
-}
-
-*BerkeleyDB::Queue::TIEARRAY = \&BerkeleyDB::Queue::new ;
-
-sub UNSHIFT
-{
- my $self = shift;
- croak "unshift is unsupported with Queue databases";
-}
-
-## package BerkeleyDB::Text ;
-##
-## use vars qw(@ISA) ;
-## @ISA = qw( BerkeleyDB::Common BerkeleyDB::_tiedArray ) ;
-## use UNIVERSAL qw( isa ) ;
-## use Carp ;
-##
-## sub new
-## {
-## my $self = shift ;
-## my $got = BerkeleyDB::ParseParameters(
-## {
-## # Generic Stuff
-## Filename => undef,
-## #Flags => BerkeleyDB::DB_CREATE(),
-## Flags => 0,
-## Property => 0,
-## Mode => 0666,
-## Cachesize => 0,
-## Lorder => 0,
-## Pagesize => 0,
-## Env => undef,
-## #Tie => undef,
-## Txn => undef,
-##
-## # Recno specific
-## Delim => undef,
-## Len => undef,
-## Pad => undef,
-## Btree => undef,
-## }, @_) ;
-##
-## croak("Env not of type BerkeleyDB::Env")
-## if defined $got->{Env} and ! isa($got->{Env},'BerkeleyDB::Env');
-##
-## croak("Txn not of type BerkeleyDB::Txn")
-## if defined $got->{Txn} and ! isa($got->{Txn},'BerkeleyDB::Txn');
-##
-## croak("-Tie needs a reference to an array")
-## if defined $got->{Tie} and $got->{Tie} !~ /ARRAY/ ;
-##
-## # rearange for recno
-## $got->{Source} = $got->{Filename} if defined $got->{Filename} ;
-## delete $got->{Filename} ;
-## $got->{Fname} = $got->{Btree} if defined $got->{Btree} ;
-## return BerkeleyDB::Recno::_db_open_recno($self, $got);
-## }
-##
-## *BerkeleyDB::Text::TIEARRAY = \&BerkeleyDB::Text::new ;
-## *BerkeleyDB::Text::db_stat = \&BerkeleyDB::Btree::db_stat ;
-
-package BerkeleyDB::Unknown ;
-
-use vars qw(@ISA) ;
-@ISA = qw( BerkeleyDB::Common BerkeleyDB::_tiedArray ) ;
-use UNIVERSAL qw( isa ) ;
-use Carp ;
-
-sub new
-{
- my $self = shift ;
- my $got = BerkeleyDB::ParseParameters(
- {
- # Generic Stuff
- Filename => undef,
- Subname => undef,
- #Flags => BerkeleyDB::DB_CREATE(),
- Flags => 0,
- Property => 0,
- Mode => 0666,
- Cachesize => 0,
- Lorder => 0,
- Pagesize => 0,
- Env => undef,
- #Tie => undef,
- Txn => undef,
-
- }, @_) ;
-
- croak("Env not of type BerkeleyDB::Env")
- if defined $got->{Env} and ! isa($got->{Env},'BerkeleyDB::Env');
-
- croak("Txn not of type BerkeleyDB::Txn")
- if defined $got->{Txn} and ! isa($got->{Txn},'BerkeleyDB::Txn');
-
- croak("-Tie needs a reference to a hash")
- if defined $got->{Tie} and $got->{Tie} !~ /HASH/ ;
-
- my ($addr, $type) = _db_open_unknown($got);
- my $obj ;
- if ($addr) {
- $obj = bless [$addr], "BerkeleyDB::$type" ;
- push @{ $obj }, $got->{Env} if $got->{Env} ;
- $obj->Txn($got->{Txn})
- if $got->{Txn} ;
- }
- return $obj ;
-}
-
-
-package BerkeleyDB::_tiedHash ;
-
-use Carp ;
-
-#sub TIEHASH
-#{
-# my $self = shift ;
-# my $db_object = shift ;
-#
-#print "Tiehash REF=[$self] [" . (ref $self) . "]\n" ;
-#
-# return bless { Obj => $db_object}, $self ;
-#}
-
-sub Tie
-{
- # Usage:
- #
- # $db->Tie \%hash ;
- #
-
- my $self = shift ;
-
- #print "Tie method REF=[$self] [" . (ref $self) . "]\n" ;
-
- croak("usage \$x->Tie \\%hash\n") unless @_ ;
- my $ref = shift ;
-
- croak("Tie needs a reference to a hash")
- if defined $ref and $ref !~ /HASH/ ;
-
- #tie %{ $ref }, ref($self), $self ;
- tie %{ $ref }, "BerkeleyDB::_tiedHash", $self ;
- return undef ;
-}
-
-
-sub TIEHASH
-{
- my $self = shift ;
- my $db_object = shift ;
- #return bless $db_object, 'BerkeleyDB::Common' ;
- return $db_object ;
-}
-
-sub STORE
-{
- my $self = shift ;
- my $key = shift ;
- my $value = shift ;
-
- $self->db_put($key, $value) ;
-}
-
-sub FETCH
-{
- my $self = shift ;
- my $key = shift ;
- my $value = undef ;
- $self->db_get($key, $value) ;
-
- return $value ;
-}
-
-sub EXISTS
-{
- my $self = shift ;
- my $key = shift ;
- my $value = undef ;
- $self->db_get($key, $value) == 0 ;
-}
-
-sub DELETE
-{
- my $self = shift ;
- my $key = shift ;
- $self->db_del($key) ;
-}
-
-sub CLEAR
-{
- my $self = shift ;
- my ($key, $value) = (0, 0) ;
- my $cursor = $self->db_cursor() ;
- while ($cursor->c_get($key, $value, BerkeleyDB::DB_PREV()) == 0)
- { $cursor->c_del() }
- #1 while $cursor->c_del() == 0 ;
- # cursor will self-destruct
-}
-
-#sub DESTROY
-#{
-# my $self = shift ;
-# print "BerkeleyDB::_tieHash::DESTROY\n" ;
-# $self->{Cursor}->c_close() if $self->{Cursor} ;
-#}
-
-package BerkeleyDB::_tiedArray ;
-
-use Carp ;
-
-sub Tie
-{
- # Usage:
- #
- # $db->Tie \@array ;
- #
-
- my $self = shift ;
-
- #print "Tie method REF=[$self] [" . (ref $self) . "]\n" ;
-
- croak("usage \$x->Tie \\%hash\n") unless @_ ;
- my $ref = shift ;
-
- croak("Tie needs a reference to an array")
- if defined $ref and $ref !~ /ARRAY/ ;
-
- #tie %{ $ref }, ref($self), $self ;
- tie @{ $ref }, "BerkeleyDB::_tiedArray", $self ;
- return undef ;
-}
-
-
-#sub TIEARRAY
-#{
-# my $self = shift ;
-# my $db_object = shift ;
-#
-#print "Tiearray REF=[$self] [" . (ref $self) . "]\n" ;
-#
-# return bless { Obj => $db_object}, $self ;
-#}
-
-sub TIEARRAY
-{
- my $self = shift ;
- my $db_object = shift ;
- #return bless $db_object, 'BerkeleyDB::Common' ;
- return $db_object ;
-}
-
-sub STORE
-{
- my $self = shift ;
- my $key = shift ;
- my $value = shift ;
-
- $self->db_put($key, $value) ;
-}
-
-sub FETCH
-{
- my $self = shift ;
- my $key = shift ;
- my $value = undef ;
- $self->db_get($key, $value) ;
-
- return $value ;
-}
-
-*CLEAR = \&BerkeleyDB::_tiedHash::CLEAR ;
-*FIRSTKEY = \&BerkeleyDB::_tiedHash::FIRSTKEY ;
-*NEXTKEY = \&BerkeleyDB::_tiedHash::NEXTKEY ;
-
-sub EXTEND {} # don't do anything with EXTEND
-
-
-sub SHIFT
-{
- my $self = shift;
- my ($key, $value) = (0, 0) ;
- my $cursor = $self->db_cursor() ;
- return undef if $cursor->c_get($key, $value, BerkeleyDB::DB_FIRST()) != 0 ;
- return undef if $cursor->c_del() != 0 ;
-
- return $value ;
-}
-
-
-sub UNSHIFT
-{
- my $self = shift;
- if (@_)
- {
- my ($key, $value) = (0, 0) ;
- my $cursor = $self->db_cursor() ;
- my $status = $cursor->c_get($key, $value, BerkeleyDB::DB_FIRST()) ;
- if ($status == 0)
- {
- foreach $value (reverse @_)
- {
- $key = 0 ;
- $cursor->c_put($key, $value, BerkeleyDB::DB_BEFORE()) ;
- }
- }
- elsif ($status == BerkeleyDB::DB_NOTFOUND())
- {
- $key = 0 ;
- foreach $value (@_)
- {
- $self->db_put($key++, $value) ;
- }
- }
- }
-}
-
-sub PUSH
-{
- my $self = shift;
- if (@_)
- {
- my ($key, $value) = (-1, 0) ;
- my $cursor = $self->db_cursor() ;
- my $status = $cursor->c_get($key, $value, BerkeleyDB::DB_LAST()) ;
- if ($status == 0 || $status == BerkeleyDB::DB_NOTFOUND())
- {
- $key = -1 if $status != 0 and $self->type != BerkeleyDB::DB_RECNO() ;
- foreach $value (@_)
- {
- ++ $key ;
- $status = $self->db_put($key, $value) ;
- }
- }
-
-# can use this when DB_APPEND is fixed.
-# foreach $value (@_)
-# {
-# my $status = $cursor->c_put($key, $value, BerkeleyDB::DB_AFTER()) ;
-#print "[$status]\n" ;
-# }
- }
-}
-
-sub POP
-{
- my $self = shift;
- my ($key, $value) = (0, 0) ;
- my $cursor = $self->db_cursor() ;
- return undef if $cursor->c_get($key, $value, BerkeleyDB::DB_LAST()) != 0 ;
- return undef if $cursor->c_del() != 0 ;
-
- return $value ;
-}
-
-sub SPLICE
-{
- my $self = shift;
- croak "SPLICE is not implemented yet" ;
-}
-
-*shift = \&SHIFT ;
-*unshift = \&UNSHIFT ;
-*push = \&PUSH ;
-*pop = \&POP ;
-*clear = \&CLEAR ;
-*length = \&FETCHSIZE ;
-
-sub STORESIZE
-{
- croak "STORESIZE is not implemented yet" ;
-#print "STORESIZE @_\n" ;
-# my $self = shift;
-# my $length = shift ;
-# my $current_length = $self->FETCHSIZE() ;
-#print "length is $current_length\n";
-#
-# if ($length < $current_length) {
-#print "Make smaller $length < $current_length\n" ;
-# my $key ;
-# for ($key = $current_length - 1 ; $key >= $length ; -- $key)
-# { $self->db_del($key) }
-# }
-# elsif ($length > $current_length) {
-#print "Make larger $length > $current_length\n" ;
-# $self->db_put($length-1, "") ;
-# }
-# else { print "stay the same\n" }
-
-}
-
-
-
-#sub DESTROY
-#{
-# my $self = shift ;
-# print "BerkeleyDB::_tieArray::DESTROY\n" ;
-#}
-
-
-package BerkeleyDB::Common ;
-
-
-use Carp ;
-
-sub DESTROY
-{
- my $self = shift ;
- $self->_DESTROY() ;
-}
-
-sub Txn
-{
- my $self = shift ;
- my $txn = shift ;
- #print "BerkeleyDB::Common::Txn db [$self] txn [$txn]\n" ;
- if ($txn) {
- $self->_Txn($txn) ;
- push @{ $txn }, $self ;
- }
- else {
- $self->_Txn() ;
- }
- #print "end BerkeleyDB::Common::Txn \n";
-}
-
-
-sub get_dup
-{
- croak "Usage: \$db->get_dup(key [,flag])\n"
- unless @_ == 2 or @_ == 3 ;
-
- my $db = shift ;
- my $key = shift ;
- my $flag = shift ;
- my $value = 0 ;
- my $origkey = $key ;
- my $wantarray = wantarray ;
- my %values = () ;
- my @values = () ;
- my $counter = 0 ;
- my $status = 0 ;
- my $cursor = $db->db_cursor() ;
-
- # iterate through the database until either EOF ($status == 0)
- # or a different key is encountered ($key ne $origkey).
- for ($status = $cursor->c_get($key, $value, BerkeleyDB::DB_SET()) ;
- $status == 0 and $key eq $origkey ;
- $status = $cursor->c_get($key, $value, BerkeleyDB::DB_NEXT()) ) {
- # save the value or count number of matches
- if ($wantarray) {
- if ($flag)
- { ++ $values{$value} }
- else
- { push (@values, $value) }
- }
- else
- { ++ $counter }
-
- }
-
- return ($wantarray ? ($flag ? %values : @values) : $counter) ;
-}
-
-sub db_cursor
-{
- my $db = shift ;
- my ($addr) = $db->_db_cursor(@_) ;
- my $obj ;
- $obj = bless [$addr, $db] , "BerkeleyDB::Cursor" if $addr ;
- return $obj ;
-}
-
-sub db_join
-{
- croak 'Usage: $db->BerkeleyDB::Common::db_join([cursors], flags=0)'
- if @_ < 2 || @_ > 3 ;
- my $db = shift ;
- my ($addr) = $db->_db_join(@_) ;
- my $obj ;
- $obj = bless [$addr, $db, $_[0]] , "BerkeleyDB::Cursor" if $addr ;
- return $obj ;
-}
-
-package BerkeleyDB::Cursor ;
-
-sub c_close
-{
- my $cursor = shift ;
- $cursor->[1] = "" ;
- return $cursor->_c_close() ;
-}
-
-sub c_dup
-{
- my $cursor = shift ;
- my ($addr) = $cursor->_c_dup(@_) ;
- my $obj ;
- $obj = bless [$addr, $cursor->[1]] , "BerkeleyDB::Cursor" if $addr ;
- return $obj ;
-}
-
-sub DESTROY
-{
- my $self = shift ;
- $self->_DESTROY() ;
-}
-
-package BerkeleyDB::TxnMgr ;
-
-sub DESTROY
-{
- my $self = shift ;
- $self->_DESTROY() ;
-}
-
-sub txn_begin
-{
- my $txnmgr = shift ;
- my ($addr) = $txnmgr->_txn_begin(@_) ;
- my $obj ;
- $obj = bless [$addr, $txnmgr] , "BerkeleyDB::Txn" if $addr ;
- return $obj ;
-}
-
-package BerkeleyDB::Txn ;
-
-sub Txn
-{
- my $self = shift ;
- my $db ;
- # keep a reference to each db in the txn object
- foreach $db (@_) {
- $db->_Txn($self) ;
- push @{ $self}, $db ;
- }
-}
-
-sub txn_commit
-{
- my $self = shift ;
- $self->disassociate() ;
- my $status = $self->_txn_commit() ;
- return $status ;
-}
-
-sub txn_abort
-{
- my $self = shift ;
- $self->disassociate() ;
- my $status = $self->_txn_abort() ;
- return $status ;
-}
-
-sub disassociate
-{
- my $self = shift ;
- my $db ;
- while ( @{ $self } > 2) {
- $db = pop @{ $self } ;
- $db->Txn() ;
- }
- #print "end disassociate\n" ;
-}
-
-
-sub DESTROY
-{
- my $self = shift ;
-
- $self->disassociate() ;
- # first close the close the transaction
- $self->_DESTROY() ;
-}
-
-package BerkeleyDB::Term ;
-
-END
-{
- close_everything() ;
-}
-
-
-package BerkeleyDB ;
-
-
-
-# Autoload methods go after =cut, and are processed by the autosplit program.
-
-1;
-__END__
-
-