comparison variant_effect_predictor/Bio/EnsEMBL/DBFile/FileAdaptor.pm @ 0:1f6dce3d34e0

Uploaded
author mahtabm
date Thu, 11 Apr 2013 02:01:53 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:1f6dce3d34e0
1 =head1 LICENSE
2
3 Copyright (c) 1999-2012 The European Bioinformatics Institute and
4 Genome Research Limited. All rights reserved.
5
6 This software is distributed under a modified Apache license.
7 For license details, please see
8
9 http://www.ensembl.org/info/about/code_licence.html
10
11 =head1 CONTACT
12
13 Please email comments or questions to the public Ensembl
14 developers list at <dev@ensembl.org>.
15
16 Questions may also be sent to the Ensembl help desk at
17 <helpdesk@ensembl.org>.
18
19 =cut
20
21 =head1 NAME
22
23 Bio::EnsEMBL::DBFile::FileAdaptor - Base Adaptor for direct file access
24
25 =head1 DESCRIPTION
26
27 Basic wrapper class to provide access to file based data.
28
29 This is primarily aimed at indexed Collection(.col) files which are optimised for Slice
30 based queries. Collections store fixed width width/windowed data as BLOBS. This makes
31 it possible to seek to the a required location given slice coordinate and read the only
32 the required amount of data covering the slice.
33
34 Currently only works as hybrid DBAdaptor e.g. ResultFeatureAdaptor which inherits both from
35 here and BaseFeatureAdaptor.
36
37 =cut
38
39
40
41 package Bio::EnsEMBL::DBFile::FileAdaptor;
42
43 use Bio::EnsEMBL::Utils::Exception qw(throw warning deprecate);
44 use strict;
45 use warnings;
46
47
48 =head2 get_filehandle
49
50 Arg[1] : string - filepath
51 Arg[2] : HASHREF - Optional params, see open_file
52 Example : my $fh = $self->get_filehandle($filepath, 1);
53 Description: Gets and caches a simple file handle.
54 Returntype : GLOB/undef - filehandle
55 Exceptions : warns if cache entry exists but is not defined
56 Caller : general
57 Status : at risk
58
59 =cut
60
61 sub get_filehandle{
62 my ($self, $filepath, $params_hash) = @_;
63
64 my $file_op = '<';
65
66 if(exists $params_hash->{-file_operator}){
67 $file_op = $params_hash->{-file_operator};
68 }else{
69 $params_hash->{-file_operator} = $file_op;
70 }
71
72 if(! exists $self->{file_cache}{$filepath}{filehandle}){
73 my $fh = $self->Bio::EnsEMBL::DBFile::FileAdaptor::open_file($filepath, $params_hash);
74
75 if(defined $fh){
76 $self->{file_cache}{$filepath}{filehandle} = $fh;
77 #$self->initialise_filehandle($filepath) if $self->can('initialise_filehandle');
78 $self->initialise_filehandle($filepath) if($file_op eq '<');
79 }
80 }
81 elsif(! defined $self->{file_cache}{$filepath}{filehandle}){
82 #This maybe one of several read/seek errors which will have already been warned
83 warn "Encountered and error with file handle for $filepath\n";
84 }
85 #else
86 # check against cache file op
87 # to make sure we aren't trying to open an already open fh with a different operator
88
89
90 return $self->{file_cache}{$filepath}{filehandle};
91 }
92
93
94 =head2 open_file
95
96 Arg[1] : string - filepath
97 Arg[2] : HASHREF - Optional params:
98 -binmode => 0|1, # Boolean i.e. treat file as binary
99 -file_operator => '>' # Default is '<'
100 #-perms_octal => # Requires FileHandle
101 Example : my $fh = $self->open_file($filepath, {-binmode = > 1, -file_operator => '>'});
102 Description: Opens a file for reading or writing.
103 Returntype : GLOB/undef - filehandle
104 Exceptions : warns if file open fails
105 warns if file operator unsupported
106 warns if failed to set binmode
107 Caller : general
108 Status : at risk
109
110 =cut
111
112 sub open_file{
113 my ($self, $filepath, $params_hash) = @_;
114
115 #Validate params_hash?
116 #rearrange? Will not warn/throw for invalid keys?
117 #perms octal, requires FileHandle? See EFGUtils::open_file
118
119
120
121 my $file_op = $params_hash->{-file_operator} || '<';
122
123 if(($file_op ne '<') &&
124 ($file_op ne '>') &&
125 ($file_op ne '>>')){
126 throw("Cannot perform open with unsupported operator:\t${file_op}${filepath}");
127 }
128
129 my $fh;
130 my $success = open($fh, "${file_op}${filepath}");
131 #$fh will be still be GLOB on fail
132
133 #These warn instead of throw/die to allow
134 #open_file to be used to test a file
135 #this prevents throws/die when an attempting to access an absent file (good for webcode)
136 #could alternatively change to throw/die and eval where required
137 #prevents need to catch everywhere else and potential double reporting of error
138
139 if(! $success){
140 #undef $fh;
141 throw("Failed to open:\t$filepath\n$!\n");
142 }
143 elsif($params_hash->{-binmode}){
144 $success = binmode $fh;
145
146 if(! $success){
147 throw("Failed to set binmode:\t$filepath\n$!");
148 #undef $fh;
149 }
150 }
151
152 return $fh;
153 }
154
155
156 =head2 validate_file_length
157
158 Arg[1] : string - filepath
159 Arg[2] : int - expected length in bytes
160 Example : $self->validate_file_length($filepath, $expected_length);
161 Description: Utility method which can be used during file creation
162 Returntype : None
163 Exceptions : warns if file open fails
164 throws if file is not expected length
165 Caller : general
166 Status : at risk - change to seek to accounts for 'logical characters'
167
168 =cut
169
170 sub validate_file_length{
171 my ($self, $filepath, $expected_length, $binmode) = @_;
172
173 #Currently not using cache as we rarely want to
174 #use the file handle afterwards
175
176
177 #THIS WAS USING EFGUtils::open_file imported in the Collector::ResultFeature!!!!
178 #which is just a sub not a class method, and is in a parallel inheritance path
179 #No warnings about redefining method :(
180 #Force use of FileAdaptor::open_file
181
182 my $fh = $self->Bio::EnsEMBL::DBFile::FileAdaptor::open_file($filepath, {-binmode => $binmode});
183
184
185 #sysseek always returns length in bytes, change to seek which
186 #uses logical characters i.e. actual encoding?
187 #Does seek use bytes in binmode and chars in non-binmode?
188
189 my $seeked_bytes = sysseek($fh, 0, 2);# 2 is SEEK_END
190 #There is no systell function. Use sysseek(FH, 0, 1) for that.
191
192 if($seeked_bytes < $expected_length){
193 throw("File is shorter($seeked_bytes) than expected($expected_length):\t$filepath\n");
194 }
195 elsif($seeked_bytes > $expected_length){
196 throw("File is longer($seeked_bytes) than expected($expected_length):\t$filepath\n");
197 }
198
199 return;
200 }
201
202
203
204
205
206 ### STUBB/TEMPLATE METHODS ###
207 #
208 # If required hese should be over-ridden in the
209 # descendant FileAdaptor e.g. CollectionAdaptor
210 # Listed here rather for visibility (rather than
211 # using 'can')
212
213
214 sub initialise_filehandle{
215 return;
216 }
217
218
219
220 1;