ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/ObjectUtilities/ObjectStore.pm
Revision: 1.9
Committed: Tue Feb 8 14:41:19 2000 UTC (25 years, 3 months ago) by williamc
Content type: text/plain
Branch: MAIN
Changes since 1.8: +32 -2 lines
Log Message:
Add alias methods

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 williamc 1.2 # new(ObjectStore) :
12     # store(location) : dump out to location
13     # restore(location) : restore from location
14 williamc 1.5 # objects must inherit from StorableObject
15 williamc 1.1 #
16     # Interface
17     # ---------
18 williamc 1.3 # new(store_directory,[object]) : A new ObjectStore object. An alternative
19     # object can be specified with which to
20     # construct the stored objects with by
21     # supplying the object reference
22 williamc 1.1 # store(oref,@keys) : store an object - each object must have
23     # a unique key
24     # find(@keys) : find and recover object(s) from the store
25     # that match keys. Returned as a list of oref
26 williamc 1.2 # sequence(@keys) : return the sequence number of the object
27     # matching the keys
28     # An object is assigned a new sequence number
29     # with each store.
30 williamc 1.9 # delete(@keys) : Delete the object with the given key
31     # alias(\@refofkeys,\@aliaskeys) : attatch another set of keys to objects that
32     # match the refofkeys
33     # note that these are references to the arrays
34     # unalias(@aliaskeys) :remove an alias
35 williamc 1.1
36     package ObjectUtilities::ObjectStore;
37     require 5.004;
38     use Utilities::AddDir;
39     use Utilities::HashDB;
40    
41     sub new {
42     my $class=shift;
43     my $dir=shift;
44     $self={};
45 williamc 1.3 # do we have an alternative object to instantiate objects with
46     if ( @_ ) {
47     $self->{storeobject}=shift;
48     }
49     else {
50     $self->{storeobject}=$self;
51     }
52 williamc 1.1 bless $self, $class;
53     $self->{admindir}=$dir."/admin";
54     AddDir::adddir($self->{admindir});
55     if ( -d $dir ) {
56     $self->{storage}=$dir."/objects";
57     AddDir::adddir($self->{storage});
58     $self->_init();
59     }
60     else {
61     return undef;
62     }
63 williamc 1.9 #print "ObjectStore -- $self->{storeobject}\n";
64 williamc 1.1 return $self;
65     }
66    
67    
68     sub store {
69     my $self=shift;
70     my $oref=shift;
71     my @keys=@_;
72    
73     my $oreftype=ref($oref);
74 williamc 1.9 print "$self: Storing an object of type : $oreftype\n";
75 williamc 1.2 my $filename=$self->_filename(@keys);
76 williamc 1.8 $oref->store($self->_fullfilename($filename));
77 williamc 1.2 # Update the sequence number to track changes
78     my @seqnumbers=$self->{filehash}->getdata("__seq_number",@keys);
79     my $seqnumb=((@seqnumbers)?$seqnumbers[0]:-1)+1;
80     $self->{filehash}->deletedata("__seq_number",@keys);
81     $self->{filehash}->setdata($seqnumb,"__seq_number",@keys);
82    
83 williamc 1.1 $self->{filehash}->deletedata(@keys);
84     $self->{filehash}->setdata($filename,@keys); # persistent
85     $self->{typehash}->deletedata($filename);
86     $self->{typehash}->setdata($oreftype,$filename); # persistent
87     $self->{orefhash}->deletedata($filename);
88     $self->{orefhash}->setdata($oref,$filename); # transient
89     $self->_storedb();
90     }
91    
92 williamc 1.2 sub sequence {
93     my $self=shift;
94     my @keys=@_;
95    
96     my @seq=$self->{filehash}->getdata("__seq_number",@keys);
97 williamc 1.4 return (($#seq == 0)?$seq[0]:-1);
98 williamc 1.2 }
99    
100 williamc 1.1 sub find {
101     my $self=shift;
102 williamc 1.3 my @keys=@_;
103 williamc 1.1
104     my @oref=();
105     my $oref;
106     my @types;
107     my $type;
108     my @validobjs=();
109     my $fh;
110    
111 williamc 1.9 print "$self: Searching for : @keys\n";
112 williamc 1.1 my @datafiles=$self->{filehash}->getdata(@keys);
113     foreach $file ( @datafiles ) {
114     @oref=$self->{orefhash}->getdata($file);
115     if ( $#oref < 0 ) { # we need to instatniate it
116     @types=$self->{typehash}->getdata($file);
117     $type=$types[0];
118     eval "require $type";
119 williamc 1.3 $oref=$type->new($self->{storeobject});
120 williamc 1.8 $oref->restore($self->_fullfilename($file));
121 williamc 1.1 }
122     else {
123     $oref=$oref[0];
124     }
125     push @validobjs, $oref;
126     }
127     return @validobjs;
128 williamc 1.9 }
129    
130     sub alias {
131     my $self=shift;
132     $self->{filehash}->alias(@_);
133     }
134    
135     sub unalias {
136     my $self=shift;
137     $self->{filehash}->unalias(@_);
138     }
139    
140     sub delete {
141     my $self=shift;
142     my @keys=@_;
143    
144     my $filename=$self->_filename(@keys);
145     $self->{filehash}->deletedata("__seq_number",@keys);
146     $self->{filehash}->deletedata(@keys);
147     $self->{typehash}->deletedata($filename);
148     $self->{orefhash}->deletedata($filename);
149     $self->_storedb();
150     print "Deleting ".$self->_fullfilename($filename)."\n";
151     unlink $self->_fullfilename($filename);
152 williamc 1.1 }
153    
154     #
155     # Private routines
156     #
157     sub _filename {
158     my $self=shift;
159     my @keys=@_;
160    
161 williamc 1.2 my ($file)=$self->{filehash}->getdata(@keys);
162 williamc 1.3 if ( ! defined $file ) {
163 williamc 1.2 # need to generate a new filename - a random number will do
164     srand();
165     do {
166 williamc 1.7 $file=int(rand 99999999)+1;
167     } until ( ! ( -e $self->_fullfilename($file) ) );
168 williamc 1.2 }
169 williamc 1.7 return $file;
170     }
171    
172     sub _fullfilename {
173     my $self=shift;
174     my $file=shift;
175    
176     if ( $file!~/^\// ) { # return only full path names
177     $file=$self->{storage}."/".$file;
178     }
179 williamc 1.2 return $file;
180 williamc 1.1 }
181    
182     sub _storedb {
183     my $self=shift;
184     $self->{filehash}->store($self->{admindir}."/filedb");
185     $self->{typehash}->store($self->{admindir}."/typedb");
186     }
187    
188     sub _restoredb {
189     my $self=shift;
190     if ( -f $self->{admindir}."/filedb" ) {
191     $self->{filehash}->restore($self->{admindir}."/filedb");
192     $self->{typehash}->restore($self->{admindir}."/typedb");
193     }
194     }
195    
196     sub _openfile {
197     my $self=shift;
198     my $filename=shift;
199    
200     local $fh=FileHandle->new();
201     open ( $fh, $filename) or die "Unable to open $filename\n $!\n";
202     return $fh;
203     }
204    
205     sub _init {
206     my $self=shift;
207     $self->{filehash}=Utilities::HashDB->new();
208     $self->{typehash}=Utilities::HashDB->new();
209     $self->{orefhash}=Utilities::HashDB->new();
210     $self->_restoredb();
211     }