Author: dylan
Date: 2005-06-23 21:55:23 -0400 (Thu, 23 Jun 2005)
New Revision: 807
Modified:
trunk/
trunk/perl/server/lib/Haver/Server/Entity/Channel.pm
trunk/perl/server/lib/Haver/Server/Entity/Lobby.pm
trunk/perl/server/lib/Haver/Server/Store.pm
trunk/perl/server/t/004_store.t
Log:
[EMAIL PROTECTED]: dylan | 2005-06-23 21:52:31 -0400
updated Store to be smart about directories. Added more test cases.
Property changes on: trunk
___________________________________________________________________
Name: svk:merge
- 1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/havercurs-objc:43089
1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk:11166
1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk-merge-10131:11178
27e50396-46e3-0310-8b22-ae223a1f35ce:/local:212
e9404bb1-7af0-0310-a7ff-e22194cd388b:/haver/local:1160
edfcd8bd-4ce7-0310-a97e-bb1efd40edf3:/local:238
+ 1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/havercurs-objc:43089
1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk:11166
1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk-merge-10131:11178
27e50396-46e3-0310-8b22-ae223a1f35ce:/local:212
e9404bb1-7af0-0310-a7ff-e22194cd388b:/haver/local:1161
edfcd8bd-4ce7-0310-a97e-bb1efd40edf3:/local:238
Modified: trunk/perl/server/lib/Haver/Server/Entity/Channel.pm
===================================================================
--- trunk/perl/server/lib/Haver/Server/Entity/Channel.pm 2005-06-24
01:55:21 UTC (rev 806)
+++ trunk/perl/server/lib/Haver/Server/Entity/Channel.pm 2005-06-24
01:55:23 UTC (rev 807)
@@ -79,6 +79,19 @@
return wantarray ? @values : [EMAIL PROTECTED];
}
+sub names {
+ my ($self, $ns) = @_;
+ my @names = ();
+
+ if (exists $self->{_contents}{$ns}) {
+ @names = keys %{ $self->{_contents}{$ns} };
+ } else {
+ return ();
+ }
+
+ return wantarray ? @names : [EMAIL PROTECTED];
+}
+
sub contains {
my ($self, $ns, $name) = @_;
Modified: trunk/perl/server/lib/Haver/Server/Entity/Lobby.pm
===================================================================
--- trunk/perl/server/lib/Haver/Server/Entity/Lobby.pm 2005-06-24 01:55:21 UTC
(rev 806)
+++ trunk/perl/server/lib/Haver/Server/Entity/Lobby.pm 2005-06-24 01:55:23 UTC
(rev 807)
@@ -7,17 +7,39 @@
our $VERSION = 0.22;
-const name => '&lobby';
+const name => '&lobby';
+const namespace => 'lobby';
sub can_contain {
my ($self, $object) = @_;
$self != $object;
}
-sub fetch {
+sub dump {
+ my ($self) = shift;
+ my $data = super;
+ $data->{channels} = [
+ map { $_->name }
+ grep { $_->{attr}{keep} } $self->list('channel')
+ ];
+
+ return $data;
+}
+
+sub load {
+ my ($this, $data, $store) = @_;
+ my $self = super($data);
+ foreach my $name (@{ $data->{channels} }) {
+ my $chan = $store->fetch('channel', $name);
+ $self->add($chan);
+ }
+ return $self;
+}
+
+sub get {
my ($self, $ns, $name) = @_;
- if ($ns eq 'channel' and $name eq '&lobby') {
+ if (is_self($ns, $name)) {
return $self;
} else {
super ($ns, $name);
@@ -27,11 +49,15 @@
sub contains {
my ($self, $ns, $name) = @_;
- if ($ns eq 'channel' and $name eq '&lobby') {
+ if (is_self($ns, $name)) {
return 1;
} else {
return super ($ns, $name);
}
}
+sub is_self {
+ my ($ns, $name) = @_;
+ ( $ns eq 'channel' or $ns eq 'lobby') and $name eq '&lobby';
+}
1;
Modified: trunk/perl/server/lib/Haver/Server/Store.pm
===================================================================
--- trunk/perl/server/lib/Haver/Server/Store.pm 2005-06-24 01:55:21 UTC (rev
806)
+++ trunk/perl/server/lib/Haver/Server/Store.pm 2005-06-24 01:55:23 UTC (rev
807)
@@ -5,30 +5,44 @@
use warnings;
use Haver::Base -base;
use File::Spec;
+use File::Basename ();
use YAML ();
our $VERSION = 0.01;
-field storedir => File::Spec->curdir;
+sub initialize {
+ my $self = shift;
+ $self->{storedir} ||= File::Spec->curdir;
+}
+sub storedir {
+ my ($self, $dir) = @_;
+ if (@_ == 1) {
+ $self->{storedir};
+ } elsif (@_ > 1) {
+ if (-d $dir) {
+ $self->{storedir} = $dir;
+ } elsif (not -e _) {
+ croak "Storage directory $dir does not exist!";
+ } elsif (not -d _) {
+ croak "Storage directory $dir is not a directory!";
+ }
+ }
+}
+
sub insert {
my ($self, $entity) = @_;
my $data = $entity->dump;
my $file = $self->filename($entity->namespace, $entity->name);
- my $dir = $self->dirname($entity->namespace);
- if (not -e $dir) {
- mkdir($dir) or croak "Can't mkdir($dir): $!";
- }
-
- $self->save_file($file, ref($entity), $data);
+ $self->_save_file($file, ref($entity), $data);
}
sub fetch {
my ($self, $ns, $name) = @_;
my $file = $self->filename($ns, $name);
- my ($class, $data) = @{ $self->load_file($file) };
- return $class->load($data);
+ my ($class, $data) = @{ $self->_load_file($file) };
+ return $class->load($data, $self);
}
sub delete {
@@ -37,9 +51,30 @@
unlink($file) or croak "Can't delete $ns/$name!";
}
-sub save_file {
+sub exists {
+ my ($self, $ns, $name) = @_;
+ my $file = $self->filename($ns, $name);
+ -e $file;
+}
+
+sub filename {
+ my ($self, $ns, $name) = @_;
+ File::Spec->catfile($self->storedir, $ns, $name)
+}
+
+sub dirname {
+ my ($self, $ns) = @_;
+ File::Spec->catfile($self->storedir, $ns)
+}
+
+sub _save_file {
my ($self, $file, $class, $data) = @_;
-
+
+ my $dir = File::Basename::dirname($file);
+ if (not -e $dir) {
+ mkdir($dir) or croak "Can't mkdir($dir): $!";
+ }
+
YAML::DumpFile($file, [
$class,
$data,
@@ -47,20 +82,12 @@
);
}
-sub load_file {
+sub _load_file {
my ($self, $file) = @_;
YAML::LoadFile($file);
}
-sub filename {
- my ($self, $ns, $name) = @_;
- File::Spec->catfile($self->storedir, $ns, $name)
-}
-sub dirname {
- my ($self, $ns) = @_;
- File::Spec->catfile($self->storedir, $ns)
-}
1;
__END__
Modified: trunk/perl/server/t/004_store.t
===================================================================
--- trunk/perl/server/t/004_store.t 2005-06-24 01:55:21 UTC (rev 806)
+++ trunk/perl/server/t/004_store.t 2005-06-24 01:55:23 UTC (rev 807)
@@ -1,11 +1,16 @@
#!/usr/bin/perl
# vim: set ft=perl:
-use Test::More tests => 8;
+use Test::More tests => 10;
+use File::Path 'rmtree';
use Haver::Server::Entity::User;
use Haver::Server::Entity::Channel;
+use constant STORE_DIR => 'store';
+
BEGIN { use_ok('Haver::Server::Store') };
+mkdir(STORE_DIR);
+
my $user = new Haver::Server::Entity::User (
name => 'bobby',
attr => {
@@ -19,7 +24,7 @@
},
);
my $store = new Haver::Server::Store (
- storedir => 't/',
+ storedir => STORE_DIR,
);
@@ -34,8 +39,12 @@
my $chan2 = $store->fetch('channel', 'lobby');
is_deeply($chan, $chan2, "load channel");
+ok($store->exists('user', 'bobby'), 'exists user');
+ok($store->exists('channel', 'lobby'), 'exists channel');
$store->delete('user', 'bobby');
$store->delete('channel', 'lobby');
ok(not(-e 't/user/bobby'), "delete user from store");
ok(not(-e 't/channel/lobby'), "delete channel from store");
+
+rmtree(STORE_DIR, 0);