[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
gnue-common/src/datasources/drivers/mysql/mysql...
From: |
Jason Cater |
Subject: |
gnue-common/src/datasources/drivers/mysql/mysql... |
Date: |
Wed, 25 Jun 2003 19:09:40 -0400 |
CVSROOT: /cvsroot/gnue
Module name: gnue-common
Branch:
Changes by: Jason Cater <address@hidden> 03/06/25 19:09:40
Modified files:
src/datasources/drivers/mysql/mysql: Driver.py
Log message:
added primary key introspection support to MySQL
CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/datasources/drivers/mysql/mysql/Driver.py.diff?tr1=1.4&tr2=1.5&r1=text&r2=text
Patches:
Index: gnue-common/src/datasources/drivers/mysql/mysql/Driver.py
diff -c gnue-common/src/datasources/drivers/mysql/mysql/Driver.py:1.4
gnue-common/src/datasources/drivers/mysql/mysql/Driver.py:1.5
*** gnue-common/src/datasources/drivers/mysql/mysql/Driver.py:1.4 Wed Jun
4 19:23:34 2003
--- gnue-common/src/datasources/drivers/mysql/mysql/Driver.py Wed Jun 25
19:09:40 2003
***************
*** 1,287 ****
! #
! # This file is part of GNU Enterprise.
! #
! # GNU Enterprise is free software; you can redistribute it
! # and/or modify it under the terms of the GNU General Public
! # License as published by the Free Software Foundation; either
! # version 2, or (at your option) any later version.
! #
! # GNU Enterprise is distributed in the hope that it will be
! # useful, but WITHOUT ANY WARRANTY; without even the implied
! # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
! # PURPOSE. See the GNU General Public License for more details.
! #
! # You should have received a copy of the GNU General Public
! # License along with program; see the file COPYING. If not,
! # write to the Free Software Foundation, Inc., 59 Temple Place
! # - Suite 330, Boston, MA 02111-1307, USA.
! #
! # Copyright 2000-2003 Free Software Foundation
! #
! # FILE:
! # mysql/DBdriver.py
! #
! # DESCRIPTION:
! # Driver to provide access to data vi MySQL
! #
! # NOTES:
! # Supports transactions if the MySQL server is compiled w/transaction support
! # (which it does NOT by default)
!
!
! import string
! import sys
! from gnue.common.datasources import GDataObjects, GConditions
! from gnue.common.apps import GDebug
! from gnue.common.datasources.drivers.DBSIG2.Driver \
! import DBSIG_RecordSet, DBSIG_ResultSet, DBSIG_DataObject, \
! DBSIG_DataObject_SQL, DBSIG_DataObject_Object
!
! try:
! import MySQLdb
! except ImportError, mesg:
! GDebug.printMesg(1,mesg)
! print "-"*79
! print _("\nCould not load MySQLdb. For MySQL support, please install \n") \
! + _("mysql-python 0.9.0 or later from") \
! + "http://sourceforge.net/projects/mysql-python\n"
! print _("Error: %s") % mesg
! print "-"*79
! sys.exit()
!
!
!
! class MySQL_RecordSet(DBSIG_RecordSet):
! pass
!
!
! class MySQL_ResultSet(DBSIG_ResultSet):
! def __init__(self, dataObject, cursor=None, defaultValues={},
masterRecordSet=None):
! DBSIG_ResultSet.__init__(self, dataObject, \
! cursor, defaultValues, masterRecordSet)
! self._recordSetClass = MySQL_RecordSet
!
! # Compensate for bug in python mysql drivers older than 0.9.2a2
! if MySQLdb.__version__ >= '0.9.2a2':
! self.fetchBugFix = self._cursor.fetchmany
! else:
! self.__done = 0
! self.fetchBugFix = self.__mySqlNeedsLotsOfTLC
!
!
! # Compensate for MySQ bug
! def __mySqlNeedsLotsOfTLC(self):
! if self.__done:
! return None
!
! self.__done = 1
! return self._cursor.fetchall()
!
!
! def _loadNextRecord(self):
! if self._cursor:
! rs = None
!
! try:
! # See __init__ for details
! rsets = self.fetchBugFix()
!
! except self._dataObject._DatabaseError, err:
! raise GDataObjects.ConnectionError, err
!
! if rsets and len(rsets):
! for rs in(rsets):
! if rs:
! i = 0
! dict = {}
! for f in (rs):
! dict[string.lower(self._fieldNames[i])] = f
! i += 1
! self._cachedRecords.append (self._recordSetClass(parent=self, \
!
initialData=dict))
! else:
! return 0
! return 1
! else:
! return 0
! else:
! return 0
!
! class MySQL_DataObject(DBSIG_DataObject):
! def __init__(self):
! DBSIG_DataObject.__init__(self)
! self._DatabaseError = MySQLdb.DatabaseError
! self._resultSetClass = MySQL_ResultSet
! def connect(self, connectData={}):
! GDebug.printMesg(1,"Mysql database driver initializing")
!
! try:
! self._dataConnection = MySQLdb.connect(user=connectData['_username'],
! passwd=connectData['_password'],
! host=connectData['host'],
! db=connectData['dbname'])
! except self._DatabaseError, value:
! raise GDataObjects.LoginError, value
!
! self._beginTransaction()
! self._postConnect()
!
!
! def _postConnect(self):
! self.triggerExtensions = TriggerExtensions(self._dataConnection)
!
!
! def _beginTransaction(self):
! try:
! self._dataConnection.begin()
! except:
! pass
!
!
! #
! # Schema (metadata) functions
! #
!
! # Return a list of the types of Schema objects this driver provides
! def getSchemaTypes(self):
! return [('table',_('Tables'),1)]
!
! # Return a list of Schema objects
! def getSchemaList(self, type=None):
!
! # TODO: This excludes any system tables and views. Should it?
! statement = "SHOW TABLES"
!
! cursor = self._dataConnection.cursor()
! cursor.execute(statement)
!
! list = []
! for rs in cursor.fetchall():
! list.append(GDataObjects.Schema(attrs={'id':rs[0], 'name':rs[0],
! 'type':'table'},
! getChildSchema=self.__getFieldSchema))
!
! cursor.close()
! return list
!
!
! # Find a schema object with specified name
! def getSchemaByName(self, name, type=None):
! statement = "DESCRIBE %s" % (name)
!
! cursor = self._dataConnection.cursor()
! cursor.execute(statement)
!
! rs = cursor.fetchone()
! if rs:
! schema = GDataObjects.Schema(attrs={'id':name, 'name':name,
! 'type':'table'},
! getChildSchema=self.__getFieldSchema)
! else:
! schema = None
!
! cursor.close()
! return schema
!
!
! # Get fields for a table
! def __getFieldSchema(self, parent):
!
! statement = "DESCRIBE %s" % parent.id
!
! cursor = self._dataConnection.cursor()
! cursor.execute(statement)
!
! list = []
! for rs in cursor.fetchall():
!
! nativetype = string.split(string.replace(rs[1],')',''),'(')
!
!
! attrs={'id': "%s.%s" % (parent.id, rs[0]), 'name': rs[0],
! 'type':'field', 'nativetype': nativetype[0],
! 'required': rs[2] != 'YES'}
!
! if nativetype[0] in ('int','integer','bigint','mediumint',
! 'smallint','tinyint','float','real',
! 'double','decimal'):
! attrs['datatype']='number'
! elif nativetype[0] in ('date','time','timestamp','datetime'):
! attrs['datatype']='date'
! else:
! attrs['datatype']='text'
!
! try:
! if len(nativetype) == 2:
! attrs['length'] = int(string.split(nativetype[1])[0])
! except ValueError:
! GDebug.printMesg(1,'WARNING: mysql native type error: %s' %
nativetype)
!
! list.append(GDataObjects.Schema(attrs=attrs))
!
! cursor.close()
! return list
!
!
!
!
! class MySQL_DataObject_Object(MySQL_DataObject, \
! DBSIG_DataObject_Object):
!
! def __init__(self):
! MySQL_DataObject.__init__(self)
!
! def _buildQuery(self, conditions={},forDetail=None,additionalSQL=""):
! return DBSIG_DataObject_Object._buildQuery(self,
conditions,forDetail,additionalSQL)
!
!
! class MySQL_DataObject_SQL(MySQL_DataObject, \
! DBSIG_DataObject_SQL):
! def __init__(self):
! # Call DBSIG init first because MySQL_DataObject needs to overwrite
! # some of its values
! DBSIG_DataObject_SQL.__init__(self)
! MySQL_DataObject.__init__(self)
!
! def _buildQuery(self, conditions={}):
! return DBSIG_DataObject_SQL._buildQuery(self, conditions)
!
!
! #
! # Extensions to Trigger Namespaces
! #
! class TriggerExtensions:
!
! def __init__(self, connection):
! self.__connection = connection
!
! # Return the current date, according to database
! # def getDate(self):
! # pass
!
! # Return a sequence number from sequence 'name'
! # def getSequence(self, name):
! # pass
!
! # Run the SQL statement 'statement'
! # def sql(self, statement):
! # pass
!
!
!
! ######################################
! #
! # The following hashes describe
! # this driver's characteristings.
! #
! ######################################
!
! #
! # All datasouce "types" and corresponding DataObject class
! #
! supportedDataObjects = {
! 'object': MySQL_DataObject_Object,
! 'sql': MySQL_DataObject_SQL
! }
!
!
--- 1,323 ----
! #
! # This file is part of GNU Enterprise.
! #
! # GNU Enterprise is free software; you can redistribute it
! # and/or modify it under the terms of the GNU General Public
! # License as published by the Free Software Foundation; either
! # version 2, or (at your option) any later version.
! #
! # GNU Enterprise is distributed in the hope that it will be
! # useful, but WITHOUT ANY WARRANTY; without even the implied
! # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
! # PURPOSE. See the GNU General Public License for more details.
! #
! # You should have received a copy of the GNU General Public
! # License along with program; see the file COPYING. If not,
! # write to the Free Software Foundation, Inc., 59 Temple Place
! # - Suite 330, Boston, MA 02111-1307, USA.
! #
! # Copyright 2000-2003 Free Software Foundation
! #
! # FILE:
! # mysql/DBdriver.py
! #
! # DESCRIPTION:
! # Driver to provide access to data vi MySQL
! #
! # NOTES:
! # Supports transactions if the MySQL server is compiled w/transaction support
! # (which it does NOT by default)
!
!
! import string
! import sys
! from gnue.common.datasources import GDataObjects, GConditions
! from gnue.common.apps import GDebug
! from gnue.common.datasources.drivers.DBSIG2.Driver \
! import DBSIG_RecordSet, DBSIG_ResultSet, DBSIG_DataObject, \
! DBSIG_DataObject_SQL, DBSIG_DataObject_Object
!
! try:
! import MySQLdb
! except ImportError, mesg:
! GDebug.printMesg(1,mesg)
! print "-"*79
! print _("\nCould not load MySQLdb. For MySQL support, please install \n") \
! + _("mysql-python 0.9.0 or later from") \
! + "http://sourceforge.net/projects/mysql-python\n"
! print _("Error: %s") % mesg
! print "-"*79
! sys.exit()
!
!
!
! class MySQL_RecordSet(DBSIG_RecordSet):
! pass
!
!
! class MySQL_ResultSet(DBSIG_ResultSet):
! def __init__(self, dataObject, cursor=None, defaultValues={},
masterRecordSet=None):
! DBSIG_ResultSet.__init__(self, dataObject, \
! cursor, defaultValues, masterRecordSet)
! self._recordSetClass = MySQL_RecordSet
!
! # Compensate for bug in python mysql drivers older than 0.9.2a2
! if MySQLdb.__version__ >= '0.9.2a2':
! self.fetchBugFix = self._cursor.fetchmany
! else:
! self.__done = 0
! self.fetchBugFix = self.__mySqlNeedsLotsOfTLC
!
!
! # Compensate for MySQ bug
! def __mySqlNeedsLotsOfTLC(self):
! if self.__done:
! return None
!
! self.__done = 1
! return self._cursor.fetchall()
!
!
! def _loadNextRecord(self):
! if self._cursor:
! rs = None
!
! try:
! # See __init__ for details
! rsets = self.fetchBugFix()
!
! except self._dataObject._DatabaseError, err:
! raise GDataObjects.ConnectionError, err
!
! if rsets and len(rsets):
! for rs in(rsets):
! if rs:
! i = 0
! dict = {}
! for f in (rs):
! dict[string.lower(self._fieldNames[i])] = f
! i += 1
! self._cachedRecords.append (self._recordSetClass(parent=self, \
!
initialData=dict))
! else:
! return 0
! return 1
! else:
! return 0
! else:
! return 0
!
! class MySQL_DataObject(DBSIG_DataObject):
! def __init__(self):
! DBSIG_DataObject.__init__(self)
! self._DatabaseError = MySQLdb.DatabaseError
! self._resultSetClass = MySQL_ResultSet
! def connect(self, connectData={}):
! GDebug.printMesg(1,"Mysql database driver initializing")
!
! try:
! self._dataConnection = MySQLdb.connect(user=connectData['_username'],
! passwd=connectData['_password'],
! host=connectData['host'],
! db=connectData['dbname'])
! except self._DatabaseError, value:
! raise GDataObjects.LoginError, value
!
! self._beginTransaction()
! self._postConnect()
!
!
! def _postConnect(self):
! self.triggerExtensions = TriggerExtensions(self._dataConnection)
!
!
! def _beginTransaction(self):
! try:
! self._dataConnection.begin()
! except:
! pass
!
!
! #
! # Schema (metadata) functions
! #
!
! # Return a list of the types of Schema objects this driver provides
! def getSchemaTypes(self):
! return [('table',_('Tables'),1)]
!
! # Return a list of Schema objects
! def getSchemaList(self, type=None):
!
! # TODO: This excludes any system tables and views. Should it?
! statement = "SHOW TABLES"
!
! cursor = self._dataConnection.cursor()
! cursor.execute(statement)
!
! list = []
! for rs in cursor.fetchall():
! list.append(GDataObjects.Schema(attrs={'id':rs[0], 'name':rs[0],
! 'type':'table',
! 'primarykey': self.__getPrimaryKey(rs[0])},
! getChildSchema=self.__getFieldSchema))
!
! cursor.close()
! return list
!
!
! # Find a schema object with specified name
! def getSchemaByName(self, name, type=None):
! statement = "DESCRIBE %s" % (name)
!
! cursor = self._dataConnection.cursor()
! cursor.execute(statement)
!
! rs = cursor.fetchone()
! if rs:
! schema = GDataObjects.Schema(attrs={'id':name, 'name':name,
! 'type':'table',
! 'primarykey': self.__getPrimaryKey(name,cursor)},
! getChildSchema=self.__getFieldSchema)
! else:
! schema = None
!
! cursor.close()
! return schema
!
!
! def __getPrimaryKey(self, id, cursor=None):
! statement = "DESCRIBE %s" % id
! if not cursor:
! cursor = self._dataConnection.cursor()
! close_cursor = 1
! else:
! close_cursor = 0
! cursor.execute(statement)
!
! lst = []
! for rs in cursor.fetchall():
! if rs[3] == 'PRI':
! lst.append(rs[0])
!
! if close_cursor:
! cursor.close()
!
! return tuple(lst)
!
! # Get fields for a table
! def __getFieldSchema(self, parent):
!
! statement = "DESCRIBE %s" % parent.id
!
! cursor = self._dataConnection.cursor()
! cursor.execute(statement)
!
! list = []
! for rs in cursor.fetchall():
!
! nativetype = string.split(string.replace(rs[1],')',''),'(')
!
!
! attrs={'id': "%s.%s" % (parent.id, rs[0]), 'name': rs[0],
! 'type':'field', 'nativetype': nativetype[0],
! 'required': rs[2] != 'YES'}
!
! if nativetype[0] in ('int','integer','bigint','mediumint',
! 'smallint','tinyint','float','real',
! 'double','decimal'):
! attrs['datatype']='number'
! elif nativetype[0] in ('date','time','timestamp','datetime'):
! attrs['datatype']='date'
! else:
! attrs['datatype']='text'
!
! try:
! if len(nativetype) == 2:
! try:
! ln, prec = nativetype[1].split(',')
! except:
! ln = nativetype[1]
! prec = None
! attrs['length'] = int(ln.split()[0])
! if prec != None:
! attrs['precision'] = int(prec)
! except ValueError:
! GDebug.printMesg(1,'WARNING: mysql native type error: %s' %
nativetype)
!
! if rs[4] not in ('NULL', '0000-00-00 00:00:00','', None):
! attrs['defaulttype'] = 'constant'
! attrs['defaultval'] = rs[4]
!
! if rs[5] == 'auto_increment':
! attrs['defaulttype'] = 'serial'
!
!
! list.append(GDataObjects.Schema(attrs=attrs))
!
! cursor.close()
! return list
!
!
!
!
! class MySQL_DataObject_Object(MySQL_DataObject, \
! DBSIG_DataObject_Object):
!
! def __init__(self):
! MySQL_DataObject.__init__(self)
!
! def _buildQuery(self, conditions={},forDetail=None,additionalSQL=""):
! return DBSIG_DataObject_Object._buildQuery(self,
conditions,forDetail,additionalSQL)
!
!
! class MySQL_DataObject_SQL(MySQL_DataObject, \
! DBSIG_DataObject_SQL):
! def __init__(self):
! # Call DBSIG init first because MySQL_DataObject needs to overwrite
! # some of its values
! DBSIG_DataObject_SQL.__init__(self)
! MySQL_DataObject.__init__(self)
!
! def _buildQuery(self, conditions={}):
! return DBSIG_DataObject_SQL._buildQuery(self, conditions)
!
!
! #
! # Extensions to Trigger Namespaces
! #
! class TriggerExtensions:
!
! def __init__(self, connection):
! self.__connection = connection
!
! # Return the current date, according to database
! # def getDate(self):
! # pass
!
! # Return a sequence number from sequence 'name'
! # def getSequence(self, name):
! # pass
!
! # Run the SQL statement 'statement'
! # def sql(self, statement):
! # pass
!
!
!
! ######################################
! #
! # The following hashes describe
! # this driver's characteristings.
! #
! ######################################
!
! #
! # All datasouce "types" and corresponding DataObject class
! #
! supportedDataObjects = {
! 'object': MySQL_DataObject_Object,
! 'sql': MySQL_DataObject_SQL
! }
!
!
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- gnue-common/src/datasources/drivers/mysql/mysql...,
Jason Cater <=