| /***************************************************************** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * <p/> |
| * https://www.apache.org/licenses/LICENSE-2.0 |
| * <p/> |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| ****************************************************************/ |
| package org.apache.cayenne.dba; |
| |
| import java.sql.PreparedStatement; |
| import java.sql.SQLException; |
| import java.util.Collection; |
| import java.util.List; |
| |
| import org.apache.cayenne.access.DataNode; |
| import org.apache.cayenne.access.sqlbuilder.sqltree.SQLTreeProcessor; |
| import org.apache.cayenne.access.translator.ParameterBinding; |
| import org.apache.cayenne.access.translator.ejbql.EJBQLTranslatorFactory; |
| import org.apache.cayenne.access.translator.select.SelectTranslator; |
| import org.apache.cayenne.access.types.ExtendedTypeMap; |
| import org.apache.cayenne.map.DbAttribute; |
| import org.apache.cayenne.map.DbEntity; |
| import org.apache.cayenne.map.DbRelationship; |
| import org.apache.cayenne.map.EntityResolver; |
| import org.apache.cayenne.query.FluentSelect; |
| import org.apache.cayenne.query.Query; |
| import org.apache.cayenne.query.SQLAction; |
| import org.apache.cayenne.query.SelectQuery; |
| |
| /** |
| * A Cayenne extension point that abstracts the differences between specifics of |
| * JDBC interfaces to various databases. Cayenne already ships with a number of |
| * built-in adapters for most common databases and users can provide their own |
| * custom adapters. |
| */ |
| public interface DbAdapter { |
| |
| /** |
| * Returns a String used to terminate a batch in command-line tools. E.g. |
| * ";" on Oracle or "go" on Sybase. |
| * |
| * @since 1.0.4 |
| */ |
| String getBatchTerminator(); |
| |
| /** |
| * Returns a SelectTranslator that works with the adapter target database. |
| * |
| * @since 4.0 |
| * @deprecated since 4.2 as {@link SelectQuery} is deprecated. |
| * {@link #getSelectTranslator(FluentSelect, EntityResolver)} replaces this method. |
| */ |
| @Deprecated |
| SelectTranslator getSelectTranslator(SelectQuery<?> query, EntityResolver entityResolver); |
| |
| /** |
| * @since 4.2 |
| */ |
| SelectTranslator getSelectTranslator(FluentSelect<?> query, EntityResolver entityResolver); |
| |
| /** |
| * @since 4.2 |
| * @return {@link SQLTreeProcessor} that can adjust SQL tree to specific database flavour |
| */ |
| SQLTreeProcessor getSqlTreeProcessor(); |
| |
| /** |
| * Returns an instance of SQLAction that should handle the query. |
| * |
| * @since 1.2 |
| */ |
| SQLAction getAction(Query query, DataNode node); |
| |
| /** |
| * Returns true if a target database supports UNIQUE constraints. |
| * |
| * @since 1.1 |
| */ |
| boolean supportsUniqueConstraints(); |
| |
| /** |
| * Returns true if a target database supports catalogs on reverse |
| * engineering. |
| * |
| * @since 4.0 |
| */ |
| boolean supportsCatalogsOnReverseEngineering(); |
| |
| /** |
| * Returns true if a target database supports key autogeneration. This |
| * feature also requires JDBC3-compliant driver. |
| * |
| * @since 1.2 |
| */ |
| boolean supportsGeneratedKeys(); |
| |
| /** |
| * Returns true if a target database supports key autogeneration in a batch insert. |
| * @see #supportsGeneratedKeys() |
| * @since 4.2 |
| */ |
| default boolean supportsGeneratedKeysForBatchInserts() { |
| return supportsGeneratedKeys(); |
| } |
| |
| /** |
| * Returns <code>true</code> if the target database supports batch updates. |
| */ |
| boolean supportsBatchUpdates(); |
| |
| boolean typeSupportsLength(int type); |
| |
| /** |
| * Returns a collection of SQL statements needed to drop a database table. |
| * |
| * @since 3.0 |
| */ |
| Collection<String> dropTableStatements(DbEntity table); |
| |
| /** |
| * Returns a SQL string that can be used to create database table |
| * corresponding to <code>entity</code> parameter. |
| */ |
| String createTable(DbEntity entity); |
| |
| /** |
| * Returns a DDL string to create a unique constraint over a set of columns, |
| * or null if the unique constraints are not supported. |
| * |
| * @since 1.1 |
| */ |
| String createUniqueConstraint(DbEntity source, Collection<DbAttribute> columns); |
| |
| /** |
| * Returns a SQL string that can be used to create a foreign key constraint |
| * for the relationship, or null if foreign keys are not supported. |
| */ |
| String createFkConstraint(DbRelationship rel); |
| |
| /** |
| * Returns an array of RDBMS types that can be used with JDBC |
| * <code>type</code>. Valid JDBC types are defined in java.sql.Types. |
| */ |
| String[] externalTypesForJdbcType(int type); |
| |
| /** |
| * Returns a map of ExtendedTypes that is used to translate values between |
| * Java and JDBC layer. |
| */ |
| ExtendedTypeMap getExtendedTypes(); |
| |
| /** |
| * Returns primary key generator associated with this DbAdapter. |
| */ |
| PkGenerator getPkGenerator(); |
| |
| /** |
| * Set custom PK generator associated with this DbAdapter. |
| * @param pkGenerator to set |
| * @since 4.1 |
| */ |
| void setPkGenerator(PkGenerator pkGenerator); |
| |
| /** |
| * Creates and returns a DbAttribute based on supplied parameters (usually |
| * obtained from database meta data). |
| * |
| * @param name |
| * database column name |
| * @param typeName |
| * database specific type name, may be used as a hint to |
| * determine the right JDBC type. |
| * @param type |
| * JDBC column type |
| * @param size |
| * database column size (ignored if less than zero) |
| * @param scale |
| * database column scale, i.e. the number of decimal digits |
| * (ignored if less than zero) |
| * @param allowNulls |
| * database column nullable parameter |
| */ |
| DbAttribute buildAttribute(String name, String typeName, int type, int size, int scale, boolean allowNulls); |
| |
| /** |
| * Binds an object value to PreparedStatement's parameter. |
| */ |
| void bindParameter(PreparedStatement statement, ParameterBinding parameterBinding) throws SQLException, Exception; |
| |
| /** |
| * Returns the name of the table type (as returned by |
| * <code>DatabaseMetaData.getTableTypes</code>) for a simple user table. |
| */ |
| String tableTypeForTable(); |
| |
| /** |
| * Returns the name of the table type (as returned by |
| * <code>DatabaseMetaData.getTableTypes</code>) for a view table. |
| */ |
| String tableTypeForView(); |
| |
| /** |
| * Append the column type part of a "create table" to the given |
| * {@link StringBuffer} |
| * |
| * @param sqlBuffer |
| * the {@link StringBuffer} to append the column type to |
| * @param column |
| * the {@link DbAttribute} defining the column to append type for |
| * @since 3.0 |
| */ |
| void createTableAppendColumn(StringBuffer sqlBuffer, DbAttribute column); |
| |
| /** |
| * Returns SQL identifier quoting strategy object |
| * |
| * @since 4.0 |
| */ |
| QuotingStrategy getQuotingStrategy(); |
| |
| /** |
| * Allows the users to get access to the adapter decorated by a given |
| * adapter. |
| * |
| * @since 4.0 |
| */ |
| DbAdapter unwrap(); |
| |
| /** |
| * Returns a translator factory for EJBQL to SQL translation. |
| * |
| * @since 4.0 |
| */ |
| EJBQLTranslatorFactory getEjbqlTranslatorFactory(); |
| |
| /** |
| * @since 4.1 |
| * @return list of system catalogs |
| */ |
| List<String> getSystemCatalogs(); |
| |
| /** |
| * @since 4.1 |
| * @return list of system schemas |
| */ |
| List<String> getSystemSchemas(); |
| } |