annotate variant_effect_predictor/Bio/EnsEMBL/DBSQL/ProxyDBConnection.pm @ 1:d6778b5d8382 draft default tip

Deleted selected files
author willmclaren
date Fri, 03 Aug 2012 10:05:43 -0400
parents 21066c0abaf5
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::DBSQL::ProxyDBConnection - Database connection wrapper allowing
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
24 for one backing connection to be used for multiple DBs
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
25
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
26 =head1 SYNOPSIS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
27
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
28 my $dbc = Bio::EnsEMBL::DBSQL::DBConnection->new(-HOST => 'host', -PORT => 3306, -USER => 'user');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
29 my $p_h_dbc = Bio::EnsEMBL::DBSQL::ProxyDBConnection->new(-DBC => $dbc, -DBNAME => 'human');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
30 my $p_m_dbc = Bio::EnsEMBL::DBSQL::ProxyDBConnection->new(-DBC => $dbc, -DBNAME => 'mouse');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
31
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
32 =head1 DESCRIPTION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
33
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
34 This class is used to maintain one active connection to a database whilst it
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
35 appears to be working against multiple schemas. It does this by checking the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
36 currently connected database before performing any query which could require
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
37 a database change such as prepare.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
38
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
39 This class is only intended for internal use so please do not use unless
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
40 you are aware of what it will do and what the consequences of its usage are.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
41
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
42 =head1 METHODS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
43
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
44 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
45
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
46 package Bio::EnsEMBL::DBSQL::ProxyDBConnection;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
47
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
48 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
49 use warnings;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
50
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
51 use Bio::EnsEMBL::Utils::Exception qw/warning/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
52 use Bio::EnsEMBL::Utils::Argument qw/rearrange/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
53
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
54 use base qw/Bio::EnsEMBL::Utils::Proxy/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
55
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
56 sub new {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
57 my ($class, @args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
58 my ($dbc, $dbname) = rearrange([qw/DBC DBNAME/], @args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
59 my $self = $class->SUPER::new($dbc);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
60 $self->dbname($dbname);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
61 return $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
62 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
63
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
64 =head2 switch_database
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
65
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
66 Description : Performs a switch of the backing DBConnection if the currently
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
67 connected database is not the same as the database this proxy
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
68 wants to connect to. It currently supports MySQL, Oracle and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
69 Postges switches is untested with all bar MySQL. If it
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
70 cannot do a live DB/schema switch then it will disconnect
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
71 the connection and then wait for the next process to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
72 connect therefore switching the DB.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
73 Exceptions : None but will warn if you attempt to switch a DB with
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
74 active kids attached to the proxied database handle.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
75
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
76 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
77
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
78 sub switch_database {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
79 my ($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
80 my $proxy = $self->__proxy();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
81 my $backing_dbname = $proxy->dbname();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
82 my $dbname = $self->dbname();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
83
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
84 my $switch = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
85 if(defined $dbname) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
86 if(defined $backing_dbname) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
87 $switch = ($dbname ne $backing_dbname) ? 1 : 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
88 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
89 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
90 $switch = 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
91 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
92 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
93 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
94 $switch = 1 if defined $backing_dbname;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
95 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
96
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
97 if($switch) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
98 $proxy->dbname($dbname);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
99 if($proxy->connected()) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
100 my $kids = $proxy->db_handle()->{Kids};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
101 my $driver = lc($proxy->driver());
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
102 #Edit to add other DB switching strategies on a per driver basis
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
103 if($driver eq 'mysql') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
104 $proxy->do('use '.$dbname);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
105 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
106 elsif($driver eq 'oracle') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
107 $proxy->do('ALTER SESSION SET CURRENT_SCHEMA = '.$dbname);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
108 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
109 elsif($driver eq 'pg') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
110 $proxy->do('set search_path to '.$dbname);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
111 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
112 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
113 if($kids > 0) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
114 warning "Attempting a database switch from '$backing_dbname' to '$dbname' with $kids active handle(s). Check your logic or do not use a ProxyDBConnection";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
115 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
116 $proxy->disconnect_if_idle();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
117 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
118 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
119 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
120
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
121 return $switch;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
122 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
123
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
124 sub dbname {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
125 my ($self, $dbname) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
126 $self->{'dbname'} = $dbname if defined $dbname;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
127 return $self->{'dbname'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
128 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
129
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
130 my %SWITCH_METHODS = map { $_ => 1 } qw/
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
131 connect
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
132 db_handle
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
133 do
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
134 prepare
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
135 reconnect
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
136 work_with_db_handle
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
137 /;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
138
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
139 sub __resolver {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
140 my ($self, $package, $method) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
141 if($self->__proxy()->can($method)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
142 if($SWITCH_METHODS{$method}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
143 return sub {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
144 my ($local_self, @args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
145 $local_self->switch_database();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
146 return $local_self->__proxy()->$method(@args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
147 };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
148 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
149 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
150 return sub {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
151 my ($local_self, @args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
152 return $local_self->__proxy()->$method(@args);
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 return;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
157 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
158
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
159 1;