Package grizzled :: Package db :: Module dbgadfly
[hide private]
[frames] | no frames]

Source Code for Module grizzled.db.dbgadfly

  1  # $Id: f25618704b7ebe12c191cc1a51055c26db731b85 $ 
  2   
  3  """ 
  4  Gadfly extended database driver. 
  5  """ 
  6   
  7  __docformat__ = "restructuredtext en" 
  8   
  9  # --------------------------------------------------------------------------- 
 10  # Imports 
 11  # --------------------------------------------------------------------------- 
 12   
 13  import os 
 14  import sys 
 15   
 16  from grizzled.db.base import (Cursor, DB, DBDriver, Error, Warning, 
 17                                TableMetadata, IndexMetadata, RDBMSMetadata) 
18 19 # --------------------------------------------------------------------------- 20 # Exports 21 # --------------------------------------------------------------------------- 22 23 # --------------------------------------------------------------------------- 24 # Classes 25 # --------------------------------------------------------------------------- 26 27 -class GadflyCursor(Cursor):
28 - def __init__(self, real_cursor, driver):
29 self.real_cursor = real_cursor 30 self.driver = driver
31 32 @property
33 - def rowcount(self):
34 total = len(self.real_cursor.fetchall()) 35 self.real_cursor.reset_results() 36 return total
37 38 @property
39 - def description(self):
40 return self.real_cursor.description
41
42 - def close(self):
43 try: 44 self.real_cursor.close() 45 except: 46 raise Error(sys.exc_info()[1])
47
48 - def execute(self, statement, parameters=None):
49 try: 50 if parameters: 51 result = self.real_cursor.execute(statement, parameters) 52 else: 53 result = self.real_cursor.execute(statement) 54 return result 55 except: 56 raise Error(sys.exc_info()[1])
57
58 - def executemany(self, statement, *parameters):
59 try: 60 return self.real_cursor.executemany(statement, *parameters) 61 except: 62 raise Error(sys.exc_info()[1])
63
64 - def fetchall(self):
65 try: 66 return self.real_cursor.fetchall() 67 except: 68 raise Error(sys.exc_info()[1])
69
70 - def fetchone(self):
71 try: 72 return self.real_cursor.fetchone() 73 except: 74 s = sys.exc_info()[1] 75 if (type(s) == str) and (s.startswith('no more')): 76 return None 77 raise Error(s)
78
79 - def fetchmany(self, n):
80 try: 81 return self.real_cursor.fetchmany(n) 82 except: 83 s = sys.exc_info()[1] 84 if (type(s) == str) and (s.startswith('no more')): 85 return None 86 raise Error(s)
87
88 -class GadflyDB(DB):
89 - def __init__(self, db, driver):
90 DB.__init__(self, db, driver) 91 self.__db = db 92 self.__driver = driver
93
94 - def cursor(self):
95 return Cursor(GadflyCursor(self.__db.cursor(), self.__driver), 96 self.__driver)
97
98 -class GadflyDriver(DBDriver):
99 """DB Driver for Gadfly, a pure Python RDBMS""" 100
101 - def __init__(self):
102 gadfly = self.get_import() 103 gadfly.error = Exception()
104
105 - def get_import(self):
106 import gadfly 107 return gadfly
108
109 - def get_display_name(self):
110 return "Gadfly"
111
112 - def connect(self, 113 host=None, 114 port=None, 115 user='', 116 password='', 117 database='default'):
118 gadfly = self.get_import() 119 directory = os.path.dirname(database) 120 database = os.path.basename(database) 121 if database.endswith('.gfd'): 122 database = database[:-4] 123 124 try: 125 g = gadfly.gadfly() 126 g.startup(database, directory) 127 return GadflyDB(g, self) 128 except IOError: 129 raise Error(sys.exc_info()[1])
130
131 - def get_tables(self, cursor):
132 cursor.execute('SELECT table_name FROM __table_names__ ' 133 'WHERE is_view = 0') 134 table_names = [] 135 for row in cursor.fetchall(): 136 table_names += [row[0]] 137 138 return table_names
139
140 - def get_rdbms_metadata(self, cursor):
141 import gadfly 142 version = '.'.join([str(i) for i in gadfly.version_info]) 143 return RDBMSMetadata('gadfly', 'gadfly', version)
144
145 - def get_table_metadata(self, table, cursor):
146 self._ensure_valid_table(cursor, table) 147 148 cursor.execute("SELECT column_name FROM __columns__ " 149 "WHERE table_name = '%s'" % table.upper()) 150 result = [] 151 column_names = [] 152 for row in cursor.fetchall(): 153 result += [TableMetadata(row[0], 'object', None, None, None, True)] 154 return result
155
156 - def get_index_metadata(self, table, cursor):
157 self._ensure_valid_table(cursor, table) 158 159 cursor.execute("SELECT is_unique, index_name FROM __indices__ " 160 "WHERE table_name = '%s'" % table.upper()) 161 indexes = [] 162 result = [] 163 for row in cursor.fetchall(): 164 indexes.append(row) 165 166 for unique, index_name in indexes: 167 cursor.execute("SELECT column_name FROM __indexcols__ " 168 "WHERE index_name = '%s'" % index_name) 169 cols = [] 170 for row in cursor.fetchall(): 171 cols.append(row[0]) 172 173 if unique: 174 description = 'UNIQUE' 175 else: 176 description = 'NON-UNIQUE' 177 178 result.append(IndexMetadata(index_name, cols, description)) 179 180 return result
181
182 - def _is_valid_table(self, cursor, table_name):
183 tables = self.get_tables(cursor) 184 return table_name.upper() in tables
185