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 java.util.ArrayList;
020import java.util.Arrays;
021
022import org.apache.activemq.store.jdbc.Statements;
023
024/**
025 * 
026 * @org.apache.xbean.XBean element="mysql-jdbc-adapter"
027 * 
028 */
029public class MySqlJDBCAdapter extends DefaultJDBCAdapter {
030
031    // The transactional types..
032    public static final String INNODB = "INNODB";
033    public static final String NDBCLUSTER = "NDBCLUSTER";
034    public static final String BDB = "BDB";
035
036    // The non transactional types..
037    public static final String MYISAM = "MYISAM";
038    public static final String ISAM = "ISAM";
039    public static final String MERGE = "MERGE";
040    public static final String HEAP = "HEAP";
041
042    String engineType = INNODB;
043    String typeStatement = "ENGINE";
044
045    @Override
046    public void setStatements(Statements statements) {
047        String type = engineType.toUpperCase();
048        if( !type.equals(INNODB) &&  !type.equals(NDBCLUSTER) ) {
049            // Don't use LOCK TABLE for the INNODB and NDBCLUSTER engine types...
050            statements.setLockCreateStatement("LOCK TABLE " + statements.getFullLockTableName() + " WRITE");
051        }
052
053        statements.setBinaryDataType("LONGBLOB");
054        
055        
056        String typeClause = typeStatement + "=" + type;
057        if( type.equals(NDBCLUSTER) ) {
058            // in the NDBCLUSTER case we will create as INNODB and then alter to NDBCLUSTER
059            typeClause = typeStatement + "=" + INNODB;
060        }
061        
062        // Update the create statements so they use the right type of engine 
063        String[] s = statements.getCreateSchemaStatements();
064        for (int i = 0; i < s.length; i++) {
065            if( s[i].startsWith("CREATE TABLE")) {
066                s[i] = s[i]+ " " + typeClause;
067            }
068        }
069        
070        if( type.equals(NDBCLUSTER) ) {
071            // Add the alter statements.
072            ArrayList<String> l = new ArrayList<String>(Arrays.asList(s));
073            l.add("ALTER TABLE "+statements.getFullMessageTableName()+" ENGINE="+NDBCLUSTER);
074            l.add("ALTER TABLE "+statements.getFullAckTableName()+" ENGINE="+NDBCLUSTER);
075            l.add("ALTER TABLE "+statements.getFullLockTableName()+" ENGINE="+NDBCLUSTER);
076            l.add("FLUSH TABLES");
077            s = l.toArray(new String[l.size()]);
078            statements.setCreateSchemaStatements(s);
079        }        
080        
081        super.setStatements(statements);
082    }
083
084    public String getEngineType() {
085        return engineType;
086    }
087
088    public void setEngineType(String engineType) {
089        this.engineType = engineType;
090    }
091
092    public String getTypeStatement() {
093        return typeStatement;
094    }
095
096    public void setTypeStatement(String typeStatement) {
097        this.typeStatement = typeStatement;
098    }
099}