001 /** 002 * 003 * Copyright 2004 Hiram Chirino 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 * 017 **/ 018 package org.activemq.store.jdbc.adapter; 019 020 import org.activemq.store.jdbc.StatementProvider; 021 022 023 /** 024 * @version $Revision: 1.1 $ 025 */ 026 public class DefaultStatementProvider implements StatementProvider { 027 028 protected String tablePrefix = ""; 029 protected String messageTableName = "ACTIVEMQ_MSGS"; 030 protected String txTableName = "ACTIVEMQ_TXS"; 031 protected String durableSubAcksTableName = "ACTIVEMQ_ACKS"; 032 033 protected String binaryDataType = "BLOB"; 034 protected String containerNameDataType = "VARCHAR(250)"; 035 protected String xidDataType = "VARCHAR(250)"; 036 protected String msgIdDataType = "VARCHAR(250)"; 037 protected String subscriptionIdDataType = "VARCHAR(250)"; 038 protected String sequenceDataType = "INTEGER"; 039 protected String charDataType = "CHAR(1)"; 040 protected String longDataType = "BIGINT"; 041 protected String stringIdDataType = "VARCHAR(250)"; 042 043 public String [] getCreateSchemaStatments() { 044 return new String[]{ 045 "CREATE TABLE "+tablePrefix+messageTableName+"(" 046 +"ID "+sequenceDataType+" NOT NULL" 047 +", CONTAINER "+containerNameDataType 048 +", MSGID "+msgIdDataType 049 +", MSG "+binaryDataType 050 +", PRIMARY KEY ( ID ) )", 051 "CREATE INDEX "+tablePrefix+messageTableName+"_MIDX ON "+tablePrefix+messageTableName+" (MSGID)", 052 "CREATE INDEX "+tablePrefix+messageTableName+"_CIDX ON "+tablePrefix+messageTableName+" (CONTAINER)", 053 054 "CREATE TABLE "+tablePrefix+txTableName+"(" 055 +"XID "+xidDataType+" NOT NULL" 056 +", PRIMARY KEY ( XID ))", 057 058 "CREATE TABLE "+tablePrefix+durableSubAcksTableName+"(" 059 +"SUB "+subscriptionIdDataType+" NOT NULL" 060 +", CONTAINER "+containerNameDataType+" NOT NULL" 061 +", LAST_ACKED_ID "+sequenceDataType 062 +", SE_ID INTEGER" 063 +", SE_CLIENT_ID "+stringIdDataType 064 +", SE_CONSUMER_NAME "+stringIdDataType 065 +", SE_SELECTOR "+stringIdDataType 066 +", PRIMARY KEY ( SUB, CONTAINER ))", 067 "CREATE INDEX "+tablePrefix+durableSubAcksTableName+"_CIDX ON "+tablePrefix+durableSubAcksTableName+" (CONTAINER)", 068 "ALTER TABLE "+tablePrefix+messageTableName+" ADD EXPIRATION "+longDataType, 069 "ALTER TABLE "+tablePrefix+messageTableName+" ADD SENT_TO_DEADLETTER "+charDataType 070 }; 071 } 072 073 public String [] getDropSchemaStatments() { 074 return new String[]{ 075 "DROP TABLE "+tablePrefix+durableSubAcksTableName+"", 076 "DROP TABLE "+tablePrefix+messageTableName+"", 077 "DROP TABLE "+tablePrefix+txTableName+"" 078 }; 079 } 080 081 public String getAddMessageStatment() { 082 return "INSERT INTO "+tablePrefix+messageTableName+"(ID, CONTAINER, MSGID, MSG, EXPIRATION) VALUES (?, ?, ?, ?, ?)"; 083 } 084 public String getUpdateMessageStatment() { 085 return "UPDATE "+tablePrefix+messageTableName+" SET MSG=? WHERE ID=?"; 086 } 087 public String getRemoveMessageStatment() { 088 return "DELETE FROM "+tablePrefix+messageTableName+" WHERE ID=?"; 089 } 090 public String getFindMessageSequenceIdStatment() { 091 return "SELECT ID FROM "+tablePrefix+messageTableName+" WHERE MSGID=?"; 092 } 093 public String getFindMessageStatment() { 094 return "SELECT MSG FROM "+tablePrefix+messageTableName+" WHERE ID=?"; 095 } 096 public String getFindMessageAttributesStatment() { 097 return "SELECT CONTAINER, MSGID, SENT_TO_DEADLETTER FROM "+tablePrefix+messageTableName+" WHERE ID=?"; 098 } 099 public String getFindMessageAttributesForUpdateStatment() { 100 return "SELECT CONTAINER, MSGID, SENT_TO_DEADLETTER FROM "+tablePrefix+messageTableName+" WHERE ID=? FOR UPDATE"; 101 } 102 public String getFindAllMessagesStatment() { 103 return "SELECT ID, MSGID FROM "+tablePrefix+messageTableName+" WHERE CONTAINER=? ORDER BY ID"; 104 } 105 public String getFindLastSequenceIdInMsgs() { 106 return "SELECT MAX(ID) FROM "+tablePrefix+messageTableName; 107 } 108 public String getFindLastSequenceIdInAcks() { 109 return "SELECT MAX(LAST_ACKED_ID) FROM "+tablePrefix+durableSubAcksTableName; 110 } 111 112 public String getAddXidStatment() { 113 return "INSERT INTO "+tablePrefix+txTableName+"(XID) VALUES (?)"; 114 } 115 public String getRemoveXidStatment() { 116 return "DELETE FROM "+tablePrefix+txTableName+" WHERE XID=?"; 117 } 118 public String getFindAllXidStatment() { 119 return "SELECT XID FROM "+tablePrefix+txTableName+""; 120 } 121 122 public String getCreateDurableSubStatment() { 123 return "INSERT INTO "+tablePrefix+durableSubAcksTableName 124 +"(SE_ID, SE_CLIENT_ID, SE_CONSUMER_NAME, SE_SELECTOR, SUB, CONTAINER, LAST_ACKED_ID) " 125 +"VALUES (?, ?, ?, ?, ?, ?, ?)"; 126 } 127 128 public String getUpdateDurableSubStatment() { 129 return "UPDATE "+tablePrefix+durableSubAcksTableName 130 +" SET SE_ID=?, SE_CLIENT_ID=?, SE_CONSUMER_NAME=?, SE_SELECTOR=? WHERE SUB=? AND CONTAINER=?"; 131 } 132 133 public String getFindDurableSubStatment() { 134 return "SELECT SE_ID, SE_CLIENT_ID, SE_CONSUMER_NAME, SE_SELECTOR, CONTAINER=? "+tablePrefix+durableSubAcksTableName 135 +" WHERE SUB=? AND CONTAINER=?"; 136 } 137 138 public String getUpdateLastAckOfDurableSub() { 139 return "UPDATE "+tablePrefix+durableSubAcksTableName 140 +" SET LAST_ACKED_ID=? WHERE SUB=? AND CONTAINER=?"; 141 } 142 143 public String getDeleteSubscriptionStatment() { 144 return "DELETE FROM "+tablePrefix+durableSubAcksTableName 145 +" WHERE SUB=? AND CONTAINER=?"; 146 } 147 148 public String getFindAllDurableSubMessagesStatment() { 149 return "SELECT M.ID, M.MSGID FROM " 150 +tablePrefix+messageTableName+" M, " 151 +tablePrefix+durableSubAcksTableName +" D " 152 +" WHERE D.CONTAINER=? AND D.SUB=? " 153 +" AND M.CONTAINER=D.CONTAINER AND M.ID > D.LAST_ACKED_ID" 154 +" ORDER BY M.ID"; 155 } 156 157 158 public String getRemoveAllMessagesStatment() { 159 return "DELETE FROM "+tablePrefix+messageTableName+" WHERE CONTAINER=?"; 160 } 161 162 public String getRemoveAllSubscriptionsStatment() { 163 return "DELETE FROM "+tablePrefix+durableSubAcksTableName+" WHERE CONTAINER=?"; 164 } 165 166 public String getDeleteOldMessagesStatment() { 167 return "DELETE FROM "+tablePrefix+messageTableName+ 168 " WHERE ID <= ( SELECT MIN("+tablePrefix+durableSubAcksTableName+".LAST_ACKED_ID) " + 169 "FROM "+tablePrefix+durableSubAcksTableName+" WHERE " + 170 tablePrefix+durableSubAcksTableName+".CONTAINER="+tablePrefix+messageTableName+ 171 ".CONTAINER)"; 172 } 173 174 public String getFindExpiredMessagesStatment() { 175 return "SELECT ID, CONTAINER, MSGID, SENT_TO_DEADLETTER FROM "+tablePrefix+messageTableName+ 176 " WHERE ( EXPIRATION<>0 AND EXPIRATION<?)"; 177 } 178 179 public String getSetDeadLetterFlagStatement() { 180 return "UPDATE "+tablePrefix+messageTableName 181 +" SET SENT_TO_DEADLETTER='Y' WHERE ID=?"; 182 } 183 184 public String getDeleteMessageStatement() { 185 return "DELETE FROM "+tablePrefix+messageTableName 186 +" WHERE ID=? AND MSGID=?"; 187 } 188 189 /** 190 * @return Returns the containerNameDataType. 191 */ 192 public String getContainerNameDataType() { 193 return containerNameDataType; 194 } 195 /** 196 * @param containerNameDataType The containerNameDataType to set. 197 */ 198 public void setContainerNameDataType(String containerNameDataType) { 199 this.containerNameDataType = containerNameDataType; 200 } 201 /** 202 * @return Returns the messageDataType. 203 */ 204 public String getBinaryDataType() { 205 return binaryDataType; 206 } 207 /** 208 * @param messageDataType The messageDataType to set. 209 */ 210 public void setBinaryDataType(String messageDataType) { 211 this.binaryDataType = messageDataType; 212 } 213 /** 214 * @return Returns the messageTableName. 215 */ 216 public String getMessageTableName() { 217 return messageTableName; 218 } 219 /** 220 * @param messageTableName The messageTableName to set. 221 */ 222 public void setMessageTableName(String messageTableName) { 223 this.messageTableName = messageTableName; 224 } 225 /** 226 * @return Returns the msgIdDataType. 227 */ 228 public String getMsgIdDataType() { 229 return msgIdDataType; 230 } 231 /** 232 * @param msgIdDataType The msgIdDataType to set. 233 */ 234 public void setMsgIdDataType(String msgIdDataType) { 235 this.msgIdDataType = msgIdDataType; 236 } 237 /** 238 * @return Returns the sequenceDataType. 239 */ 240 public String getSequenceDataType() { 241 return sequenceDataType; 242 } 243 /** 244 * @param sequenceDataType The sequenceDataType to set. 245 */ 246 public void setSequenceDataType(String sequenceDataType) { 247 this.sequenceDataType = sequenceDataType; 248 } 249 /** 250 * @return Returns the tablePrefix. 251 */ 252 public String getTablePrefix() { 253 return tablePrefix; 254 } 255 /** 256 * @param tablePrefix The tablePrefix to set. 257 */ 258 public void setTablePrefix(String tablePrefix) { 259 this.tablePrefix = tablePrefix; 260 } 261 /** 262 * @return Returns the txTableName. 263 */ 264 public String getTxTableName() { 265 return txTableName; 266 } 267 /** 268 * @param txTableName The txTableName to set. 269 */ 270 public void setTxTableName(String txTableName) { 271 this.txTableName = txTableName; 272 } 273 /** 274 * @return Returns the xidDataType. 275 */ 276 public String getXidDataType() { 277 return xidDataType; 278 } 279 /** 280 * @param xidDataType The xidDataType to set. 281 */ 282 public void setXidDataType(String xidDataType) { 283 this.xidDataType = xidDataType; 284 } 285 /** 286 * @return Returns the durableSubAcksTableName. 287 */ 288 public String getDurableSubAcksTableName() { 289 return durableSubAcksTableName; 290 } 291 /** 292 * @param durableSubAcksTableName The durableSubAcksTableName to set. 293 */ 294 public void setDurableSubAcksTableName(String durableSubAcksTableName) { 295 this.durableSubAcksTableName = durableSubAcksTableName; 296 } 297 /** 298 * @return Returns the subscriptionIdDataType. 299 */ 300 public String getSubscriptionIdDataType() { 301 return subscriptionIdDataType; 302 } 303 /** 304 * @param subscriptionIdDataType The subscriptionIdDataType to set. 305 */ 306 public void setSubscriptionIdDataType(String subscriptionIdDataType) { 307 this.subscriptionIdDataType = subscriptionIdDataType; 308 } 309 310 public String getLongDataType() { 311 return longDataType; 312 } 313 314 public void setLongDataType(String longDataType) { 315 this.longDataType = longDataType; 316 } 317 318 public String getStringIdDataType() { 319 return stringIdDataType; 320 } 321 322 public void setStringIdDataType(String stringIdDataType) { 323 this.stringIdDataType = stringIdDataType; 324 } 325 326 }