org.datanucleus.store.rdbms.adapter
Class MySQLAdapter

java.lang.Object
  extended by org.datanucleus.store.rdbms.adapter.DatabaseAdapter
      extended by org.datanucleus.store.rdbms.adapter.MySQLAdapter
All Implemented Interfaces:
org.datanucleus.store.mapped.DatastoreAdapter, org.datanucleus.store.mapped.expression.ExpressionConversionAdapter, org.datanucleus.store.mapped.expression.ExpressionLogicSetAdapter, org.datanucleus.store.mapped.expression.ExpressionMethodAdapter, org.datanucleus.store.mapped.expression.ExpressionOperatorAdapter, org.datanucleus.store.mapped.expression.ExpressionPatternAdapter, RDBMSAdapter

public class MySQLAdapter
extends DatabaseAdapter

Provides methods for adapting SQL language elements to the MySQL database.


Field Summary
static java.lang.String NONSQL92_RESERVED_WORDS
          A string containing the list of MySQL keywords that are not also SQL/92 reserved words, separated by commas.
 
Fields inherited from class org.datanucleus.store.rdbms.adapter.DatabaseAdapter
catalogSeparator, datastoreMajorVersion, datastoreMinorVersion, datastoreProductName, datastoreProductVersion, datastoreRevisionVersion, driverMajorVersion, driverMinorVersion, driverName, driverVersion, identifierQuoteString, LOCALISER, LOCALISER_BASE, maxColumnNameLength, maxConstraintNameLength, maxIndexNameLength, maxTableNameLength, properties, reservedKeywords, supportedOptions
 
Fields inherited from interface org.datanucleus.store.rdbms.adapter.RDBMSAdapter
ACCESS_PARENTQUERY_IN_SUBQUERY, ALTER_TABLE_DROP_CONSTRAINT_SYNTAX, ALTER_TABLE_DROP_FOREIGN_KEY_CONSTRAINT, ANSI_JOIN_SYNTAX, AUTO_INCREMENT_COLUMN_TYPE_SPECIFICATION, AUTO_INCREMENT_KEYS_NULL_SPECIFICATION, BLOB_SET_USING_SETSTRING, CHAR_COLUMNS_PADDED_WITH_SPACES, CHECK_IN_CREATE_STATEMENTS, CHECK_IN_END_CREATE_STATEMENTS, CLOB_SET_USING_SETSTRING, CREATE_INDEXES_BEFORE_FOREIGN_KEYS, DATETIME_STORES_MILLISECS, DEFAULT_BEFORE_NULL_IN_COLUMN_OPTIONS, DEFAULT_KEYWORD_IN_COLUMN_OPTIONS, DEFAULT_KEYWORD_WITH_NOT_NULL_IN_COLUMN_OPTIONS, DEFERRED_CONSTRAINTS, DISTINCT_WITH_SELECT_FOR_UPDATE, EXISTS_SYNTAX, FK_DELETE_ACTION_CASCADE, FK_DELETE_ACTION_DEFAULT, FK_DELETE_ACTION_NULL, FK_DELETE_ACTION_RESTRICT, FK_UPDATE_ACTION_CASCADE, FK_UPDATE_ACTION_DEFAULT, FK_UPDATE_ACTION_NULL, FK_UPDATE_ACTION_RESTRICT, GET_GENERATED_KEYS_STATEMENT, INCLUDE_ORDERBY_COLS_IN_SELECT, LOCK_OPTION_PLACED_AFTER_FROM, LOCK_OPTION_PLACED_WITHIN_JOIN, LOCK_WITH_SELECT_FOR_UPDATE, NULL_EQUALS_EMPTY_STRING, NULLS_IN_CANDIDATE_KEYS, NULLS_KEYWORD_IN_COLUMN_OPTIONS, ORDERBY_USING_SELECT_COLUMN_INDEX, PERSIST_OF_UNASSIGNED_CHAR, PRIMARYKEY_IN_CREATE_STATEMENTS, STATEMENT_BATCHING, TX_ISOLATION_NONE, TX_ISOLATION_READ_COMMITTED, TX_ISOLATION_READ_UNCOMMITTED, TX_ISOLATION_REPEATABLE_READ, TX_ISOLATION_SERIALIZABLE, UNION_SYNTAX, UNIQUE_IN_END_CREATE_STATEMENTS, USE_UNION_ALL, VIEWS
 
Fields inherited from interface org.datanucleus.store.mapped.DatastoreAdapter
ANALYSIS_METHODS, BIT_IS_REALLY_BOOLEAN, BOOLEAN_COMPARISON, CATALOGS_IN_TABLE_DEFINITIONS, ESCAPE_EXPRESSION_IN_LIKE_PREDICATE, IDENTIFIERS_LOWERCASE, IDENTIFIERS_LOWERCASE_QUOTED, IDENTIFIERS_MIXEDCASE, IDENTIFIERS_MIXEDCASE_QUOTED, IDENTIFIERS_MIXEDCASE_QUOTED_SENSITIVE, IDENTIFIERS_MIXEDCASE_SENSITIVE, IDENTIFIERS_UPPERCASE, IDENTIFIERS_UPPERCASE_QUOTED, IDENTITY_COLUMNS, PROJECTION_IN_TABLE_REFERENCE_JOINS, SCHEMAS_IN_TABLE_DEFINITIONS, SEQUENCES
 
Constructor Summary
MySQLAdapter(java.sql.DatabaseMetaData metadata)
          Constructor.
 
Method Summary
 java.lang.String cartersianProduct(org.datanucleus.store.mapped.expression.LogicSetExpression Y)
          Generates a expression that represents the cartesian product of two sets: X and Y.
 org.datanucleus.store.mapped.expression.ScalarExpression concatOperator(org.datanucleus.store.mapped.expression.ScalarExpression operand1, org.datanucleus.store.mapped.expression.ScalarExpression operand2)
           If only one operand expression is of type String, then string conversion is performed on the other operand to produce a string at run time.
 java.lang.String getAddColumnStatement(org.datanucleus.store.mapped.DatastoreContainerObject table, Column col)
          Accessor for the SQL statement to add a column to a table.
 java.lang.String getAddPrimaryKeyStatement(PrimaryKey pk, org.datanucleus.store.mapped.IdentifierFactory factory)
          MySQL, when using AUTO_INCREMENT, requires the primary key specified in the CREATE TABLE, so we do nothing here.
 java.lang.String getAutoIncrementKeyword()
          Accessor for the auto-increment keyword for generating DDLs (CREATE TABLEs...).
 java.lang.String getAutoIncrementStmt(Table table, java.lang.String columnName)
          Accessor for the auto-increment sql statement for this datastore.
 java.lang.String getCreateTableStatement(TableImpl table, Column[] columns, java.util.Properties props)
          Method to return the CREATE TABLE statement.
 java.lang.String getDropTableStatement(org.datanucleus.store.mapped.DatastoreContainerObject table)
          Method to return the DROP TABLE statement.
 java.lang.String getEscapePatternExpression()
          The character for escaping patterns.
 java.lang.String getRangeByLimitWhereClause(long offset, long count)
          Method to return the SQL to append to the WHERE clause of a SELECT statement to handle restriction of ranges using the LIMUT keyword.
 java.lang.String getSelectNewUUIDStmt()
          The function to creates a unique value of type uniqueidentifier.
 java.lang.String getVendorID()
           
 void initialiseTypes(org.datanucleus.store.schema.StoreSchemaHandler handler, org.datanucleus.ManagedConnection mconn)
          Initialise the types for this datastore.
 RDBMSColumnInfo newRDBMSColumnInfo(java.sql.ResultSet rs)
          Method to create a column info for the current row.
 SQLTypeInfo newSQLTypeInfo(java.sql.ResultSet rs)
          Create a new SQL type info from the current row of the passed ResultSet.
 org.datanucleus.store.mapped.expression.BooleanExpression startsWithMethod(org.datanucleus.store.mapped.expression.ScalarExpression source, org.datanucleus.store.mapped.expression.ScalarExpression str)
          Method to handle the starts with operation.
 org.datanucleus.store.mapped.expression.StringExpression toStringExpression(org.datanucleus.store.mapped.expression.NumericExpression expr)
          A String conversion that converts a numeric expression to string.
 
Methods inherited from class org.datanucleus.store.rdbms.adapter.DatabaseAdapter
addSQLTypeForJDBCType, endsWithMethod, getAdapterTime, getAddCandidateKeyStatement, getAddForeignKeyStatement, getCatalogName, getCatalogSeparator, getCheckConstraintForValues, getColumns, getConnection, getContinuationString, getCreateIndexStatement, getCurrentDateMethod, getCurrentTimeMethod, getCurrentTimestampMethod, getDatastoreDateStatement, getDatastoreIdentifierMaxLength, getDatastoreMajorVersion, getDatastoreMinorVersion, getDriverMajorVersion, getDriverMinorVersion, getDropViewStatement, getEscapeCharacter, getEscapedPatternExpression, getExistingIndexes, getIdentifierQuoteString, getInsertStatementForNoColumns, getMapping, getMappingManager, getMaxForeignKeys, getMaxIndexes, getMiliseconds, getNewUUIDFunction, getNonAnsiInnerJoinWhereClause, getNonAnsiLeftOuterJoinWhereClause, getNonAnsiRightOuterJoinWhereClause, getNumericConversionFunction, getNumericExpressionForMethod, getOperatorConcat, getPatternExpressionAnyCharacter, getPatternExpressionZeroMoreCharacters, getRangeByLimitSelectClause, getRangeByRowNumberColumn, getRequiredTransactionIsolationLevel, getSchemaName, getSelectForUpdateText, getSelectWithLockOption, getSequenceCreateStmt, getSequenceNextStmt, getSupportedOptions, getSurrogateForEmptyStrings, getTime, getTransactionIsolationForSchemaCreation, getUnlimitedLengthPrecisionValue, getValueForProperty, indexOfMethod, initialiseDatastore, isIdentityFieldDataType, isKeyword, isReservedKeyword, isValidPrimaryKeyType, iteratorReservedWords, logConfiguration, lowerMethod, matchesMethod, modOperator, newFKInfo, newQueryStatement, newTableExpression, parseKeywordList, removeUnsupportedMappings, setProperties, substringMethod, substringMethod, supportsOption, supportsQueryFetchSize, supportsTransactionIsolation, toNumericExpression, toString, toStringExpression, translateMethod, trimMethod, upperMethod
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

NONSQL92_RESERVED_WORDS

public static final java.lang.String NONSQL92_RESERVED_WORDS
A string containing the list of MySQL keywords that are not also SQL/92 reserved words, separated by commas. This list is normally obtained dynamically from the driver using DatabaseMetaData.getSQLKeywords(), but MySQL drivers are known to return an incomplete list.

This list was produced based on the reserved word list in the MySQL Manual (Version 4.0.10-gamma) at http://www.mysql.com/doc/en/Reserved_words.html.

See Also:
Constant Field Values
Constructor Detail

MySQLAdapter

public MySQLAdapter(java.sql.DatabaseMetaData metadata)
Constructor. Overridden so we can add on our own list of NON SQL92 reserved words which is returned incorrectly with the JDBC driver.

Parameters:
metadata - MetaData for the DB
Method Detail

initialiseTypes

public void initialiseTypes(org.datanucleus.store.schema.StoreSchemaHandler handler,
                            org.datanucleus.ManagedConnection mconn)
Initialise the types for this datastore.

Specified by:
initialiseTypes in interface org.datanucleus.store.mapped.DatastoreAdapter
Overrides:
initialiseTypes in class DatabaseAdapter
Parameters:
handler - SchemaHandler that we initialise the types for
mconn - Managed connection to use

getVendorID

public java.lang.String getVendorID()
Specified by:
getVendorID in interface org.datanucleus.store.mapped.DatastoreAdapter
Overrides:
getVendorID in class DatabaseAdapter

newRDBMSColumnInfo

public RDBMSColumnInfo newRDBMSColumnInfo(java.sql.ResultSet rs)
Method to create a column info for the current row. Overrides the dataType for BLOB/CLOB as necessary

Specified by:
newRDBMSColumnInfo in interface RDBMSAdapter
Overrides:
newRDBMSColumnInfo in class DatabaseAdapter
Parameters:
rs - ResultSet from DatabaseMetaData.getColumns()
Returns:
column info

newSQLTypeInfo

public SQLTypeInfo newSQLTypeInfo(java.sql.ResultSet rs)
Description copied from interface: RDBMSAdapter
Create a new SQL type info from the current row of the passed ResultSet. Allows an adapter to override particular types where the JDBC driver is known to be buggy.

Specified by:
newSQLTypeInfo in interface RDBMSAdapter
Overrides:
newSQLTypeInfo in class DatabaseAdapter
Parameters:
rs - ResultSet
Returns:
The SQL type info

getAddPrimaryKeyStatement

public java.lang.String getAddPrimaryKeyStatement(PrimaryKey pk,
                                                  org.datanucleus.store.mapped.IdentifierFactory factory)
MySQL, when using AUTO_INCREMENT, requires the primary key specified in the CREATE TABLE, so we do nothing here.

Specified by:
getAddPrimaryKeyStatement in interface RDBMSAdapter
Overrides:
getAddPrimaryKeyStatement in class DatabaseAdapter
Parameters:
pk - An object describing the primary key.
factory - Identifier factory
Returns:
The PK statement

getCreateTableStatement

public java.lang.String getCreateTableStatement(TableImpl table,
                                                Column[] columns,
                                                java.util.Properties props)
Method to return the CREATE TABLE statement. Versions before 5 need INNODB table type selecting for them. It seems, MySQL >= 5 still needs innodb in order to support transactions.

Specified by:
getCreateTableStatement in interface RDBMSAdapter
Overrides:
getCreateTableStatement in class DatabaseAdapter
Parameters:
table - The table
columns - The columns in the table
props - Properties for controlling the table creation
Returns:
The creation statement

getDropTableStatement

public java.lang.String getDropTableStatement(org.datanucleus.store.mapped.DatastoreContainerObject table)
Method to return the DROP TABLE statement. Override the default omitting the CASCADE part since MySQL doesn't support that.

Specified by:
getDropTableStatement in interface RDBMSAdapter
Overrides:
getDropTableStatement in class DatabaseAdapter
Parameters:
table - The table
Returns:
The drop statement

getAddColumnStatement

public java.lang.String getAddColumnStatement(org.datanucleus.store.mapped.DatastoreContainerObject table,
                                              Column col)
Accessor for the SQL statement to add a column to a table.

Specified by:
getAddColumnStatement in interface RDBMSAdapter
Overrides:
getAddColumnStatement in class DatabaseAdapter
Parameters:
table - The table
col - The column
Returns:
The SQL necessary to add the column

getAutoIncrementStmt

public java.lang.String getAutoIncrementStmt(Table table,
                                             java.lang.String columnName)
Accessor for the auto-increment sql statement for this datastore.

Specified by:
getAutoIncrementStmt in interface RDBMSAdapter
Overrides:
getAutoIncrementStmt in class DatabaseAdapter
Parameters:
table - Name of the table that the autoincrement is for
columnName - Name of the column that the autoincrement is for
Returns:
The statement for getting the latest auto-increment key

getAutoIncrementKeyword

public java.lang.String getAutoIncrementKeyword()
Accessor for the auto-increment keyword for generating DDLs (CREATE TABLEs...).

Specified by:
getAutoIncrementKeyword in interface RDBMSAdapter
Overrides:
getAutoIncrementKeyword in class DatabaseAdapter
Returns:
The keyword for a column using auto-increment

getSelectNewUUIDStmt

public java.lang.String getSelectNewUUIDStmt()
The function to creates a unique value of type uniqueidentifier. MySQL generates 36-character hex uuids.

Specified by:
getSelectNewUUIDStmt in interface RDBMSAdapter
Overrides:
getSelectNewUUIDStmt in class DatabaseAdapter
Returns:
The function. e.g. "SELECT uuid()"

getRangeByLimitWhereClause

public java.lang.String getRangeByLimitWhereClause(long offset,
                                                   long count)
Method to return the SQL to append to the WHERE clause of a SELECT statement to handle restriction of ranges using the LIMUT keyword.

Specified by:
getRangeByLimitWhereClause in interface RDBMSAdapter
Overrides:
getRangeByLimitWhereClause in class DatabaseAdapter
Parameters:
offset - The offset to return from
count - The number of items to return
Returns:
The SQL to append to allow for ranges using LIMIT.

concatOperator

public org.datanucleus.store.mapped.expression.ScalarExpression concatOperator(org.datanucleus.store.mapped.expression.ScalarExpression operand1,
                                                                               org.datanucleus.store.mapped.expression.ScalarExpression operand2)

If only one operand expression is of type String, then string conversion is performed on the other operand to produce a string at run time. The result is a reference to a String object (newly created, unless the expression is a compile-time constant expression (�15.28))that is the concatenation of the two operand strings. The characters of the left-hand operand precede the characters of the right-hand operand in the newly created string. If an operand of type String is null, then the string "null" is used instead of that operand. "null" is used instead of that operand.

Concatenates two or more character or binary strings, columns, or a combination of strings and column names into one expression (a string operator).

Specified by:
concatOperator in interface org.datanucleus.store.mapped.expression.ExpressionOperatorAdapter
Overrides:
concatOperator in class DatabaseAdapter
Parameters:
operand1 - the left expression
operand2 - the right expression
Returns:
The Expression for concatenation

startsWithMethod

public org.datanucleus.store.mapped.expression.BooleanExpression startsWithMethod(org.datanucleus.store.mapped.expression.ScalarExpression source,
                                                                                  org.datanucleus.store.mapped.expression.ScalarExpression str)
Method to handle the starts with operation.

Specified by:
startsWithMethod in interface org.datanucleus.store.mapped.expression.ExpressionMethodAdapter
Overrides:
startsWithMethod in class DatabaseAdapter
Parameters:
source - The expression with the searched string
str - The expression for the search string
Returns:
The expression.

getEscapePatternExpression

public java.lang.String getEscapePatternExpression()
The character for escaping patterns.

Specified by:
getEscapePatternExpression in interface org.datanucleus.store.mapped.expression.ExpressionPatternAdapter
Overrides:
getEscapePatternExpression in class DatabaseAdapter
Returns:
Escape character(s)

toStringExpression

public org.datanucleus.store.mapped.expression.StringExpression toStringExpression(org.datanucleus.store.mapped.expression.NumericExpression expr)
A String conversion that converts a numeric expression to string. If the expr argument represents a Literal value, converts to a Literal string. In SQL, it should compile something like:

 CAST(999999 AS VARCHAR(4000))
 

Specified by:
toStringExpression in interface org.datanucleus.store.mapped.expression.ExpressionConversionAdapter
Overrides:
toStringExpression in class DatabaseAdapter
Parameters:
expr - The NumericExpression
Returns:
the StringExpression

cartersianProduct

public java.lang.String cartersianProduct(org.datanucleus.store.mapped.expression.LogicSetExpression Y)
Generates a expression that represents the cartesian product of two sets: X and Y. Actually, X is not generated to the expression.

Specified by:
cartersianProduct in interface org.datanucleus.store.mapped.expression.ExpressionLogicSetAdapter
Overrides:
cartersianProduct in class DatabaseAdapter
Parameters:
Y - right hand set
Returns:
the cartesion product expression. if the cartesian product expression is "X x Y", the returned expression is " x Y". Note that the left hand set was not introduced to the expression


Copyright © 2009. All Rights Reserved.