annotate variant_effect_predictor/Bio/EnsEMBL/Utils/URI.pm @ 0:21066c0abaf5 draft

Uploaded
author willmclaren
date Fri, 03 Aug 2012 10:04:48 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1 =head1 LICENSE
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
3 Copyright (c) 1999-2012 The European Bioinformatics Institute and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
4 Genome Research Limited. All rights reserved.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
5
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
6 This software is distributed under a modified Apache license.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
7 For license details, please see
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
8
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
9 http://www.ensembl.org/info/about/code_licence.html
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
10
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
11 =head1 CONTACT
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
12
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
13 Please email comments or questions to the public Ensembl
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
14 developers list at <dev@ensembl.org>.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
15
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
16 Questions may also be sent to the Ensembl help desk at
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
17 <helpdesk@ensembl.org>.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
18
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
19 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
20
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
21 =head1 NAME
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
22
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
23 Bio::EnsEMBL::Utils::URI
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
24
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
25 =head1 SYNOPSIS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
26
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
27 use Bio::EnsEMBL::Utils::URI qw/parse_uri is_uri/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
28 # or use Bio::EnsEMBL::Utils::URI qw/:all/; # to bring everything in
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
29
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
30 my $db_uri = parse_uri('mysql://user@host:3157/db');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
31 my $http_uri = parse_uri('http://www.google.co.uk:80/search?q=t');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
32
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
33 is_uri('mysql://user@host'); # returns 1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
34 is_uri('file:///my/path'); # returns 1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
35 is_uri('/my/path'); # returns 0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
36
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
37 =head1 DESCRIPTION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
38
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
39 This object is a generic URI parser which is primarily used in the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
40 parsing of database URIs into a more managable data structure. We also provide
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
41 the resulting URI object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
42
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
43 =head1 DEPENDENCIES
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
44
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
45 L<URI::Escape> is an optional dependency but if available the code will attempt
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
46 to perform URI encoding/decoding on parameters. If you do not want this
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
47 functionality then modify the global C<$Bio::EnsEMBL::Utils::URI::URI_ESCAPE>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
48 to false;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
49
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
50 =head1 METHODS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
51
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
52 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
53
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
54 package Bio::EnsEMBL::Utils::URI;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
55
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
56 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
57 use warnings;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
58
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
59 use Scalar::Util qw/looks_like_number/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
60 use Bio::EnsEMBL::Utils::Exception qw(throw);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
61 use File::Spec;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
62
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
63 our $URI_ESCAPE;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
64 $URI_ESCAPE = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
65 eval {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
66 require URI::Escape;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
67 URI::Escape->import();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
68 $URI_ESCAPE = 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
69 };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
70
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
71 use base qw/Exporter/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
72 our @EXPORT_OK;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
73 our %EXPORT_TAGS;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
74 @EXPORT_OK = qw/parse_uri is_uri/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
75 %EXPORT_TAGS = ( all => [@EXPORT_OK] );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
76
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
77 ####URI Parsing
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
78
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
79 =head2 is_uri
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
80
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
81 Arg[1] : Scalar; URI to parse
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
82 Example : is_uri('mysql://user:pass@host:415/db');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
83 Description : Looks for the existence of a URI scheme to decide if this
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
84 is a classical URI. Whilst non-scheme based URIs can still be
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
85 interprited it is useful to use when you need to know if
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
86 you are going to work with a URI or not
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
87 Returntype : Boolean
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
88 Caller : General
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
89 Status : Beta
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
90
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
91 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
92
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
93 sub is_uri {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
94 my ($uri) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
95 return 0 if ! $uri;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
96 my $SCHEME = qr{ ([^:]*) :// }xms;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
97 return ($uri =~ $SCHEME) ? 1 : 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
98 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
99
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
100 =head2 parse_uri
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
101
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
102 Arg[1] : Scalar; URI to parse
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
103 Example : my $uri = parse_uri('mysql://user:pass@host:415/db');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
104 Description : A URL parser which attempts to convert many different types
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
105 of URL into a common data structure.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
106 Returntype : Bio::EnsEMBL::Utils::URI
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
107 Caller : General
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
108 Status : Beta
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
109
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
110 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
111
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
112 sub parse_uri {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
113 my ($url) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
114
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
115 my $SCHEME = qr{ ([^:]*) :// }xms;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
116 my $USER = qr{ ([^/:\@]+)? :? ([^/\@]+)? \@ }xms;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
117 my $HOST = qr{ ([^/:]+)? :? ([^/]+)? }xms;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
118 my $DB = qr{ / ([^/?]+)? /? ([^/?]+)? }xms;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
119 my $PARAMS = qr{ \? (.+)}xms;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
120
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
121 my $p;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
122
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
123 if($url =~ qr{ $SCHEME ([^?]+) (?:$PARAMS)? }xms) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
124 my $scheme = $1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
125 $scheme = ($URI_ESCAPE) ? uri_unescape($scheme) : $scheme;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
126 $p = Bio::EnsEMBL::Utils::URI->new($scheme);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
127 my ($locator, $params) = ($2, $3);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
128
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
129 if($scheme eq 'file') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
130 $p->path($locator);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
131 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
132 elsif($scheme eq 'sqlite') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
133 $p->path($locator);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
134 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
135 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
136 if($locator =~ s/^$USER//) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
137 $p->user($1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
138 $p->pass($2);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
139 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
140 if($locator =~ s/^$HOST//) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
141 $p->host(($URI_ESCAPE) ? uri_unescape($1) : $1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
142 $p->port(($URI_ESCAPE) ? uri_unescape($2) : $2);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
143 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
144
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
145 if($p->is_db_scheme() || $scheme eq q{}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
146 if($locator =~ $DB) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
147 $p->db_params()->{dbname} = ($URI_ESCAPE) ? uri_unescape($1) : $1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
148 $p->db_params()->{table} = ($URI_ESCAPE) ? uri_unescape($2) : $2;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
149 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
150 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
151 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
152 $p->path($locator);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
153 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
154 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
155
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
156 if(defined $params) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
157 my @kv_pairs = split(/;|&/, $params);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
158 foreach my $kv_string (@kv_pairs) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
159 my ($key, $value) = map { ($URI_ESCAPE) ? uri_unescape($_) : $_ } split(/=/, $kv_string);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
160 $p->add_param($key, $value);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
161 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
162 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
163 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
164
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
165 return $p;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
166 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
167
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
168 ####URI Object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
169
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
170 =pod
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
171
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
172 =head2 new()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
173
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
174 Arg[1] : String; scheme the URI will confrom to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
175 Description : New object call
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
176 Returntype : Bio::EnsEMBL::Utils::URIParser::URI
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
177 Exceptions : Thrown if scheme is undefined.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
178 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
179
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
180 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
181
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
182 sub new {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
183 my ($class, $scheme) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
184 $class = ref($class) || $class;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
185 throw "Scheme cannot be undefined. Empty string is allowed" if ! defined $scheme;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
186
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
187 my $self = bless ({
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
188 params => {},
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
189 param_keys => [],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
190 db_params => {},
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
191 scheme => $scheme,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
192 }, $class);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
193
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
194 return $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
195 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
196
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
197 =head2 db_schemes()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
198
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
199 Description: Returns a hash of scheme names known to be databases
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
200 Returntype : HashRef
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
201 Exceptions : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
202 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
203
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
204 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
205
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
206 sub db_schemes {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
207 my ($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
208 return {map { $_ => 1 } qw/mysql ODBC sqlite Oracle Sybase/};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
209 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
210
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
211
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
212 =head2 is_db_scheme()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
213
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
214 Description: Returns true if the code believes the scheme to be a Database
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
215 Returntype : Boolean
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
216 Exceptions : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
217 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
218
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
219 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
220
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
221 sub is_db_scheme {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
222 my ($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
223 return ( exists $self->db_schemes()->{$self->scheme()} ) ? 1 : 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
224 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
225
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
226 =head2 scheme()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
227
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
228 Description : Getter for the scheme attribute
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
229 Returntype : String
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
230 Exceptions : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
231 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
232
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
233 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
234
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
235 sub scheme {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
236 my ($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
237 return $self->{scheme};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
238 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
239
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
240 =head2 path()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
241
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
242 Arg[1] : Setter argument
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
243 Description : Getter/setter for the path attribute
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
244 Returntype : String
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
245 Exceptions : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
246 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
247
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
248 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
249
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
250 sub path {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
251 my ($self, $path) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
252 $self->{path} = $path if defined $path;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
253 return $self->{path};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
254 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
255
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
256 =head2 user()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
257
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
258 Arg[1] : Setter argument
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
259 Description : Getter/setter for the user attribute
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
260 Returntype : String
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
261 Exceptions : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
262 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
263
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
264 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
265
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
266 sub user {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
267 my ($self, $user) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
268 $self->{user} = $user if defined $user;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
269 return $self->{user};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
270 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
271
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
272 =head2 pass()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
273
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
274 Arg[1] : Setter argument
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
275 Description : Getter/setter for the password attribute
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
276 Returntype : String
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
277 Exceptions : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
278 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
279
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
280 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
281
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
282 sub pass {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
283 my ($self, $pass) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
284 $self->{pass} = $pass if defined $pass;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
285 return $self->{pass};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
286 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
287
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
288 =head2 host()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
289
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
290 Arg[1] : Setter argument
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
291 Description : Getter/setter for the host attribute
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
292 Returntype : String
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
293 Exceptions : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
294 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
295
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
296 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
297
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
298 sub host {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
299 my ($self, $host) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
300 $self->{host} = $host if defined $host;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
301 return $self->{host};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
302 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
303
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
304 =head2 port()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
305
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
306 Arg[1] : Setter argument
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
307 Description : Getter/setter for the port attribute
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
308 Returntype : Integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
309 Exceptions : If port is not a number, less than 1 or not a whole integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
310 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
311
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
312 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
313
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
314 sub port {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
315 my ($self, $port) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
316 if(defined $port) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
317 if(! looks_like_number($port) || $port < 1 || int($port) != $port) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
318 throw "Port $port is not a number, less than 1 or not a whole integer";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
319 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
320 $self->{port} = $port if defined $port;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
321 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
322 return $self->{port};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
323 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
324
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
325 =head2 param_keys()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
326
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
327 Description : Getter for the paramater map keys in the order they were first
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
328 seen. Keys should only appear once in this array
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
329 Returntype : ArrayRef
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
330 Exceptions : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
331 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
332
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
333 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
334
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
335 sub param_keys {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
336 my ($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
337 return [@{$self->{param_keys}}];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
338 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
339
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
340 =head2 param_exists_ci()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
341
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
342 Arg[1] : String; Key
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
343 Description : Performs a case-insensitive search for the given key
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
344 Returntype : Boolean; returns true if your given key was seen
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
345 Exceptions : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
346 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
347
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
348 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
349
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
350 sub param_exists_ci {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
351 my ($self, $key) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
352 my %keys = map { uc($_) => 1 } @{$self->param_keys()};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
353 return ($keys{uc($key)}) ? 1 : 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
354 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
355
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
356 =head2 add_param()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
357
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
358 Arg[1] : String; key
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
359 Arg[1] : Scalar; value
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
360 Description : Add a key/value to the params map. Multiple inserts of the same
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
361 key is allowed
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
362 Returntype : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
363 Exceptions : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
364 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
365
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
366 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
367
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
368 sub add_param {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
369 my ($self, $key, $value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
370 if(!exists $self->{params}->{$key}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
371 $self->{params}->{$key} = [];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
372 push(@{$self->{param_keys}}, $key);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
373 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
374 push(@{$self->{params}->{$key}}, $value);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
375 return;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
376 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
377
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
378 =head2 get_params()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
379
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
380 Arg[1] : String; key
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
381 Description : Returns the values which were found to be linked to the given
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
382 key. Arrays are returned because one key can have many
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
383 values in a URI
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
384 Returntype : ArrayRef[Scalar]
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
385 Exceptions : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
386 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
387
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
388 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
389
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
390 sub get_params {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
391 my ($self, $key) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
392 return [] if ! exists $self->{params}->{$key};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
393 return [@{$self->{params}->{$key}}];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
394 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
395
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
396 =head2 db_params()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
397
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
398 Description : Storage of parameters used only for database URIs since
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
399 they require
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
400 Returntype : HashRef; Database name is keyed under C<dbname> and the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
401 table is keyed under C<table>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
402 Exceptions : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
403 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
404
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
405 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
406
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
407 sub db_params {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
408 my ($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
409 return $self->{db_params};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
410 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
411
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
412 =head2 generate_dbsql_params()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
413
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
414 Arg[1] : boolean $no_table alows you to avoid pushing -TABLE as an
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
415 output value
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
416 Description : Generates a Hash of Ensembl compatible parameters to be used
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
417 to construct a DB object. We combine those parameters
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
418 which are deemed to be part of the C<db_params()> method
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
419 under C<-DBNAME> and C<-TABLE>. We also search for a number
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
420 of optional parameters which are lowercased equivalents
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
421 of the construction parameters available from a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
422 L<Bio::EnsEMBL::DBSQL::DBAdaptor>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
423 L<Bio::EnsEMBL::DBSQL::DBConnection> as well as C<verbose>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
424 being supported.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
425
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
426 We also convert the scheme type into the driver attribute
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
427
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
428 Returntype : Hash (not a reference). Output can be put into a C<DBConnection>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
429 constructor.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
430 Exceptions : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
431 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
432
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
433 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
434
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
435 sub generate_dbsql_params {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
436 my ($self, $no_table) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
437 my %db_params;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
438
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
439 $db_params{-DRIVER} = $self->scheme();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
440 $db_params{-HOST} = $self->host() if $self->host();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
441 $db_params{-PORT} = $self->port() if $self->port();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
442 $db_params{-USER} = $self->user() if $self->user();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
443 $db_params{-PASS} = $self->pass() if $self->pass();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
444
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
445 my $dbname;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
446 my $table;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
447 if($self->scheme() eq 'sqlite') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
448 ($dbname, $table) = $self->_decode_sqlite();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
449 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
450 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
451 $dbname = $self->db_params()->{dbname};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
452 $table = $self->db_params()->{table};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
453 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
454
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
455 $db_params{-DBNAME} = $dbname if $dbname;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
456 $db_params{-TABLE} = $table if ! $no_table && $table;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
457
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
458 foreach my $boolean_param (qw/disconnect_when_inactive reconnect_when_connection_lost is_multispecies no_cache verbose/) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
459 if($self->param_exists_ci($boolean_param)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
460 $db_params{q{-}.uc($boolean_param)} = 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
461 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
462 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
463 foreach my $value_param (qw/species group species_id wait_timeout/) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
464 if($self->param_exists_ci($value_param)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
465 $db_params{q{-}.uc($value_param)} = $self->get_params($value_param)->[0];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
466 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
467 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
468
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
469 return %db_params;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
470 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
471
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
472 =head2 _decode_sqlite
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
473
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
474 Description : Performs path gymnastics to decode into a number of possible
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
475 options. The issue with SQLite is that the normal URI scheme
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
476 looks like sqlite:///my/path.sqlite/table but how do we know
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
477 that the DB name is C</my/path.sqlite> and the table is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
478 C<table>?
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
479
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
480 The code takes a path, looks for the full path & if it cannot
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
481 be found looks for the file a directory back. In the above
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
482 example it would have looked for C</my/path.sqlite/table>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
483 found it to be non-existant, looked for C</my/path.sqlite>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
484 and found it.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
485
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
486 If the path splitting procdure resulted in just 1 file after
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
487 the first existence check e.g. C<sqlite://db.sqlite> it assumes
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
488 that should be the name. If no file can be found we default to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
489 the full length path.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
490 Caller : internal
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
491
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
492 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
493
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
494 sub _decode_sqlite {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
495 my ($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
496 my $dbname;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
497 my $table;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
498 my $path = $self->path();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
499 if(-f $path) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
500 $dbname = $path;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
501 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
502 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
503 my ($volume, $directories, $file) = File::Spec->splitpath($path);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
504 my @splitdirs = File::Spec->splitdir($directories);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
505 if(@splitdirs == 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
506 $dbname = $path;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
507 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
508 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
509 my $new_file = pop(@splitdirs);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
510 $new_file ||= q{};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
511 my $new_path = File::Spec->catpath($volume, File::Spec->catdir(@splitdirs), $new_file);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
512 if($new_path ne File::Spec->rootdir() && -f $new_path) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
513 $dbname = $new_path;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
514 $table = $file;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
515 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
516 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
517 $dbname = $path;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
518 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
519 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
520 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
521
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
522 $self->db_params()->{dbname} = $dbname if $dbname;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
523 $self->db_params()->{table} = $table if $table;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
524
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
525 return ($dbname, $table);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
526 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
527
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
528 =head2 generate_uri()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
529
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
530 Description : Generates a URI string from the paramaters in this object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
531 Returntype : String
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
532 Exceptions : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
533 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
534
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
535 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
536
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
537 sub generate_uri {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
538 my ($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
539 my $scheme = sprintf('%s://', ($URI_ESCAPE) ? uri_escape($self->scheme()) : $self->scheme());
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
540 my $user_credentials = q{};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
541 my $host_credentials = q{};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
542 my $location = q{};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
543
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
544 if($self->user() || $self->pass()) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
545 my $user = $self->user();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
546 my $pass = $self->pass();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
547 if($URI_ESCAPE) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
548 $user = uri_escape($user) if $user;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
549 $pass = uri_escape($pass) if $pass;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
550 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
551 $user_credentials = sprintf('%s%s@',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
552 ( $user ? $user : q{} ),
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
553 ( $pass ? q{:}.$pass : q{} )
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
554 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
555 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
556
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
557 if($self->host() || $self->port()) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
558 my $host = $self->host();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
559 my $port = $self->port();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
560 if($URI_ESCAPE) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
561 $host = uri_escape($host) if $host;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
562 $port = uri_escape($port) if $port;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
563 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
564 $host_credentials = sprintf('%s%s',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
565 ( $host ? $host : q{} ),
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
566 ( $port ? q{:}.$port : q{} )
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
567 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
568 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
569
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
570 if($self->is_db_scheme() || $self->scheme() eq '') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
571 if($self->scheme() eq 'sqlite') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
572 if(! $self->path()) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
573 my $tmp_loc = $self->db_params()->{dbname};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
574 throw "There is no dbname available" unless $tmp_loc;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
575 $tmp_loc .= q{/}.$self->db_params()->{table} if $self->db_params()->{table};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
576 $self->path($tmp_loc);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
577 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
578 $location = $self->path();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
579 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
580 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
581 my $dbname = $self->db_params()->{dbname};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
582 my $table = $self->db_params()->{table};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
583 if($dbname || $table) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
584 if($URI_ESCAPE) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
585 $dbname = uri_escape($dbname) if $dbname;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
586 $table = uri_escape($table) if $table;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
587 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
588 $location = sprintf('/%s%s',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
589 ($dbname ? $dbname : q{}),
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
590 ($table ? q{/}.$table : q{})
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
591 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
592 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
593 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
594 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
595 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
596 $location = $self->path() if $self->path();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
597 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
598
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
599 my $param_string = q{};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
600 if(@{$self->param_keys()}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
601 $param_string = q{?};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
602 my @params;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
603 foreach my $key (@{$self->param_keys}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
604 my $values_array = $self->get_params($key);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
605 foreach my $value (@{$values_array}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
606 my $encoded_key = ($URI_ESCAPE) ? uri_escape($key) : $key;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
607 my $encoded_value = ($URI_ESCAPE) ? uri_escape($value) : $value;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
608 push(@params, ($encoded_value) ? "$encoded_key=$encoded_value" : $encoded_key);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
609 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
610 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
611 $param_string .= join(q{;}, @params);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
612 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
613
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
614 return join(q{}, $scheme, $user_credentials, $host_credentials, $location, $param_string);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
615 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
616
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
617 1;