ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/ObjectUtilities/ObjectStore.pm
Revision: 1.8
Committed: Wed Jan 26 12:01:17 2000 UTC (25 years, 3 months ago) by williamc
Content type: text/plain
Branch: MAIN
Changes since 1.7: +3 -9 lines
Log Message:
Debug new relative storage mechanism

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.1
31     package ObjectUtilities::ObjectStore;
32     require 5.004;
33     use Utilities::AddDir;
34     use Utilities::HashDB;
35    
36     sub new {
37     my $class=shift;
38     my $dir=shift;
39     $self={};
40 williamc 1.3 # do we have an alternative object to instantiate objects with
41     if ( @_ ) {
42     $self->{storeobject}=shift;
43     }
44     else {
45     $self->{storeobject}=$self;
46     }
47 williamc 1.1 bless $self, $class;
48     $self->{admindir}=$dir."/admin";
49     AddDir::adddir($self->{admindir});
50     if ( -d $dir ) {
51     $self->{storage}=$dir."/objects";
52     AddDir::adddir($self->{storage});
53     $self->_init();
54     }
55     else {
56     return undef;
57     }
58 williamc 1.3 print " -- $self->{storeobject}\n";
59 williamc 1.1 return $self;
60     }
61    
62    
63     sub store {
64     my $self=shift;
65     my $oref=shift;
66     my @keys=@_;
67    
68     my $oreftype=ref($oref);
69 williamc 1.8 print "Storing an object of type : $oreftype\n";
70 williamc 1.2 my $filename=$self->_filename(@keys);
71 williamc 1.8 $oref->store($self->_fullfilename($filename));
72 williamc 1.2 # Update the sequence number to track changes
73     my @seqnumbers=$self->{filehash}->getdata("__seq_number",@keys);
74     my $seqnumb=((@seqnumbers)?$seqnumbers[0]:-1)+1;
75     $self->{filehash}->deletedata("__seq_number",@keys);
76     $self->{filehash}->setdata($seqnumb,"__seq_number",@keys);
77    
78 williamc 1.1 $self->{filehash}->deletedata(@keys);
79     $self->{filehash}->setdata($filename,@keys); # persistent
80     $self->{typehash}->deletedata($filename);
81     $self->{typehash}->setdata($oreftype,$filename); # persistent
82     $self->{orefhash}->deletedata($filename);
83     $self->{orefhash}->setdata($oref,$filename); # transient
84     $self->_storedb();
85     }
86    
87 williamc 1.2 sub sequence {
88     my $self=shift;
89     my @keys=@_;
90    
91     my @seq=$self->{filehash}->getdata("__seq_number",@keys);
92 williamc 1.4 return (($#seq == 0)?$seq[0]:-1);
93 williamc 1.2 }
94    
95 williamc 1.1 sub find {
96     my $self=shift;
97 williamc 1.3 my @keys=@_;
98 williamc 1.1
99     my @oref=();
100     my $oref;
101     my @types;
102     my $type;
103     my @validobjs=();
104     my $fh;
105    
106     my @datafiles=$self->{filehash}->getdata(@keys);
107     foreach $file ( @datafiles ) {
108     @oref=$self->{orefhash}->getdata($file);
109     if ( $#oref < 0 ) { # we need to instatniate it
110     @types=$self->{typehash}->getdata($file);
111     $type=$types[0];
112     eval "require $type";
113 williamc 1.3 $oref=$type->new($self->{storeobject});
114 williamc 1.8 $oref->restore($self->_fullfilename($file));
115 williamc 1.1 }
116     else {
117     $oref=$oref[0];
118     }
119     push @validobjs, $oref;
120     }
121     return @validobjs;
122     }
123    
124     #
125     # Private routines
126     #
127     sub _filename {
128     my $self=shift;
129     my @keys=@_;
130    
131 williamc 1.2 my ($file)=$self->{filehash}->getdata(@keys);
132 williamc 1.3 if ( ! defined $file ) {
133 williamc 1.2 # need to generate a new filename - a random number will do
134     srand();
135     do {
136 williamc 1.7 $file=int(rand 99999999)+1;
137     } until ( ! ( -e $self->_fullfilename($file) ) );
138 williamc 1.2 }
139 williamc 1.7 return $file;
140     }
141    
142     sub _fullfilename {
143     my $self=shift;
144     my $file=shift;
145    
146     if ( $file!~/^\// ) { # return only full path names
147     $file=$self->{storage}."/".$file;
148     }
149 williamc 1.2 return $file;
150 williamc 1.1 }
151    
152     sub _storedb {
153     my $self=shift;
154     $self->{filehash}->store($self->{admindir}."/filedb");
155     $self->{typehash}->store($self->{admindir}."/typedb");
156     }
157    
158     sub _restoredb {
159     my $self=shift;
160     if ( -f $self->{admindir}."/filedb" ) {
161     $self->{filehash}->restore($self->{admindir}."/filedb");
162     $self->{typehash}->restore($self->{admindir}."/typedb");
163     }
164     }
165    
166     sub _openfile {
167     my $self=shift;
168     my $filename=shift;
169    
170     local $fh=FileHandle->new();
171     open ( $fh, $filename) or die "Unable to open $filename\n $!\n";
172     return $fh;
173     }
174    
175     sub _init {
176     my $self=shift;
177     $self->{filehash}=Utilities::HashDB->new();
178     $self->{typehash}=Utilities::HashDB->new();
179     $self->{orefhash}=Utilities::HashDB->new();
180     $self->_restoredb();
181     }