Mercurial > sqlpython
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.''' |