annotate variant_effect_predictor/Bio/EnsEMBL/DBFile/CollectionAdaptor.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 =head1 LICENSE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
3 Copyright (c) 1999-2012 The European Bioinformatics Institute and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
4 Genome Research Limited. All rights reserved.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
5
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
6 This software is distributed under a modified Apache license.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
7 For license details, please see
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
8
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
9 http://www.ensembl.org/info/about/code_licence.html
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
10
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
11 =head1 CONTACT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
12
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
13 Please email comments or questions to the public Ensembl
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
14 developers list at <dev@ensembl.org>.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
15
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
16 Questions may also be sent to the Ensembl help desk at
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
17 <helpdesk@ensembl.org>.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
18
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
19 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
20
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
21 =head1 NAME
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
22
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
23 Bio::EnsEMBL::DBFile::CollectionAdaptor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
24
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
25 =head1 SYNOPSIS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
26
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
27 For use with a Bio::EnsEMBL::Collector e.g.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
28
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
29 package Bio::EnsEMBL::Funcgen::DBSQL::ResultFeatureAdaptor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
30
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
31 @ISA = qw(Bio::EnsEMBL::Funcgen::DBSQL::BaseFeatureAdaptor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
32 Bio::EnsEMBL::Funcgen::Collector::ResultFeature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
33 Bio::EnsEMBL::DBFile::CollectionAdaptor);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
34 #DBSQL and DBFile inheritance here due to dynamic nature of ResultFeatureAdaptor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
35
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
36
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
37 Fetch wrapper methods access file based data via read_collection_blob:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
38
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
39 sub _fetch_from_file_by_Slice_ResultSet{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
40
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
41 #define filepath/config
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
42
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
43 my $packed_scores = $self->read_collection_blob(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
44 $filepath,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
45 $efg_sr_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
46 $conf->{$window_size}{'byte_offset'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
47 $conf->{$window_size}{'byte_length'},
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
48 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
49
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
50 #Do unpacking and object creation here
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
51
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
52 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
53
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
54 =head1 DESCRIPTION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
55
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
56 Adaptor for direct collection(.col) file access, which are binary compressed fixed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
57 width format files providing window based values across the genome. Collection files
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
58 integrate an index block which contains seq_region byte off set values.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
59
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
60 NOTE: By default all collection files are generated and packed using little endian encoding.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
61 Due to the lack of standards of float encoding(wrt to endianess) perl packs using the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
62 implicit endianess of the underlying architecture. This means that accessing float
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
63 collection files located on a big endian architecture will produce unexpected results.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
64
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
65 # endian issues will disappear with knetfile xsubs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
66
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
67 =head1 SEE ALSO
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
68
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
69 Bio::EnsEMBL::DBFile::FileAdaptor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
70
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
71 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
72
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
73
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
74
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
75 package Bio::EnsEMBL::DBFile::CollectionAdaptor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
76
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
77 use strict;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
78 use warnings;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
79
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
80 use Bio::EnsEMBL::DBFile::FileAdaptor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
81 use Bio::EnsEMBL::Utils::Exception qw(throw warning deprecate);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
82 use vars qw(@ISA);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
83 @ISA = qw(Bio::EnsEMBL::DBFile::FileAdaptor);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
84
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
85
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
86 =head2 initialise_filehandle
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
87
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
88 Arg[1] : string - filepath
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
89 Example : $self->initialise_filehandle($filepath);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
90 Description: Initialises the filehandle for use, in this case reads
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
91 the index (seq_region offsets)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
92 Returntype : None
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
93 Exceptions : warns if read fails
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
94 Caller : Bio::EnsEMBL::DBFile::FileAdaptor::get_filehandle
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
95 Status : at risk
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
96
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
97 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
98
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
99 sub initialise_filehandle{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
100 my ($self, $filepath) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
101 my $fh = $self->{file_cache}{$filepath}{filehandle};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
102
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
103 #offsets include the length of the complete index block
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
104 my ($index_size, $read_bytes, $index, $num_keys, %offset_index);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
105
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
106 ### INDEX FORMAT ###
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
107 #First block of the index the index size in bytes(not inc size block).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
108 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
109 #Rest of index is a hash of sr_id(v 2 bytes) key offset(V 4 bytes) value pairs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
110 #V (long) is 4 bytes(via sys/read), which is actually an Config{intsize} i.e. i?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
111 #long is 8 bytes according to Config{longsize}!
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
112
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
113 #read uses logical characters not necessarily in bytes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
114 #altho this does seem to read bytes, maybe due to binmode?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
115 #seek is in bytes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
116 #Changed to sysread/read which both use bytes explicitly
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
117 #Can't mix sysread/seek due to I/O buffering differences
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
118
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
119
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
120 #Read index_size first encoded as v(2 bytes)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
121 $read_bytes = sysread($fh, $index_size, 2);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
122
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
123 if(! ((defined $read_bytes) && ($read_bytes == 2))){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
124 #! defined is error 0 is end of file
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
125 warn "Failed to read index size from $filepath\n$!";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
126
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
127 #Delete fh as it is useless/unsafe to retry
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
128 undef $self->{file_cache}{$filepath}{filehandle};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
129 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
130 else{ #Read index
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
131 ($index_size) = unpack('v', $index_size);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
132 $read_bytes = sysread($fh, $index, $index_size); #Now read index proper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
133
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
134 if(! ((defined $read_bytes) && ($read_bytes == $index_size))){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
135 #! defined is error 0 is end of file
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
136 warn "Failed to read index from $filepath\n$!";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
137
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
138 #Delete fh as it is useless/unsafe to retry
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
139 undef $self->{file_cache}{$filepath}{filehandle};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
140 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
141 else{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
142 #Number of key-value pairs => $index_size /(size of key(v 2bytes) + size of offset(V 4bytes))
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
143 $num_keys = $index_size/6;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
144 my $unpack_template = '(vV)'.$num_keys,;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
145
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
146 %offset_index = unpack($unpack_template, $index);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
147 $self->{file_cache}{$filepath}{off_sets} = \%offset_index;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
148 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
149 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
150
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
151 return $self->{file_cache}{$filepath}{off_sets};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
152 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
153
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
154
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
155 =head2 read_collection_blob
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
156
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
157 Arg[1] : string - filepath
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
158 Arg[2] : int - seq_region_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
159 Arg[3] : int - seq_region offset. The byte offset required to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
160 locate the required start position
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
161 Arg[4] : int - byte length to read
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
162 Example : my $blob_substr = $self->read_collection_blob($filepath,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
163 $sr_key,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
164 $sr_offset,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
165 $byte_length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
166 Description: Reads bytes from file given a seq_region_key, byte offset and byte length.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
167 Sets filehandle to undef if read fails.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
168 Returntype : string - packed binary data
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
169 Exceptions : warns if seek or read errors
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
170 Caller : general e.g. fetch_from_file_by_Slice_ResultSet
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
171 Status : at risk
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
172
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
173 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
174
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
175 # We could change this to take a Slice, hence we could check
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
176 # whether an EOF error is because the slice is out of range
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
177 # and undef only if it is in range i.e. the index/file is corrupt
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
178 # overkill?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
179 # This is something the Slice API should warn about
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
180 # but will still cause undef'd filehandle here
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
181 # Index should also contain ends, so we can validate whether the slice is out of range???
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
182
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
183
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
184 sub read_collection_blob{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
185 my($self, $filepath, $sr_key, $sr_offset, $byte_length) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
186
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
187 my $blob_substr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
188 my $fh = $self->get_filehandle($filepath, {-binmode => 1});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
189
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
190 if(defined $fh){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
191 #Return from query cache here?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
192 #cache key = "$filepath:$key:$sr_offset:$byte_length"
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
193
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
194 #define total offset
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
195
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
196 #if(! exists $self->{file_cache}{$filepath}{off_sets}{$sr_key}){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
197 # #warn "sr_key($sr_key) is not part of index for $filepath\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
198 #}
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
199 #else{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
200
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
201 if(exists $self->{file_cache}{$filepath}{off_sets}{$sr_key}){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
202
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
203 my $total_offset = $self->{file_cache}{$filepath}{off_sets}{$sr_key} + $sr_offset;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
204 my $seeked = sysseek($fh, $total_offset, 0);#0(whence) is SEEK_SET.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
205
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
206 if(! $seeked){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
207 warn("Failed to seek to byte $total_offset in $filepath");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
208 #Don't undef fh here as this valid Slice maybe out of range
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
209 #and we don't want to kill a valid fh
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
210 #i.e. Slice start/end is past end of seq_region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
211 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
212 else{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
213 my $read_bytes = sysread($fh, $blob_substr, $byte_length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
214
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
215 if(! ((defined $read_bytes) && ($read_bytes == $byte_length))){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
216 #! defined is error 0 is end of file
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
217 warn "Failed to read from $filepath\n$!";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
218
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
219 if($read_bytes == 0){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
220 #This maybe because the slice is out of range!
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
221 #The API gives no warning about this
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
222
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
223 warn "End Of File encountered\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
224 warn "Total offset:\t".$self->{file_cache}{$filepath}{off_sets}{$sr_key}.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
225 " key($sr_key) + $sr_offset = $total_offset\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
226
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
227 #add some checks against the theoretical/true length of the file?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
228 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
229 else{ #Delete fh as it is useless/unsafe to retry
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
230 undef $self->{file_cache}{$filepath}{filehandle};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
231 #$blob_substr is now set to empty string by read
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
232 undef $blob_substr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
233 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
234 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
235 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
236 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
237 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
238
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
239 return $blob_substr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
240 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
241
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
242
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
243 1;