Class AbstractQueryProtocol

    • Method Detail

      • 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​(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,
                                 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)
                                   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
        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
      • 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 replica, can be execute temporary on master, but we keep this flag, so when a replica is connected back to relaunch this query on replica)

        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.
      • executeBatchServer

        public boolean executeBatchServer​(boolean mustExecuteOnMaster,
                                          ServerPrepareResult serverPrepareResult,
                                          Results results,
                                          String sql,
                                          List<ParameterHolder[]> parametersList)
                                   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
        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
      • 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
      • 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
      • 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
      • 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.
      • setReadonly

        public void setReadonly​(boolean readOnly)
                         throws SQLException
        Puts this connection in read-only / read-write mode
        Specified by:
        setReadonly in interface Protocol
        Parameters:
        readOnly - true enables read-only mode; false disables it
        Throws:
        SQLException - If socket 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
      • 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
      • 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.
      • 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.
      • interrupt

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