ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/ObjectUtilities/ObjectStore.pm
Revision: 1.7
Committed: Mon Jan 24 17:52:42 2000 UTC (25 years, 3 months ago) by williamc
Content type: text/plain
Branch: MAIN
Changes since 1.6: +12 -3 lines
Log Message:
Made relocatable

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.6 print "Storing an $oreftype\n";
70 williamc 1.2 my $filename=$self->_filename(@keys);
71     #my $fh=$self->_openfile(">".$filename);
72     #$oref->store($fh);
73     #close $fh;
74     $oref->store($filename);
75     # Update the sequence number to track changes
76     my @seqnumbers=$self->{filehash}->getdata("__seq_number",@keys);
77     my $seqnumb=((@seqnumbers)?$seqnumbers[0]:-1)+1;
78     $self->{filehash}->deletedata("__seq_number",@keys);
79     $self->{filehash}->setdata($seqnumb,"__seq_number",@keys);
80    
81 williamc 1.1 $self->{filehash}->deletedata(@keys);
82     $self->{filehash}->setdata($filename,@keys); # persistent
83     $self->{typehash}->deletedata($filename);
84     $self->{typehash}->setdata($oreftype,$filename); # persistent
85     $self->{orefhash}->deletedata($filename);
86     $self->{orefhash}->setdata($oref,$filename); # transient
87     $self->_storedb();
88     }
89    
90 williamc 1.2 sub sequence {
91     my $self=shift;
92     my @keys=@_;
93    
94     my @seq=$self->{filehash}->getdata("__seq_number",@keys);
95 williamc 1.4 return (($#seq == 0)?$seq[0]:-1);
96 williamc 1.2 }
97    
98 williamc 1.1 sub find {
99     my $self=shift;
100 williamc 1.3 my @keys=@_;
101 williamc 1.1
102     my @oref=();
103     my $oref;
104     my @types;
105     my $type;
106     my @validobjs=();
107     my $fh;
108    
109     my @datafiles=$self->{filehash}->getdata(@keys);
110     foreach $file ( @datafiles ) {
111     @oref=$self->{orefhash}->getdata($file);
112     if ( $#oref < 0 ) { # we need to instatniate it
113     @types=$self->{typehash}->getdata($file);
114     $type=$types[0];
115     eval "require $type";
116 williamc 1.3 $oref=$type->new($self->{storeobject});
117 williamc 1.2 #$fh=$self->_openfile("<".$file);
118     #$oref->restore($fh);
119     #close $fh;
120     $oref->restore($file);
121 williamc 1.1 }
122     else {
123     $oref=$oref[0];
124     }
125     push @validobjs, $oref;
126     }
127     return @validobjs;
128     }
129    
130     #
131     # Private routines
132     #
133     sub _filename {
134     my $self=shift;
135     my @keys=@_;
136    
137 williamc 1.2 my ($file)=$self->{filehash}->getdata(@keys);
138 williamc 1.3 if ( ! defined $file ) {
139 williamc 1.2 # need to generate a new filename - a random number will do
140     srand();
141     do {
142 williamc 1.7 $file=int(rand 99999999)+1;
143     } until ( ! ( -e $self->_fullfilename($file) ) );
144 williamc 1.2 }
145 williamc 1.7 return $file;
146     }
147    
148     sub _fullfilename {
149     my $self=shift;
150     my $file=shift;
151    
152     if ( $file!~/^\// ) { # return only full path names
153     $file=$self->{storage}."/".$file;
154     }
155 williamc 1.2 return $file;
156 williamc 1.1 }
157    
158     sub _storedb {
159     my $self=shift;
160     $self->{filehash}->store($self->{admindir}."/filedb");
161     $self->{typehash}->store($self->{admindir}."/typedb");
162     }
163    
164     sub _restoredb {
165     my $self=shift;
166     if ( -f $self->{admindir}."/filedb" ) {
167     $self->{filehash}->restore($self->{admindir}."/filedb");
168     $self->{typehash}->restore($self->{admindir}."/typedb");
169     }
170     }
171    
172     sub _openfile {
173     my $self=shift;
174     my $filename=shift;
175    
176     local $fh=FileHandle->new();
177     open ( $fh, $filename) or die "Unable to open $filename\n $!\n";
178     return $fh;
179     }
180    
181     sub _init {
182     my $self=shift;
183     $self->{filehash}=Utilities::HashDB->new();
184     $self->{typehash}=Utilities::HashDB->new();
185     $self->{orefhash}=Utilities::HashDB->new();
186     $self->_restoredb();
187     }