All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ldbc.sql.Connection.scala Maven / Gradle / Ivy

There is a newer version: 0.3.0-beta8
Show newest version
/**
 * Copyright (c) 2023-2024 by Takahiko Tominaga
 * This software is licensed under the MIT License (MIT).
 * For more information see LICENSE or https://opensource.org/licenses/MIT
 */

package ldbc.sql

/**
 * A connection (session) with a specific database. SQL statements are executed and results are returned within the
 * context of a connection.
 *
 * A Connection object's database is able to provide information describing its tables, its supported SQL grammar, its
 * stored procedures, the capabilities of this connection, and so on. This information is obtained with the getMetaData
 * method.
 *
 * Note: When configuring a Connection, JDBC applications should use the appropriate Connection method such as
 * setAutoCommit or setTransactionIsolation. Applications should not invoke SQL commands directly to change the
 * connection's configuration when there is a JDBC method available. By default a Connection object is in auto-commit
 * mode, which means that it automatically commits changes after executing each statement. If auto-commit mode has been
 * disabled, the method commit must be called explicitly in order to commit changes; otherwise, database changes will
 * not be saved.
 *
 * A new Connection object created using the JDBC 2.1 core API has an initially empty type map associated with it. A
 * user may enter a custom mapping for a UDT in this type map. When a UDT is retrieved from a data source with the
 * method ResultSet.getObject, the getObject method will check the connection's type map to see if there is an entry for
 * that UDT. If so, the getObject method will map the UDT to the class indicated. If there is no entry, the UDT will be
 * mapped using the standard mapping.
 *
 * A user may create a new type map, which is a java.util.Map object, make an entry in it, and pass it to the java.sql
 * methods that can perform custom mapping. In this case, the method will use the given type map instead of the one
 * associated with the connection.
 * @tparam F
 *   The effect type
 */
trait Connection[F[_]]:

  /**
   * Creates a Statement object for sending
   * SQL statements to the database.
   * SQL statements without parameters are normally
   * executed using Statement objects. If the same SQL statement
   * is executed many times, it may be more efficient to use a
   * PreparedStatement object.
   * 

* Result sets created using the returned Statement * object will by default be type TYPE_FORWARD_ONLY * and have a concurrency level of CONCUR_READ_ONLY. * The holdability of the created result sets can be determined by * calling [[getHoldability]]. * * @return a new default Statement object */ def createStatement(): F[Statement[F]] /** * Creates a PreparedStatement object for sending * parameterized SQL statements to the database. *

* A SQL statement with or without IN parameters can be * pre-compiled and stored in a PreparedStatement object. This * object can then be used to efficiently execute this statement * multiple times. * *

Note: This method is optimized for handling * parametric SQL statements that benefit from precompilation. If * the driver supports precompilation, * the method prepareStatement will send * the statement to the database for precompilation. Some drivers * may not support precompilation. In this case, the statement may * not be sent to the database until the PreparedStatement * object is executed. This has no direct effect on users; however, it does * affect which methods throw certain SQLException objects. *

* Result sets created using the returned PreparedStatement * object will by default be type TYPE_FORWARD_ONLY * and have a concurrency level of CONCUR_READ_ONLY. * The holdability of the created result sets can be determined by * calling [[getHoldability]]. * * @param sql an SQL statement that may contain one or more '?' IN * parameter placeholders * @return a new default PreparedStatement object containing the * pre-compiled SQL statement */ def prepareStatement(sql: String): F[PreparedStatement[F]] /** * Creates a CallableStatement object for calling * database stored procedures. * The CallableStatement object provides * methods for setting up its IN and OUT parameters, and * methods for executing the call to a stored procedure. * *

Note: This method is optimized for handling stored * procedure call statements. Some drivers may send the call * statement to the database when the method prepareCall * is done; others * may wait until the CallableStatement object * is executed. This has no * direct effect on users; however, it does affect which method * throws certain SQLExceptions. *

* Result sets created using the returned CallableStatement * object will by default be type TYPE_FORWARD_ONLY * and have a concurrency level of CONCUR_READ_ONLY. * The holdability of the created result sets can be determined by * calling {@link # getHoldability}. * * @param sql an SQL statement that may contain one or more '?' * parameter placeholders. Typically this statement is specified using JDBC * call escape syntax. * @return a new default CallableStatement object containing the * pre-compiled SQL statement */ def prepareCall(sql: String): F[CallableStatement[F]] /** * Converts the given SQL statement into the system's native SQL grammar. * A driver may convert the JDBC SQL grammar into its system's * native SQL grammar prior to sending it. This method returns the * native form of the statement that the driver would have sent. * * @param sql an SQL statement that may contain one or more '?' * parameter placeholders * @return the native form of this statement */ def nativeSQL(sql: String): F[String] /** * Sets this connection's auto-commit mode to the given state. * If a connection is in auto-commit mode, then all its SQL * statements will be executed and committed as individual * transactions. Otherwise, its SQL statements are grouped into * transactions that are terminated by a call to either * the method commit or the method rollback. * By default, new connections are in auto-commit * mode. *

* The commit occurs when the statement completes. The time when the statement * completes depends on the type of SQL Statement: *

    *
  • For DML statements, such as Insert, Update or Delete, and DDL statements, * the statement is complete as soon as it has finished executing. *
  • For Select statements, the statement is complete when the associated result * set is closed. *
  • For CallableStatement objects or for statements that return * multiple results, the statement is complete * when all of the associated result sets have been closed, and all update * counts and output parameters have been retrieved. *
*

* NOTE: If this method is called during a transaction and the * auto-commit mode is changed, the transaction is committed. If * setAutoCommit is called and the auto-commit mode is * not changed, the call is a no-op. * * @param autoCommit true to enable auto-commit mode; * false to disable it */ def setAutoCommit(autoCommit: Boolean): F[Unit] /** * Retrieves the current auto-commit mode for this Connection * object. * * @return the current state of this Connection object's * auto-commit mode */ def getAutoCommit(): F[Boolean] /** * Makes all changes made since the previous * commit/rollback permanent and releases any database locks * currently held by this Connection object. * This method should be * used only when auto-commit mode has been disabled. */ def commit(): F[Unit] /** * Undoes all changes made in the current transaction * and releases any database locks currently held * by this Connection object. This method should be * used only when auto-commit mode has been disabled. */ def rollback(): F[Unit] /** * Releases this Connection object's database and JDBC resources * immediately instead of waiting for them to be automatically released. *

* Calling the method close on a Connection * object that is already closed is a no-op. *

* It is strongly recommended that an application explicitly * commits or rolls back an active transaction prior to calling the * close method. If the close method is called * and there is an active transaction, the results are implementation-defined. */ def close(): F[Unit] /** * Retrieves whether this Connection object has been * closed. A connection is closed if the method close * has been called on it or if certain fatal errors have occurred. * This method is guaranteed to return true only when * it is called after the method Connection.close has * been called. *

* This method generally cannot be called to determine whether a * connection to a database is valid or invalid. A typical client * can determine that a connection is invalid by catching any * exceptions that might be thrown when an operation is attempted. * * @return true if this Connection object * is closed; false if it is still open */ def isClosed(): F[Boolean] /** * Retrieves a DatabaseMetaData object that contains * metadata about the database to which this * Connection object represents a connection. * The metadata includes information about the database's * tables, its supported SQL grammar, its stored * procedures, the capabilities of this connection, and so on. * * @return a DatabaseMetaData object for this * Connection object */ def getMetaData(): F[DatabaseMetaData[F]] /** * Puts this connection in read-only mode as a hint to the driver to enable * database optimizations. * * @param isReadOnly * true enables read-only mode; false disables it */ def setReadOnly(isReadOnly: Boolean): F[Unit] /** * Retrieves whether this Connection object is in read-only mode. * * @return * true if this Connection object is read-only; false otherwise */ def isReadOnly: F[Boolean] /** * Sets the given catalog name in order to select * a subspace of this Connection object's database * in which to work. *

* If the driver does not support catalogs, it will * silently ignore this request. *

* Calling {@code setCatalog} has no effect on previously created or prepared * {@code Statement} objects. It is implementation defined whether a DBMS * prepare operation takes place immediately when the {@code Connection} * method {@code prepareStatement} or {@code prepareCall} is invoked. * For maximum portability, {@code setCatalog} should be called before a * {@code Statement} is created or prepared. * * @param catalog the name of a catalog (subspace in this * Connection object's database) in which to work */ def setCatalog(catalog: String): F[Unit] /** * Retrieves this Connection object's current catalog name. * * @return the current catalog name or None if there is none */ def getCatalog(): F[String] /** * Attempts to change the transaction isolation level for this Connection object to the one given. The constants * defined in the interface Connection are the possible transaction isolation levels. * * Note: If this method is called during a transaction, the result is implementation-defined. * * @param level * one of the following Connection constants: Connection.TRANSACTION_READ_UNCOMMITTED, * Connection.TRANSACTION_READ_COMMITTED, Connection.TRANSACTION_REPEATABLE_READ, or * Connection.TRANSACTION_SERIALIZABLE. (Note that Connection.TRANSACTION_NONE cannot be used because it specifies * that transactions are not supported.) */ def setTransactionIsolation(level: Int): F[Unit] /** * Retrieves this Connection object's current transaction isolation level. * * @return * the current transaction isolation level, which will be one of the following constants: * Connection.TRANSACTION_READ_UNCOMMITTED, Connection.TRANSACTION_READ_COMMITTED, * Connection.TRANSACTION_REPEATABLE_READ, Connection.TRANSACTION_SERIALIZABLE, or Connection.TRANSACTION_NONE. */ def getTransactionIsolation(): F[Int] /** * Creates a Statement object that will generate * ResultSet objects with the given type and concurrency. * This method is the same as the createStatement method * above, but it allows the default result set * type and concurrency to be overridden. * The holdability of the created result sets can be determined by * calling {@link #getHoldability}. * * @param resultSetType a result set type; one of * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @param resultSetConcurrency a concurrency type; one of * ResultSet.CONCUR_READ_ONLY or * ResultSet.CONCUR_UPDATABLE * @return a new Statement object that will generate * ResultSet objects with the given type and * concurrency */ def createStatement(resultSetType: Int, resultSetConcurrency: Int): F[Statement[F]] /** * Creates a PreparedStatement object that will generate * ResultSet objects with the given type and concurrency. * This method is the same as the prepareStatement method * above, but it allows the default result set * type and concurrency to be overridden. * The holdability of the created result sets can be determined by * calling {@link #getHoldability}. * * @param sql a String object that is the SQL statement to * be sent to the database; may contain one or more '?' IN * parameters * @param resultSetType a result set type; one of * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @param resultSetConcurrency a concurrency type; one of * ResultSet.CONCUR_READ_ONLY or * ResultSet.CONCUR_UPDATABLE * @return a new PreparedStatement object containing the * pre-compiled SQL statement that will produce ResultSet * objects with the given type and concurrency */ def prepareStatement(sql: String, resultSetType: Int, resultSetConcurrency: Int): F[PreparedStatement[F]] /** * Creates a CallableStatement object that will generate * ResultSet objects with the given type and concurrency. * This method is the same as the prepareCall method * above, but it allows the default result set * type and concurrency to be overridden. * The holdability of the created result sets can be determined by * calling {@link # getHoldability}. * * @param sql a String object that is the SQL statement to * be sent to the database; may contain on or more '?' parameters * @param resultSetType a result set type; one of * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @param resultSetConcurrency a concurrency type; one of * ResultSet.CONCUR_READ_ONLY or * ResultSet.CONCUR_UPDATABLE * @return a new CallableStatement object containing the * pre-compiled SQL statement that will produce ResultSet * objects with the given type and concurrency */ def prepareCall(sql: String, resultSetType: Int, resultSetConcurrency: Int): F[CallableStatement[F]] /** * Creates a default PreparedStatement object that has * the capability to retrieve auto-generated keys. The given constant * tells the driver whether it should make auto-generated keys * available for retrieval. This parameter is ignored if the SQL statement * is not an INSERT statement, or an SQL statement able to return * auto-generated keys (the list of such statements is vendor-specific). *

* Note: This method is optimized for handling * parametric SQL statements that benefit from precompilation. If * the driver supports precompilation, * the method prepareStatement will send * the statement to the database for precompilation. Some drivers * may not support precompilation. In this case, the statement may * not be sent to the database until the PreparedStatement * object is executed. This has no direct effect on users; however, it does * affect which methods throw certain SQLExceptions. *

* Result sets created using the returned PreparedStatement * object will by default be type TYPE_FORWARD_ONLY * and have a concurrency level of CONCUR_READ_ONLY. * The holdability of the created result sets can be determined by * calling {@link #getHoldability}. * * @param sql an SQL statement that may contain one or more '?' IN * parameter placeholders * @param autoGeneratedKeys a flag indicating whether auto-generated keys * should be returned; one of * Statement.RETURN_GENERATED_KEYS or * Statement.NO_GENERATED_KEYS * @return a new PreparedStatement object, containing the * pre-compiled SQL statement, that will have the capability of * returning auto-generated keys */ def prepareStatement( sql: String, autoGeneratedKeys: Int ): F[PreparedStatement[F]] /** * Sets the schema name that will be used for subsequent queries. * * Calling setSchema has no effect on previously created or prepared Statement objects. * It is implementation defined whether a DBMS prepare operation takes place immediately when the Connection method [[statement]] or [[clientPreparedStatement]], [[serverPreparedStatement]] is invoked. * For maximum portability, setSchema should be called before a Statement is created or prepared. * * @param schema * the name of a schema in which to work */ def setSchema(schema: String): F[Unit] /** * Retrieves this Connection object's current schema name. * * @return * the current schema name or null if there is none */ def getSchema(): F[String] /** * Returns true if the connection has not been closed and is still valid. The driver shall submit a query on the * connection or use some other mechanism that positively verifies the connection is still valid when this method is * called. * * The query submitted by the driver to validate the connection shall be executed in the context of the current * transaction. * * @param timeout * The time in seconds to wait for the database operation used to validate the connection to complete. If the * timeout period expires before the operation completes, this method returns false. A value of 0 indicates a * timeout is not applied to the database operation. * @return * true if the connection is valid, false otherwise */ def isValid(timeout: Int): F[Boolean] /** * Creates an unnamed savepoint in the current transaction and returns the new Savepoint object that represents it. * if setSavepoint is invoked outside of an active transaction, a transaction will be started at this newly created savepoint. * * @return * the new Savepoint object */ def setSavepoint(): F[Savepoint] /** * Creates a savepoint with the given name in the current transaction and returns the new Savepoint object that represents it. * if setSavepoint is invoked outside of an active transaction, a transaction will be started at this newly created savepoint. * * @param name * a String containing the name of the savepoint * @return * the new Savepoint object */ def setSavepoint(name: String): F[Savepoint] /** * Undoes all changes made after the given Savepoint object was set. * This method should be used only when auto-commit has been disabled. * * @param savepoint * the Savepoint object to roll back to */ def rollback(savepoint: Savepoint): F[Unit] /** * Removes the specified Savepoint and subsequent Savepoint objects from the current transaction. * Any reference to the savepoint after it have been removed will cause an SQLException to be thrown. * * @param savepoint * the Savepoint object to release */ def releaseSavepoint(savepoint: Savepoint): F[Unit] object Connection: /** * A constant indicating that transactions are not supported. */ val TRANSACTION_NONE: Int = 0 /** * A constant indicating that * dirty reads, non-repeatable reads and phantom reads can occur. * This level allows a row changed by one transaction to be read * by another transaction before any changes in that row have been * committed (a "dirty read"). If any of the changes are rolled back, * the second transaction will have retrieved an invalid row. */ val TRANSACTION_READ_UNCOMMITTED: Int = 1 /** * A constant indicating that * dirty reads are prevented; non-repeatable reads and phantom * reads can occur. This level only prohibits a transaction * from reading a row with uncommitted changes in it. */ val TRANSACTION_READ_COMMITTED: Int = 2 /** * A constant indicating that * dirty reads and non-repeatable reads are prevented; phantom * reads can occur. This level prohibits a transaction from * reading a row with uncommitted changes in it, and it also * prohibits the situation where one transaction reads a row, * a second transaction alters the row, and the first transaction * rereads the row, getting different values the second time * (a "non-repeatable read"). */ val TRANSACTION_REPEATABLE_READ: Int = 4 /** * A constant indicating that * dirty reads, non-repeatable reads and phantom reads are prevented. * This level includes the prohibitions in * TRANSACTION_REPEATABLE_READ and further prohibits the * situation where one transaction reads all rows that satisfy * a WHERE condition, a second transaction inserts a row that * satisfies that WHERE condition, and the first transaction * rereads for the same condition, retrieving the additional * "phantom" row in the second read. */ val TRANSACTION_SERIALIZABLE: Int = 8





© 2015 - 2024 Weber Informatics LLC | Privacy Policy