Class AbstractQueryProtocol

java.lang.Object
org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol
org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol
All Implemented Interfaces:
Protocol
Direct Known Subclasses:
MasterProtocol

public class AbstractQueryProtocol extends AbstractConnectProtocol implements Protocol
  • Field Details

    • logger

      private static final Logger logger
    • CHECK_GALERA_STATE_QUERY

      private static final String CHECK_GALERA_STATE_QUERY
      See Also:
    • readScheduler

      protected static ThreadPoolExecutor readScheduler
    • logQuery

      private final LogQueryTool logQuery
    • transactionIsolationLevel

      private int transactionIsolationLevel
    • localInfileInputStream

      private InputStream localInfileInputStream
    • maxRows

      private long maxRows
    • statementIdToRelease

      private volatile int statementIdToRelease
    • activeFutureTask

      private FutureTask activeFutureTask
    • interrupted

      private boolean interrupted
    • galeraAllowedStates

      private final List<String> galeraAllowedStates
  • Constructor Details

    • AbstractQueryProtocol

      AbstractQueryProtocol(UrlParser urlParser, GlobalStateInfo globalInfo, ReentrantLock lock)
      Get a protocol instance.
      Parameters:
      urlParser - connection URL information's
      lock - the lock for thread synchronisation
  • Method Details

    • reset

      public void reset() throws SQLException
      Reset connection state.
      1. Transaction will be rollback
      2. transaction isolation will be reset
      3. user variables will be removed
      4. sessions variables will be reset to global values
      Specified by:
      reset in interface Protocol
      Throws:
      SQLException - if command failed
    • executeQuery

      public void executeQuery(String sql) throws SQLException
      Execute internal query.

      !! will not support multi values queries !!

      Specified by:
      executeQuery in interface Protocol
      Specified by:
      executeQuery in class AbstractConnectProtocol
      Parameters:
      sql - sql
      Throws:
      SQLException - in any exception occur
    • executeQuery

      public void executeQuery(boolean mustExecuteOnMaster, Results results, String sql) throws SQLException
      Execute query directly to outputStream.
      Specified by:
      executeQuery in interface Protocol
      Parameters:
      mustExecuteOnMaster - was intended to be launched on master connection
      results - result
      sql - the query to executeInternal
      Throws:
      SQLException - exception
    • executeQuery

      public void executeQuery(boolean mustExecuteOnMaster, Results results, String sql, Charset charset) throws SQLException
      Specified by:
      executeQuery in interface Protocol
      Throws:
      SQLException
    • executeQuery

      public void executeQuery(boolean mustExecuteOnMaster, Results results, ClientPrepareResult clientPrepareResult, ParameterHolder[] parameters) throws SQLException
      Execute a unique clientPrepareQuery.
      Specified by:
      executeQuery in interface Protocol
      Parameters:
      mustExecuteOnMaster - was intended to be launched on master connection
      results - results
      clientPrepareResult - clientPrepareResult
      parameters - parameters
      Throws:
      SQLException - exception
    • executeQuery

      public void executeQuery(boolean mustExecuteOnMaster, Results results, ClientPrepareResult clientPrepareResult, ParameterHolder[] parameters, int queryTimeout) throws SQLException
      Execute a unique clientPrepareQuery.
      Specified by:
      executeQuery in interface Protocol
      Parameters:
      mustExecuteOnMaster - was intended to be launched on master connection
      results - results
      clientPrepareResult - clientPrepareResult
      parameters - parameters
      queryTimeout - if timeout is set and must use max_statement_time
      Throws:
      SQLException - exception
    • executeBatchClient

      public boolean executeBatchClient(boolean mustExecuteOnMaster, Results results, ClientPrepareResult prepareResult, List<ParameterHolder[]> parametersList, boolean hasLongData) throws SQLException
      Execute clientPrepareQuery batch.
      Specified by:
      executeBatchClient in interface Protocol
      Parameters:
      mustExecuteOnMaster - was intended to be launched on master connection
      results - results
      prepareResult - ClientPrepareResult
      parametersList - List of parameters
      hasLongData - has parameter with long data (stream)
      Throws:
      SQLException - exception
    • executeBulkBatch

      private boolean executeBulkBatch(Results results, String sql, ServerPrepareResult serverPrepareResult, List<ParameterHolder[]> parametersList) throws SQLException
      Execute clientPrepareQuery batch.
      Parameters:
      results - results
      sql - sql command
      serverPrepareResult - prepare result if exist
      parametersList - List of parameters
      Returns:
      if executed
      Throws:
      SQLException - exception
    • initializeBatchReader

      private void initializeBatchReader()
    • executeBatchMulti

      private void executeBatchMulti(Results results, ClientPrepareResult clientPrepareResult, List<ParameterHolder[]> parametersList) throws SQLException
      Execute clientPrepareQuery batch.
      Parameters:
      results - results
      clientPrepareResult - ClientPrepareResult
      parametersList - List of parameters
      Throws:
      SQLException - exception
    • executeBatchStmt

      public void executeBatchStmt(boolean mustExecuteOnMaster, Results results, List<String> queries) throws SQLException
      Execute batch from Statement.executeBatch().
      Specified by:
      executeBatchStmt in interface Protocol
      Parameters:
      mustExecuteOnMaster - was intended to be launched on master connection
      results - results
      queries - queries
      Throws:
      SQLException - if any exception occur
    • executeBatch

      private void executeBatch(Results results, List<String> queries) throws SQLException
      Execute list of queries not rewritable.
      Parameters:
      results - result object
      queries - list of queries
      Throws:
      SQLException - exception
    • prepare

      public ServerPrepareResult prepare(String sql, boolean executeOnMaster) throws SQLException
      Prepare query on server side. Will permit to know the parameter number of the query, and permit to send only the data on next results.

      For failover, two additional information are in the result-set object : - current connection : Since server maintain a state of this prepare statement, all query will be executed on this particular connection. - executeOnMaster : state of current connection when creating this prepareStatement (if was on master, will only be executed on master. If was on a slave, can be execute temporary on master, but we keep this flag, so when a slave is connected back to relaunch this query on slave)

      Specified by:
      prepare in interface Protocol
      Parameters:
      sql - the query
      executeOnMaster - state of current connection when creating this prepareStatement
      Returns:
      a ServerPrepareResult object that contain prepare result information.
      Throws:
      SQLException - if any error occur on connection.
    • executeBatchAggregateSemiColon

      private void executeBatchAggregateSemiColon(Results results, List<String> queries) throws SQLException
      Execute list of queries. This method is used when using text batch statement and using rewriting (allowMultiQueries || rewriteBatchedStatements). queries will be send to server according to max_allowed_packet size.
      Parameters:
      results - result object
      queries - list of queries
      Throws:
      SQLException - exception
    • executeBatchRewrite

      private void executeBatchRewrite(Results results, ClientPrepareResult prepareResult, List<ParameterHolder[]> parameterList, boolean rewriteValues) throws SQLException
      Specific execution for batch rewrite that has specific query for memory.
      Parameters:
      results - result
      prepareResult - prepareResult
      parameterList - parameters
      rewriteValues - is rewritable flag
      Throws:
      SQLException - exception
    • executeBatchServer

      public boolean executeBatchServer(boolean mustExecuteOnMaster, ServerPrepareResult serverPrepareResult, Results results, String sql, List<ParameterHolder[]> parametersList, boolean hasLongData) throws SQLException
      Execute Prepare if needed, and execute COM_STMT_EXECUTE queries in batch.
      Specified by:
      executeBatchServer in interface Protocol
      Parameters:
      mustExecuteOnMaster - must normally be executed on master connection
      serverPrepareResult - prepare result. can be null if not prepared.
      results - execution results
      sql - sql query if needed to be prepared
      parametersList - parameter list
      hasLongData - has long data (stream)
      Returns:
      executed
      Throws:
      SQLException - if parameter error or connection error occur.
    • executePreparedQuery

      public void executePreparedQuery(boolean mustExecuteOnMaster, ServerPrepareResult serverPrepareResult, Results results, ParameterHolder[] parameters) throws SQLException
      Execute a query that is already prepared.
      Specified by:
      executePreparedQuery in interface Protocol
      Parameters:
      mustExecuteOnMaster - must execute on master
      serverPrepareResult - prepare result
      results - execution result
      parameters - parameters
      Throws:
      SQLException - exception
    • rollback

      public void rollback() throws SQLException
      Rollback transaction.
      Specified by:
      rollback in interface Protocol
      Throws:
      SQLException
    • forceReleasePrepareStatement

      public boolean forceReleasePrepareStatement(int statementId) throws SQLException
      Force release of prepare statement that are not used. This method will be call when adding a new prepare statement in cache, so the packet can be send to server without problem.
      Specified by:
      forceReleasePrepareStatement in interface Protocol
      Parameters:
      statementId - prepared statement Id to remove.
      Returns:
      true if successfully released
      Throws:
      SQLException - if connection exception.
    • forceReleaseWaitingPrepareStatement

      public void forceReleaseWaitingPrepareStatement() throws SQLException
      Force release of prepare statement that are not used. This permit to deallocate a statement that cannot be release due to multi-thread use.
      Specified by:
      forceReleaseWaitingPrepareStatement in interface Protocol
      Throws:
      SQLException - if connection occur
    • ping

      public boolean ping() throws SQLException
      Specified by:
      ping in interface Protocol
      Throws:
      SQLException
    • isValid

      public boolean isValid(int timeout) throws SQLException
      Check that connection is valid. !! careful, timeout is in milliseconds, connection.isValid(timeout) is in seconds !!
      Specified by:
      isValid in interface Protocol
      Parameters:
      timeout - timeout in milliseconds
      Returns:
      true is valid
      Throws:
      SQLException - if any error occur
    • getCatalog

      public String getCatalog() throws SQLException
      Specified by:
      getCatalog in interface Protocol
      Throws:
      SQLException
    • setCatalog

      public void setCatalog(String database) throws SQLException
      Specified by:
      setCatalog in interface Protocol
      Throws:
      SQLException
    • resetDatabase

      public void resetDatabase() throws SQLException
      Specified by:
      resetDatabase in interface Protocol
      Throws:
      SQLException
    • cancelCurrentQuery

      public void cancelCurrentQuery() throws SQLException
      Cancels the current query - clones the current protocol and executes a query using the new connection.
      Specified by:
      cancelCurrentQuery in interface Protocol
      Throws:
      SQLException - never thrown
    • getAutocommit

      public boolean getAutocommit()
      Get current autocommit status.
      Specified by:
      getAutocommit in interface Protocol
      Returns:
      autocommit status
    • inTransaction

      public boolean inTransaction()
      Specified by:
      inTransaction in interface Protocol
    • closeExplicit

      public void closeExplicit()
      Specified by:
      closeExplicit in interface Protocol
    • releasePrepareStatement

      public void releasePrepareStatement(ServerPrepareResult serverPrepareResult) throws SQLException
      Deallocate prepare statement if not used anymore.
      Specified by:
      releasePrepareStatement in interface Protocol
      Parameters:
      serverPrepareResult - allocation result
      Throws:
      SQLException - if de-allocation failed.
    • getMaxRows

      public long getMaxRows()
      Specified by:
      getMaxRows in interface Protocol
    • setMaxRows

      public void setMaxRows(long max) throws SQLException
      Specified by:
      setMaxRows in interface Protocol
      Throws:
      SQLException
    • setLocalInfileInputStream

      public void setLocalInfileInputStream(InputStream inputStream)
      Specified by:
      setLocalInfileInputStream in interface Protocol
    • getTimeout

      public int getTimeout()
      Returns the connection timeout in milliseconds.
      Specified by:
      getTimeout in interface Protocol
      Returns:
      the connection timeout in milliseconds.
    • setTimeout

      public void setTimeout(int timeout) throws SocketException
      Sets the connection timeout.
      Specified by:
      setTimeout in interface Protocol
      Parameters:
      timeout - the timeout, in milliseconds
      Throws:
      SocketException - if there is an error in the underlying protocol, such as a TCP error.
    • setTransactionIsolation

      public void setTransactionIsolation(int level) throws SQLException
      Set transaction isolation.
      Specified by:
      setTransactionIsolation in interface Protocol
      Parameters:
      level - transaction level.
      Throws:
      SQLException - if transaction level is unknown
    • getTransactionIsolationLevel

      public int getTransactionIsolationLevel()
      Specified by:
      getTransactionIsolationLevel in interface Protocol
    • checkClose

      private void checkClose() throws SQLException
      Throws:
      SQLException
    • getResult

      public void getResult(Results results) throws SQLException
      Specified by:
      getResult in interface Protocol
      Throws:
      SQLException
    • readPacket

      private void readPacket(Results results) throws SQLException
      Read server response packet.
      Parameters:
      results - result object
      Throws:
      SQLException - if sub-result connection fail
      See Also:
    • readOkPacket

      private void readOkPacket(Buffer buffer, Results results)
      Read OK_Packet.
      Parameters:
      buffer - current buffer
      results - result object
      See Also:
    • handleStateChange

      private void handleStateChange(Buffer buf, Results results)
    • getAutoIncrementIncrement

      public int getAutoIncrementIncrement() throws SQLException
      Get current auto increment increment. *** no lock needed ****
      Specified by:
      getAutoIncrementIncrement in interface Protocol
      Returns:
      auto increment increment.
      Throws:
      SQLException - if cannot retrieve auto increment value
    • readErrorPacket

      private SQLException readErrorPacket(Buffer buffer, Results results)
      Read ERR_Packet.
      Parameters:
      buffer - current buffer
      results - result object
      Returns:
      SQLException if sub-result connection fail
      See Also:
    • readLocalInfilePacket

      private void readLocalInfilePacket(Buffer buffer, Results results) throws SQLException
      Read Local_infile Packet.
      Parameters:
      buffer - current buffer
      results - result object
      Throws:
      SQLException - if sub-result connection fail
      See Also:
    • readResultSet

      private void readResultSet(Buffer buffer, Results results) throws SQLException
      Read ResultSet Packet.
      Parameters:
      buffer - current buffer
      results - result object
      Throws:
      SQLException - if sub-result connection fail
      See Also:
    • prologProxy

      public void prologProxy(ServerPrepareResult serverPrepareResult, long maxRows, boolean hasProxy, MariaDbConnection connection, MariaDbStatement statement) throws SQLException
      Specified by:
      prologProxy in interface Protocol
      Throws:
      SQLException
    • prolog

      public void prolog(long maxRows, boolean hasProxy, MariaDbConnection connection, MariaDbStatement statement) throws SQLException
      Preparation before command.
      Specified by:
      prolog in interface Protocol
      Parameters:
      maxRows - query max rows
      hasProxy - has proxy
      connection - current connection
      statement - current statement
      Throws:
      SQLException - if any error occur.
    • addPrepareInCache

      public ServerPrepareResult addPrepareInCache(String key, ServerPrepareResult serverPrepareResult)
      Specified by:
      addPrepareInCache in interface Protocol
    • cmdPrologue

      private void cmdPrologue() throws SQLException
      Throws:
      SQLException
    • resetStateAfterFailover

      public void resetStateAfterFailover(long maxRows, int transactionIsolationLevel, String database, boolean autocommit) throws SQLException
      Set current state after a failover.
      Specified by:
      resetStateAfterFailover in interface Protocol
      Parameters:
      maxRows - current Max rows
      transactionIsolationLevel - current transactionIsolationLevel
      database - current database
      autocommit - current autocommit state
      Throws:
      SQLException - if any error occur.
    • handleIoException

      public SQLException handleIoException(Exception initialException)
      Handle IoException (reconnect if Exception is due to having send too much data, making server close the connection.

      There is 3 kind of IOException :

      1. MaxAllowedPacketException : without need of reconnect : thrown when driver don't send packet that would have been too big then error is not a CONNECTION_EXCEPTION
      2. packets size is greater than max_allowed_packet (can be checked with writer.isAllowedCmdLength()). Need to reconnect
      3. unknown IO error throw a CONNECTION_EXCEPTION
      Specified by:
      handleIoException in interface Protocol
      Parameters:
      initialException - initial Io error
      Returns:
      the resulting error to return to client.
    • setActiveFutureTask

      public void setActiveFutureTask(FutureTask activeFutureTask)
      Specified by:
      setActiveFutureTask in interface Protocol
    • interrupt

      public void interrupt()
      Specified by:
      interrupt in interface Protocol
    • isInterrupted

      public boolean isInterrupted()
      Specified by:
      isInterrupted in interface Protocol
    • stopIfInterrupted

      public void stopIfInterrupted() throws SQLTimeoutException
      Throw TimeoutException if timeout has been reached.
      Specified by:
      stopIfInterrupted in interface Protocol
      Throws:
      SQLTimeoutException - to indicate timeout exception.