001/**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  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 */
017package org.apache.activemq.store.jdbc.adapter;
018
019import org.apache.activemq.store.jdbc.Statements;
020
021/**
022 * Axion specific Adapter.
023 * 
024 * Axion does not seem to support ALTER statements or sub-selects.  This means:
025 * - We cannot auto upgrade the schema was we roll out new versions of ActiveMQ
026 * - We cannot delete durable sub messages that have be acknowledged by all consumers.
027 * 
028 * @org.apache.xbean.XBean element="axionJDBCAdapter"
029 * 
030 */
031public class AxionJDBCAdapter extends StreamJDBCAdapter {
032
033    @Override
034    public void setStatements(Statements statements) {
035        
036        String[] createStatements = new String[]{
037            "CREATE TABLE " + statements.getFullMessageTableName() + "("
038                + "ID " + statements.getSequenceDataType() + " NOT NULL"
039                + ", CONTAINER " + statements.getContainerNameDataType()
040                + ", MSGID_PROD " + statements.getMsgIdDataType()
041                + ", MSGID_SEQ " + statements.getSequenceDataType()
042                + ", EXPIRATION " + statements.getLongDataType()
043                + ", MSG " + (statements.isUseExternalMessageReferences() ? statements.getStringIdDataType() : statements.getBinaryDataType())
044                + ", PRIMARY KEY ( ID ) )",                          
045            "CREATE INDEX " + statements.getFullMessageTableName() + "_MIDX ON " + statements.getFullMessageTableName() + " (MSGID_PROD,MSGID_SEQ)",
046            "CREATE INDEX " + statements.getFullMessageTableName() + "_CIDX ON " + statements.getFullMessageTableName() + " (CONTAINER)",                                       
047            "CREATE INDEX " + statements.getFullMessageTableName() + "_EIDX ON " + statements.getFullMessageTableName() + " (EXPIRATION)",                 
048            "CREATE TABLE " + statements.getFullAckTableName() + "("
049                + "CONTAINER " + statements.getContainerNameDataType() + " NOT NULL"
050                + ", SUB_DEST " + statements.getContainerNameDataType()
051                + ", CLIENT_ID " + statements.getStringIdDataType() + " NOT NULL"
052                + ", SUB_NAME " + statements.getStringIdDataType() + " NOT NULL"
053                + ", SELECTOR " + statements.getStringIdDataType()
054                + ", LAST_ACKED_ID " + statements.getSequenceDataType()
055                + ", PRIMARY KEY ( CONTAINER, CLIENT_ID, SUB_NAME))"
056        };
057        statements.setCreateSchemaStatements(createStatements);
058        statements.setLongDataType("LONG");
059        statements.setSequenceDataType("LONG");
060        
061        super.setStatements(statements);
062    }
063    
064}