📄 berkeleydb.pm
字号:
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 EXTENDsub 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__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -