# -*- coding: iso-8859-1 -*-
#-----------------------------------------------------------------------------
# Modeling Framework: an Object-Relational Bridge for python
#
# Copyright (c) 2001-2004 Sbastien Bigaret <sbigaret@users.sourceforge.net>
# All rights reserved.
#
# This file is part of the Modeling Framework.
#
# This code is distributed under a "3-clause BSD"-style license;
# see the LICENSE file for details.
#-----------------------------------------------------------------------------
"""
MySQLSchemaGeneration
CVS information
$Id: MySQLSchemaGeneration.py 933 2004-08-02 19:58:54Z sbigaret $
"""
__version__='$Revision: 933 $'[11:-2]
from StringIO import StringIO
# Framework
from Modeling.SchemaGeneration import SchemaGeneration
# Interfaces
#from Modeling.interfaces.SchemaGeneration import ISchemaGeneration
#
from Modeling.SchemaGeneration import \
CreateDatabaseKey, CreatePrimaryKeySupportKey, CreateTablesKey, \
DropDatabaseKey, DropPrimaryKeySupportKey, DropTablesKey, \
ForeignKeyConstraintsKey, PrimaryKeyConstraintsKey
class MySQLSchemaGeneration(SchemaGeneration):
"""
Implements the details db-schema generation which differ from the
standard behaviour implemented by SchemaGeneration.
See also Modeling.SchemaGeneration and Modeling.interfaces.SchemaGeneration
for further details
"""
#__implements__ = (ISchemaGeneration,)
def createDatabaseStatementsForConnectionDictionary(self, connectionDictionary, administrativeConnectionDictionary, createUserFlag=0):
"""
See also: interfaces.SchemaGeneration for details
"""
createDB='CREATE DATABASE %(database)s'%connectionDictionary
createUser='CREATE USER %(user)s NOCREATEUSER NOCREATEDB'%connectionDictionary
sqlExprs=[]
sqlExpr=self._adaptor.expressionClass()(None)
sqlExpr.setStatement(createDB)
sqlExprs.append(sqlExpr)
# Create user
if createUserFlag:
sqlExpr=self._adaptor.expressionClass()(None)
sqlExpr.setStatement(createUser)
sqlExprs.append(sqlExpr)
return tuple(sqlExprs)
def dropDatabaseStatementsForConnectionDictionary(self, connectionDictionary, administrativeConnectionDictionary, dropUserFlag=0):
"See Modeling.interfaces.SchemaGeneration for details"
dropDB='DROP DATABASE %(database)s'%connectionDictionary
dropUser='DROP USER %(user)s'%connectionDictionary
sqlExprs=[]
sqlExpr=self._adaptor.expressionClass()(None)
sqlExpr.setStatement(dropDB)
sqlExprs.append(sqlExpr)
# Create user
if dropUserFlag:
sqlExpr=self._adaptor.expressionClass()(None)
sqlExpr.setStatement(dropUser)
sqlExprs.append(sqlExpr)
return tuple(sqlExprs)
def dropPrimaryKeySupportStatementsForEntityGroup(self, entityGroup):
"""
Returns a list containing a single SQLExpression statement, which takes
the following form: 'DROP TABLE <SEQUENCE_NAME>', where
'<SEQUENCE_NAME>' is::
'PK_SEQ_%s'%entityGroup[0].primaryKeyRootName()
See primaryKeySupportStatementsForEntityGroup() for further details on
how sequences can be emulated with MySQL databases.
See Modeling.interfaces.SchemaGeneration for further details
"""
if not entityGroup:
return ()
firstEntity=entityGroup[0]
sqlExpr=self._adaptor.expressionClass()(firstEntity)
sqlExpr.setStatement('DROP TABLE PK_SEQ_%s'%firstEntity.primaryKeyRootName())
return (sqlExpr,)
def foreignKeyConstraintStatementsForRelationship(self, relationship):
"""
Removes ' INITIALLY DEFERRED' from the statements returned by
SQLExpression's foreignKeyConstraintStatementsForRelationship() and
returns them.
"""
sqlExprs=SchemaGeneration.foreignKeyConstraintStatementsForRelationship.im_func(self, relationship)
for sqlExpr in sqlExprs:
sqlExpr.setStatement(sqlExpr.statement()[:-19])
return sqlExprs
def primaryKeySupportStatementsForEntityGroup(self, entityGroup):
"""
Returns a list containing two SQLExpression statements, which take the
following form::
CREATE TABLE <SEQUENCE_NAME> (id INT NOT NULL)
INSERT INTO <SEQUENCE_NAME> VALUES(0)
where '<SEQUENCE_NAME>' is::
'PK_SEQ_%s'%entityGroup[0].primaryKeyRootName()
cf. http://www.mysql.com/doc/en/Miscellaneous_functions.html: this is one
way to emulate real sequences with MySQL.
The statements used by MySQLAdaptorChannel.primaryKeysForNewRowsWithEntity
are the following::
'UPDATE PK_SEQ_%s SET id=LAST_INSERT_ID(id+1)'%pkRootName
'select id FROM PK_SEQ_%s'%pkRootName
See Modeling.interfaces.SchemaGeneration for further details
See also:
dropPrimaryKeySupportStatementsForEntityGroup()
MySQLAdaptorChannel.primaryKeysForNewRowsWithEntity()
"""
if not entityGroup:
return ()
firstEntity=entityGroup[0]
sqlExprs=[]
sqlExprClass=self._adaptor.expressionClass
sqlExpr=sqlExprClass()(firstEntity)
sqlExpr.setStatement('CREATE TABLE PK_SEQ_%s (id INT NOT NULL)'%firstEntity.primaryKeyRootName())
sqlExprs.append(sqlExpr)
sqlExpr=sqlExprClass()(firstEntity)
sqlExpr.setStatement('INSERT INTO PK_SEQ_%s VALUES(0)'%firstEntity.primaryKeyRootName())
sqlExprs.append(sqlExpr)
return sqlExprs
|