Class MySQLAdapter

  • All Implemented Interfaces:
    DatastoreAdapter

    public class MySQLAdapter
    extends BaseDatastoreAdapter
    Provides methods for adapting SQL language elements to the MySQL database. Note that this also currently supports the MariaDB database. We could contemplate splitting this into separate MySQL and MariaDB support at some point, but one of the issues to overcome with that is that "datanucleus-geospatial" adds support for Geospatial types, including MySQL types and extends this class. We would need to have an equivalent extension for MariaDB.
    • 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
      • isMariaDB

        boolean isMariaDB
      • needsQuoting

        private static final java.util.regex.Pattern needsQuoting
    • 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.store.connection.ManagedConnection mconn)
        Initialise the types for this datastore.
        Specified by:
        initialiseTypes in interface DatastoreAdapter
        Overrides:
        initialiseTypes in class BaseDatastoreAdapter
        Parameters:
        handler - SchemaHandler that we initialise the types for
        mconn - Managed connection to use
      • isReservedKeyword

        public boolean isReservedKeyword​(java.lang.String word)
        Description copied from class: BaseDatastoreAdapter
        Tests if a given string is an SQL keyword.

        The list of key words tested against is defined to contain all SQL/92 keywords, plus any additional key words reported by the JDBC driver for this adapter via DatabaseMetaData.getSQLKeywords().

        In general, use of a SQL key word as an identifier should be avoided. SQL/92 key words are divided into reserved and non-reserved words. If a reserved word is used as an identifier it must be quoted with double quotes. Strictly speaking, the same is not true of non-reserved words. However, as C.J. Date writes in A Guide To The SQL Standard :

        The rule by which it is determined within the standard that one key word needs to be reserved while another need not is not clear to this writer. In practice, it is probably wise to treat all key words as reserved.
        Specified by:
        isReservedKeyword in interface DatastoreAdapter
        Overrides:
        isReservedKeyword in class BaseDatastoreAdapter
        Parameters:
        word - The word to test.
        Returns:
        true if word is a SQL key word for this DBMS. The comparison is case-insensitive.
      • needsQuoting

        private static boolean needsQuoting​(java.lang.String columnName)
      • newSQLTypeInfo

        public SQLTypeInfo newSQLTypeInfo​(java.sql.ResultSet rs)
        Description copied from interface: DatastoreAdapter
        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 DatastoreAdapter
        Overrides:
        newSQLTypeInfo in class BaseDatastoreAdapter
        Parameters:
        rs - ResultSet
        Returns:
        The SQL type info
      • getCreateDatabaseStatement

        public java.lang.String getCreateDatabaseStatement​(java.lang.String catalogName,
                                                           java.lang.String schemaName)
        Description copied from interface: DatastoreAdapter
        Method to return the statement necessary to create a database with this RDBMS. Note that some RDBMS don't support this.
        Specified by:
        getCreateDatabaseStatement in interface DatastoreAdapter
        Overrides:
        getCreateDatabaseStatement in class BaseDatastoreAdapter
        Parameters:
        catalogName - name of the catalog
        schemaName - Name of the schema
        Returns:
        The DDL statement
      • getDropDatabaseStatement

        public java.lang.String getDropDatabaseStatement​(java.lang.String catalogName,
                                                         java.lang.String schemaName)
        Description copied from interface: DatastoreAdapter
        Method to return the statement necessary to drop a database with this RDBMS. Note that some RDBMS don't support this.
        Specified by:
        getDropDatabaseStatement in interface DatastoreAdapter
        Overrides:
        getDropDatabaseStatement in class BaseDatastoreAdapter
        Parameters:
        catalogName - Name of the catalog
        schemaName - Name of the schema
        Returns:
        The DDL statement
      • getCreateTableStatement

        public java.lang.String getCreateTableStatement​(TableImpl table,
                                                        Column[] columns,
                                                        java.util.Properties props,
                                                        IdentifierFactory factory)
        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 DatastoreAdapter
        Overrides:
        getCreateTableStatement in class BaseDatastoreAdapter
        Parameters:
        table - The table
        columns - The columns in the table
        props - Properties for controlling the table creation
        factory - Identifier factory
        Returns:
        The creation statement
      • getIdentityLastValueStmt

        public java.lang.String getIdentityLastValueStmt​(Table table,
                                                         java.lang.String columnName)
        Accessor for the auto-increment sql statement for this datastore.
        Specified by:
        getIdentityLastValueStmt in interface DatastoreAdapter
        Overrides:
        getIdentityLastValueStmt in class BaseDatastoreAdapter
        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
      • getIdentityKeyword

        public java.lang.String getIdentityKeyword​(org.datanucleus.store.StoreManager storeMgr)
        Accessor for the auto-increment keyword for generating DDLs (CREATE TABLEs...).
        Specified by:
        getIdentityKeyword in interface DatastoreAdapter
        Overrides:
        getIdentityKeyword in class BaseDatastoreAdapter
        Parameters:
        storeMgr - The Store Manager
        Returns:
        The keyword for a column using auto-increment
      • getRangeByLimitEndOfStatementClause

        public java.lang.String getRangeByLimitEndOfStatementClause​(long offset,
                                                                    long count,
                                                                    boolean hasOrdering)
        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:
        getRangeByLimitEndOfStatementClause in interface DatastoreAdapter
        Overrides:
        getRangeByLimitEndOfStatementClause in class BaseDatastoreAdapter
        Parameters:
        offset - The offset to return from
        count - The number of items to return
        hasOrdering - Whether ordering is present
        Returns:
        The SQL to append to allow for ranges using LIMIT.
      • getSequenceCreateStmt

        public java.lang.String getSequenceCreateStmt​(java.lang.String sequenceName,
                                                      java.lang.Integer min,
                                                      java.lang.Integer max,
                                                      java.lang.Integer start,
                                                      java.lang.Integer increment,
                                                      java.lang.Integer cacheSize)
        Accessor for the sequence statement to create the sequence.
        Specified by:
        getSequenceCreateStmt in interface DatastoreAdapter
        Overrides:
        getSequenceCreateStmt in class BaseDatastoreAdapter
        Parameters:
        sequenceName - Name of the sequence
        min - Minimum value for the sequence
        max - Maximum value for the sequence
        start - Start value for the sequence
        increment - Increment value for the sequence
        cacheSize - Cache size for the sequence
        Returns:
        The statement for getting the next id from the sequence
      • getSequenceNextStmt

        public java.lang.String getSequenceNextStmt​(java.lang.String sequenceName)
        Accessor for the statement for getting the next id from the sequence for this datastore.
        Specified by:
        getSequenceNextStmt in interface DatastoreAdapter
        Overrides:
        getSequenceNextStmt in class BaseDatastoreAdapter
        Parameters:
        sequenceName - Name of the sequence
        Returns:
        The statement for getting the next id for the sequence
      • getSQLMethodClass

        public java.lang.Class<? extends SQLMethod> getSQLMethodClass​(java.lang.String className,
                                                                      java.lang.String methodName,
                                                                      org.datanucleus.ClassLoaderResolver clr)
        Description copied from interface: DatastoreAdapter
        Accessor for the SQLMethod class for the query invocation of specified class + method name (if available for this datastore).
        Specified by:
        getSQLMethodClass in interface DatastoreAdapter
        Overrides:
        getSQLMethodClass in class BaseDatastoreAdapter
        Parameters:
        className - Name of the class (or null if this is a STATIC method)
        methodName - Method name
        clr - ClassLoader resolver, in case className is a subclass of a supported type
        Returns:
        The SQLMethod class (or null if not defined for this datastore).
      • loadColumnMappings

        protected void loadColumnMappings​(org.datanucleus.plugin.PluginManager mgr,
                                          org.datanucleus.ClassLoaderResolver clr)
        Load all datastore mappings defined in the associated plugins. We handle RDBMS datastore mappings so refer to rdbms-mapping-class, jdbc-type, sql-type in particular.
        Overrides:
        loadColumnMappings in class BaseDatastoreAdapter
        Parameters:
        mgr - the PluginManager
        clr - the ClassLoaderResolver