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}