content: /**
   * Licensed to the Apache Software Foundation (ASF) under one or more
   * contributor license agreements.  See the NOTICE file distributed with
   * this work for additional information regarding copyright ownership.
   * The ASF licenses this file to You under the Apache License, Version 2.0
   * (the "License"); you may not use this file except in compliance with
   * the License.  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package org.apache.activemq.store.jdbc;
  
  /**
   * 
   * 
   * @org.apache.xbean.XBean element="statements"
   * 
   */
  public class Statements {
  
      protected String messageTableName = "ACTIVEMQ_MSGS";
      protected String durableSubAcksTableName = "ACTIVEMQ_ACKS";
      protected String lockTableName = "ACTIVEMQ_LOCK";
      protected String binaryDataType = "BLOB";
      protected String containerNameDataType = "VARCHAR(250)";
      protected String msgIdDataType = "VARCHAR(250)";
      protected String sequenceDataType = "BIGINT";
      protected String longDataType = "BIGINT";
      protected String stringIdDataType = "VARCHAR(250)";
      protected boolean useExternalMessageReferences;
  
      private String tablePrefix = "";
      private String addMessageStatement;
      private String updateMessageStatement;
      private String removeMessageStatement;
      private String findMessageSequenceIdStatement;
      private String findMessageStatement;
      private String findMessageByIdStatement;
      private String findAllMessagesStatement;
      private String findLastSequenceIdInMsgsStatement;
      private String findLastSequenceIdInAcksStatement;
      private String createDurableSubStatement;
      private String findDurableSubStatement;
      private String findAllDurableSubsStatement;
      private String updateLastPriorityAckRowOfDurableSubStatement;
      private String deleteSubscriptionStatement;
      private String findAllDurableSubMessagesStatement;
      private String findDurableSubMessagesStatement;
      private String findDurableSubMessagesByPriorityStatement;
      private String findAllDestinationsStatement;
      private String removeAllMessagesStatement;
      private String removeAllSubscriptionsStatement;
      private String[] createSchemaStatements;
      private String[] createLockSchemaStatements;
      private String[] dropSchemaStatements;
      private String lockCreateStatement;
      private String lockUpdateStatement;
      private String nextDurableSubscriberMessageStatement;
      private String durableSubscriberMessageCountStatement;
      private String lastAckedDurableSubscriberMessageStatement;
      private String destinationMessageCountStatement;
      private String findNextMessagesStatement;
      private String findNextMessagesByPriorityStatement;
      private boolean useLockCreateWhereClause;
      private String findAllMessageIdsStatement;
      private String lastProducerSequenceIdStatement;
      private String selectDurablePriorityAckStatement;
  
      private String insertDurablePriorityAckStatement;
      private String updateDurableLastAckStatement;
      private String deleteOldMessagesStatementWithPriority;
      private String durableSubscriberMessageCountStatementWithPriority;
      private String dropAckPKAlterStatementEnd;
      private String updateXidFlagStatement;
      private String findOpsPendingOutcomeStatement;
      private String clearXidFlagStatement;
      private String updateDurableLastAckInTxStatement;
      private String findAcksPendingOutcomeStatement;
      private String clearDurableLastAckInTxStatement;
      private String updateDurableLastAckWithPriorityStatement;
      private String updateDurableLastAckWithPriorityInTxStatement;
      private String findXidByIdStatement;
      private String leaseObtainStatement;
      private String currentDateTimeStatement;
      private String leaseUpdateStatement;
      private String leaseOwnerStatement;
  
      public String[] getCreateSchemaStatements() {
          if (createSchemaStatements == null) {
              createSchemaStatements = new String[] {
                  "CREATE TABLE " + getFullMessageTableName() + "(" + "ID " + sequenceDataType + " NOT NULL"
                      + ", CONTAINER " + containerNameDataType + " NOT NULL, MSGID_PROD " + msgIdDataType + ", MSGID_SEQ "
                      + sequenceDataType + ", EXPIRATION " + longDataType + ", MSG "
                      + (useExternalMessageReferences ? stringIdDataType : binaryDataType)
                      + ", PRIMARY KEY ( ID ) )",
                  "CREATE INDEX " + getFullMessageTableName() + "_MIDX ON " + getFullMessageTableName() + " (MSGID_PROD,MSGID_SEQ)",
                  "CREATE INDEX " + getFullMessageTableName() + "_CIDX ON " + getFullMessageTableName() + " (CONTAINER)",
                  "CREATE INDEX " + getFullMessageTableName() + "_EIDX ON " + getFullMessageTableName() + " (EXPIRATION)",
                  "CREATE TABLE " + getFullAckTableName() + "(" + "CONTAINER " + containerNameDataType + " NOT NULL"
                      + ", SUB_DEST " + stringIdDataType 
                      + ", CLIENT_ID " + stringIdDataType + " NOT NULL" + ", SUB_NAME " + stringIdDataType
                      + " NOT NULL" + ", SELECTOR " + stringIdDataType + ", LAST_ACKED_ID " + sequenceDataType
                      + ", CONSTRAINT PK_" + getDurableSubAcksTableName() + " PRIMARY KEY ( CONTAINER, CLIENT_ID, SUB_NAME))",
                  "ALTER TABLE " + getFullMessageTableName() + " ADD PRIORITY " + sequenceDataType,
                  "CREATE INDEX " + getFullMessageTableName() + "_PIDX ON " + getFullMessageTableName() + " (PRIORITY)",
                  "ALTER TABLE " + getFullMessageTableName() + " ADD XID " + stringIdDataType,
                  "ALTER TABLE " + getFullAckTableName() + " ADD PRIORITY " + sequenceDataType  + " DEFAULT 5 NOT NULL",
                  "ALTER TABLE " + getFullAckTableName() + " ADD XID " + stringIdDataType,
                  "ALTER TABLE " + getFullAckTableName() + " " + getDropAckPKAlterStatementEnd(),
                  "ALTER TABLE " + getFullAckTableName() + " ADD PRIMARY KEY (CONTAINER, CLIENT_ID, SUB_NAME, PRIORITY)",
                  "CREATE INDEX " + getFullMessageTableName() + "_XIDX ON " + getFullMessageTableName() + " (XID)",
                  "CREATE INDEX " + getFullAckTableName() + "_XIDX ON " + getFullAckTableName() + " (XID)",
                  "CREATE INDEX " + getFullMessageTableName() + "_IIDX ON " + getFullMessageTableName() + " (ID ASC, XID, CONTAINER)"
              };
          }
          getCreateLockSchemaStatements();
          String[] allCreateStatements = new String[createSchemaStatements.length + createLockSchemaStatements.length];
          System.arraycopy(createSchemaStatements, 0, allCreateStatements, 0, createSchemaStatements.length);
          System.arraycopy(createLockSchemaStatements, 0, allCreateStatements, createSchemaStatements.length, createLockSchemaStatements.length);
  
          return allCreateStatements;
      }
  
      public String[] getCreateLockSchemaStatements() {
          if (createLockSchemaStatements == null) {
              createLockSchemaStatements = new String[] {
                  "CREATE TABLE " + getFullLockTableName()
                      + "( ID " + longDataType + " NOT NULL, TIME " + longDataType
                      + ", BROKER_NAME " + stringIdDataType + ", PRIMARY KEY (ID) )",
                  "INSERT INTO " + getFullLockTableName() + "(ID) VALUES (1)"
              };
          }
          return createLockSchemaStatements;
      }
  
      public String getDropAckPKAlterStatementEnd() {
          if (dropAckPKAlterStatementEnd == null) {
              dropAckPKAlterStatementEnd = "DROP PRIMARY KEY";
          }
          return dropAckPKAlterStatementEnd;
      }
  
      public void setDropAckPKAlterStatementEnd(String dropAckPKAlterStatementEnd) {
          this.dropAckPKAlterStatementEnd = dropAckPKAlterStatementEnd;
      }
  
      public String[] getDropSchemaStatements() {
          if (dropSchemaStatements == null) {
              dropSchemaStatements = new String[] {"DROP TABLE " + getFullAckTableName() + "",
                                                   "DROP TABLE " + getFullMessageTableName() + "",
                                                   "DROP TABLE " + getFullLockTableName() + ""};
          }
          return dropSchemaStatements;
      }
  
      public String getAddMessageStatement() {
          if (addMessageStatement == null) {
              addMessageStatement = "INSERT INTO "
                                    + getFullMessageTableName()
                                    + "(ID, MSGID_PROD, MSGID_SEQ, CONTAINER, EXPIRATION, PRIORITY, MSG, XID) VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
          }
          return addMessageStatement;
      }
  
      public String getUpdateMessageStatement() {
          if (updateMessageStatement == null) {
              updateMessageStatement = "UPDATE " + getFullMessageTableName() + " SET MSG=? WHERE MSGID_PROD=? AND MSGID_SEQ=? AND CONTAINER=?";
          }
          return updateMessageStatement;
      }
  
      public String getRemoveMessageStatement() {
          if (removeMessageStatement == null) {
              removeMessageStatement = "DELETE FROM " + getFullMessageTableName() + " WHERE ID=?";
          }
          return removeMessageStatement;
      }
  
      public String getFindMessageSequenceIdStatement() {
          if (findMessageSequenceIdStatement == null) {
              findMessageSequenceIdStatement = "SELECT ID, PRIORITY FROM " + getFullMessageTableName()
                                               + " WHERE MSGID_PROD=? AND MSGID_SEQ=? AND CONTAINER=?";
          }
          return findMessageSequenceIdStatement;
      }
  
      public String getFindMessageStatement() {
          if (findMessageStatement == null) {
              findMessageStatement = "SELECT MSG FROM " + getFullMessageTableName() + " WHERE MSGID_PROD=? AND MSGID_SEQ=?";
          }
          return findMessageStatement;
      }
  
      public String getFindMessageByIdStatement() {
          if (findMessageByIdStatement == null) {
          	findMessageByIdStatement = "SELECT MSG FROM " + getFullMessageTableName() + " WHERE ID=?";
          }
          return findMessageByIdStatement;
      }
  
      public String getFindXidByIdStatement() {
          if (findXidByIdStatement == null) {
              findXidByIdStatement = "SELECT XID FROM " + getFullMessageTableName() + " WHERE ID=?";
          }
          return findXidByIdStatement;
      }
  
      public String getFindAllMessagesStatement() {
          if (findAllMessagesStatement == null) {
              findAllMessagesStatement = "SELECT ID, MSG FROM " + getFullMessageTableName()
                                         + " WHERE CONTAINER=? ORDER BY ID";
          }
          return findAllMessagesStatement;
      }
      
      public String getFindAllMessageIdsStatement() {
          //  this needs to be limited maybe need to use getFindLastSequenceIdInMsgsStatement
          // and work back for X
          if (findAllMessageIdsStatement == null) {
              findAllMessageIdsStatement = "SELECT ID, MSGID_PROD, MSGID_SEQ FROM " + getFullMessageTableName()
                                         + " ORDER BY ID DESC";
          }
          return findAllMessageIdsStatement;
      }
  
      public void setFindAllMessageIdsStatement(String val) {
          findAllMessageIdsStatement = val;
      }
  
      public String getFindLastSequenceIdInMsgsStatement() {
          if (findLastSequenceIdInMsgsStatement == null) {
              findLastSequenceIdInMsgsStatement = "SELECT MAX(ID) FROM " + getFullMessageTableName();
          }
          return findLastSequenceIdInMsgsStatement;
      }
  
      public String getLastProducerSequenceIdStatement() {
          if (lastProducerSequenceIdStatement == null) {
              lastProducerSequenceIdStatement = "SELECT MAX(MSGID_SEQ) FROM " + getFullMessageTableName()
                                              + " WHERE MSGID_PROD=?";
          }
          return lastProducerSequenceIdStatement;
      }
  
  
      public String getFindLastSequenceIdInAcksStatement() {
          if (findLastSequenceIdInAcksStatement == null) {
              findLastSequenceIdInAcksStatement = "SELECT MAX(LAST_ACKED_ID) FROM " + getFullAckTableName();
          }
          return findLastSequenceIdInAcksStatement;
      }
  
      public String getCreateDurableSubStatement() {
          if (createDurableSubStatement == null) {
              createDurableSubStatement = "INSERT INTO "
                                          + getFullAckTableName()
                                          + "(CONTAINER, CLIENT_ID, SUB_NAME, SELECTOR, LAST_ACKED_ID, SUB_DEST, PRIORITY) "
                                          + "VALUES (?, ?, ?, ?, ?, ?, ?)";
          }
          return createDurableSubStatement;
      }
  
      public String getFindDurableSubStatement() {
          if (findDurableSubStatement == null) {
              findDurableSubStatement = "SELECT SELECTOR, SUB_DEST " + "FROM " + getFullAckTableName()
                                        + " WHERE CONTAINER=? AND CLIENT_ID=? AND SUB_NAME=?";
          }
          return findDurableSubStatement;
      }
  
      public String getFindAllDurableSubsStatement() {
          if (findAllDurableSubsStatement == null) {
              findAllDurableSubsStatement = "SELECT SELECTOR, SUB_NAME, CLIENT_ID, SUB_DEST" + " FROM "
                                            + getFullAckTableName() + " WHERE CONTAINER=? AND PRIORITY=0";
          }
          return findAllDurableSubsStatement;
      }
  
      public String getUpdateLastPriorityAckRowOfDurableSubStatement() {
          if (updateLastPriorityAckRowOfDurableSubStatement == null) {
              updateLastPriorityAckRowOfDurableSubStatement = "UPDATE " + getFullAckTableName() + " SET LAST_ACKED_ID=?"
                                                   + " WHERE CONTAINER=? AND CLIENT_ID=? AND SUB_NAME=? AND PRIORITY=?";
          }
          return updateLastPriorityAckRowOfDurableSubStatement;
      }
  
      public String getDeleteSubscriptionStatement() {
          if (deleteSubscriptionStatement == null) {
              deleteSubscriptionStatement = "DELETE FROM " + getFullAckTableName()
                                            + " WHERE CONTAINER=? AND CLIENT_ID=? AND SUB_NAME=?";
          }
          return deleteSubscriptionStatement;
      }
  
      public String getFindAllDurableSubMessagesStatement() {
          if (findAllDurableSubMessagesStatement == null) {
              findAllDurableSubMessagesStatement = "SELECT M.ID, M.MSG FROM " + getFullMessageTableName()
                                                   + " M, " + getFullAckTableName() + " D "
                                                   + " WHERE D.CONTAINER=? AND D.CLIENT_ID=? AND D.SUB_NAME=?"
                                                   + " AND M.CONTAINER=D.CONTAINER AND M.ID > D.LAST_ACKED_ID"
                                                   + " ORDER BY M.PRIORITY DESC, M.ID";
          }
          return findAllDurableSubMessagesStatement;
      }
  
      public String getFindDurableSubMessagesStatement() {
          if (findDurableSubMessagesStatement == null) {
              findDurableSubMessagesStatement = "SELECT M.ID, M.MSG FROM " + getFullMessageTableName() + " M, "
                                                + getFullAckTableName() + " D "
                                                + " WHERE D.CONTAINER=? AND D.CLIENT_ID=? AND D.SUB_NAME=?"
                                                + " AND M.XID IS NULL"
                                                + " AND M.CONTAINER=D.CONTAINER AND M.ID > D.LAST_ACKED_ID"
                                                + " AND M.ID > ?"
                                                + " ORDER BY M.ID";
          }
          return findDurableSubMessagesStatement;
      }
      
      public String getFindDurableSubMessagesByPriorityStatement() {
          if (findDurableSubMessagesByPriorityStatement == null) {
              findDurableSubMessagesByPriorityStatement = "SELECT M.ID, M.MSG FROM " + getFullMessageTableName() + " M,"
                                                + " " + getFullAckTableName() + " D"
                                                + " WHERE D.CONTAINER=? AND D.CLIENT_ID=? AND D.SUB_NAME=?"
                                                + " AND M.XID IS NULL"
                                                + " AND M.CONTAINER=D.CONTAINER"
                                                + " AND M.PRIORITY=D.PRIORITY AND M.ID > D.LAST_ACKED_ID"
                                                + " AND M.ID > ? AND M.PRIORITY = ?"
                                                + " ORDER BY M.ID";
          }
          return findDurableSubMessagesByPriorityStatement;
      }    
  
      public String getNextDurableSubscriberMessageStatement() {
          if (nextDurableSubscriberMessageStatement == null) {
              nextDurableSubscriberMessageStatement = "SELECT M.ID, M.MSG FROM "
                                                      + getFullMessageTableName()
                                                      + " M, "
                                                      + getFullAckTableName()
                                                      + " D "
                                                      + " WHERE D.CONTAINER=? AND D.CLIENT_ID=? AND D.SUB_NAME=?"
                                                      + " AND M.CONTAINER=D.CONTAINER AND M.ID > ?"
                                                      + " ORDER BY M.ID ";
          }
          return nextDurableSubscriberMessageStatement;
      }
  
      /**
       * @return the durableSubscriberMessageCountStatement
       */
  
      public String getDurableSubscriberMessageCountStatement() {
          if (durableSubscriberMessageCountStatement == null) {
              durableSubscriberMessageCountStatement = "SELECT COUNT(*) FROM "
                                                       + getFullMessageTableName()
                                                       + " M, "
                                                       + getFullAckTableName()
                                                       + " D "
                                                       + " WHERE D.CONTAINER=? AND D.CLIENT_ID=? AND D.SUB_NAME=?"
                                                       + " AND M.CONTAINER=D.CONTAINER "
                                                       + "     AND M.ID >"
                                                       + "          ( SELECT LAST_ACKED_ID FROM " + getFullAckTableName()
                                                       + "           WHERE CONTAINER=D.CONTAINER AND CLIENT_ID=D.CLIENT_ID"
                                                       + "           AND SUB_NAME=D.SUB_NAME )";
  
          }
          return durableSubscriberMessageCountStatement;
      }
  
      public String getDurableSubscriberMessageCountStatementWithPriority() {
          if (durableSubscriberMessageCountStatementWithPriority == null) {
              durableSubscriberMessageCountStatementWithPriority = "SELECT COUNT(*) FROM "
                                                       + getFullMessageTableName()
                                                       + " M, "
                                                       + getFullAckTableName()
                                                       + " D "
                                                       + " WHERE D.CONTAINER=? AND D.CLIENT_ID=? AND D.SUB_NAME=?"
                                                       + " AND M.CONTAINER=D.CONTAINER "
                                                       + " AND M.PRIORITY=D.PRIORITY "
                                                       + " AND M.ID > D.LAST_ACKED_ID";
          }
  
          return durableSubscriberMessageCountStatementWithPriority;
      }
  
      public String getFindAllDestinationsStatement() {
          if (findAllDestinationsStatement == null) {
              findAllDestinationsStatement = "SELECT DISTINCT CONTAINER FROM " + getFullMessageTableName()
                      + " WHERE CONTAINER IS NOT NULL UNION SELECT DISTINCT CONTAINER FROM " + getFullAckTableName();
          }
          return findAllDestinationsStatement;
      }
  
      public String getRemoveAllMessagesStatement() {
          if (removeAllMessagesStatement == null) {
              removeAllMessagesStatement = "DELETE FROM " + getFullMessageTableName() + " WHERE CONTAINER=?";
          }
          return removeAllMessagesStatement;
      }
  
      public String getRemoveAllSubscriptionsStatement() {
          if (removeAllSubscriptionsStatement == null) {
              removeAllSubscriptionsStatement = "DELETE FROM " + getFullAckTableName() + " WHERE CONTAINER=?";
          }
          return removeAllSubscriptionsStatement;
      }
  
      public String getDeleteOldMessagesStatementWithPriority() {
          if (deleteOldMessagesStatementWithPriority == null) {
              deleteOldMessagesStatementWithPriority = "DELETE FROM " + getFullMessageTableName()
                                           + " WHERE (PRIORITY=? AND ID <= "
                                           + "     ( SELECT min(" + getFullAckTableName() + ".LAST_ACKED_ID)"
                                           + "       FROM " + getFullAckTableName() + " WHERE "
                                           +          getFullAckTableName() + ".CONTAINER="
                                           +          getFullMessageTableName() + ".CONTAINER"
                                           + "        AND " + getFullAckTableName() + ".PRIORITY=?)"
                                           + "   )";
          }
          return deleteOldMessagesStatementWithPriority;
      }
  
      public String getLockCreateStatement() {
          if (lockCreateStatement == null) {
              lockCreateStatement = "SELECT * FROM " + getFullLockTableName();
              if (useLockCreateWhereClause) {
                  lockCreateStatement += " WHERE ID = 1";
              }
              lockCreateStatement += " FOR UPDATE";
          }
          return lockCreateStatement;
      }
  
      public String getLeaseObtainStatement() {
          if (leaseObtainStatement == null) {
              leaseObtainStatement = "UPDATE " + getFullLockTableName()
                      + " SET BROKER_NAME=?, TIME=?"
                      + " WHERE (TIME IS NULL OR TIME < ?) AND ID = 1";
          }
          return leaseObtainStatement;
      }
  
      public String getCurrentDateTime() {
          if (currentDateTimeStatement == null) {
              currentDateTimeStatement = "SELECT CURRENT_TIMESTAMP FROM " + getFullLockTableName();
          }
          return currentDateTimeStatement;
      }
  
      public String getLeaseUpdateStatement() {
          if (leaseUpdateStatement == null) {
              leaseUpdateStatement = "UPDATE " + getFullLockTableName()
                      + " SET BROKER_NAME=?, TIME=?"
                      + " WHERE BROKER_NAME=? AND ID = 1";
          }
          return leaseUpdateStatement;
      }
  
      public String getLeaseOwnerStatement() {
          if (leaseOwnerStatement == null) {
              leaseOwnerStatement = "SELECT BROKER_NAME, TIME FROM " + getFullLockTableName()
                      + " WHERE ID = 1";
          }
          return leaseOwnerStatement;
      }
  
      public String getLockUpdateStatement() {
          if (lockUpdateStatement == null) {
              lockUpdateStatement = "UPDATE " + getFullLockTableName() + " SET TIME = ? WHERE ID = 1";
          }
          return lockUpdateStatement;
      }
  
      /**
       * @return the destinationMessageCountStatement
       */
      public String getDestinationMessageCountStatement() {
          if (destinationMessageCountStatement == null) {
              destinationMessageCountStatement = "SELECT COUNT(*) FROM " + getFullMessageTableName()
                                                 + " WHERE CONTAINER=? AND XID IS NULL";
          }
          return destinationMessageCountStatement;
      }
  
      /**
       * @return the findNextMessagesStatement
       */
      public String getFindNextMessagesStatement() {
          if (findNextMessagesStatement == null) {
              findNextMessagesStatement = "SELECT ID, MSG FROM " + getFullMessageTableName()
                                          + " WHERE CONTAINER=? AND ID < ? AND ID > ? AND XID IS NULL ORDER BY ID";
          }
          return findNextMessagesStatement;
      }
  
      /**
       * @return the findNextMessagesStatement
       */
      public String getFindNextMessagesByPriorityStatement() {
          if (findNextMessagesByPriorityStatement == null) {
              findNextMessagesByPriorityStatement = "SELECT ID, MSG FROM " + getFullMessageTableName()
                                          + " WHERE CONTAINER=?"
                                          + " AND XID IS NULL"
                                          + " AND ID < ? "
                                          + " AND ( (ID > ? AND PRIORITY = 9) "
                                          + "    OR (ID > ? AND PRIORITY = 8) "
                                          + "    OR (ID > ? AND PRIORITY = 7) "
                                          + "    OR (ID > ? AND PRIORITY = 6) "
                                          + "    OR (ID > ? AND PRIORITY = 5) "
                                          + "    OR (ID > ? AND PRIORITY = 4) "
                                          + "    OR (ID > ? AND PRIORITY = 3) "
                                          + "    OR (ID > ? AND PRIORITY = 2) "
                                          + "    OR (ID > ? AND PRIORITY = 1) "
                                          + "    OR (ID > ? AND PRIORITY = 0) )"
                                          + " ORDER BY PRIORITY DESC, ID";
          }
          return findNextMessagesByPriorityStatement;
      }    
  
      public void setFindNextMessagesByPriorityStatement(String val) {
          findNextMessagesByPriorityStatement = val;
      }
  
      /**
       * @return the lastAckedDurableSubscriberMessageStatement
       */
      public String getLastAckedDurableSubscriberMessageStatement() {
          if (lastAckedDurableSubscriberMessageStatement == null) {
              lastAckedDurableSubscriberMessageStatement = "SELECT MAX(LAST_ACKED_ID) FROM "
                                                           + getFullAckTableName()
                                                           + " WHERE CONTAINER=? AND CLIENT_ID=? AND SUB_NAME=?";                                                    
          }
          return lastAckedDurableSubscriberMessageStatement;
      }
  
      public String getSelectDurablePriorityAckStatement() {
          if (selectDurablePriorityAckStatement == null) {
              selectDurablePriorityAckStatement = "SELECT LAST_ACKED_ID FROM " + getFullAckTableName()
                                                      + " WHERE CONTAINER=? AND CLIENT_ID=? AND SUB_NAME=?"
                                                      + " AND PRIORITY = ?";
          }
          return selectDurablePriorityAckStatement;
      }
  
      public String getInsertDurablePriorityAckStatement() {
          if (insertDurablePriorityAckStatement == null) {
              insertDurablePriorityAckStatement = "INSERT INTO "
                                    + getFullAckTableName()
                                    + "(CONTAINER, CLIENT_ID, SUB_NAME, PRIORITY)"
                                    + " VALUES (?, ?, ?, ?)";            
         }
          return insertDurablePriorityAckStatement;
      }
  
  
      public String getUpdateDurableLastAckStatement() {
          if (updateDurableLastAckStatement == null) {
              updateDurableLastAckStatement  = "UPDATE " + getFullAckTableName()
                      + " SET LAST_ACKED_ID=?, XID = NULL WHERE CONTAINER=? AND CLIENT_ID=? AND SUB_NAME=?";
          }
          return  updateDurableLastAckStatement;
      }
  
      public String getUpdateDurableLastAckInTxStatement() {
          if (updateDurableLastAckInTxStatement == null) {
              updateDurableLastAckInTxStatement = "UPDATE " + getFullAckTableName()
                      + " SET XID=? WHERE CONTAINER=? AND CLIENT_ID=? AND SUB_NAME=?";
          }
          return updateDurableLastAckInTxStatement;
      }
  
      public String getUpdateDurableLastAckWithPriorityStatement() {
          if (updateDurableLastAckWithPriorityStatement == null) {
              updateDurableLastAckWithPriorityStatement  = "UPDATE " + getFullAckTableName()
                      + " SET LAST_ACKED_ID=?, XID = NULL WHERE CONTAINER=? AND CLIENT_ID=? AND SUB_NAME=? AND PRIORITY=?";
          }
          return  updateDurableLastAckWithPriorityStatement;
      }
  
      public String getUpdateDurableLastAckWithPriorityInTxStatement() {
          if (updateDurableLastAckWithPriorityInTxStatement == null) {
              updateDurableLastAckWithPriorityInTxStatement  = "UPDATE " + getFullAckTableName()
                      + " SET XID=? WHERE CONTAINER=? AND CLIENT_ID=? AND SUB_NAME=? AND PRIORITY=?";
          }
          return  updateDurableLastAckWithPriorityInTxStatement;
      }
  
      public String getClearDurableLastAckInTxStatement() {
          if (clearDurableLastAckInTxStatement == null) {
              clearDurableLastAckInTxStatement = "UPDATE " + getFullAckTableName()
                      + " SET XID = NULL WHERE CONTAINER=? AND CLIENT_ID=? AND SUB_NAME=? AND PRIORITY=?";
          }
          return clearDurableLastAckInTxStatement;
      }
  
      public String getFindOpsPendingOutcomeStatement() {
          if (findOpsPendingOutcomeStatement == null) {
              findOpsPendingOutcomeStatement = "SELECT ID, XID, MSG FROM " + getFullMessageTableName()
                      + " WHERE XID IS NOT NULL ORDER BY ID";
          }
          return findOpsPendingOutcomeStatement;
      }
  
      public String getFindAcksPendingOutcomeStatement() {
          if (findAcksPendingOutcomeStatement == null) {
              findAcksPendingOutcomeStatement = "SELECT XID," +
                      " CONTAINER, CLIENT_ID, SUB_NAME FROM " + getFullAckTableName()
                      + " WHERE XID IS NOT NULL";
          }
          return findAcksPendingOutcomeStatement;
      }
  
      public String getUpdateXidFlagStatement() {
          if (updateXidFlagStatement == null) {
              updateXidFlagStatement = "UPDATE " + getFullMessageTableName()
                      + " SET XID = ? WHERE ID = ?";
          }
          return updateXidFlagStatement;
      }
  
      public String getClearXidFlagStatement() {
          if (clearXidFlagStatement == null) {
              clearXidFlagStatement = "UPDATE "  + getFullMessageTableName()
                      + " SET XID = NULL, ID = ? WHERE ID = ?";
          }
          return clearXidFlagStatement;
      }
  
      public String getFullMessageTableName() {
          return getTablePrefix() + getMessageTableName();
      }
  
      public String getFullAckTableName() {
          return getTablePrefix() + getDurableSubAcksTableName();
      }
  
      public String getFullLockTableName() {
          return getTablePrefix() + getLockTableName();
      }
  
      /**
       * @return Returns the containerNameDataType.
       */
      public String getContainerNameDataType() {
          return containerNameDataType;
      }
  
      /**
       * @param containerNameDataType The containerNameDataType to set.
       */
      public void setContainerNameDataType(String containerNameDataType) {
          this.containerNameDataType = containerNameDataType;
      }
  
      /**
       * @return Returns the messageDataType.
       */
      public String getBinaryDataType() {
          return binaryDataType;
      }
  
      /**
       * @param messageDataType The messageDataType to set.
       */
      public void setBinaryDataType(String messageDataType) {
          this.binaryDataType = messageDataType;
      }
  
      /**
       * @return Returns the messageTableName.
       */
      public String getMessageTableName() {
          return messageTableName;
      }
  
      /**
       * @param messageTableName The messageTableName to set.
       */
      public void setMessageTableName(String messageTableName) {
          this.messageTableName = messageTableName;
      }
  
      /**
       * @return Returns the msgIdDataType.
       */
      public String getMsgIdDataType() {
          return msgIdDataType;
      }
  
      /**
       * @param msgIdDataType The msgIdDataType to set.
       */
      public void setMsgIdDataType(String msgIdDataType) {
          this.msgIdDataType = msgIdDataType;
      }
  
      /**
       * @return Returns the sequenceDataType.
       */
      public String getSequenceDataType() {
          return sequenceDataType;
      }
  
      /**
       * @param sequenceDataType The sequenceDataType to set.
       */
      public void setSequenceDataType(String sequenceDataType) {
          this.sequenceDataType = sequenceDataType;
      }
  
      /**
       * @return Returns the tablePrefix.
       */
      public String getTablePrefix() {
          return tablePrefix;
      }
  
      /**
       * @param tablePrefix The tablePrefix to set.
       */
      public void setTablePrefix(String tablePrefix) {
          this.tablePrefix = tablePrefix;
      }
  
      /**
       * @return Returns the durableSubAcksTableName.
       */
      public String getDurableSubAcksTableName() {
          return durableSubAcksTableName;
      }
  
      /**
       * @param durableSubAcksTableName The durableSubAcksTableName to set.
       */
      public void setDurableSubAcksTableName(String durableSubAcksTableName) {
          this.durableSubAcksTableName = durableSubAcksTableName;
      }
  
      public String getLockTableName() {
          return lockTableName;
      }
  
      public void setLockTableName(String lockTableName) {
          this.lockTableName = lockTableName;
      }
  
      public String getLongDataType() {
          return longDataType;
      }
  
      public void setLongDataType(String longDataType) {
          this.longDataType = longDataType;
      }
  
      public String getStringIdDataType() {
          return stringIdDataType;
      }
  
      public void setStringIdDataType(String stringIdDataType) {
          this.stringIdDataType = stringIdDataType;
      }
  
      public void setUseExternalMessageReferences(boolean useExternalMessageReferences) {
          this.useExternalMessageReferences = useExternalMessageReferences;
      }
  
      public boolean isUseExternalMessageReferences() {
          return useExternalMessageReferences;
      }
  
      public void setAddMessageStatement(String addMessageStatment) {
          this.addMessageStatement = addMessageStatment;
      }
  
      public void setCreateDurableSubStatement(String createDurableSubStatment) {
          this.createDurableSubStatement = createDurableSubStatment;
      }
  
      public void setCreateSchemaStatements(String[] createSchemaStatments) {
          this.createSchemaStatements = createSchemaStatments;
      }
  
      public void setCreateLockSchemaStatements(String[] createLockSchemaStatments) {
          this.createLockSchemaStatements = createLockSchemaStatments;
      }
  
      public void setDeleteOldMessagesStatementWithPriority(String deleteOldMessagesStatementWithPriority) {
          this.deleteOldMessagesStatementWithPriority = deleteOldMessagesStatementWithPriority;
      }
  
      public void setDeleteSubscriptionStatement(String deleteSubscriptionStatment) {
          this.deleteSubscriptionStatement = deleteSubscriptionStatment;
      }
  
      public void setDropSchemaStatements(String[] dropSchemaStatments) {
          this.dropSchemaStatements = dropSchemaStatments;
      }
  
      public void setFindAllDestinationsStatement(String findAllDestinationsStatment) {
          this.findAllDestinationsStatement = findAllDestinationsStatment;
      }
  
      public void setFindAllDurableSubMessagesStatement(String findAllDurableSubMessagesStatment) {
          this.findAllDurableSubMessagesStatement = findAllDurableSubMessagesStatment;
      }
  
      public void setFindAllDurableSubsStatement(String findAllDurableSubsStatment) {
          this.findAllDurableSubsStatement = findAllDurableSubsStatment;
      }
  
      public void setFindAllMessagesStatement(String findAllMessagesStatment) {
          this.findAllMessagesStatement = findAllMessagesStatment;
      }
  
      public void setFindDurableSubStatement(String findDurableSubStatment) {
          this.findDurableSubStatement = findDurableSubStatment;
      }
  
      public void setFindLastSequenceIdInAcksStatement(String findLastSequenceIdInAcks) {
          this.findLastSequenceIdInAcksStatement = findLastSequenceIdInAcks;
      }
  
      public void setFindLastSequenceIdInMsgsStatement(String findLastSequenceIdInMsgs) {
          this.findLastSequenceIdInMsgsStatement = findLastSequenceIdInMsgs;
      }
  
      public void setFindMessageSequenceIdStatement(String findMessageSequenceIdStatment) {
          this.findMessageSequenceIdStatement = findMessageSequenceIdStatment;
      }
  
      public void setFindMessageStatement(String findMessageStatment) {
          this.findMessageStatement = findMessageStatment;
      }
      
      public void setFindMessageByIdStatement(String findMessageByIdStatement) {
          this.findMessageByIdStatement = findMessageByIdStatement;
      }
  
      public void setRemoveAllMessagesStatement(String removeAllMessagesStatment) {
          this.removeAllMessagesStatement = removeAllMessagesStatment;
      }
  
      public void setRemoveAllSubscriptionsStatement(String removeAllSubscriptionsStatment) {
          this.removeAllSubscriptionsStatement = removeAllSubscriptionsStatment;
      }
  
      public void setRemoveMessageStatment(String removeMessageStatement) {
          this.removeMessageStatement = removeMessageStatement;
      }
  
      public void setUpdateLastPriorityAckRowOfDurableSubStatement(String updateLastPriorityAckRowOfDurableSubStatement) {
          this.updateLastPriorityAckRowOfDurableSubStatement = updateLastPriorityAckRowOfDurableSubStatement;
      }
  
      public void setUpdateMessageStatement(String updateMessageStatment) {
          this.updateMessageStatement = updateMessageStatment;
      }
  
      public boolean isUseLockCreateWhereClause() {
          return useLockCreateWhereClause;
      }
  
      public void setUseLockCreateWhereClause(boolean useLockCreateWhereClause) {
          this.useLockCreateWhereClause = useLockCreateWhereClause;
      }
  
      public void setLockCreateStatement(String lockCreateStatement) {
          this.lockCreateStatement = lockCreateStatement;
      }
  
      public void setLockUpdateStatement(String lockUpdateStatement) {
          this.lockUpdateStatement = lockUpdateStatement;
      }
  
      /**
       * @param findDurableSubMessagesStatement the
       *                findDurableSubMessagesStatement to set
       */
      public void setFindDurableSubMessagesStatement(String findDurableSubMessagesStatement) {
          this.findDurableSubMessagesStatement = findDurableSubMessagesStatement;
      }
  
      /**
       * @param nextDurableSubscriberMessageStatement the nextDurableSubscriberMessageStatement to set
       */
      public void setNextDurableSubscriberMessageStatement(String nextDurableSubscriberMessageStatement) {
          this.nextDurableSubscriberMessageStatement = nextDurableSubscriberMessageStatement;
      }
  
      /**
       * @param durableSubscriberMessageCountStatement the durableSubscriberMessageCountStatement to set
       */
      public void setDurableSubscriberMessageCountStatement(String durableSubscriberMessageCountStatement) {
          this.durableSubscriberMessageCountStatement = durableSubscriberMessageCountStatement;
      }
  
      public void setDurableSubscriberMessageCountStatementWithPriority(String durableSubscriberMessageCountStatementWithPriority) {
          this.durableSubscriberMessageCountStatementWithPriority = durableSubscriberMessageCountStatementWithPriority;
      }
  
      /**
       * @param findNextMessagesStatement the findNextMessagesStatement to set
       */
      public void setFindNextMessagesStatement(String findNextMessagesStatement) {
          this.findNextMessagesStatement = findNextMessagesStatement;
      }
  
      /**
       * @param destinationMessageCountStatement the destinationMessageCountStatement to set
       */
      public void setDestinationMessageCountStatement(String destinationMessageCountStatement) {
          this.destinationMessageCountStatement = destinationMessageCountStatement;
      }
  
      /**
       * @param lastAckedDurableSubscriberMessageStatement the lastAckedDurableSubscriberMessageStatement to set
       */
      public void setLastAckedDurableSubscriberMessageStatement(
                                                                String lastAckedDurableSubscriberMessageStatement) {
          this.lastAckedDurableSubscriberMessageStatement = lastAckedDurableSubscriberMessageStatement;
      }
  
  
      public void setLastProducerSequenceIdStatement(String lastProducerSequenceIdStatement) {
          this.lastProducerSequenceIdStatement = lastProducerSequenceIdStatement;
      }
  
      public void setSelectDurablePriorityAckStatement(String selectDurablePriorityAckStatement) {
          this.selectDurablePriorityAckStatement = selectDurablePriorityAckStatement;
      }
  
      public void setInsertDurablePriorityAckStatement(String insertDurablePriorityAckStatement) {
          this.insertDurablePriorityAckStatement = insertDurablePriorityAckStatement;
      }
  
      public void setUpdateDurableLastAckStatement(String updateDurableLastAckStatement) {
          this.updateDurableLastAckStatement = updateDurableLastAckStatement;
      }
  
      public void setUpdateXidFlagStatement(String updateXidFlagStatement) {
          this.updateXidFlagStatement = updateXidFlagStatement;
      }
  
      public void setFindOpsPendingOutcomeStatement(String findOpsPendingOutcomeStatement) {
          this.findOpsPendingOutcomeStatement = findOpsPendingOutcomeStatement;
      }
  
      public void setClearXidFlagStatement(String clearXidFlagStatement) {
          this.clearXidFlagStatement = clearXidFlagStatement;
      }
  
      public void setUpdateDurableLastAckInTxStatement(String updateDurableLastAckInTxStatement) {
          this.updateDurableLastAckInTxStatement = updateDurableLastAckInTxStatement;
      }
  
      public void setFindAcksPendingOutcomeStatement(String findAcksPendingOutcomeStatement) {
          this.findAcksPendingOutcomeStatement = findAcksPendingOutcomeStatement;
      }
  
      public void setClearDurableLastAckInTxStatement(String clearDurableLastAckInTxStatement) {
          this.clearDurableLastAckInTxStatement = clearDurableLastAckInTxStatement;
      }
  
      public void setUpdateDurableLastAckWithPriorityStatement(String updateDurableLastAckWithPriorityStatement) {
          this.updateDurableLastAckWithPriorityStatement = updateDurableLastAckWithPriorityStatement;
      }
  
      public void setUpdateDurableLastAckWithPriorityInTxStatement(String updateDurableLastAckWithPriorityInTxStatement) {
          this.updateDurableLastAckWithPriorityInTxStatement = updateDurableLastAckWithPriorityInTxStatement;
      }
  
      public void setFindXidByIdStatement(String findXidByIdStatement) {
          this.findXidByIdStatement = findXidByIdStatement;
      }
  
      public void setLeaseObtainStatement(String leaseObtainStatement) {
          this.leaseObtainStatement = leaseObtainStatement;
      }
  
      public void setCurrentDateTimeStatement(String currentDateTimeStatement) {
          this.currentDateTimeStatement = currentDateTimeStatement;
      }
  
      public void setLeaseUpdateStatement(String leaseUpdateStatement) {
          this.leaseUpdateStatement = leaseUpdateStatement;
      }
  
      public void setLeaseOwnerStatement(String leaseOwnerStatement) {
          this.leaseOwnerStatement = leaseOwnerStatement;
      }
  }
  