001    /**
002     * 
003     * Copyright 2004 Protique Ltd
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     * Axion specific Adapter.
024     * 
025     * Axion does not seem to support ALTER statments or Subselects.  This means:
026     * - We cannot auto upgrade the schema was we roll out new versions of ActiveMQ
027     * - We cannot delete durable sub messages that have be acknowleged by all consumers.
028     * 
029     * @version $Revision: 1.1 $
030     */
031    public class AxionJDBCAdapter extends StreamJDBCAdapter {
032    
033        public static StatementProvider createStatementProvider() {
034            DefaultStatementProvider answer = new DefaultStatementProvider() {
035                public String [] getCreateSchemaStatments() {
036                    return new String[]{
037                        "CREATE TABLE "+tablePrefix+messageTableName+"("
038                                       +"ID "+sequenceDataType+" NOT NULL"
039                                       +", CONTAINER "+containerNameDataType
040                                       +", MSGID "+msgIdDataType
041                                       +", MSG "+binaryDataType
042                                       +", EXPIRATION "+longDataType
043                                       +", PRIMARY KEY ( ID ) )",                          
044                        "CREATE INDEX "+tablePrefix+messageTableName+"_MIDX ON "+tablePrefix+messageTableName+" (MSGID)",
045                        "CREATE INDEX "+tablePrefix+messageTableName+"_CIDX ON "+tablePrefix+messageTableName+" (CONTAINER)",                    
046                        "CREATE TABLE "+tablePrefix+txTableName+"("
047                                       +"XID "+xidDataType+" NOT NULL"
048                                       +", PRIMARY KEY ( XID ))",                                   
049                        "CREATE TABLE "+tablePrefix+durableSubAcksTableName+"("
050                                       +"SUB "+subscriptionIdDataType+" NOT NULL"
051                                       +", CONTAINER "+containerNameDataType+" NOT NULL"
052                                       +", LAST_ACKED_ID "+sequenceDataType
053                                       +", SE_ID INTEGER"
054                                       +", SE_CLIENT_ID "+stringIdDataType
055                                       +", SE_CONSUMER_NAME "+stringIdDataType
056                                       +", SE_SELECTOR "+stringIdDataType
057                                       +", PRIMARY KEY ( SUB, CONTAINER ))",
058                        "CREATE INDEX "+tablePrefix+durableSubAcksTableName+"_CIDX ON "+tablePrefix+durableSubAcksTableName+" (CONTAINER)",            
059                    };
060                }
061                
062                public String getDeleteOldMessagesStatment() {
063                    return "DELETE FROM "+tablePrefix+messageTableName+
064                        " WHERE ( EXPIRATION<>0 AND EXPIRATION<?)";
065                }
066    
067            };
068            answer.setLongDataType("LONG");
069            return answer;
070        }
071        
072        public AxionJDBCAdapter() {
073            this(createStatementProvider());
074        }
075    
076        public AxionJDBCAdapter(StatementProvider provider) {
077            super(provider);        
078        }
079    }