#----- Key data -------------------------------------------------------------
-package Catacomb::Key::StructData;
+package Catacomb::Key::Data::StructTie;
use Carp;
use Catacomb::Base;
sub TIEHASH { bless [$_[1], []], $_[0]; }
-sub FETCH { Catacomb::Key::Data::StructItem->new($_[0][0], $_[1]); }
-sub EXISTS { !!$_[0][0]->_get->structfind($_[1]); }
-sub DELETE { $_[0][0]->_get->structdel($_[1]); }
-sub CLEAR { $_[0][0]->_get()->setstruct(); }
-sub STORE {
- my ($me, $k, $v) = @_;
- $me->[0]->_get()->structcreate($k)->set($v);
+sub FETCH { $_[0][0]->find($_[1]); }
+sub EXISTS { !!$_[0][0]->find($_[1]); }
+sub DELETE { $_[0][0]->del($_[1]); }
+sub STORE { $_[0][0]->find($_[1], $_[2]); }
+
+sub CLEAR {
+ my ($me) = @_;
+ my $kd = $me->[0];
+ my $i = $kd->iterate();
+ $kd->del($k) while my $k = $i->next();
+ 1;
}
+
sub FIRSTKEY {
my ($me) = @_;
- my $kd = $me->[0]->_get();
- my $i = $kd->structiter();
+ my $kd = $me->[0];
+ my $i = $kd->iterate();
my @k = ();
while (my $k = $i->next()) {
push(@k, $k);
}
sub NEXTKEY { shift(@{$_[0][1]}); }
-package Catacomb::Key::DataRef;
-use Carp;
-use Catacomb::Base;
-use Catacomb::MP;
-use Catacomb::EC;
-sub _adopt {
- my $kd = shift;
- defined($kd) or return;
- $kd = bless [$kd], Catacomb::Key::Data;
- return wantarray ? ($kd, @_) : $kd;
-}
-sub new { my $me = shift(@_); bless [@_], $me; }
-sub _proxy { my ($op, $kd, @args) = @_; &$op($kd->_get(), @args); }
-
-sub setbinary { _proxy(\&Catacomb::Key::DataImpl::setbinary, @_); }
-sub setencrypted { _proxy(\&Catacomb::Key::DataImpl::setencrypted, @_); }
-sub setmp { _proxy(\&Catacomb::Key::DataImpl::setec, @_); }
-sub setstring { _proxy(\&Catacomb::Key::DataImpl::setstring, @_); }
-sub setec { _proxy(\&Catacomb::Key::DataImpl::setec, @_); }
+package Catacomb::Key::Data::Structured;
+sub open { my %h; tie %h, Catacomb::Key::Data::StructTie, $_[0]; \%h; }
-sub flags { _proxy(\&Catacomb::Key::DataImpl::flags, @_); }
-
-sub getbinary { _proxy(\&Catacomb::Key::DataImpl::getbinary, @_); }
-sub getencrypted { _proxy(\&Catacomb::Key::DataImpl::getencrypted, @_); }
-sub getmp { _proxy(\&Catacomb::Key::DataImpl::getmp, @_); }
-sub getstring { _proxy(\&Catacomb::Key::DataImpl::getstring, @_); }
-sub getec { _proxy(\&Catacomb::Key::DataImpl::getec, @_); }
-
-sub setstruct { _proxy(\&Catacomb::Key::DataImpl::setstruct, @_); }
-sub structfind { Catacomb::Key::Data::StructItem->new($_[0], $_[1]); }
-sub structcreate {
- _proxy(\&Catacomb::Key::DataImpl::structcreate, @_);
- Catacomb::Key::Data::StructItem->new($_[0], $_[1]);
-}
-sub structiter { _proxy(\&Catacomb::Key::DataImpl::structiter, @_); }
-sub structdel { _proxy(\&Catacomb::Key::DataImpl::structdel, @_); }
-sub structopen { my %h; tie %h, Catacomb::Key::StructData, $_[0]; \%h; }
-
-sub copy {
- croak("Usage: Catacomb::Key::Data::Ref::copy(kd, kkd, [filter])")
- unless @_ >= 2 && @_ <= 3;
- my $kd = Catacomb::Key::Data->new();
- $kd->_get()->set($_[0]->_get(), $_[1]);
- return $kd;
+foreach $i (qw(Binary Encrypted MP EC String Structured)) {
+ @{"Catacomb::Key::Data::${i}::ISA"} = qw(Catacomb::Key::Data);
}
-sub lock { _adopt(_proxy(\&Catacomb::Key::DataImpl::lock, @_)); }
-sub unlock { _adopt(_proxy(\&Catacomb::Key::DataImpl::unlock, @_)); }
-sub plock { _adopt(_proxy(\&Catacomb::Key::DataImpl::plock, @_)); }
-sub punlock { _adopt(_proxy(\&Catacomb::Key::DataImpl::punlock, @_)); }
-sub read { _adopt(Catacomb::Key::DataImpl::read(@_)); }
-sub write { _proxy(\&Catacomb::Key::DataImpl::write, @_); }
-sub decode { _adopt(Catacomb::Key::DataImpl::decode(@_)); }
-sub encode { _proxy(\&Catacomb::Key::DataImpl::encode, @_); }
-
-package Catacomb::Key::Data;
-use Carp;
-@ISA = qw(Catacomb::Key::DataRef);
-sub _get { $_[0][0]; }
-## Perl will randomly zap my reference during cleanup. Just pretend
-## we didn't notice.
-sub DESTROY { $_[0][0]->free() if defined $_[0][0]; }
-sub new {
- croak("Usage: Catacomb::Key::Data::new(me)") unless @_ == 1;
- Catacomb::Key::DataRef::_adopt(Catacomb::Key::DataImpl->new());
-}
-
-package Catacomb::Key::Data::StructItem;
-@ISA = qw(Catacomb::Key::DataRef);
-sub _get { $_[0][0]->_get()->structfind($_[0][1]); }
-
-package Catacomb::Key::Data::KeyData;
-@ISA = qw(Catacomb::Key::DataRef);
-sub _get { $_[0][0]->_data(); }
#----- Actual keys ----------------------------------------------------------
return \%a;
}
-sub data {
- croak("Usage: Catacomb::Key::data(k)") unless @_ == 1;
- return Catacomb::Key::Data::KeyData->new($_[0]);
-}
-
-package Catacomb::Key::File;
-use Carp;
-use Catacomb::Base;
-
-sub qtag {
- croak("Usage: Catacomb::Key::File::qtag(kf, tag)") unless @_ == 2;
- my ($kf, $tag) = @_;
- my @q = ();
- if ($tag =~ /^([^.]*)\.(.*)$/) {
- $tag = $1;
- @q = split(/\./, $2);
- }
- my $k = $kf->bytag($tag) or return;
- my $d = $k->data();
- my $f = $k->fulltag();
- foreach my $t (@q) {
- $d = $d->structfind($t) or return;
- $f .= "." . $t;
- }
- return $k, $d, $f;
-}
-
#----- That's all, folks ----------------------------------------------------
1;