comparison 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
comparison
equal deleted inserted replaced
406:4b481c4293b8 407:188c86d4a11e
45 []) 45 [])
46 s.table_names = reduce(operator.add, 46 s.table_names = reduce(operator.add,
47 [s.qual_table_names for s in self.schemas.values()], 47 [s.qual_table_names for s in self.schemas.values()],
48 []) 48 [])
49 49
50 class OracleSchemaAccess(object):
51 child_type = gerald.OracleSchema
52 current_database_time_query = 'SELECT sysdate FROM dual'
53 def latest_ddl_timestamp_query(self, username, connection):
54 curs = connection.cursor()
55 curs.execute('''SELECT owner, MAX(last_ddl_time)
56 FROM all_objects
57 GROUP BY owner
58 -- sort :username to top
59 ORDER BY REPLACE(owner, :username, 'A'), owner''',
60 {'username': username.upper()})
61 return curs
62
63 class PostgresSchemaAccess(object):
64 child_type = gerald.PostgresSchema
65 current_database_time_query = 'SELECT current_time'
66 def latest_ddl_timestamp_query(self, username, connection):
67 curs = connection.cursor()
68 curs.execute("""SELECT '%s', current_time""" % username)
69 return curs
70
71 class MySQLSchemaAccess(object):
72 child_type = gerald.MySQLSchema
73 current_database_time_query = 'SELECT sysdate FROM dual'
74 def latest_ddl_timestamp_query(self, username, connection):
75 curs = connection.cursor()
76 curs.execute("""SELECT '%s', current_time""" % username)
77 return curs
78
50 class SchemaDict(dict): 79 class SchemaDict(dict):
51 schema_types = {'oracle': gerald.OracleSchema} 80 schema_types = {'oracle': OracleSchemaAccess, 'postgres': PostgresSchemaAccess, 'mysql': MySQLSchemaAccess}
52 def __init__(self, dct, rdbms, user, connection, connection_string): 81 def __init__(self, dct, rdbms, user, connection, connection_string):
53 dict.__init__(self, dct) 82 dict.__init__(self, dct)
54 self.child_type = self.schema_types[rdbms] 83 self.schema_access = self.schema_types[rdbms]()
55 self.user = user 84 self.user = user
56 self.connection = connection 85 self.connection = connection
57 self.gerald_connection_string = gerald_connection_string(connection_string) 86 self.gerald_connection_string = gerald_connection_string(connection_string)
58 self.refresh_thread = RefreshGroupThread(self) 87 self.refresh_thread = RefreshGroupThread(self)
59 self.complete = 0 88 self.complete = 0
60 def refresh_asynch(self): 89 def refresh_asynch(self):
61 self.refresh_thread.start() 90 self.refresh_thread.start()
91 current_database_time_sql = {gerald.OracleSchema: 'SELECT sysdate FROM dual',
92 gerald.PostgresSchema: 'SELECT current_time'}
62 def get_current_database_time(self): 93 def get_current_database_time(self):
63 curs = self.connection.cursor() 94 curs = self.connection.cursor()
64 curs.execute('SELECT sysdate FROM dual') 95 curs.execute(self.schema_access.current_database_time_query)
65 return curs.fetchone()[0] 96 return curs.fetchone()[0]
97 def refresh_times(self, target_schema):
98 now = self.get_current_database_time()
99 result = []
100 for (schema_name, schema) in self.items():
101 if (not target_schema) or (target_schema.lower() == schema_name.lower()):
102 result.append('%s: %s (%s ago)' % (schema_name, schema.refreshed, now - schema.refreshed))
103 result.sort()
104 return '\n'.join(result)
105
66 def refresh(self): 106 def refresh(self):
67 current_database_time = self.get_current_database_time() 107 current_database_time = self.get_current_database_time()
68 curs = self.connection.cursor() 108 curs = self.schema_access.latest_ddl_timestamp_query(self.user, self.connection)
69 curs.execute('''SELECT owner, MAX(last_ddl_time)
70 FROM all_objects
71 GROUP BY owner
72 -- sort :username to top
73 ORDER BY REPLACE(owner, :username, 'A'), owner''',
74 {'username': self.user.upper()})
75 for (owner, last_ddl_time) in curs.fetchall(): 109 for (owner, last_ddl_time) in curs.fetchall():
76 if (owner not in self) or (self[owner].refreshed < last_ddl_time): 110 if (owner not in self) or (self[owner].refreshed < last_ddl_time):
77 self.refresh_one(owner, current_database_time) 111 self.refresh_one(owner, current_database_time)
78 # what if a user's last object is deleted? 112 # what if a user's last object is deleted?
79 if isinstance(self.complete, int): 113 if isinstance(self.complete, int):
80 self.complete += 1 114 self.complete += 1
81 self.column_names = [s.column_names for s in self.values()] 115 self.column_names = [s.column_names for s in self.values()]
82 self.columns = reduce(operator.add, [s.column_names for s in self.values()]) 116 self.columns = reduce(operator.add, [s.column_names for s in self.values()])
83 self.complete = 'all' 117 self.complete = 'all'
84 print 'metadata discovered'
85 def refresh_one(self, owner, current_database_time=None): 118 def refresh_one(self, owner, current_database_time=None):
119 #owner = owner.upper()
120 owner = str(owner)
86 if not current_database_time: 121 if not current_database_time:
87 current_database_time = self.get_current_database_time() 122 current_database_time = self.get_current_database_time()
88 self[owner] = self.child_type(owner, self.gerald_connection_string) 123 self[owner] = self.schema_access.child_type(owner, self.gerald_connection_string)
89 self[owner].refreshed = current_database_time 124 self[owner].refreshed = current_database_time
90 build_column_list(self[owner]) 125 build_column_list(self[owner])
91 126
92 class PlainObject(object): 127 class PlainObject(object):
93 '''Simply a dumb container for attributes.''' 128 '''Simply a dumb container for attributes.'''