annotate sqlpython/connections.py @ 473:d710a48e6fb7

connect problem unfixed
author catherine@dellzilla
date Fri, 05 Mar 2010 12:59:28 -0500
parents 0be350ab306c
children f29923ac1119
rev   line source
427
8c1dec7fbd71 refactoring connections in progress
catherine@dellzilla
parents:
diff changeset
1 import re
8c1dec7fbd71 refactoring connections in progress
catherine@dellzilla
parents:
diff changeset
2 import os
428
6cd30b785885 continuing connection transition
catherine@dellzilla
parents: 427
diff changeset
3 import getpass
427
8c1dec7fbd71 refactoring connections in progress
catherine@dellzilla
parents:
diff changeset
4 import gerald
432
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
5 import time
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
6 import threading
436
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
7 import pickle
440
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
8 import optparse
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
9 import doctest
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
10
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
11 try:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
12 import cx_Oracle
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
13 except ImportError:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
14 pass
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
15
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
16 try:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
17 import psycopg2
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
18 except ImportError:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
19 pass
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
20
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
21 try:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
22 import MySQLdb
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
23 except ImportError:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
24 pass
427
8c1dec7fbd71 refactoring connections in progress
catherine@dellzilla
parents:
diff changeset
25
432
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
26 class ObjectDescriptor(object):
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
27 def __init__(self, name, dbobj):
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
28 self.fullname = name
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
29 self.dbobj = dbobj
433
439621c917c4 changes to match refactored cmd2
catherine@dellzilla
parents: 432
diff changeset
30 self.type = str(type(self.dbobj)).split('.')[-1].lower().strip("'>")
432
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
31 self.path = '%s/%s' % (self.type, self.fullname)
437
6ba7087f1a34 allow qualified or unqualified object names in gerald
catherine@dellzilla
parents: 436
diff changeset
32 if '.' in self.fullname:
6ba7087f1a34 allow qualified or unqualified object names in gerald
catherine@dellzilla
parents: 436
diff changeset
33 (self.owner, self.unqualified_name) = self.fullname.split('.')
6ba7087f1a34 allow qualified or unqualified object names in gerald
catherine@dellzilla
parents: 436
diff changeset
34 self.owner = self.owner.lower()
6ba7087f1a34 allow qualified or unqualified object names in gerald
catherine@dellzilla
parents: 436
diff changeset
35 else:
6ba7087f1a34 allow qualified or unqualified object names in gerald
catherine@dellzilla
parents: 436
diff changeset
36 (self.owner, self.unqualified_name) = (None, self.fullname)
435
5443c5d5ed8c fixes to ls
catherine@dellzilla
parents: 434
diff changeset
37 self.unqualified_path = '%s/%s' % (self.type, self.unqualified_name)
432
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
38 def match_pattern(self, pattern, specific_owner=None):
437
6ba7087f1a34 allow qualified or unqualified object names in gerald
catherine@dellzilla
parents: 436
diff changeset
39 right_owner = (not self.owner) or (not specific_owner) or (self.owner == specific_owner.lower())
435
5443c5d5ed8c fixes to ls
catherine@dellzilla
parents: 434
diff changeset
40 if not pattern:
5443c5d5ed8c fixes to ls
catherine@dellzilla
parents: 434
diff changeset
41 return right_owner
5443c5d5ed8c fixes to ls
catherine@dellzilla
parents: 434
diff changeset
42 compiled = re.compile(pattern, re.IGNORECASE)
5443c5d5ed8c fixes to ls
catherine@dellzilla
parents: 434
diff changeset
43 if r'\.' in pattern:
5443c5d5ed8c fixes to ls
catherine@dellzilla
parents: 434
diff changeset
44 return compiled.match(self.fullname) or compiled.match(self.path)
5443c5d5ed8c fixes to ls
catherine@dellzilla
parents: 434
diff changeset
45 return right_owner and (compiled.match(self.type) or
465
0be350ab306c fixed \dt
catherine@Drou
parents: 448
diff changeset
46 compiled.match(self.type + r'/') or
435
5443c5d5ed8c fixes to ls
catherine@dellzilla
parents: 434
diff changeset
47 compiled.match(self.unqualified_name) or
5443c5d5ed8c fixes to ls
catherine@dellzilla
parents: 434
diff changeset
48 compiled.match(self.unqualified_path))
432
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
49
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
50 class GeraldPlaceholder(object):
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
51 current = False
440
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
52 complete = False
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
53
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
54 class OptionTestDummy(object):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
55 mysql = None
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
56 postgres = None
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
57 username = None
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
58 password = None
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
59 hostname = None
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
60 port = None
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
61 database = None
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
62 mode = 0
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
63 def __init__(self, *args, **kwargs):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
64 self.__dict__.update(kwargs)
432
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
65
440
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
66 class ConnectionData(object):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
67 username = None
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
68 password = None
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
69 hostname = None
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
70 port = None
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
71 database = None
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
72 mode = 0
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
73 connection_uri_parser = re.compile('(postgres|oracle|mysql|sqlite|mssql):/(.*$)', re.IGNORECASE)
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
74 connection_parser = re.compile('((?P<database>\S+)(\s+(?P<username>\S+))?)?')
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
75 def __init__(self, arg, opts, default_rdbms = 'oracle'):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
76 '''
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
77 >>> opts = OptionTestDummy(postgres=True, password='password')
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
78 >>> ConnectionData('thedatabase theuser', opts).uri()
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
79 'postgres://theuser:password@localhost:5432/thedatabase'
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
80 >>> opts = OptionTestDummy(password='password')
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
81 >>> ConnectionData('oracle://user:password@db', opts).uri()
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
82 'oracle://user:password@db'
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
83 >>> ConnectionData('user/password@db', opts).uri()
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
84 'oracle://user:password@db'
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
85 >>> ConnectionData('user/password@db as sysdba', opts).uri()
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
86 'oracle://user:password@db?mode=2'
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
87 >>> ConnectionData('user/password@thehost/db', opts).uri()
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
88 'oracle://user:password@thehost:1521/db'
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
89 >>> opts = OptionTestDummy(postgres=True, hostname='thehost', password='password')
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
90 >>> ConnectionData('thedatabase theuser', opts).uri()
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
91 'postgres://theuser:password@thehost:5432/thedatabase'
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
92 >>> opts = OptionTestDummy(mysql=True, password='password')
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
93 >>> ConnectionData('thedatabase theuser', opts).uri()
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
94 'mysql://theuser:password@localhost:3306/thedatabase'
447
0b71da565ebe added gerald patches
catherine@dellzilla
parents: 441
diff changeset
95 >>> opts = OptionTestDummy(mysql=True, password='password')
0b71da565ebe added gerald patches
catherine@dellzilla
parents: 441
diff changeset
96 >>> ConnectionData('thedatabase', opts).uri()
0b71da565ebe added gerald patches
catherine@dellzilla
parents: 441
diff changeset
97 'mysql://catherine:password@localhost:3306/thedatabase'
440
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
98 '''
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
99 self.arg = arg
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
100 self.opts = opts
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
101 self.default_rdbms = default_rdbms
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
102 self.determine_rdbms()
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
103 if not self.parse_connect_uri(arg):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
104 self.set_defaults()
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
105 connectargs = self.connection_parser.search(self.arg)
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
106 if connectargs:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
107 for param in ('username', 'password', 'database', 'port', 'hostname', 'mode'):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
108 if hasattr(opts, param) and getattr(opts, param):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
109 setattr(self, param, getattr(opts, param))
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
110 else:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
111 try:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
112 if connectargs.group(param):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
113 setattr(self, param, connectargs.group(param))
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
114 except IndexError:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
115 pass
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
116 self.set_corrections()
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
117 if not self.password:
441
da332a670378 successful connect to mysql testdb
catherine@dellzilla
parents: 440
diff changeset
118 self.password = getpass.getpass()
440
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
119 def parse_connect_uri(self, uri):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
120 results = self.connection_uri_parser.search(uri)
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
121 if results:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
122 (self.username, self.password, self.hostname, self.port, self.database
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
123 ) = gerald.utilities.dburi.Connection().parse_uri(results.group(2))
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
124 self.set_class_from_rdbms_name(results.group(1))
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
125 self.port = self.port or self.default_port
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
126 return True
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
127 else:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
128 return False
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
129 def set_class_from_rdbms_name(self, rdbms_name):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
130 for cls in (OracleConnectionData, PostgresConnectionData, MySQLConnectionData):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
131 if cls.rdbms == rdbms_name:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
132 self.__class__ = cls
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
133 def uri(self):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
134 return '%s://%s:%s@%s:%s/%s' % (self.rdbms, self.username, self.password,
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
135 self.hostname, self.port, self.database)
473
d710a48e6fb7 connect problem unfixed
catherine@dellzilla
parents: 465
diff changeset
136 colon_between_username_passwd = re.compile(r':(?=[^/]+@)')
440
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
137 def gerald_uri(self):
473
d710a48e6fb7 connect problem unfixed
catherine@dellzilla
parents: 465
diff changeset
138 result = self.uri().split('?mode=')[0]
d710a48e6fb7 connect problem unfixed
catherine@dellzilla
parents: 465
diff changeset
139 result = self.colon_between_username_passwd.sub('/', result)
d710a48e6fb7 connect problem unfixed
catherine@dellzilla
parents: 465
diff changeset
140 result = result.replace('://', ':/')
d710a48e6fb7 connect problem unfixed
catherine@dellzilla
parents: 465
diff changeset
141 return result
440
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
142 def determine_rdbms(self):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
143 if self.opts.mysql:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
144 self.__class__ = MySQLConnectionData
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
145 elif self.opts.postgres:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
146 self.__class__ = PostgresConnectionData
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
147 else:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
148 self.set_class_from_rdbms_name(self.default_rdbms)
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
149 def set_defaults(self):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
150 self.port = self.default_port
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
151 def set_corrections(self):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
152 pass
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
153
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
154 class MySQLConnectionData(ConnectionData):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
155 rdbms = 'mysql'
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
156 default_port = 3306
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
157 def set_defaults(self):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
158 self.port = self.default_port
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
159 self.hostname = 'localhost'
447
0b71da565ebe added gerald patches
catherine@dellzilla
parents: 441
diff changeset
160 self.username = os.getenv('USER')
441
da332a670378 successful connect to mysql testdb
catherine@dellzilla
parents: 440
diff changeset
161 self.database = os.getenv('USER')
440
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
162 def connection(self):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
163 return MySQLdb.connect(host = self.hostname, user = self.username,
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
164 passwd = self.password, db = self.database,
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
165 port = self.port, sql_mode = 'ANSI')
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
166
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
167 class PostgresConnectionData(ConnectionData):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
168 rdbms = 'postgres'
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
169 default_port = 5432
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
170 def set_defaults(self):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
171 self.port = os.getenv('PGPORT') or self.default_port
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
172 self.database = os.getenv('ORACLE_SID')
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
173 self.hostname = os.getenv('PGHOST') or 'localhost'
441
da332a670378 successful connect to mysql testdb
catherine@dellzilla
parents: 440
diff changeset
174 self.username = os.getenv('USER')
440
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
175 def connection(self):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
176 return psycopg2.connect(host = self.hostname, user = self.username,
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
177 password = self.password, database = self.database,
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
178 port = self.port)
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
179
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
180 class OracleConnectionData(ConnectionData):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
181 rdbms = 'oracle'
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
182 default_port = 1521
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
183 connection_parser = re.compile('(?P<username>[^/\s@]*)(/(?P<password>[^/\s@]*))?(@((?P<hostname>[^/\s:]*)(:(?P<port>\d{1,4}))?/)?(?P<database>[^/\s:]*))?(\s+as\s+(?P<mode>sys(dba|oper)))?',
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
184 re.IGNORECASE)
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
185 def uri(self):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
186 if self.hostname:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
187 uri = '%s://%s:%s@%s:%s/%s' % (self.rdbms, self.username, self.password,
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
188 self.hostname, self.port, self.database)
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
189 else:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
190 uri = '%s://%s:%s@%s' % (self.rdbms, self.username, self.password, self.database)
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
191 if self.mode:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
192 uri = '%s?mode=%d' % (uri, self.mode)
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
193 return uri
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
194 def set_defaults(self):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
195 self.port = 1521
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
196 self.database = os.getenv('ORACLE_SID')
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
197 def set_corrections(self):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
198 if self.mode:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
199 self.mode = getattr(cx_Oracle, self.mode.upper())
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
200 if self.hostname:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
201 self.dsn = cx_Oracle.makedsn(self.hostname, self.port, self.database)
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
202 else:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
203 self.dsn = self.database
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
204 def parse_connect_uri(self, uri):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
205 if ConnectionData.parse_connect_uri(self, uri):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
206 if not self.database:
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
207 self.database = self.hostname
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
208 self.hostname = None
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
209 self.port = self.default_port
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
210 return True
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
211 return False
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
212 def connection(self):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
213 return cx_Oracle.connect(user = self.username, password = self.password,
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
214 dsn = self.dsn, mode = self.mode)
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
215
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
216 gerald_classes = {'oracle': gerald.oracle_schema.User,
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
217 'postgres': gerald.PostgresSchema,
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
218 'mysql': gerald.MySQLSchema }
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
219
428
6cd30b785885 continuing connection transition
catherine@dellzilla
parents: 427
diff changeset
220 class DatabaseInstance(object):
436
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
221 import_failure = None
439
0a2474b76db6 trying to make mysql connections work
catherine@dellzilla
parents: 438
diff changeset
222 username = None
427
8c1dec7fbd71 refactoring connections in progress
catherine@dellzilla
parents:
diff changeset
223 password = None
439
0a2474b76db6 trying to make mysql connections work
catherine@dellzilla
parents: 438
diff changeset
224 port = None
427
8c1dec7fbd71 refactoring connections in progress
catherine@dellzilla
parents:
diff changeset
225 uri = None
436
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
226 pickledir = os.path.join(os.getenv('HOME'), '.sqlpython')
427
8c1dec7fbd71 refactoring connections in progress
catherine@dellzilla
parents:
diff changeset
227 connection_uri_parser = re.compile('(postgres|oracle|mysql|sqlite|mssql):/(.*$)', re.IGNORECASE)
8c1dec7fbd71 refactoring connections in progress
catherine@dellzilla
parents:
diff changeset
228
8c1dec7fbd71 refactoring connections in progress
catherine@dellzilla
parents:
diff changeset
229 def __init__(self, arg, opts, default_rdbms = 'oracle'):
440
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
230 #opts.username = opts.username or opts.user
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
231 self.conn_data = ConnectionData(arg, opts, default_rdbms)
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
232 for v in ('username', 'database', 'rdbms'):
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
233 setattr(self, v, getattr(self.conn_data, v))
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
234 self.connection = self.conn_data.connection()
432
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
235 self.gerald = GeraldPlaceholder()
436
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
236 self.discover_metadata()
433
439621c917c4 changes to match refactored cmd2
catherine@dellzilla
parents: 432
diff changeset
237
439621c917c4 changes to match refactored cmd2
catherine@dellzilla
parents: 432
diff changeset
238 def discover_metadata(self):
432
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
239 self.metadata_discovery_thread = MetadataDiscoveryThread(self)
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
240 self.metadata_discovery_thread.start()
433
439621c917c4 changes to match refactored cmd2
catherine@dellzilla
parents: 432
diff changeset
241
428
6cd30b785885 continuing connection transition
catherine@dellzilla
parents: 427
diff changeset
242 def set_instance_number(self, instance_number):
6cd30b785885 continuing connection transition
catherine@dellzilla
parents: 427
diff changeset
243 self.instance_number = instance_number
440
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
244 self.prompt = "%d:%s@%s> " % (self.instance_number, self.username, self.database)
436
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
245 def pickle(self):
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
246 try:
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
247 os.mkdir(self.pickledir)
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
248 except OSError:
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
249 pass
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
250 picklefile = open(self.picklefile(), 'w')
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
251 pickle.dump(self.gerald.schema, picklefile)
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
252 picklefile.close()
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
253 def picklefile(self):
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
254 return os.path.join(self.pickledir, ('%s.%s.%s.%s.pickle' %
440
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
255 (self.rdbms, self.username, self.conn_data.hostname, self.database)).lower())
436
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
256 def retreive_pickled_gerald(self):
448
9708afb3bb41 oops, remove benchmark references
cat@eee
parents: 447
diff changeset
257 picklefile = open(self.picklefile())
9708afb3bb41 oops, remove benchmark references
cat@eee
parents: 447
diff changeset
258 schema = pickle.load(picklefile)
9708afb3bb41 oops, remove benchmark references
cat@eee
parents: 447
diff changeset
259 picklefile.close()
440
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
260 newgerald = gerald_classes[self.rdbms](self.username, None)
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
261 newgerald.connect(self.conn_data.gerald_uri())
436
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
262 newgerald.schema = schema
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
263 newgerald.current = False
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
264 newgerald.complete = True
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
265 newgerald.descriptions = {}
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
266 for (name, obj) in newgerald.schema.items():
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
267 newgerald.descriptions[name] = ObjectDescriptor(name, obj)
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
268 self.gerald = newgerald
432
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
269
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
270 class MetadataDiscoveryThread(threading.Thread):
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
271 def __init__(self, db_instance):
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
272 threading.Thread.__init__(self)
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
273 self.db_instance = db_instance
26b09e1481e7 beginning to reimplement threaded metadata discovery
catherine@dellzilla
parents: 431
diff changeset
274 def run(self):
436
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
275 if not self.db_instance.gerald.complete:
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
276 try:
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
277 self.db_instance.retreive_pickled_gerald()
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
278 except IOError:
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
279 pass
433
439621c917c4 changes to match refactored cmd2
catherine@dellzilla
parents: 432
diff changeset
280 self.db_instance.gerald.current = False
448
9708afb3bb41 oops, remove benchmark references
cat@eee
parents: 447
diff changeset
281 newgerald = gerald_classes[self.db_instance.rdbms](self.db_instance.username, self.db_instance.conn_data.gerald_uri())
433
439621c917c4 changes to match refactored cmd2
catherine@dellzilla
parents: 432
diff changeset
282 newgerald.descriptions = {}
448
9708afb3bb41 oops, remove benchmark references
cat@eee
parents: 447
diff changeset
283 for (name, obj) in newgerald.schema.items():
9708afb3bb41 oops, remove benchmark references
cat@eee
parents: 447
diff changeset
284 newgerald.descriptions[name] = ObjectDescriptor(name, obj)
433
439621c917c4 changes to match refactored cmd2
catherine@dellzilla
parents: 432
diff changeset
285 newgerald.current = True
439621c917c4 changes to match refactored cmd2
catherine@dellzilla
parents: 432
diff changeset
286 newgerald.complete = True
439621c917c4 changes to match refactored cmd2
catherine@dellzilla
parents: 432
diff changeset
287 self.db_instance.gerald = newgerald
436
f441f2eb52e0 pickling gerald data
catherine@dellzilla
parents: 435
diff changeset
288 self.db_instance.pickle()
440
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
289
e1a962dd7139 refactored connections
catherine@dellzilla
parents: 439
diff changeset
290 if __name__ == '__main__':
448
9708afb3bb41 oops, remove benchmark references
cat@eee
parents: 447
diff changeset
291 doctest.testmod()