ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/ObjectUtilities/ObjectStore.pm
Revision: 1.1
Committed: Thu Oct 21 17:53:42 1999 UTC (25 years, 6 months ago) by williamc
Content type: text/plain
Branch: MAIN
Log Message:
First working mini object store

File Contents

# User Rev Content
1 williamc 1.1 #
2     # ObjectStore.pm
3     #
4     # Originally Written by Christopher Williams
5     #
6     # Description
7     # -----------
8     # An very simple object persistency manager for small scale use.
9     # Objects are saved and recovered on demand
10     # Objects to be stored in this manager must implement the following interface
11     # new() : No arguments to new
12     # store(filehandle) : dump out to stream passed by filehandle
13     # restore(filehandle) : restore from stream passed by filehandle
14     #
15     # Interface
16     # ---------
17     # new(store_directory) : A new ObjectStore object
18     # store(oref,@keys) : store an object - each object must have
19     # a unique key
20     # find(@keys) : find and recover object(s) from the store
21     # that match keys. Returned as a list of oref
22    
23     package ObjectUtilities::ObjectStore;
24     require 5.004;
25     use Utilities::AddDir;
26     use Utilities::HashDB;
27    
28     sub new {
29     my $class=shift;
30     my $dir=shift;
31     $self={};
32     bless $self, $class;
33     $self->{admindir}=$dir."/admin";
34     AddDir::adddir($self->{admindir});
35     if ( -d $dir ) {
36     $self->{storage}=$dir."/objects";
37     AddDir::adddir($self->{storage});
38     $self->_init();
39     }
40     else {
41     return undef;
42     }
43     return $self;
44     }
45    
46    
47     sub store {
48     my $self=shift;
49     my $oref=shift;
50     my @keys=@_;
51    
52     my $oreftype=ref($oref);
53     my $filename=$self->{storage}."/".$self->_filename(@keys);
54     my $fh=$self->_openfile(">".$filename);
55     $oref->store($fh);
56     close $fh;
57     $self->{filehash}->deletedata(@keys);
58     $self->{filehash}->setdata($filename,@keys); # persistent
59     $self->{typehash}->deletedata($filename);
60     $self->{typehash}->setdata($oreftype,$filename); # persistent
61     $self->{orefhash}->deletedata($filename);
62     $self->{orefhash}->setdata($oref,$filename); # transient
63     $self->_storedb();
64     }
65    
66     sub find {
67     my $self=shift;
68     my @keys=shift;
69    
70     my @oref=();
71     my $oref;
72     my @types;
73     my $type;
74     my @validobjs=();
75     my $fh;
76    
77     my @datafiles=$self->{filehash}->getdata(@keys);
78     foreach $file ( @datafiles ) {
79     @oref=$self->{orefhash}->getdata($file);
80     if ( $#oref < 0 ) { # we need to instatniate it
81     @types=$self->{typehash}->getdata($file);
82     $type=$types[0];
83     eval "require $type";
84     $oref=$type->new();
85     $fh=$self->_openfile("<".$file);
86     $oref->restore($fh);
87     close $fh;
88     }
89     else {
90     $oref=$oref[0];
91     }
92     push @validobjs, $oref;
93     }
94     return @validobjs;
95     }
96    
97     #
98     # Private routines
99     #
100     sub _filename {
101     my $self=shift;
102     my @keys=@_;
103    
104     my $filename=join '_', @keys;
105     return $filename;
106     }
107    
108     sub _storedb {
109     my $self=shift;
110     $self->{filehash}->store($self->{admindir}."/filedb");
111     $self->{typehash}->store($self->{admindir}."/typedb");
112     }
113    
114     sub _restoredb {
115     my $self=shift;
116     if ( -f $self->{admindir}."/filedb" ) {
117     $self->{filehash}->restore($self->{admindir}."/filedb");
118     $self->{typehash}->restore($self->{admindir}."/typedb");
119     close $fh;
120     }
121     }
122    
123     sub _openfile {
124     my $self=shift;
125     my $filename=shift;
126    
127     local $fh=FileHandle->new();
128     open ( $fh, $filename) or die "Unable to open $filename\n $!\n";
129     return $fh;
130     }
131    
132     sub _init {
133     my $self=shift;
134     $self->{filehash}=Utilities::HashDB->new();
135     $self->{typehash}=Utilities::HashDB->new();
136     $self->{orefhash}=Utilities::HashDB->new();
137     $self->_restoredb();
138     }