annotate variant_effect_predictor/Bio/DB/Flat/BDB.pm @ 0:1f6dce3d34e0

Uploaded
author mahtabm
date Thu, 11 Apr 2013 02:01:53 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2 # $Id: BDB.pm,v 1.6.2.1 2003/03/25 18:46:10 jason Exp $
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
3 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
4 # BioPerl module for Bio::DB::Flat::BDB
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
5 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
6 # Cared for by Lincoln Stein <lstein@cshl.org>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
7 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
8 # You may distribute this module under the same terms as perl itself
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
9
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
10 # POD documentation - main docs before the code
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
11
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
12 =head1 NAME
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
13
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
14 Bio::DB::Flat::BDB - Interface for BioHackathon standard BDB-indexed flat file
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
15
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
16 =head1 SYNOPSIS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
17
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
18 You should not be using this module directly. See Bio::DB::Flat.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
19
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
20 =head1 DESCRIPTION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
21
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
22 This object provides the basic mechanism to associate positions in
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
23 files with primary and secondary name spaces. Unlike
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
24 Bio::Index::Abstract (see L<Bio::Index::Abstract>), this is specialized
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
25 to work with the BerkeleyDB-indexed "common" flat file format worked
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
26 out at the 2002 BioHackathon.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
27
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
28 This object is the guts to the mechanism, which will be used by the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
29 specific objects inheriting from it.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
30
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
31 =head1 FEEDBACK
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
32
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
33 =head2 Mailing Lists
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
34
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
35 User feedback is an integral part of the evolution of this and other
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
36 Bioperl modules. Send your comments and suggestions preferably to one
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
37 of the Bioperl mailing lists. Your participation is much appreciated.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
38
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
39 bioperl-l@bioperl.org - General discussion
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
40 http://bioperl.org/MailList.shtml - About the mailing lists
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
41
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
42 =head2 Reporting Bugs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
43
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
44 Report bugs to the Bioperl bug tracking system to help us keep track
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
45 the bugs and their resolution. Bug reports can be submitted via
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
46 email or the web:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
47
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
48 http://bugzilla.bioperl.org/
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
49
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
50 =head1 AUTHOR - Lincoln Stein
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
51
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
52 Email - lstein@cshl.org
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
53
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
54 =head1 SEE ALSO
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
55
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
56 L<Bio::DB::Flat>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
57
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
58 =head1 APPENDIX
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
59
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
60 The rest of the documentation details each of the object methods. Internal
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
61 methods are usually preceded with an "_" (underscore).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
62
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
63 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
64
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
65
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
66 # Let the code begin...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
67
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
68 package Bio::DB::Flat::BDB;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
69
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
70 use strict;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
71 use DB_File;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
72 use IO::File;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
73 use Fcntl qw(O_CREAT O_RDWR O_RDONLY);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
74 use File::Spec;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
75 use Bio::DB::Flat;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
76 use Bio::SeqIO;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
77 use Bio::DB::RandomAccessI;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
78 use Bio::Root::Root;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
79 use Bio::Root::IO;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
80 use vars '@ISA';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
81
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
82 @ISA = qw(Bio::DB::Flat);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
83
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
84 sub _initialize {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
85 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
86 my ($max_open) = $self->_rearrange(['MAXOPEN'],@_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
87 $self->{bdb_maxopen} = $max_open || 32;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
88 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
89
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
90 # return a filehandle seeked to the appropriate place
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
91 # this only works with the primary namespace
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
92 sub _get_stream {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
93 my ($self,$id) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
94 my ($filepath,$offset,$length) = $self->_lookup_primary($id)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
95 or $self->throw("Unable to find a record for $id in the flat file index");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
96 my $fh = $self->_fhcache($filepath)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
97 or $self->throw("couldn't open $filepath: $!");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
98 seek($fh,$offset,0) or $self->throw("can't seek on $filepath: $!");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
99 $fh;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
100 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
101
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
102 # return records corresponding to the indicated index
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
103 # if there are multiple hits will return a list in list context,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
104 # otherwise will throw an exception
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
105 sub fetch_raw {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
106 my ($self,$id,$namespace) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
107
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
108 # secondary lookup
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
109 if (defined $namespace && $namespace ne $self->primary_namespace) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
110 my @hits = $self->_lookup_secondary($namespace,$id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
111 $self->throw("Multiple records correspond to $namespace=>$id but function called in a scalar context")
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
112 unless wantarray;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
113 return map {$self->_read_record(@$_)} @hits;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
114 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
115
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
116 # primary lookup
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
117 my @args = $self->_lookup_primary($id)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
118 or $self->throw("Unable to find a record for $id in the flat file index");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
119 return $self->_read_record(@args);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
120 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
121
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
122 # create real live Bio::Seq object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
123 sub get_Seq_by_id {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
124 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
125 my $id = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
126 my $fh = eval {$self->_get_stream($id)} or return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
127 my $seqio =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
128 $self->{bdb_cached_parsers}{fileno $fh} ||= Bio::SeqIO->new( -Format => $self->file_format,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
129 -fh => $fh);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
130 return $seqio->next_seq;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
131 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
132
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
133 # fetch array of Bio::Seq objects
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
134 sub get_Seq_by_acc {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
135 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
136 unshift @_,'ACC' if @_==1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
137 my ($ns,$key) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
138 my @primary_ids = $self->expand_ids($ns => $key);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
139 $self->throw("more than one sequences correspond to this accession")
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
140 if @primary_ids > 1 && ! wantarray;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
141 my @rc = map {$self->get_Seq_by_id($_)} @primary_ids;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
142 return wantarray ? @rc : $rc[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
143 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
144
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
145 # fetch array of Bio::Seq objects
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
146 sub get_Seq_by_version {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
147 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
148 unshift @_,'VERSION' if @_==1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
149 my ($ns,$key) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
150 my @primary_ids = $self->expand_ids($ns => $key);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
151 $self->throw("more than one sequences correspond to this accession")
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
152 if @primary_ids > 1 && !wantarray;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
153 return map {$self->get_Seq_by_id($_)} @primary_ids;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
154 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
155
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
156 =head2 get_PrimarySeq_stream
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
157
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
158 Title : get_PrimarySeq_stream
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
159 Usage : $stream = get_PrimarySeq_stream
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
160 Function: Makes a Bio::DB::SeqStreamI compliant object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
161 which provides a single method, next_primary_seq
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
162 Returns : Bio::DB::SeqStreamI
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
163 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
164
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
165
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
166 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
167
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
168 sub get_PrimarySeq_stream {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
169 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
170 my @files = $self->files || 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
171 my $out = Bio::SeqIO::MultiFile->new( -format => $self->file_format ,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
172 -files => \@files);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
173 return $out;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
174 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
175
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
176 sub get_all_primary_ids {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
177 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
178 my $db = $self->primary_db;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
179 return keys %$db;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
180 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
181
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
182 =head2 get_all_primary_ids
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
183
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
184 Title : get_all_primary_ids
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
185 Usage : @ids = $seqdb->get_all_primary_ids()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
186 Function: gives an array of all the primary_ids of the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
187 sequence objects in the database.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
188 Example :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
189 Returns : an array of strings
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
190 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
191
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
192 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
193
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
194 # this will perform an ID lookup on a (possibly secondary)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
195 # id, returning all the corresponding ids
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
196 sub expand_ids {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
197 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
198 my ($ns,$key) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
199 return $key unless defined $ns;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
200 return $key if $ns eq $self->primary_namespace;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
201 my $db = $self->secondary_db($ns)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
202 or $self->throw("invalid secondary namespace $ns");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
203 my $record = $db->{$key} or return; # nothing there
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
204 return $self->unpack_secondary($record);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
205 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
206
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
207 # build index from files listed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
208 sub build_index {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
209 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
210 my @files = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
211 my $count = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
212 for my $file (@files) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
213 $file = File::Spec->rel2abs($file)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
214 unless File::Spec->file_name_is_absolute($file);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
215 $count += $self->_index_file($file);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
216 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
217 $self->write_config;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
218 $count;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
219 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
220
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
221 sub _index_file {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
222 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
223 my $file = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
224
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
225 my $fileno = $self->_path2fileno($file);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
226 defined $fileno or $self->throw("could not create a file number for $file");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
227
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
228 my $fh = $self->_fhcache($file) or $self->throw("could not open $file for indexing: $!");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
229 my $offset = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
230 my $count = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
231 while (!eof($fh)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
232 my ($ids,$adjustment) = $self->parse_one_record($fh) or next;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
233 $adjustment ||= 0; # prevent uninit variable warning
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
234 my $pos = tell($fh) + $adjustment;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
235 $self->_store_index($ids,$file,$offset,$pos-$offset);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
236 $offset = $pos;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
237 $count++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
238 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
239 $count;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
240 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
241
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
242 =head2 To Be Implemented in Subclasses
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
243
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
244 The following methods MUST be implemented by subclasses.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
245
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
246 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
247
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
248 =head2 May Be Overridden in Subclasses
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
249
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
250 The following methods MAY be overridden by subclasses.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
251
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
252 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
253
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
254 sub default_primary_namespace {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
255 return "ACC";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
256 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
257
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
258 sub default_secondary_namespaces {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
259 return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
260 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
261
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
262 sub _read_record {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
263 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
264 my ($filepath,$offset,$length) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
265 my $fh = $self->_fhcache($filepath)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
266 or $self->throw("couldn't open $filepath: $!");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
267 seek($fh,$offset,0) or $self->throw("can't seek on $filepath: $!");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
268 my $record;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
269 read($fh,$record,$length) or $self->throw("can't read $filepath: $!");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
270 $record
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
271 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
272
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
273 # return a list in the form ($filepath,$offset,$length)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
274 sub _lookup_primary {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
275 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
276 my $primary = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
277 my $db = $self->primary_db
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
278 or $self->throw("no primary namespace database is open");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
279
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
280 my $record = $db->{$primary} or return; # nothing here
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
281
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
282 my($fileid,$offset,$length) = $self->unpack_primary($record);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
283 my $filepath = $self->_fileno2path($fileid)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
284 or $self->throw("no file path entry for fileid $fileid");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
285 return ($filepath,$offset,$length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
286 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
287
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
288 # return a list of array refs in the form [$filepath,$offset,$length]
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
289 sub _lookup_secondary {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
290 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
291 my ($namespace,$secondary) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
292 my @primary = $self->expand_ids($namespace=>$secondary);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
293 return map {[$self->_lookup_primary($_)]} @primary;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
294 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
295
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
296 # store indexing information into a primary & secondary record
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
297 # $namespaces is one of:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
298 # 1. a scalar corresponding to the primary name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
299 # 2. a hashref corresponding to namespace=>id identifiers
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
300 # it is valid for secondary id to be an arrayref
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
301 sub _store_index {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
302 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
303 my ($keys,$filepath,$offset,$length) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
304 my ($primary,%secondary);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
305
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
306 if (ref $keys eq 'HASH') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
307 my %valid_secondary = map {$_=>1} $self->secondary_namespaces;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
308 while (my($ns,$value) = each %$keys) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
309 if ($ns eq $self->primary_namespace) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
310 $primary = $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
311 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
312 $valid_secondary{$ns} or $self->throw("invalid secondary namespace $ns");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
313 push @{$secondary{$ns}},$value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
314 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
315 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
316 $primary or $self->throw("no primary namespace ID provided");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
317 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
318 $primary = $keys;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
319 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
320
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
321 $self->throw("invalid primary ID; must be a scalar")
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
322 if ref($primary) =~ /^(ARRAY|HASH)$/; # but allow stringified objects
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
323
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
324 $self->_store_primary($primary,$filepath,$offset,$length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
325 for my $ns (keys %secondary) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
326 my @ids = ref $secondary{$ns} ? @{$secondary{$ns}} : $secondary{$ns};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
327 $self->_store_secondary($ns,$_,$primary) foreach @ids;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
328 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
329
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
330 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
331 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
332
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
333 # store primary index
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
334 sub _store_primary {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
335 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
336 my ($id,$filepath,$offset,$length) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
337
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
338 my $db = $self->primary_db
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
339 or $self->throw("no primary namespace database is open");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
340 my $fileno = $self->_path2fileno($filepath);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
341 defined $fileno or $self->throw("could not create a file number for $filepath");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
342
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
343 my $record = $self->pack_primary($fileno,$offset,$length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
344 $db->{$id} = $record or return; # nothing here
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
345 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
346 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
347
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
348 # store a primary index name under a secondary index
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
349 sub _store_secondary {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
350 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
351 my ($secondary_ns,$secondary_id,$primary_id) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
352
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
353 my $db = $self->secondary_db($secondary_ns)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
354 or $self->throw("invalid secondary namespace $secondary_ns");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
355
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
356 # first get whatever secondary ids are already stored there
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
357 my @primary = $self->unpack_secondary($db->{$secondary_id});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
358 # uniqueify
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
359 my %unique = map {$_=>undef} @primary,$primary_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
360
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
361 my $record = $self->pack_secondary(keys %unique);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
362 $db->{$secondary_id} = $record;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
363 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
364
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
365 # get output file handle
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
366 sub _outfh {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
367 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
368 #### XXXXX FINISH #####
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
369 # my $
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
370 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
371
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
372 # unpack a primary record into fileid,offset,length
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
373 sub unpack_primary {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
374 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
375 my $index_record = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
376 return split "\t",$index_record;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
377 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
378
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
379 # unpack a secondary record into a list of primary ids
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
380 sub unpack_secondary {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
381 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
382 my $index_record = shift or return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
383 return split "\t",$index_record;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
384 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
385
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
386 # pack a list of fileid,offset,length into a primary id record
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
387 sub pack_primary {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
388 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
389 my ($fileid,$offset,$length) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
390 return join "\t",($fileid,$offset,$length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
391 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
392
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
393 # pack a list of primary ids into a secondary id record
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
394 sub pack_secondary {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
395 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
396 my @secondaries = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
397 return join "\t",@secondaries;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
398 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
399
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
400 sub primary_db {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
401 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
402 # lazy opening
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
403 $self->_open_bdb unless exists $self->{bdb_primary_db};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
404 return $self->{bdb_primary_db};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
405 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
406
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
407 sub secondary_db {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
408 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
409 my $secondary_namespace = shift
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
410 or $self->throw("usage: secondary_db(\$secondary_namespace)");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
411 $self->_open_bdb unless exists $self->{bdb_primary_db};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
412 return $self->{bdb_secondary_db}{$secondary_namespace};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
413 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
414
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
415 sub _open_bdb {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
416 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
417
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
418 my $flags = $self->write_flag ? O_CREAT|O_RDWR : O_RDONLY;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
419
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
420 my $primary_db = {};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
421 tie(%$primary_db,'DB_File',$self->_catfile($self->_primary_db_name),$flags,0666,$DB_BTREE)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
422 or $self->throw("Could not open primary index file: $! (did you remember to use -write_flag=>1?)");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
423 $self->{bdb_primary_db} = $primary_db;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
424
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
425 for my $secondary ($self->secondary_namespaces) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
426 my $secondary_db = {};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
427 tie(%$secondary_db,'DB_File',$self->_catfile($self->_secondary_db_name($secondary)),$flags,0666,$DB_BTREE)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
428 or $self->throw("Could not open primary index file");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
429 $self->{bdb_secondary_db}{$secondary} = $secondary_db;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
430 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
431
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
432 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
433 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
434
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
435 sub _primary_db_name {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
436 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
437 my $pns = $self->primary_namespace or $self->throw('no primary namespace defined');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
438 return "key_$pns";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
439 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
440
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
441 sub _secondary_db_name {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
442 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
443 my $sns = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
444 return "id_$sns";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
445 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
446
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
447 sub _fhcache {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
448 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
449 my $path = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
450 my $write = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
451
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
452 if (!$self->{bdb_fhcache}{$path}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
453 $self->{bdb_curopen} ||= 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
454 if ($self->{bdb_curopen} >= $self->{bdb_maxopen}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
455 my @lru = sort {$self->{bdb_cacheseq}{$a} <=> $self->{bdb_cacheseq}{$b};} keys %{$self->{bdb_fhcache}};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
456 splice(@lru, $self->{bdb_maxopen} / 3);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
457 $self->{bdb_curopen} -= @lru;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
458 for (@lru) { delete $self->{bdb_fhcache}{$_} }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
459 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
460 if ($write) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
461 my $modifier = $self->{bdb_fhcache_seenit}{$path}++ ? '>' : '>>';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
462 $self->{bdb_fhcache}{$path} = IO::File->new("${modifier}${path}") or return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
463 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
464 $self->{bdb_fhcache}{$path} = IO::File->new($path) or return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
465 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
466 $self->{bdb_curopen}++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
467 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
468 $self->{bdb_cacheseq}{$path}++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
469 $self->{bdb_fhcache}{$path}
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
470 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
471
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
472 1;