ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/ObjectUtilities/ObjectStore.pm
Revision: 1.2
Committed: Thu Nov 11 12:52:59 1999 UTC (25 years, 6 months ago) by williamc
Content type: text/plain
Branch: MAIN
Changes since 1.1: +42 -14 lines
Log Message:
random numbers for filenames

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