annotate sqlpython/schemagroup.py @ 407:188c86d4a11e

struggling with option parsing
author catherine@DellZilla
date Wed, 14 Oct 2009 13:57:29 -0400
parents 1e3179b31a1e
children dd9aab264798
rev   line source
405
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
1 import gerald, re, datetime, threading, time, operator
382
fe0051d7f934 further gerald experiments
catherine@cordelia
parents:
diff changeset
2
387
e3dd9e4467d1 first-pass metadata collection working
catherine@DellZilla
parents: 386
diff changeset
3 def gerald_connection_string(sqlalchemy_connection_string):
e3dd9e4467d1 first-pass metadata collection working
catherine@DellZilla
parents: 386
diff changeset
4 return sqlalchemy_connection_string.split('/?mode=')[0].replace('//','/')
405
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
5
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
6 def build_column_list(schema):
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
7 schema.column_names = [[c for c in o.columns] for o in schema.schema.values()
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
8 if hasattr(o, 'columns')
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
9 and hasattr(o.columns, 'keys')]
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
10 schema.column_names = reduce(operator.add, schema.column_names, [])
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
11 schema.table_names = []
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
12 schema.qual_table_names = []
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
13 for t in schema.schema.values():
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
14 if hasattr(t, 'columns') and isinstance(t.columns, dict):
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
15 schema.table_names.append(t.name)
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
16 schema.qual_table_names.append('%s.%s' % (schema.name, t.name))
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
17 for c in t.columns:
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
18 schema.column_names.append('%s.%s' % (t.name, c))
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
19 schema.qual_column_names = ['%s.%s' % (schema.name, c) for c in schema.column_names]
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
20
386
846a59c10cf4 threads working but still slow startup
catherine@DellZilla
parents: 384
diff changeset
21 class RefreshThread(threading.Thread):
846a59c10cf4 threads working but still slow startup
catherine@DellZilla
parents: 384
diff changeset
22 def __init__(self, schemagroup, owner):
846a59c10cf4 threads working but still slow startup
catherine@DellZilla
parents: 384
diff changeset
23 threading.Thread.__init__(self)
846a59c10cf4 threads working but still slow startup
catherine@DellZilla
parents: 384
diff changeset
24 self.schemagroup = schemagroup
846a59c10cf4 threads working but still slow startup
catherine@DellZilla
parents: 384
diff changeset
25 self.owner = owner
846a59c10cf4 threads working but still slow startup
catherine@DellZilla
parents: 384
diff changeset
26 self.schema = self.schemagroup.schemas.get(self.owner)
846a59c10cf4 threads working but still slow startup
catherine@DellZilla
parents: 384
diff changeset
27 def run(self):
387
e3dd9e4467d1 first-pass metadata collection working
catherine@DellZilla
parents: 386
diff changeset
28 if (not self.schema) or (self.schema.is_stale()):
e3dd9e4467d1 first-pass metadata collection working
catherine@DellZilla
parents: 386
diff changeset
29 self.schema = self.schemagroup.childtype(self.owner, self.schemagroup)
e3dd9e4467d1 first-pass metadata collection working
catherine@DellZilla
parents: 386
diff changeset
30 else:
386
846a59c10cf4 threads working but still slow startup
catherine@DellZilla
parents: 384
diff changeset
31 self.schema.refreshed = self.schema.time()
405
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
32 self.schemagroup.schemas[self.owner] = self.schema
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
33 build_column_list(self.schema)
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
34
387
e3dd9e4467d1 first-pass metadata collection working
catherine@DellZilla
parents: 386
diff changeset
35 class RefreshGroupThread(threading.Thread):
405
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
36 def __init__(self, schemas):
387
e3dd9e4467d1 first-pass metadata collection working
catherine@DellZilla
parents: 386
diff changeset
37 threading.Thread.__init__(self)
390
3905ef976608 cleaning up extra print statements
catherine@DellZilla
parents: 389
diff changeset
38 self.parent = threading.current_thread()
387
e3dd9e4467d1 first-pass metadata collection working
catherine@DellZilla
parents: 386
diff changeset
39 self.schemas = schemas
e3dd9e4467d1 first-pass metadata collection working
catherine@DellZilla
parents: 386
diff changeset
40 self.daemon = True
e3dd9e4467d1 first-pass metadata collection working
catherine@DellZilla
parents: 386
diff changeset
41 def run(self):
405
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
42 self.schemas.refresh()
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
43 s.column_names = reduce(operator.add,
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
44 [s.qual_column_names for s in self.schemas.values()],
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
45 [])
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
46 s.table_names = reduce(operator.add,
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
47 [s.qual_table_names for s in self.schemas.values()],
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
48 [])
387
e3dd9e4467d1 first-pass metadata collection working
catherine@DellZilla
parents: 386
diff changeset
49
407
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
50 class OracleSchemaAccess(object):
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
51 child_type = gerald.OracleSchema
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
52 current_database_time_query = 'SELECT sysdate FROM dual'
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
53 def latest_ddl_timestamp_query(self, username, connection):
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
54 curs = connection.cursor()
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
55 curs.execute('''SELECT owner, MAX(last_ddl_time)
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
56 FROM all_objects
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
57 GROUP BY owner
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
58 -- sort :username to top
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
59 ORDER BY REPLACE(owner, :username, 'A'), owner''',
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
60 {'username': username.upper()})
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
61 return curs
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
62
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
63 class PostgresSchemaAccess(object):
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
64 child_type = gerald.PostgresSchema
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
65 current_database_time_query = 'SELECT current_time'
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
66 def latest_ddl_timestamp_query(self, username, connection):
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
67 curs = connection.cursor()
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
68 curs.execute("""SELECT '%s', current_time""" % username)
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
69 return curs
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
70
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
71 class MySQLSchemaAccess(object):
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
72 child_type = gerald.MySQLSchema
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
73 current_database_time_query = 'SELECT sysdate FROM dual'
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
74 def latest_ddl_timestamp_query(self, username, connection):
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
75 curs = connection.cursor()
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
76 curs.execute("""SELECT '%s', current_time""" % username)
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
77 return curs
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
78
387
e3dd9e4467d1 first-pass metadata collection working
catherine@DellZilla
parents: 386
diff changeset
79 class SchemaDict(dict):
407
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
80 schema_types = {'oracle': OracleSchemaAccess, 'postgres': PostgresSchemaAccess, 'mysql': MySQLSchemaAccess}
405
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
81 def __init__(self, dct, rdbms, user, connection, connection_string):
387
e3dd9e4467d1 first-pass metadata collection working
catherine@DellZilla
parents: 386
diff changeset
82 dict.__init__(self, dct)
407
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
83 self.schema_access = self.schema_types[rdbms]()
387
e3dd9e4467d1 first-pass metadata collection working
catherine@DellZilla
parents: 386
diff changeset
84 self.user = user
e3dd9e4467d1 first-pass metadata collection working
catherine@DellZilla
parents: 386
diff changeset
85 self.connection = connection
e3dd9e4467d1 first-pass metadata collection working
catherine@DellZilla
parents: 386
diff changeset
86 self.gerald_connection_string = gerald_connection_string(connection_string)
405
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
87 self.refresh_thread = RefreshGroupThread(self)
396
9c724e555c91 re.match is betraying me
catherine@DellZilla
parents: 394
diff changeset
88 self.complete = 0
389
53ee70e9417e oops, one more change propagated from hg messup
catherine@DellZilla
parents: 387
diff changeset
89 def refresh_asynch(self):
53ee70e9417e oops, one more change propagated from hg messup
catherine@DellZilla
parents: 387
diff changeset
90 self.refresh_thread.start()
407
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
91 current_database_time_sql = {gerald.OracleSchema: 'SELECT sysdate FROM dual',
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
92 gerald.PostgresSchema: 'SELECT current_time'}
390
3905ef976608 cleaning up extra print statements
catherine@DellZilla
parents: 389
diff changeset
93 def get_current_database_time(self):
387
e3dd9e4467d1 first-pass metadata collection working
catherine@DellZilla
parents: 386
diff changeset
94 curs = self.connection.cursor()
407
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
95 curs.execute(self.schema_access.current_database_time_query)
390
3905ef976608 cleaning up extra print statements
catherine@DellZilla
parents: 389
diff changeset
96 return curs.fetchone()[0]
407
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
97 def refresh_times(self, target_schema):
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
98 now = self.get_current_database_time()
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
99 result = []
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
100 for (schema_name, schema) in self.items():
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
101 if (not target_schema) or (target_schema.lower() == schema_name.lower()):
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
102 result.append('%s: %s (%s ago)' % (schema_name, schema.refreshed, now - schema.refreshed))
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
103 result.sort()
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
104 return '\n'.join(result)
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
105
390
3905ef976608 cleaning up extra print statements
catherine@DellZilla
parents: 389
diff changeset
106 def refresh(self):
3905ef976608 cleaning up extra print statements
catherine@DellZilla
parents: 389
diff changeset
107 current_database_time = self.get_current_database_time()
407
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
108 curs = self.schema_access.latest_ddl_timestamp_query(self.user, self.connection)
387
e3dd9e4467d1 first-pass metadata collection working
catherine@DellZilla
parents: 386
diff changeset
109 for (owner, last_ddl_time) in curs.fetchall():
e3dd9e4467d1 first-pass metadata collection working
catherine@DellZilla
parents: 386
diff changeset
110 if (owner not in self) or (self[owner].refreshed < last_ddl_time):
390
3905ef976608 cleaning up extra print statements
catherine@DellZilla
parents: 389
diff changeset
111 self.refresh_one(owner, current_database_time)
387
e3dd9e4467d1 first-pass metadata collection working
catherine@DellZilla
parents: 386
diff changeset
112 # what if a user's last object is deleted?
396
9c724e555c91 re.match is betraying me
catherine@DellZilla
parents: 394
diff changeset
113 if isinstance(self.complete, int):
9c724e555c91 re.match is betraying me
catherine@DellZilla
parents: 394
diff changeset
114 self.complete += 1
405
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
115 self.column_names = [s.column_names for s in self.values()]
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
116 self.columns = reduce(operator.add, [s.column_names for s in self.values()])
396
9c724e555c91 re.match is betraying me
catherine@DellZilla
parents: 394
diff changeset
117 self.complete = 'all'
390
3905ef976608 cleaning up extra print statements
catherine@DellZilla
parents: 389
diff changeset
118 def refresh_one(self, owner, current_database_time=None):
407
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
119 #owner = owner.upper()
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
120 owner = str(owner)
390
3905ef976608 cleaning up extra print statements
catherine@DellZilla
parents: 389
diff changeset
121 if not current_database_time:
3905ef976608 cleaning up extra print statements
catherine@DellZilla
parents: 389
diff changeset
122 current_database_time = self.get_current_database_time()
407
188c86d4a11e struggling with option parsing
catherine@DellZilla
parents: 405
diff changeset
123 self[owner] = self.schema_access.child_type(owner, self.gerald_connection_string)
390
3905ef976608 cleaning up extra print statements
catherine@DellZilla
parents: 389
diff changeset
124 self[owner].refreshed = current_database_time
405
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
125 build_column_list(self[owner])
394
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
126
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
127 class PlainObject(object):
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
128 '''Simply a dumb container for attributes.'''
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
129 def __init__(self, **kwargs):
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
130 self.__dict__.update(kwargs)
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
131 def transform(self, transformation):
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
132 '''Attempts to apply a transformation function to all the
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
133 user-defined attributes; fails silently on errors'''
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
134 for (k, v) in self.__dict__.items():
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
135 try:
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
136 self.__dict__[k] = transformation(v)
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
137 except:
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
138 pass
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
139 return self
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
140 def __repr__(self):
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
141 return '%s(%s)' % (self.__class__.__name__,
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
142 ','.join('%s=%s' % (k,
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
143 (isinstance(v, basestring) and "'%s'" % v) or v)
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
144 for (k, v) in sorted(self.__dict__.items())))
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
145
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
146
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
147 class MetaData(PlainObject):
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
148 def __init__(self, object_name, schema_name, db_object):
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
149 self.object_name = object_name
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
150 self.schema_name = schema_name
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
151 self.db_object = db_object
402
d4c045f50864 struggling to flatten the schema
catherine@DellZilla
parents: 396
diff changeset
152 if isinstance(db_object, dict):
d4c045f50864 struggling to flatten the schema
catherine@DellZilla
parents: 396
diff changeset
153 self.db_type = db_object['db_type']
d4c045f50864 struggling to flatten the schema
catherine@DellZilla
parents: 396
diff changeset
154 elif hasattr(db_object, 'type'):
394
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
155 self.db_type = db_object.type
403
dff2ac907331 genericizing _dir_indexes, _dir_constraints'
catherine@DellZilla
parents: 402
diff changeset
156 else:
394
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
157 self.db_type = str(type(db_object)).rstrip("'>").split('.')[-1]
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
158 def qualified_name(self):
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
159 return '%s.%s' % (self.schema_name, self.object_name)
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
160 def name(self, qualified=False):
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
161 if qualified:
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
162 return self.qualified_name()
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
163 else:
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
164 return self.object_name
58e6d66794b0 refactoring _matching_database_objects to return MetaData
catherine@DellZilla
parents: 390
diff changeset
165 def descriptor(self, qualified=False):
396
9c724e555c91 re.match is betraying me
catherine@DellZilla
parents: 394
diff changeset
166 return '%s/%s' % (self.db_type, self.name(qualified))
405
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
167
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
168 s = None
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
169
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
170 if __name__ == '__main__':
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
171 connection_string = 'oracle://jrrt:password@orcl/?mode=0'
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
172 connection = None
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
173 dct = {}
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
174 user = 'jrrt'
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
175 rdbms = 'oracle'
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
176 s = SchemaDict(dct, rdbms, user, connection, connection_string, 100)
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
177 sch = s.child_type('jrrt',s.gerald_connection_string)
1e3179b31a1e nice progress on tab completion
catherine@cordelia
parents: 403
diff changeset
178