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 public void setStatements(Statements statements) { 046 String type = engineType.toUpperCase(); 047 if( !type.equals(INNODB) && !type.equals(NDBCLUSTER) ) { 048 // Don't use LOCK TABLE for the INNODB and NDBCLUSTER engine types... 049 statements.setLockCreateStatement("LOCK TABLE " + statements.getFullLockTableName() + " WRITE"); 050 } 051 052 statements.setBinaryDataType("LONGBLOB"); 053 054 055 String typeClause = typeStatement + "=" + type; 056 if( type.equals(NDBCLUSTER) ) { 057 // in the NDBCLUSTER case we will create as INNODB and then alter to NDBCLUSTER 058 typeClause = typeStatement + "=" + INNODB; 059 } 060 061 // Update the create statements so they use the right type of engine 062 String[] s = statements.getCreateSchemaStatements(); 063 for (int i = 0; i < s.length; i++) { 064 if( s[i].startsWith("CREATE TABLE")) { 065 s[i] = s[i]+ " " + typeClause; 066 } 067 } 068 069 if( type.equals(NDBCLUSTER) ) { 070 // Add the alter statements. 071 ArrayList<String> l = new ArrayList<String>(Arrays.asList(s)); 072 l.add("ALTER TABLE "+statements.getFullMessageTableName()+" ENGINE="+NDBCLUSTER); 073 l.add("ALTER TABLE "+statements.getFullAckTableName()+" ENGINE="+NDBCLUSTER); 074 l.add("ALTER TABLE "+statements.getFullLockTableName()+" ENGINE="+NDBCLUSTER); 075 l.add("FLUSH TABLES"); 076 s = l.toArray(new String[l.size()]); 077 statements.setCreateSchemaStatements(s); 078 } 079 080 super.setStatements(statements); 081 } 082 083 public String getEngineType() { 084 return engineType; 085 } 086 087 public void setEngineType(String engineType) { 088 this.engineType = engineType; 089 } 090 091 public String getTypeStatement() { 092 return typeStatement; 093 } 094 095 public void setTypeStatement(String typeStatement) { 096 this.typeStatement = typeStatement; 097 } 098}