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

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

There is a newer version: 0.3.0-beta8
Show newest version
/** This file is part of the ldbc. For the full copyright and license information, please view the LICENSE file that was
  * distributed with this source code.
  */

package ldbc.sql

import java.util.Calendar

import java.io.{ InputStream, Reader }

import java.net.URL

import java.sql.{
  Blob,
  Clob,
  Date,
  NClob,
  Ref,
  ResultSetMetaData,
  RowId,
  SQLType,
  SQLWarning,
  SQLXML,
  Time,
  Timestamp,
  Array as JavaSqlArray,
  ResultSet as JavaResultSet
}

/** A table of data representing a database result set, which is usually generated by executing a statement that queries
  * the database.
  *
  * A ResultSet object maintains a cursor pointing to its current row of data. Initially the cursor is positioned before
  * the first row. The next method moves the cursor to the next row, and because it returns false when there are no more
  * rows in the ResultSet object, it can be used in a while loop to iterate through the result set.
  *
  * A default ResultSet object is not updatable and has a cursor that moves forward only. Thus, you can iterate through
  * it only once and only from the first row to the last row. It is possible to produce ResultSet objects that are
  * scrollable and/or updatable.
  *
  * The ResultSet interface provides getter methods (getBoolean, getLong, and so on) for retrieving column values from
  * the current row. Values can be retrieved using either the index number of the column or the name of the column. In
  * general, using the column index will be more efficient. Columns are numbered from 1. For maximum portability, result
  * set columns within each row should be read in left-to-right order, and each column should be read only once.
  *
  * For the getter methods, a JDBC driver attempts to convert the underlying data to the Java type specified in the
  * getter method and returns a suitable Java value. The JDBC specification has a table showing the allowable mappings
  * from SQL types to Java types that can be used by the ResultSet getter methods.
  *
  * Column names used as input to getter methods are case insensitive. When a getter method is called with a column name
  * and several columns have the same name, the value of the first matching column will be returned. The column name
  * option is designed to be used when column names are used in the SQL query that generated the result set. For columns
  * that are NOT explicitly named in the query, it is best to use column numbers. If column names are used, the
  * programmer should take care to guarantee that they uniquely refer to the intended columns, which can be assured with
  * the SQL AS clause.
  *
  * A ResultSet object is automatically closed when the Statement object that generated it is closed, re-executed, or
  * used to retrieve the next result from a sequence of multiple results.
  *
  * The number, types and properties of a ResultSet object's columns are provided by the ResultSetMetaData object
  * returned by the ResultSet.getMetaData method.
  *
  * @tparam F
  *   The effect type
  */
trait ResultSet[F[_]]:

  /** Moves the cursor forward one row from its current position. A ResultSet cursor is initially positioned before the
    * first row; the first call to the method next makes the first row the current row; the second call makes the second
    * row the current row, and so on.
    *
    * When a call to the next method returns false, the cursor is positioned after the last row. Any invocation of a
    * ResultSet method which requires a current row will result in a SQLException being thrown. If the result set type
    * is TYPE_FORWARD_ONLY, it is vendor specified whether their JDBC driver implementation will return false or throw
    * an SQLException on a subsequent call to next.
    *
    * If an input stream is open for the current row, a call to the method next will implicitly close it. A ResultSet
    * object's warning chain is cleared when a new row is read.
    *
    * @return
    *   true if the new current row is valid false if there are no more rows
    */
  def next(): F[Boolean]

  /** Releases this ResultSet object's database and JDBC resources immediately instead of waiting for this to happen
    * when it is automatically closed.
    *
    * The closing of a ResultSet object does not close the Blob, Clob or NClob objects created by the ResultSet. Blob,
    * Clob or NClob objects remain valid for at least the duration of the transaction in which they are created, unless
    * their free method is invoked.
    *
    * When a ResultSet is closed, any ResultSetMetaData instances that were created by calling the getMetaData method
    * remain accessible.
    *
    * Note: A ResultSet object is automatically closed by the Statement object that generated it when that Statement
    * object is closed, re-executed, or is used to retrieve the next result from a sequence of multiple results.
    *
    * Calling the method close on a ResultSet object that is already closed is a no-op.
    */
  def close(): F[Unit]

  /** Reports whether the last column read had a value of SQL NULL. Note that you must first call one of the getter
    * methods on a column to try to read its value and then call the method wasNull to see if the value read was SQL
    * NULL.
    *
    * @return
    *   true if the last column value read was SQL NULL and false otherwise
    */
  def wasNull(): F[Boolean]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a String in the Java
    * programming language.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   the column value; if the value is SQL NULL, the value returned is null
    */
  def getString(columnIndex: Int): F[String]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a String in the Java
    * programming language.
    *
    * @param columnLabel
    *   columnLabel – the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified,
    *   then the label is the name of the column
    * @return
    *   the column value; if the value is SQL NULL, the value returned is null
    */
  def getString(columnLabel: String): F[String]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a boolean in the Java
    * programming language.
    *
    * If the designated column has a datatype of CHAR or VARCHAR and contains a "0" or has a datatype of BIT, TINYINT,
    * SMALLINT, INTEGER or BIGINT and contains a 0, a value of false is returned. If the designated column has a
    * datatype of CHAR or VARCHAR and contains a "1" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT and
    * contains a 1, a value of true is returned.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   the column value; if the value is SQL NULL, the value returned is false
    */
  def getBoolean(columnIndex: Int): F[Boolean]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a boolean in the Java
    * programming language.
    *
    * If the designated column has a datatype of CHAR or VARCHAR and contains a "0" or has a datatype of BIT, TINYINT,
    * SMALLINT, INTEGER or BIGINT and contains a 0, a value of false is returned. If the designated column has a
    * datatype of CHAR or VARCHAR and contains a "1" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT and
    * contains a 1, a value of true is returned.
    *
    * @param columnLabel
    *   columnLabel – the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified,
    *   then the label is the name of the column
    * @return
    *   the column value; if the value is SQL NULL, the value returned is false
    */
  def getBoolean(columnLabel: String): F[Boolean]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a byte in the Java
    * programming language.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   the column value; if the value is SQL NULL, the value returned is 0
    */
  def getByte(columnIndex: Int): F[Byte]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a byte in the Java
    * programming language.
    *
    * @param columnLabel
    *   columnLabel – the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified,
    *   then the label is the name of the column
    * @return
    *   the column value; if the value is SQL NULL, the value returned is 0
    */
  def getByte(columnLabel: String): F[Byte]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a byte array in the
    * Java programming language. The bytes represent the raw values returned by the driver.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   the column value; if the value is SQL NULL, the value returned is null
    */
  def getBytes(columnIndex: Int): F[Array[Byte]]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a byte array in the
    * Java programming language. The bytes represent the raw values returned by the driver.
    *
    * @param columnLabel
    *   columnLabel – the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified,
    *   then the label is the name of the column
    * @return
    *   the column value; if the value is SQL NULL, the value returned is null
    */
  def getBytes(columnLabel: String): F[Array[Byte]]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a short in the Java
    * programming language.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   the column value; if the value is SQL NULL, the value returned is 0
    */
  def getShort(columnIndex: Int): F[Short]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a short in the Java
    * programming language.
    *
    * @param columnLabel
    *   columnLabel – the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified,
    *   then the label is the name of the column
    * @return
    *   the column value; if the value is SQL NULL, the value returned is 0
    */
  def getShort(columnLabel: String): F[Short]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as an int in the Java
    * programming language.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   the column value; if the value is SQL NULL, the value returned is 0
    */
  def getInt(columnIndex: Int): F[Int]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as an int in the Java
    * programming language.
    *
    * @param columnLabel
    *   columnLabel – the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified,
    *   then the label is the name of the column
    * @return
    *   the column value; if the value is SQL NULL, the value returned is 0
    */
  def getInt(columnLabel: String): F[Int]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a long in the Java
    * programming language.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   the column value; if the value is SQL NULL, the value returned is 0
    */
  def getLong(columnIndex: Int): F[Long]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a long in the Java
    * programming language.
    *
    * @param columnLabel
    *   columnLabel – the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified,
    *   then the label is the name of the column
    * @return
    *   the column value; if the value is SQL NULL, the value returned is 0
    */
  def getLong(columnLabel: String): F[Long]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a float in the Java
    * programming language.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   the column value; if the value is SQL NULL, the value returned is 0
    */
  def getFloat(columnIndex: Int): F[Float]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a float in the Java
    * programming language.
    *
    * @param columnLabel
    *   columnLabel – the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified,
    *   then the label is the name of the column
    * @return
    *   the column value; if the value is SQL NULL, the value returned is 0
    */
  def getFloat(columnLabel: String): F[Float]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a double in the Java
    * programming language.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   the column value; if the value is SQL NULL, the value returned is 0
    */
  def getDouble(columnIndex: Int): F[Double]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a double in the Java
    * programming language.
    *
    * @param columnLabel
    *   columnLabel – the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified,
    *   then the label is the name of the column
    * @return
    *   the column value; if the value is SQL NULL, the value returned is 0
    */
  def getDouble(columnLabel: String): F[Double]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Date object
    * in the Java programming language.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, .
    * @return
    *   the column value; if the value is SQL NULL, the value returned is null
    */
  def getDate(columnIndex: Int): F[java.sql.Date]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Date object
    * in the Java programming language.
    *
    * @param columnLabel
    *   columnLabel – the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified,
    *   then the label is the name of the column
    * @return
    *   the column value; if the value is SQL NULL, the value returned is null
    */
  def getDate(columnLabel: String): F[java.sql.Date]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Date object
    * in the Java programming language. This method uses the given calendar to construct an appropriate millisecond
    * value for the date if the underlying database does not store timezone information.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param cal
    *   the [[java.util.Calendar]] object to use in constructing the date
    * @return
    *   the column value as a java.sql.Date object; if the value is SQL NULL, the value returned is null in the Java
    *   programming language
    */
  def getDate(columnIndex: Int, cal: Calendar): F[java.sql.Date]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Date object
    * in the Java programming language. This method uses the given calendar to construct an appropriate millisecond
    * value for the date if the underlying database does not store timezone information.
    *
    * @param columnLabel
    *   he label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label
    *   is the name of the column
    * @param cal
    *   the [[java.util.Calendar]] object to use in constructing the date
    * @return
    *
    * the column value as a java.sql.Date object; if the value is SQL NULL, the value returned is null in the Java
    * programming language
    */
  def getDate(columnLabel: String, cal: Calendar): F[java.sql.Date]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Time object
    * in the Java programming language.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, .
    * @return
    *   the column value; if the value is SQL NULL, the value returned is null
    */
  def getTime(columnIndex: Int): F[java.sql.Time]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Time object
    * in the Java programming language.
    *
    * @param columnLabel
    *   columnLabel – the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified,
    *   then the label is the name of the column
    * @return
    *   the column value; if the value is SQL NULL, the value returned is null
    */
  def getTime(columnLabel: String): F[java.sql.Time]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Time object
    * in the Java programming language. This method uses the given calendar to construct an appropriate millisecond
    * value for the time if the underlying database does not store timezone information.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param cal
    *   the java.util.Calendar object to use in constructing the time
    * @return
    *   the column value as a java.sql.Time object; if the value is SQL NULL, the value returned is null in the Java
    *   programming language
    */
  def getTime(columnIndex: Int, cal: Calendar): F[java.sql.Time]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Time object
    * in the Java programming language. This method uses the given calendar to construct an appropriate millisecond
    * value for the time if the underlying database does not store timezone information.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param cal
    *   the java.util.Calendar object to use in constructing the time
    * @return
    *   the column value as a java.sql.Time object; if the value is SQL NULL, the value returned is null in the Java
    *   programming language
    */
  def getTime(columnLabel: String, cal: Calendar): F[java.sql.Time]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Timestamp
    * object in the Java programming language.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   the column value; if the value is SQL NULL, the value returned is null
    */
  def getTimestamp(columnIndex: Int): F[java.sql.Timestamp]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Timestamp
    * object in the Java programming language.
    *
    * @param columnLabel
    *   columnLabel – the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified,
    *   then the label is the name of the column
    * @return
    *   the column value; if the value is SQL NULL, the value returned is null
    */
  def getTimestamp(columnLabel: String): F[java.sql.Timestamp]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Timestamp
    * object in the Java programming language. This method uses the given calendar to construct an appropriate
    * millisecond value for the timestamp if the underlying database does not store timezone information.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param cal
    *   the java.util.Calendar object to use in constructing the timestamp
    * @return
    *   the column value as a java.sql.Timestamp object; if the value is SQL NULL, the value returned is null in the
    *   Java programming language
    */
  def getTimestamp(columnIndex: Int, cal: Calendar): F[java.sql.Timestamp]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.Timestamp
    * object in the Java programming language. This method uses the given calendar to construct an appropriate
    * millisecond value for the timestamp if the underlying database does not store timezone information.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param cal
    *   the java.util.Calendar object to use in constructing the date
    * @return
    *   the column value as a java.sql.Timestamp object; if the value is SQL NULL, the value returned is null in the
    *   Java programming language
    */
  def getTimestamp(columnLabel: String, cal: Calendar): F[java.sql.Timestamp]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a stream of ASCII
    * characters. The value can then be read in chunks from the stream. This method is particularly suitable for
    * retrieving large LONGVARCHAR values. The JDBC driver will do any necessary conversion from the database format
    * into ASCII.
    *
    * Note: All the data in the returned stream must be read prior to getting the value of any other column. The next
    * call to a getter method implicitly closes the stream. Also, a stream may return 0 when the method
    * InputStream.available is called whether there is data available or not
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   a Java input stream that delivers the database column value as a stream of one-byte ASCII characters; if the
    *   value is SQL NULL, the value returned is null
    */
  def getAsciiStream(columnIndex: Int): F[java.io.InputStream]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a stream of ASCII
    * characters. The value can then be read in chunks from the stream. This method is particularly suitable for
    * retrieving large LONGVARCHAR values. The JDBC driver will do any necessary conversion from the database format
    * into ASCII.
    *
    * Note: All the data in the returned stream must be read prior to getting the value of any other column. The next
    * call to a getter method implicitly closes the stream. Also, a stream may return 0 when the method available is
    * called whether there is data available or not.
    *
    * @param columnLabel
    *   columnLabel – the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified,
    *   then the label is the name of the column
    * @return
    *   a Java input stream that delivers the database column value as a stream of one-byte ASCII characters. If the
    *   value is SQL NULL, the value returned is null.
    */
  def getAsciiStream(columnLabel: String): F[java.io.InputStream]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a stream of
    * uninterpreted bytes. The value can then be read in chunks from the stream. This method is particularly suitable
    * for retrieving large LONGVARBINARY values.
    *
    * Note: All the data in the returned stream must be read prior to getting the value of any other column. The next
    * call to a getter method implicitly closes the stream. Also, a stream may return 0 when the method
    * InputStream.available is called whether there is data available or not.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *
    * a Java input stream that delivers the database column value as a stream of uninterpreted bytes; if the value is
    * SQL NULL, the value returned is null
    */
  def getBinaryStream(columnIndex: Int): F[java.io.InputStream]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a stream of
    * uninterpreted bytes. The value can then be read in chunks from the stream. This method is particularly suitable
    * for retrieving large LONGVARBINARY values.
    *
    * Note: All the data in the returned stream must be read prior to getting the value of any other column. The next
    * call to a getter method implicitly closes the stream. Also, a stream may return 0 when the method available is
    * called whether there is data available or not.
    *
    * @param columnLabel
    *   columnLabel – the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified,
    *   then the label is the name of the column
    * @return
    *   a Java input stream that delivers the database column value as a stream of uninterpreted bytes; if the value is
    *   SQL NULL, the result is null
    */
  def getBinaryStream(columnLabel: String): F[java.io.InputStream]

  /** Retrieves the first warning reported by calls on this ResultSet object. Subsequent warnings on this ResultSet
    * object will be chained to the SQLWarning object that this method returns.
    *
    * The warning chain is automatically cleared each time a new row is read. This method may not be called on a
    * ResultSet object that has been closed; doing so will cause an SQLException to be thrown.
    *
    * Note: This warning chain only covers warnings caused by ResultSet methods. Any warning caused by Statement methods
    * (such as reading OUT parameters) will be chained on the Statement object.
    *
    * @return
    *   the first SQLWarning object reported or null if there are none
    */
  def getWarnings(): F[java.sql.SQLWarning]

  /** Clears all warnings reported on this ResultSet object. After this method is called, the method getWarnings returns
    * null until a new warning is reported for this ResultSet object.
    */
  def clearWarnings(): F[Unit]

  /** Retrieves the name of the SQL cursor used by this ResultSet object.
    *
    * In SQL, a result table is retrieved through a cursor that is named. The current row of a result set can be updated
    * or deleted using a positioned update/delete statement that references the cursor name. To insure that the cursor
    * has the proper isolation level to support update, the cursor's SELECT statement should be of the form SELECT FOR
    * UPDATE. If FOR UPDATE is omitted, the positioned updates may fail.
    *
    * The JDBC API supports this SQL feature by providing the name of the SQL cursor used by a ResultSet object. The
    * current row of a ResultSet object is also the current row of this SQL cursor.
    *
    * @return
    *   the SQL name for this ResultSet object's cursor
    */
  def getCursorName(): F[String]

  /** Retrieves the number, types and properties of this ResultSet object's columns.
    *
    * @return
    *   the description of this ResultSet object's columns
    */
  def getMetaData(): F[java.sql.ResultSetMetaData]

  /** Gets the value of the designated column in the current row of this ResultSet object as an Object in the Java
    * programming language.
    *
    * This method will return the value of the given column as a Java object. The type of the Java object will be the
    * default Java object type corresponding to the column's SQL type, following the mapping for built-in types
    * specified in the JDBC specification. If the value is an SQL NULL, the driver returns a Java null.
    *
    * This method may also be used to read database-specific abstract data types. In the JDBC 2.0 API, the behavior of
    * method getObject is extended to materialize data of SQL user-defined types.
    *
    * If Connection.getTypeMap does not throw a SQLFeatureNotSupportedException, then when a column contains a
    * structured or distinct value, the behavior of this method is as if it were a call to: getObject(columnIndex,
    * this.getStatement().getConnection().getTypeMap()). If Connection.getTypeMap does throw a
    * SQLFeatureNotSupportedException, then structured values are not supported, and distinct values are mapped to the
    * default Java class as determined by the underlying SQL type of the DISTINCT type.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   a java.lang.Object holding the column value
    */
  def getObject(columnIndex: Int): F[Object]

  /** Gets the value of the designated column in the current row of this ResultSet object as an Object in the Java
    * programming language.
    *
    * This method will return the value of the given column as a Java object. The type of the Java object will be the
    * default Java object type corresponding to the column's SQL type, following the mapping for built-in types
    * specified in the JDBC specification. If the value is an SQL NULL, the driver returns a Java null.
    *
    * This method may also be used to read database-specific abstract data types.
    *
    * In the JDBC 2.0 API, the behavior of the method getObject is extended to materialize data of SQL user-defined
    * types. When a column contains a structured or distinct value, the behavior of this method is as if it were a call
    * to: getObject(columnIndex, this.getStatement().getConnection().getTypeMap()).
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @return
    *   a java.lang.Object holding the column value
    */
  def getObject(columnLabel: String): F[Object]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as an Object in the Java
    * programming language. If the value is an SQL NULL, the driver returns a Java null. This method uses the given Map
    * object for the custom mapping of the SQL structured or distinct type that is being retrieved.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param map
    *   a java.util.Map object that contains the mapping from SQL type names to classes in the Java programming language
    * @return
    *   an Object in the Java programming language representing the SQL value
    */
  def getObject(columnIndex: Int, map: Map[String, Class[?]]): F[Object]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as an Object in the Java
    * programming language. If the value is an SQL NULL, the driver returns a Java null. This method uses the specified
    * Map object for custom mapping if appropriate.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param map
    *   a java.util.Map object that contains the mapping from SQL type names to classes in the Java programming language
    * @return
    *   an Object representing the SQL value in the specified column
    */
  def getObject(columnLabel: String, map: Map[String, Class[?]]): F[Object]

  /** Maps the given ResultSet column label to its ResultSet column index.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @return
    *   the column index of the given column name
    */
  def findColumn(columnLabel: String): F[Int]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.io.Reader
    * object.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   a java.io.Reader object that contains the column value; if the value is SQL NULL, the value returned is null in
    *   the Java programming language.
    */
  def getCharacterStream(columnIndex: Int): F[java.io.Reader]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.io.Reader
    * object.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @return
    *   a java.io.Reader object that contains the column value; if the value is SQL NULL, the value returned is null in
    *   the Java programming language
    */
  def getCharacterStream(columnLabel: String): F[java.io.Reader]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.math.BigDecimal
    * with full precision.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   the column value (full precision); if the value is SQL NULL, the value returned is null in the Java programming
    *   language.
    */
  def getBigDecimal(columnIndex: Int): F[BigDecimal]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.math.BigDecimal
    * with full precision.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @return
    *   the column value (full precision); if the value is SQL NULL, the value returned is null in the Java programming
    *   language.
    */
  def getBigDecimal(columnLabel: String): F[BigDecimal]

  /** Retrieves whether the cursor is before the first row in this ResultSet object.
    *
    * Note:Support for the isBeforeFirst method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY
    *
    * @return
    *   true if the cursor is before the first row; false if the cursor is at any other position or the result set
    *   contains no rows
    */
  def isBeforeFirst(): F[Boolean]

  /** Retrieves whether the cursor is after the last row in this ResultSet object.
    *
    * Note:Support for the isAfterLast method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY
    *
    * @return
    *   true if the cursor is after the last row; false if the cursor is at any other position or the result set
    *   contains no rows
    */
  def isAfterLast(): F[Boolean]

  /** Retrieves whether the cursor is on the first row of this ResultSet object.
    *
    * Note:Support for the isFirst method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY
    *
    * @return
    *   true if the cursor is on the first row; false otherwise
    */
  def isFirst(): F[Boolean]

  /** Retrieves whether the cursor is on the last row of this ResultSet object. Note: Calling the method isLast may be
    * expensive because the JDBC driver might need to fetch ahead one row in order to determine whether the current row
    * is the last row in the result set.
    *
    * Note: Support for the isLast method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY
    *
    * @return
    *   true if the cursor is on the last row; false otherwise
    */
  def isLast(): F[Boolean]

  /** Moves the cursor to the front of this ResultSet object, just before the first row. This method has no effect if
    * the result set contains no rows.
    */
  def beforeFirst(): F[Unit]

  /** Moves the cursor to the end of this ResultSet object, just after the last row. This method has no effect if the
    * result set contains no rows.
    */
  def afterLast(): F[Unit]

  /** Moves the cursor to the first row in this ResultSet object.
    *
    * @return
    *   true if the cursor is on a valid row; false if there are no rows in the result set
    */
  def first(): F[Boolean]

  /** Moves the cursor to the last row in this ResultSet object.
    *
    * @return
    *   true if the cursor is on a valid row; false if there are no rows in the result set
    */
  def last(): F[Boolean]

  /** Retrieves the current row number. The first row is number 1, the second number 2, and so on.
    *
    * Note:Support for the getRow method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY
    *
    * @return
    *   the current row number; 0 if there is no current row
    */
  def getRow(): F[Int]

  /** Moves the cursor to the given row number in this ResultSet object.
    *
    * If the row number is positive, the cursor moves to the given row number with respect to the beginning of the
    * result set. The first row is row 1, the second is row 2, and so on.
    *
    * If the given row number is negative, the cursor moves to an absolute row position with respect to the end of the
    * result set. For example, calling the method absolute(-1) positions the cursor on the last row; calling the method
    * absolute(-2) moves the cursor to the next-to-last row, and so on.
    *
    * If the row number specified is zero, the cursor is moved to before the first row.
    *
    * An attempt to position the cursor beyond the first/last row in the result set leaves the cursor before the first
    * row or after the last row.
    *
    * Note: Calling absolute(1) is the same as calling first(). Calling absolute(-1) is the same as calling last().
    *
    * @param row
    *   the number of the row to which the cursor should move. A value of zero indicates that the cursor will be
    *   positioned before the first row; a positive number indicates the row number counting from the beginning of the
    *   result set; a negative number indicates the row number counting from the end of the result set
    * @return
    *   true if the cursor is moved to a position in this ResultSet object; false if the cursor is before the first row
    *   or after the last row
    */
  def absolute(row: Int): F[Boolean]

  /** Moves the cursor a relative number of rows, either positive or negative. Attempting to move beyond the first/last
    * row in the result set positions the cursor before/after the the first/last row. Calling relative(0) is valid, but
    * does not change the cursor position.
    *
    * Note: Calling the method relative(1) is identical to calling the method next() and calling the method relative(-1)
    * is identical to calling the method previous().
    *
    * @param rows
    *   an int specifying the number of rows to move from the current row; a positive number moves the cursor forward; a
    *   negative number moves the cursor backward
    * @return
    *   true if the cursor is on a row; false otherwise
    */
  def relative(rows: Int): F[Boolean]

  /** Moves the cursor to the previous row in this ResultSet object.
    *
    * When a call to the previous method returns false, the cursor is positioned before the first row. Any invocation of
    * a ResultSet method which requires a current row will result in a SQLException being thrown.
    *
    * f an input stream is open for the current row, a call to the method previous will implicitly close it. A ResultSet
    * object's warning change is cleared when a new row is read.
    *
    * @return
    *   true if the cursor is now positioned on a valid row; false if the cursor is positioned before the first row
    */
  def previous(): F[Boolean]

  /** Gives a hint as to the direction in which the rows in this ResultSet object will be processed. The initial value
    * is determined by the Statement object that produced this ResultSet object. The fetch direction may be changed at
    * any time.
    *
    * @param direction
    *   an int specifying the suggested fetch direction; one of [[ResultSet.FetchType.FETCH_FORWARD]],
    *   [[ResultSet.FetchType.FETCH_REVERSE]], or [[ResultSet.FetchType.FETCH_UNKNOWN]]
    */
  def setFetchDirection(direction: ResultSet.FetchType): F[Unit]

  /** Retrieves the fetch direction for this ResultSet object.
    *
    * @return
    *   the current fetch direction for this ResultSet object
    */
  def getFetchDirection(): F[Int]

  /** Gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are
    * needed for this ResultSet object. If the fetch size specified is zero, the JDBC driver ignores the value and is
    * free to make its own best guess as to what the fetch size should be. The default value is set by the Statement
    * object that created the result set. The fetch size may be changed at any time.
    *
    * @param rows
    *   the number of rows to fetch
    */
  def setFetchSize(rows: Int): F[Unit]

  /** Retrieves the fetch size for this ResultSet object.
    *
    * @return
    *   the current fetch size for this ResultSet object
    */
  def getFetchSize(): F[Int]

  /** Retrieves the type of this ResultSet object. The type is determined by the Statement object that created the
    * result set.
    *
    * @return
    *   [[ResultSet.Type.TYPE_FORWARD_ONLY]], [[ResultSet.Type.TYPE_SCROLL_INSENSITIVE]], or
    *   [[ResultSet.Type.TYPE_SCROLL_SENSITIVE]]
    */
  def getType(): F[Option[ResultSet.Type]]

  /** Retrieves the concurrency mode of this ResultSet object. The concurrency used is determined by the Statement
    * object that created the result set.
    *
    * @return
    *   the concurrency type, either [[ResultSet.Concur.CONCUR_READ_ONLY]] or [[ResultSet.Concur.CONCUR_UPDATABLE]]
    */
  def getConcurrency(): F[Int]

  /** Retrieves whether the current row has been updated. The value returned depends on whether or not the result set
    * can detect updates.
    *
    * Note: Support for the rowUpdated method is optional with a result set concurrency of CONCUR_READ_ONLY
    *
    * @return
    *   true if the current row is detected to have been visibly updated by the owner or another; false otherwise
    */
  def rowUpdated(): F[Boolean]

  /** Retrieves whether the current row has had an insertion. The value returned depends on whether or not this
    * ResultSet object can detect visible inserts.
    *
    * Note: Support for the rowInserted method is optional with a result set concurrency of CONCUR_READ_ONLY
    *
    * @return
    *   true if the current row is detected to have been inserted; false otherwise
    */
  def rowInserted(): F[Boolean]

  /** Retrieves whether a row has been deleted. A deleted row may leave a visible "hole" in a result set. This method
    * can be used to detect holes in a result set. The value returned depends on whether or not this ResultSet object
    * can detect deletions.
    *
    * Note: Support for the rowDeleted method is optional with a result set concurrency of CONCUR_READ_ONLY
    *
    * @return
    *   true if the current row is detected to have been deleted by the owner or another; false otherwise
    */
  def rowDeleted(): F[Boolean]

  // === [ updating system processing ] ==============

  /** Updates the designated column with a null value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    */
  def updateNull(columnIndex: Int): F[Unit]

  /** Updates the designated column with a null value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    */
  def updateNull(columnLabel: String): F[Unit]

  /** Updates the designated column with a boolean value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param x
    *   the new column value
    */
  def updateBoolean(columnIndex: Int, x: Boolean): F[Unit]

  /** Updates the designated column with a byte value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param x
    *   the new column value
    */
  def updateBoolean(columnLabel: String, x: Boolean): F[Unit]

  /** Updates the designated column with a byte value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param x
    *   the new column value
    */
  def updateByte(columnIndex: Int, x: Byte): F[Unit]

  /** Updates the designated column with a byte value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param x
    *   the new column value
    */
  def updateByte(columnLabel: String, x: Byte): F[Unit]

  /** Updates the designated column with a short value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param x
    *   the new column value
    */
  def updateShort(columnIndex: Int, x: Short): F[Unit]

  /** Updates the designated column with a short value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param x
    *   the new column value
    */
  def updateShort(columnLabel: String, x: Short): F[Unit]

  /** Updates the designated column with an int value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param x
    *   the new column value
    */
  def updateInt(columnIndex: Int, x: Int): F[Unit]

  /** Updates the designated column with an int value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param x
    *   the new column value
    */
  def updateInt(columnLabel: String, x: Int): F[Unit]

  /** Updates the designated column with a long value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param x
    *   the new column value
    */
  def updateLong(columnIndex: Int, x: Long): F[Unit]

  /** Updates the designated column with a long value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param x
    *   the new column value
    */
  def updateLong(columnLabel: String, x: Long): F[Unit]

  /** Updates the designated column with a float value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param x
    *   the new column value
    */
  def updateFloat(columnIndex: Int, x: Float): F[Unit]

  /** Updates the designated column with a float value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param x
    *   the new column value
    */
  def updateFloat(columnLabel: String, x: Float): F[Unit]

  /** Updates the designated column with a double value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param x
    *   the new column value
    */
  def updateDouble(columnIndex: Int, x: Double): F[Unit]

  /** Updates the designated column with a double value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param x
    *   the new column value
    */
  def updateDouble(columnLabel: String, x: Double): F[Unit]

  /** Updates the designated column with a java.math.BigDecimal value. The updater methods are used to update column
    * values in the current row or the insert row. The updater methods do not update the underlying database; instead
    * the updateRow or insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param x
    *   the new column value
    */
  def updateBigDecimal(columnIndex: Int, x: BigDecimal): F[Unit]

  /** Updates the designated column with a java.sql.BigDecimal value. The updater methods are used to update column
    * values in the current row or the insert row. The updater methods do not update the underlying database; instead
    * the updateRow or insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param x
    *   the new column value
    */
  def updateBigDecimal(columnLabel: String, x: BigDecimal): F[Unit]

  /** Updates the designated column with a String value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param x
    *   the new column value
    */
  def updateString(columnIndex: Int, x: String): F[Unit]

  /** Updates the designated column with a String value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param x
    *   the new column value
    */
  def updateString(columnLabel: String, x: String): F[Unit]

  /** Updates the designated column with a byte array value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param x
    *   the new column value
    */
  def updateBytes(columnIndex: Int, x: Array[Byte]): F[Unit]

  /** Updates the designated column with a byte array value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param x
    *   the new column value
    */
  def updateBytes(columnLabel: String, x: Array[Byte]): F[Unit]

  /** Updates the designated column with a java.sql.Date value. The updater methods are used to update column values in
    * the current row or the insert row. The updater methods do not update the underlying database; instead the
    * updateRow or insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param x
    *   the new column value
    */
  def updateDate(columnIndex: Int, x: java.sql.Date): F[Unit]

  /** Updates the designated column with a java.sql.Date value. The updater methods are used to update column values in
    * the current row or the insert row. The updater methods do not update the underlying database; instead the
    * updateRow or insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param x
    *   the new column value
    */
  def updateDate(columnLabel: String, x: java.sql.Date): F[Unit]

  /** Updates the designated column with a java.sql.Time value. The updater methods are used to update column values in
    * the current row or the insert row. The updater methods do not update the underlying database; instead the
    * updateRow or insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param x
    *   the new column value
    */
  def updateTime(columnIndex: Int, x: java.sql.Time): F[Unit]

  /** Updates the designated column with a java.sql.Time value. The updater methods are used to update column values in
    * the current row or the insert row. The updater methods do not update the underlying database; instead the
    * updateRow or insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param x
    *   the new column value
    */
  def updateTime(columnLabel: String, x: java.sql.Time): F[Unit]

  /** Updates the designated column with a java.sql.Timestamp value. The updater methods are used to update column
    * values in the current row or the insert row. The updater methods do not update the underlying database; instead
    * the updateRow or insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param x
    *   the new column value
    */
  def updateTimestamp(columnIndex: Int, x: java.sql.Timestamp): F[Unit]

  /** Updates the designated column with a java.sql.Timestamp value. The updater methods are used to update column
    * values in the current row or the insert row. The updater methods do not update the underlying database; instead
    * the updateRow or insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param x
    *   the new column value
    */
  def updateTimestamp(columnLabel: String, x: java.sql.Timestamp): F[Unit]

  /** Updates the designated column with an ascii stream value, which will have the specified number of bytes. The
    * updater methods are used to update column values in the current row or the insert row. The updater methods do not
    * update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ... x – the new column value
    * @param x
    *   the new column value
    * @param length
    *   the length of the stream
    */
  def updateAsciiStream(columnIndex: Int, x: java.io.InputStream, length: Int): F[Unit]

  /** Updates the designated column with an ascii stream value, which will have the specified number of bytes. The
    * updater methods are used to update column values in the current row or the insert row. The updater methods do not
    * update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param x
    *   the new column value
    * @param length
    *   the length of the stream
    */
  def updateAsciiStream(columnLabel: String, x: java.io.InputStream, length: Int): F[Unit]

  /** Updates the designated column with an ascii stream value. The data will be read from the stream as needed until
    * end-of-stream is reached.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of
    * updateAsciiStream which takes a length parameter.
    *
    * @param columnLabel
    *   he label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label
    *   is the name of the column
    * @param x
    *   the new column value
    */
  def updateAsciiStream(columnLabel: String, x: java.io.InputStream): F[Unit]

  /** Updates the designated column with a binary stream value, which will have the specified number of bytes. The
    * updater methods are used to update column values in the current row or the insert row. The updater methods do not
    * update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ... x – the new column value
    * @param x
    *   the new column value
    * @param length
    *   the length of the stream
    */
  def updateBinaryStream(columnIndex: Int, x: java.io.InputStream, length: Int): F[Unit]

  /** Updates the designated column with a binary stream value, which will have the specified number of bytes. The
    * updater methods are used to update column values in the current row or the insert row. The updater methods do not
    * update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param x
    *   the new column value
    * @param length
    *   the length of the stream
    */
  def updateBinaryStream(columnLabel: String, x: java.io.InputStream, length: Int): F[Unit]

  /** Updates the designated column with a binary stream value. The data will be read from the stream as needed until
    * end-of-stream is reached.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of
    * updateBinaryStream which takes a length parameter.
    *
    * @param columnLabel
    *   he label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label
    *   is the name of the column
    * @param x
    *   the new column value
    */
  def updateBinaryStream(columnLabel: String, x: java.io.InputStream): F[Unit]

  /** Updates the designated column with a character stream value, which will have the specified number of bytes. The
    * updater methods are used to update column values in the current row or the insert row. The updater methods do not
    * update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ... x – the new column value
    * @param x
    *   the new column value
    * @param length
    *   the length of the stream
    */
  def updateCharacterStream(columnIndex: Int, x: java.io.Reader, length: Int): F[Unit]

  /** Updates the designated column with a character stream value, which will have the specified number of bytes. The
    * updater methods are used to update column values in the current row or the insert row. The updater methods do not
    * update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param x
    *   the new column value
    * @param length
    *   the length of the stream
    */
  def updateCharacterStream(columnLabel: String, x: java.io.Reader, length: Int): F[Unit]

  /** Updates the designated column with a character stream value. The data will be read from the stream as needed until
    * end-of-stream is reached.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of
    * updateCharacterStream which takes a length parameter.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param reader
    *   the java.io.Reader object containing the new column value
    */
  def updateCharacterStream(columnLabel: String, reader: java.io.Reader): F[Unit]

  /** Updates the designated column with an Object value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * If the second argument is an InputStream then the stream must contain the number of bytes specified by
    * scaleOrLength. If the second argument is a Reader then the reader must contain the number of characters specified
    * by scaleOrLength. If these conditions are not true the driver will generate a SQLException when the statement is
    * executed.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param x
    *   the new column value
    * @param scaleOrLength
    *   for an object of java.math.BigDecimal , this is the number of digits after the decimal point. For Java Object
    *   types InputStream and Reader, this is the length of the data in the stream or reader. For all other types, this
    *   value will be ignored.
    */
  def updateObject(columnIndex: Int, x: Object, scaleOrLength: Int): F[Unit]

  /** Updates the designated column with an Object value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param x
    *   the new column value
    */
  def updateObject(columnIndex: Int, x: Object): F[Unit]

  /** Updates the designated column with an Object value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * If the second argument is an InputStream then the stream must contain the number of bytes specified by
    * scaleOrLength. If the second argument is a Reader then the reader must contain the number of characters specified
    * by scaleOrLength. If these conditions are not true the driver will generate a SQLException when the statement is
    * executed.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param x
    *   the new column value
    * @param scaleOrLength
    *   for an object of java.math.BigDecimal , this is the number of digits after the decimal point. For Java Object
    *   types InputStream and Reader, this is the length of the data in the stream or reader. For all other types, this
    *   value will be ignored.
    */
  def updateObject(columnLabel: String, x: Object, scaleOrLength: Int): F[Unit]

  /** Updates the designated column with an Object value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param x
    *   the new column value
    */
  def updateObject(columnLabel: String, x: Object): F[Unit]

  /** Inserts the contents of the insert row into this ResultSet object and into the database. The cursor must be on the
    * insert row when this method is called.
    */
  def insertRow(): F[Unit]

  /** Updates the underlying database with the new contents of the current row of this ResultSet object. This method
    * cannot be called when the cursor is on the insert row.
    */
  def updateRow(): F[Unit]

  /** Deletes the current row from this ResultSet object and from the underlying database. This method cannot be called
    * when the cursor is on the insert row.
    */
  def deleteRow(): F[Unit]

  /** Refreshes the current row with its most recent value in the database. This method cannot be called when the cursor
    * is on the insert row.
    *
    * The refreshRow method provides a way for an application to explicitly tell the JDBC driver to refetch a row(s)
    * from the database. An application may want to call refreshRow when caching or prefetching is being done by the
    * JDBC driver to fetch the latest value of a row from the database. The JDBC driver may actually refresh multiple
    * rows at once if the fetch size is greater than one.
    *
    * All values are refetched subject to the transaction isolation level and cursor sensitivity. If refreshRow is
    * called after calling an updater method, but before calling the method updateRow, then the updates made to the row
    * are lost. Calling the method refreshRow frequently will likely slow performance.
    */
  def refreshRow(): F[Unit]

  /** Cancels the updates made to the current row in this ResultSet object. This method may be called after calling an
    * updater method(s) and before calling the method updateRow to roll back the updates made to a row. If no updates
    * have been made or updateRow has already been called, this method has no effect.
    */
  def cancelRowUpdates(): F[Unit]

  /** Moves the cursor to the insert row. The current cursor position is remembered while the cursor is positioned on
    * the insert row. The insert row is a special row associated with an updatable result set. It is essentially a
    * buffer where a new row may be constructed by calling the updater methods prior to inserting the row into the
    * result set. Only the updater, getter, and insertRow methods may be called when the cursor is on the insert row.
    * All of the columns in a result set must be given a value each time this method is called before calling insertRow.
    * An updater method must be called before a getter method can be called on a column value.
    */
  def moveToInsertRow(): F[Unit]

  /** Moves the cursor to the remembered cursor position, usually the current row. This method has no effect if the
    * cursor is not on the insert row.
    */
  def moveToCurrentRow(): F[Unit]

  /** Retrieves the Statement object that produced this ResultSet object. If the result set was generated some other
    * way, such as by a DatabaseMetaData method, this method may return null.
    */
  def getStatement(): F[Unit]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a Ref object in the
    * Java programming language.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   a Ref object representing an SQL REF value
    */
  def getRef(columnIndex: Int): F[Ref]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a Ref object in the
    * Java programming language.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @return
    *   a Ref object representing the SQL REF value in the specified column
    */
  def getRef(columnLabel: String): F[Ref]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a Blob object in the
    * Java programming language.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   a Blob object representing the SQL BLOB value in the specified column
    */
  def getBlob(columnIndex: Int): F[Blob]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a Blob object in the
    * Java programming language.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @return
    *   a Blob object representing the SQL BLOB value in the specified column
    */
  def getBlob(columnLabel: String): F[Blob]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a Clob object in the
    * Java programming language.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   a Clob object representing the SQL CLOB value in the specified column
    */
  def getClob(columnIndex: Int): F[Clob]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a Clob object in the
    * Java programming language.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @return
    *   a Clob object representing the SQL CLOB value in the specified column
    */
  def getClob(columnLabel: String): F[Clob]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as an Array object in the
    * Java programming language.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   an Array object representing the SQL ARRAY value in the specified column
    */
  def getArray(columnIndex: Int): F[JavaSqlArray]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as an Array object in the
    * Java programming language.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @return
    *   an Array object representing the SQL ARRAY value in the specified column
    */
  def getArray(columnLabel: String): F[JavaSqlArray]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.net.URL object
    * in the Java programming language.
    *
    * @param columnIndex
    *   he index of the column 1 is the first, 2 is the second,...
    * @return
    *
    * the column value as a java.net.URL object; if the value is SQL NULL, the value returned is null in the Java
    * programming language
    */
  def getURL(columnIndex: Int): F[java.net.URL]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.net.URL object
    * in the Java programming language.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @return
    *
    * the column value as a java.net.URL object; if the value is SQL NULL, the value returned is null in the Java
    * programming language
    */
  def getURL(columnLabel: String): F[java.net.URL]

  /** Updates the designated column with a java.sql.Ref value. The updater methods are used to update column values in
    * the current row or the insert row. The updater methods do not update the underlying database; instead the
    * updateRow or insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param ref
    *   the new column value
    */
  def updateRef(columnIndex: Int, ref: Ref): F[Unit]

  /** Updates the designated column with a java.sql.Ref value. The updater methods are used to update column values in
    * the current row or the insert row. The updater methods do not update the underlying database; instead the
    * updateRow or insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   he label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label
    *   is the name of the column
    * @param ref
    *   the new column value
    */
  def updateRef(columnLabel: String, ref: Ref): F[Unit]

  /** Updates the designated column with a java.sql.Blob value. The updater methods are used to update column values in
    * the current row or the insert row. The updater methods do not update the underlying database; instead the
    * updateRow or insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param ref
    *   the new column value
    */
  def updateBlob(columnIndex: Int, ref: Blob): F[Unit]

  /** Updates the designated column with a java.sql.Blob value. The updater methods are used to update column values in
    * the current row or the insert row. The updater methods do not update the underlying database; instead the
    * updateRow or insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param ref
    *   the new column value
    */
  def updateBlob(columnLabel: String, ref: Blob): F[Unit]

  /** Updates the designated column with a java.sql.Clob value. The updater methods are used to update column values in
    * the current row or the insert row. The updater methods do not update the underlying database; instead the
    * updateRow or insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param ref
    *   the new column value
    */
  def updateClob(columnIndex: Int, ref: Clob): F[Unit]

  /** Updates the designated column with a java.sql.Clob value. The updater methods are used to update column values in
    * the current row or the insert row. The updater methods do not update the underlying database; instead the
    * updateRow or insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param ref
    *   the new column value
    */
  def updateClob(columnLabel: String, ref: Clob): F[Unit]

  /** Updates the designated column with a java.sql.Array value. The updater methods are used to update column values in
    * the current row or the insert row. The updater methods do not update the underlying database; instead the
    * updateRow or insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param array
    *   the new column value
    */
  def updateArray(columnIndex: Int, array: JavaSqlArray): F[Unit]

  /** Updates the designated column with a java.sql.Array value. The updater methods are used to update column values in
    * the current row or the insert row. The updater methods do not update the underlying database; instead the
    * updateRow or insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param array
    *   the new column value
    */
  def updateArray(columnLabel: String, array: JavaSqlArray): F[Unit]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.RowId
    * object in the Java programming language.
    *
    * @param columnIndex
    *   the first column is 1, the second 2, ...
    * @return
    *   the column value; if the value is a SQL NULL the value returned is null
    */
  def getRowId(columnIndex: Int): F[java.sql.RowId]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.sql.RowId
    * object in the Java programming language.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @return
    *   the column value ; if the value is a SQL NULL the value returned is null
    */
  def getRowId(columnLabel: String): F[java.sql.RowId]

  /** Updates the designated column with a RowId value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second 2, ...
    * @param rowId
    *   the column value
    */
  def updateRowId(columnIndex: Int, rowId: java.sql.RowId): F[Unit]

  /** Updates the designated column with a RowId value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param rowId
    *   the column value
    */
  def updateRowId(columnLabel: String, rowId: java.sql.RowId): F[Unit]

  /** Retrieves the holdability of this ResultSet object
    *
    * @return
    *   either ResultSet.Holdability.HOLD_CURSORS_OVER_COMMIT or ResultSet.Holdability.CLOSE_CURSORS_AT_COMMIT
    */
  def getHoldability(): F[Int]

  /** Retrieves whether this ResultSet object has been closed. A ResultSet is closed if the method close has been called
    * on it, or if it is automatically closed.
    *
    * @return
    *   true if this ResultSet object is closed; false if it is still open
    */
  def isClosed(): F[Boolean]

  /** Updates the designated column with a String value. It is intended for use when updating NCHAR,NVARCHAR and
    * LONGNVARCHAR columns. The updater methods are used to update column values in the current row or the insert row.
    * The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called
    * to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second 2, ...
    * @param nString
    *   the value for the column to be updated
    */
  def updateNString(columnIndex: Int, nString: String): F[Unit]

  /** Updates the designated column with a String value. It is intended for use when updating NCHAR,NVARCHAR and
    * LONGNVARCHAR columns. The updater methods are used to update column values in the current row or the insert row.
    * The updater methods do not update the underlying database; instead the updateRow or insertRow methods are called
    * to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param nString
    *   the value for the column to be updated
    */
  def updateNString(columnLabel: String, nString: String): F[Unit]

  /** Updates the designated column with a java.sql.NClob value. The updater methods are used to update column values in
    * the current row or the insert row. The updater methods do not update the underlying database; instead the
    * updateRow or insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second 2, ...
    * @param nClob
    *   the value for the column to be updated
    */
  def updateNClob(columnIndex: Int, nClob: java.sql.NClob): F[Unit]

  /** Updates the designated column with a java.sql.NClob value. The updater methods are used to update column values in
    * the current row or the insert row. The updater methods do not update the underlying database; instead the
    * updateRow or insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param nClob
    *   the value for the column to be updated
    */
  def updateNClob(columnLabel: String, nClob: java.sql.NClob): F[Unit]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a NClob object in the
    * Java programming language.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   a NClob object representing the SQL NCLOB value in the specified column
    */
  def getNClob(columnIndex: Int): F[java.sql.NClob]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a NClob object in the
    * Java programming language.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @return
    *   a NClob object representing the SQL NCLOB value in the specified column
    */
  def getNClob(columnLabel: String): F[java.sql.NClob]

  /** Retrieves the value of the designated column in the current row of this ResultSet as a java.sql.SQLXML object in
    * the Java programming language.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   a SQLXML object that maps an SQL XML value
    */
  def getSQLXML(columnIndex: Int): F[java.sql.SQLXML]

  /** Retrieves the value of the designated column in the current row of this ResultSet as a java.sql.SQLXML object in
    * the Java programming language.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @return
    *   a SQLXML object that maps an SQL XML value
    */
  def getSQLXML(columnLabel: String): F[java.sql.SQLXML]

  /** Updates the designated column with a java.sql.SQLXML value. The updater methods are used to update column values
    * in the current row or the insert row. The updater methods do not update the underlying database; instead the
    * updateRow or insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second 2, ...
    * @param xmlObject
    *   the value for the column to be updated
    */
  def updateSQLXML(columnIndex: Int, xmlObject: java.sql.SQLXML): F[Unit]

  /** Updates the designated column with a java.sql.SQLXML value. The updater methods are used to update column values
    * in the current row or the insert row. The updater methods do not update the underlying database; instead the
    * updateRow or insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param xmlObject
    *   the column value
    */
  def updateSQLXML(columnLabel: String, xmlObject: java.sql.SQLXML): F[Unit]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a String in the Java
    * programming language. It is intended for use when accessing NCHAR,NVARCHAR and LONGNVARCHAR columns.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   the column value; if the value is SQL NULL, the value returned is null
    */
  def getNString(columnIndex: Int): F[String]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a String in the Java
    * programming language. It is intended for use when accessing NCHAR,NVARCHAR and LONGNVARCHAR columns.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @return
    *   the column value; if the value is SQL NULL, the value returned is null
    */
  def getNString(columnLabel: String): F[String]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.io.Reader
    * object. It is intended for use when accessing NCHAR,NVARCHAR and LONGNVARCHAR columns.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @return
    *   a java.io.Reader object that contains the column value; if the value is SQL NULL, the value returned is null in
    *   the Java
    */
  def getNCharacterStream(columnIndex: Int): F[java.io.Reader]

  /** Retrieves the value of the designated column in the current row of this ResultSet object as a java.io.Reader
    * object. It is intended for use when accessing NCHAR,NVARCHAR and LONGNVARCHAR columns.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @return
    *   a java.io.Reader object that contains the column value; if the value is SQL NULL, the value returned is null in
    *   the Java programming language
    */
  def getNCharacterStream(columnLabel: String): F[java.io.Reader]

  /** Updates the designated column with a character stream value, which will have the specified number of bytes. The
    * driver does the necessary conversion from Java character format to the national character set in the database. It
    * is intended for use when updating NCHAR,NVARCHAR and LONGNVARCHAR columns.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param reader
    *   the new column value
    * @param length
    *   the length of the stream
    */
  def updateNCharacterStream(columnIndex: Int, reader: java.io.Reader, length: Long): F[Unit]

  /** Updates the designated column with a character stream value, which will have the specified number of bytes. The
    * driver does the necessary conversion from Java character format to the national character set in the database. It
    * is intended for use when updating NCHAR,NVARCHAR and LONGNVARCHAR columns.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param reader
    *   the java.io.Reader object containing the new column value
    * @param length
    *   the length of the stream
    */
  def updateNCharacterStream(columnLabel: String, reader: java.io.Reader, length: Long): F[Unit]

  /** Updates the designated column with an ascii stream value, which will have the specified number of bytes.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param inputStream
    *   the new column value
    * @param length
    *   the length of the stream
    */
  def updateAsciiStream(columnIndex: Int, inputStream: java.io.InputStream, length: Long): F[Unit]

  /** Updates the designated column with an ascii stream value, which will have the specified number of bytes.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param inputStream
    *   the new column value
    * @param length
    *   the length of the stream
    */
  def updateAsciiStream(columnLabel: String, inputStream: java.io.InputStream, length: Long): F[Unit]

  /** Updates the designated column with a binary stream value, which will have the specified number of bytes.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param inputStream
    *   the new column value
    * @param length
    *   the length of the stream
    */
  def updateBinaryStream(columnIndex: Int, inputStream: java.io.InputStream, length: Long): F[Unit]

  /** Updates the designated column with a binary stream value, which will have the specified number of bytes.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param inputStream
    *   the new column value
    * @param length
    *   the length of the stream
    */
  def updateBinaryStream(columnLabel: String, inputStream: java.io.InputStream, length: Long): F[Unit]

  /** Updates the designated column using the given input stream, which will have the specified number of bytes.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param inputStream
    *   An object that contains the data to set the parameter value to.
    * @param length
    *   the number of bytes in the parameter data.
    */
  def updateBlob(columnIndex: Int, inputStream: java.io.InputStream, length: Long): F[Unit]

  /** Updates the designated column using the given input stream, which will have the specified number of bytes.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param inputStream
    *   An object that contains the data to set the parameter value to.
    * @param length
    *   the number of bytes in the parameter data.
    */
  def updateBlob(columnLabel: String, inputStream: java.io.InputStream, length: Long): F[Unit]

  /** Updates the designated column using the given input stream. The data will be read from the stream as needed until
    * end-of-stream is reached.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of
    * updateBlob which takes a length parameter.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param inputStream
    *   An object that contains the data to set the parameter value to.
    */
  def updateBlob(columnIndex: Int, inputStream: java.io.InputStream): F[Unit]

  /** Updates the designated column using the given input stream. The data will be read from the stream as needed until
    * end-of-stream is reached.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of
    * updateBlob which takes a length parameter.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param inputStream
    *   An object that contains the data to set the parameter value to.
    */
  def updateBlob(columnLabel: String, inputStream: java.io.InputStream): F[Unit]

  /** Updates the designated column using the given Reader object, which is the given number of characters long. When a
    * very large UNICODE value is input to a LONGVARCHAR parameter, it may be more practical to send it via a
    * java.io.Reader object. The JDBC driver will do any necessary conversion from UNICODE to the database char format.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param reader
    *   An object that contains the data to set the parameter value to.
    * @param length
    *   the number of characters in the parameter data.
    */
  def updateClob(columnIndex: Int, reader: java.io.Reader, length: Long): F[Unit]

  /** Updates the designated column using the given Reader object, which is the given number of characters long. When a
    * very large UNICODE value is input to a LONGVARCHAR parameter, it may be more practical to send it via a
    * java.io.Reader object. The JDBC driver will do any necessary conversion from UNICODE to the database char format.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param reader
    *   An object that contains the data to set the parameter value to.
    * @param length
    *   the number of characters in the parameter data.
    */
  def updateClob(columnLabel: String, reader: java.io.Reader, length: Long): F[Unit]

  /** Updates the designated column using the given Reader object. The data will be read from the stream as needed until
    * end-of-stream is reached. The JDBC driver will do any necessary conversion from UNICODE to the database char
    * format.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of
    * updateClob which takes a length parameter.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param reader
    *   An object that contains the data to set the parameter value to.
    */
  def updateClob(columnIndex: Int, reader: java.io.Reader): F[Unit]

  /** Updates the designated column using the given Reader object. The data will be read from the stream as needed until
    * end-of-stream is reached. The JDBC driver will do any necessary conversion from UNICODE to the database char
    * format.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of
    * updateClob which takes a length parameter.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param reader
    *   An object that contains the data to set the parameter value to.
    */
  def updateClob(columnLabel: String, reader: java.io.Reader): F[Unit]

  /** Updates the designated column using the given Reader object, which is the given number of characters long. When a
    * very large UNICODE value is input to a LONGVARCHAR parameter, it may be more practical to send it via a
    * java.io.Reader object. The JDBC driver will do any necessary conversion from UNICODE to the database char format.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param reader
    *   An object that contains the data to set the parameter value to.
    * @param length
    *   the number of characters in the parameter data.
    */
  def updateNClob(columnIndex: Int, reader: java.io.Reader, length: Long): F[Unit]

  /** Updates the designated column using the given Reader object, which is the given number of characters long. When a
    * very large UNICODE value is input to a LONGVARCHAR parameter, it may be more practical to send it via a
    * java.io.Reader object. The JDBC driver will do any necessary conversion from UNICODE to the database char format.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param reader
    *   An object that contains the data to set the parameter value to.
    * @param length
    *   the number of characters in the parameter data.
    */
  def updateNClob(columnLabel: String, reader: java.io.Reader, length: Long): F[Unit]

  /** Updates the designated column using the given Reader The data will be read from the stream as needed until
    * end-of-stream is reached. The JDBC driver will do any necessary conversion from UNICODE to the database char
    * format.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of
    * updateNClob which takes a length parameter.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param reader
    *   An object that contains the data to set the parameter value to.
    */
  def updateNClob(columnIndex: Int, reader: java.io.Reader): F[Unit]

  /** Updates the designated column using the given Reader The data will be read from the stream as needed until
    * end-of-stream is reached. The JDBC driver will do any necessary conversion from UNICODE to the database char
    * format.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of
    * updateNClob which takes a length parameter.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param reader
    *   An object that contains the data to set the parameter value to.
    */
  def updateNClob(columnLabel: String, reader: java.io.Reader): F[Unit]

  /** Updates the designated column with a character stream value. The data will be read from the stream as needed until
    * end-of-stream is reached. The driver does the necessary conversion from Java character format to the national
    * character set in the database. It is intended for use when updating NCHAR,NVARCHAR and LONGNVARCHAR columns.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of
    * updateNCharacterStream which takes a length parameter.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param reader
    *   the new column value
    */
  def updateNCharacterStream(columnIndex: Int, reader: java.io.Reader): F[Unit]

  /** Updates the designated column with a character stream value. The data will be read from the stream as needed until
    * end-of-stream is reached. The driver does the necessary conversion from Java character format to the national
    * character set in the database. It is intended for use when updating NCHAR,NVARCHAR and LONGNVARCHAR columns.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of
    * updateNCharacterStream which takes a length parameter.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param reader
    *   the new column value
    */
  def updateNCharacterStream(columnLabel: String, reader: java.io.Reader): F[Unit]

  /** Updates the designated column with an ascii stream value. The data will be read from the stream as needed until
    * end-of-stream is reached.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of
    * updateAsciiStream which takes a length parameter.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param inputStream
    *   the new column value
    */
  def updateAsciiStream(columnIndex: Int, inputStream: java.io.InputStream): F[Unit]

  /** Updates the designated column with a binary stream value. The data will be read from the stream as needed until
    * end-of-stream is reached.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of
    * updateBinaryStream which takes a length parameter.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param inputStream
    *   the new column value
    */
  def updateBinaryStream(columnIndex: Int, inputStream: java.io.InputStream): F[Unit]

  /** Updates the designated column with a character stream value. The data will be read from the stream as needed until
    * end-of-stream is reached.
    *
    * The updater methods are used to update column values in the current row or the insert row. The updater methods do
    * not update the underlying database; instead the updateRow or insertRow methods are called to update the database.
    *
    * Note: Consult your JDBC driver documentation to determine if it might be more efficient to use a version of
    * updateCharacterStream which takes a length parameter.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param reader
    *   the new column value
    */
  def updateCharacterStream(columnIndex: Int, reader: java.io.Reader): F[Unit]

  /** Retrieves the value of the designated column in the current row of this ResultSet object and will convert from the
    * SQL type of the column to the requested Java data type, if the conversion is supported. If the conversion is not
    * supported or null is specified for the type, a SQLException is thrown.
    *
    * At a minimum, an implementation must support the conversions defined in Appendix B, Table B-3 and conversion of
    * appropriate user defined SQL types to a Java type which implements SQLData, or Struct. Additional conversions may
    * be supported and are vendor defined.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param clazz
    *   Class representing the Java data type to convert the designated column to.
    * @tparam T
    *   Java data type for converting a given column
    */
  def getObject[T](columnIndex: Int, clazz: T): F[T]

  /** Retrieves the value of the designated column in the current row of this ResultSet object and will convert from the
    * SQL type of the column to the requested Java data type, if the conversion is supported. If the conversion is not
    * supported or null is specified for the type, a SQLException is thrown.
    *
    * At a minimum, an implementation must support the conversions defined in Appendix B, Table B-3 and conversion of
    * appropriate user defined SQL types to a Java type which implements SQLData, or Struct. Additional conversions may
    * be supported and are vendor defined.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param clazz
    *   Class representing the Java data type to convert the designated column to.
    * @tparam T
    *   Java data type for converting a given column
    */
  def getObject[T](columnLabel: String, clazz: T): F[T]

  /** Updates the designated column with an Object value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * If the second argument is an InputStream then the stream must contain the number of bytes specified by
    * scaleOrLength. If the second argument is a Reader then the reader must contain the number of characters specified
    * by scaleOrLength. If these conditions are not true the driver will generate a SQLException when the statement is
    * executed.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param x
    *   the new column value
    * @param targetSqlType
    *   the SQL type to be sent to the database
    * @param scaleOrLength
    *   for an object of java.math.BigDecimal , this is the number of digits after the decimal point. For Java Object
    *   types InputStream and Reader, this is the length of the data in the stream or reader. For all other types, this
    *   value will be ignored.
    */
  def updateObject(columnIndex: Int, x: Object, targetSqlType: java.sql.SQLType, scaleOrLength: Int): F[Unit]

  /** Updates the designated column with an Object value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * If the second argument is an InputStream then the stream must contain the number of bytes specified by
    * scaleOrLength. If the second argument is a Reader then the reader must contain the number of characters specified
    * by scaleOrLength. If these conditions are not true the driver will generate a SQLException when the statement is
    * executed.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL
    * @param x
    *   the new column value
    * @param targetSqlType
    *   the SQL type to be sent to the database
    * @param scaleOrLength
    *   for an object of java.math.BigDecimal , this is the number of digits after the decimal point. For Java Object
    *   types InputStream and Reader, this is the length of the data in the stream or reader. For all other types, this
    *   value will be ignored.
    */
  def updateObject(columnLabel: String, x: Object, targetSqlType: java.sql.SQLType, scaleOrLength: Int): F[Unit]

  /** Updates the designated column with an Object value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnIndex
    *   the first column is 1, the second is 2, ...
    * @param x
    *   the new column value
    * @param targetSqlType
    *   the SQL type to be sent to the database
    */
  def updateObject(columnIndex: Int, x: Object, targetSqlType: java.sql.SQLType): F[Unit]

  /** Updates the designated column with an Object value. The updater methods are used to update column values in the
    * current row or the insert row. The updater methods do not update the underlying database; instead the updateRow or
    * insertRow methods are called to update the database.
    *
    * @param columnLabel
    *   the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the
    *   label is the name of the column
    * @param x
    *   the new column value
    * @param targetSqlType
    *   the SQL type to be sent to the database
    */
  def updateObject(columnLabel: String, x: Object, targetSqlType: java.sql.SQLType): F[Unit]

object ResultSet:

  enum FetchType(val code: Int):
    case FETCH_FORWARD extends FetchType(JavaResultSet.FETCH_FORWARD)
    case FETCH_REVERSE extends FetchType(JavaResultSet.FETCH_REVERSE)
    case FETCH_UNKNOWN extends FetchType(JavaResultSet.FETCH_UNKNOWN)

  enum Type(val code: Int):
    case TYPE_FORWARD_ONLY       extends Type(JavaResultSet.TYPE_FORWARD_ONLY)
    case TYPE_SCROLL_INSENSITIVE extends Type(JavaResultSet.TYPE_SCROLL_INSENSITIVE)
    case TYPE_SCROLL_SENSITIVE   extends Type(JavaResultSet.TYPE_SCROLL_SENSITIVE)

  enum Concur(val code: Int):
    case CONCUR_READ_ONLY extends Concur(JavaResultSet.CONCUR_READ_ONLY)
    case CONCUR_UPDATABLE extends Concur(JavaResultSet.CONCUR_UPDATABLE)

  enum Holdability(val code: Int):
    case HOLD_CURSORS_OVER_COMMIT extends Holdability(JavaResultSet.HOLD_CURSORS_OVER_COMMIT)
    case CLOSE_CURSORS_AT_COMMIT  extends Holdability(JavaResultSet.CLOSE_CURSORS_AT_COMMIT)




© 2015 - 2024 Weber Informatics LLC | Privacy Policy