ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/ObjectUtilities/ObjectStore.pm
Revision: 1.4
Committed: Tue Nov 23 17:23:20 1999 UTC (25 years, 5 months ago) by williamc
Content type: text/plain
Branch: MAIN
Changes since 1.3: +1 -1 lines
Log Message:
sequence fixed

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