Skip to content

Commit

Permalink
0001985: Add support for DB2 iSeries (AS/400)
Browse files Browse the repository at this point in the history
  • Loading branch information
erilong committed Dec 18, 2014
1 parent 75a4f64 commit 2578dac
Show file tree
Hide file tree
Showing 7 changed files with 92 additions and 6 deletions.
Expand Up @@ -22,6 +22,7 @@

import org.jumpmind.db.platform.IDatabasePlatform;
import org.jumpmind.db.platform.ase.AseDatabasePlatform;
import org.jumpmind.db.platform.db2.Db2As400DatabasePlatform;
import org.jumpmind.db.platform.db2.Db2DatabasePlatform;
import org.jumpmind.db.platform.db2.Db2zOsDatabasePlatform;
import org.jumpmind.db.platform.derby.DerbyDatabasePlatform;
Expand All @@ -43,6 +44,7 @@
import org.jumpmind.db.platform.sqlanywhere.SqlAnywhereDatabasePlatform;
import org.jumpmind.db.platform.sqlite.SqliteDatabasePlatform;
import org.jumpmind.symmetric.db.ase.AseSymmetricDialect;
import org.jumpmind.symmetric.db.db2.Db2As400SymmetricDialect;
import org.jumpmind.symmetric.db.db2.Db2SymmetricDialect;
import org.jumpmind.symmetric.db.db2.Db2v9SymmetricDialect;
import org.jumpmind.symmetric.db.db2.Db2zOsSymmetricDialect;
Expand Down Expand Up @@ -118,6 +120,10 @@ public ISymmetricDialect create() {
dialect = new HsqlDb2SymmetricDialect(parameterService, platform);
} else if (platform instanceof InformixDatabasePlatform) {
dialect = new InformixSymmetricDialect(parameterService, platform);
} else if (platform instanceof Db2zOsDatabasePlatform) {
dialect = new Db2zOsSymmetricDialect(parameterService, platform);
} else if (platform instanceof Db2As400DatabasePlatform) {
dialect = new Db2As400SymmetricDialect(parameterService, platform);
} else if (platform instanceof Db2DatabasePlatform) {
int dbMajorVersion = platform.getSqlTemplate().getDatabaseMajorVersion();
int dbMinorVersion = platform.getSqlTemplate().getDatabaseMinorVersion();
Expand All @@ -126,8 +132,6 @@ public ISymmetricDialect create() {
} else {
dialect = new Db2v9SymmetricDialect(parameterService, platform);
}
} else if (platform instanceof Db2zOsDatabasePlatform) {
dialect = new Db2zOsSymmetricDialect(parameterService, platform);
} else if (platform instanceof FirebirdDatabasePlatform) {
int dbMajorVersion = platform.getSqlTemplate().getDatabaseMajorVersion();
int dbMinorVersion = platform.getSqlTemplate().getDatabaseMinorVersion();
Expand Down
@@ -0,0 +1,37 @@
/**
* Licensed to JumpMind Inc under one or more contributor
* license agreements. See the NOTICE file distributed
* with this work for additional information regarding
* copyright ownership. JumpMind Inc licenses this file
* to you under the GNU General Public License, version 3.0 (GPLv3)
* (the "License"); you may not use this file except in compliance
* with the License.
*
* You should have received a copy of the GNU General Public License,
* version 3.0 (GPLv3) along with this library; if not, see
* <http://www.gnu.org/licenses/>.
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jumpmind.symmetric.db.db2;

import org.jumpmind.db.platform.IDatabasePlatform;
import org.jumpmind.symmetric.db.ISymmetricDialect;
import org.jumpmind.symmetric.service.IParameterService;

public class Db2As400SymmetricDialect extends Db2SymmetricDialect implements ISymmetricDialect {

public Db2As400SymmetricDialect(IParameterService parameterService, IDatabasePlatform platform) {
super(parameterService, platform);
}

protected String getSystemSchemaName() {
return "QSYS2";
}

}
Expand Up @@ -56,10 +56,14 @@ protected boolean doesTriggerExistOnPlatform(String catalog, String schema, Stri
schema = schema == null ? (platform.getDefaultSchema() == null ? null : platform
.getDefaultSchema()) : schema;
return platform.getSqlTemplate().queryForInt(
"SELECT COUNT(*) FROM SYSIBM.SYSTRIGGERS WHERE NAME = ? AND SCHEMA = ?",
"SELECT COUNT(*) FROM " + getSystemSchemaName() + ".SYSTRIGGERS WHERE NAME = ? AND SCHEMA = ?",
new Object[] { triggerName.toUpperCase(), schema.toUpperCase() }) > 0;
}

protected String getSystemSchemaName() {
return "SYSIBM";
}

@Override
public void createRequiredDatabaseObjects() {
}
Expand Down Expand Up @@ -117,4 +121,8 @@ protected String getDbSpecificDataHasChangedCondition(Trigger trigger) {
return "var_old_data is null or var_row_data != var_old_data";
}

@Override
public String getSourceNodeExpression() {
return "null";
}
}
Expand Up @@ -42,6 +42,7 @@ private DatabaseNamesConstants() {
public final static String MYSQL = "mysql";
public final static String DB2 = "db2";
public final static String DB2ZOS = "db2zos";
public final static String DB2AS400 = "db2as400";
public final static String POSTGRESQL = "postgres";
public final static String ASE = "ase";
public final static String SQLANYWHERE = "sqlanywhere";
Expand Down
Expand Up @@ -33,6 +33,7 @@
import org.apache.commons.lang.StringUtils;
import org.h2.util.JdbcUtils;
import org.jumpmind.db.platform.ase.AseDatabasePlatform;
import org.jumpmind.db.platform.db2.Db2As400DatabasePlatform;
import org.jumpmind.db.platform.db2.Db2DatabasePlatform;
import org.jumpmind.db.platform.db2.Db2zOsDatabasePlatform;
import org.jumpmind.db.platform.derby.DerbyDatabasePlatform;
Expand Down Expand Up @@ -104,6 +105,7 @@ public class JdbcDatabasePlatformFactory {
addPlatform(platforms, "SQL Anywhere", SqlAnywhereDatabasePlatform.class);
addPlatform(platforms, "DB2", Db2DatabasePlatform.class);
addPlatform(platforms, DatabaseNamesConstants.DB2ZOS, Db2zOsDatabasePlatform.class);
addPlatform(platforms, DatabaseNamesConstants.DB2AS400, Db2As400DatabasePlatform.class);
addPlatform(platforms, "SQLite", SqliteDatabasePlatform.class);
addPlatform(platforms, DatabaseNamesConstants.REDSHIFT, RedshiftDatabasePlatform.class);

Expand Down Expand Up @@ -226,11 +228,18 @@ protected static String[] determineDatabaseNameVersionSubprotocol(DataSource dat
}
}

if (nameVersion[0].equalsIgnoreCase(DatabaseNamesConstants.DB2)) {
if (nameVersion[0].toLowerCase().indexOf(DatabaseNamesConstants.DB2) != -1) {
if (nameVersion[0].toUpperCase().indexOf("Z") != -1) {
nameVersion[0] = DatabaseNamesConstants.DB2ZOS;
} else if (nameVersion[0].indexOf("400") != -1) {
nameVersion[0] = DatabaseNamesConstants.DB2AS400;
} else {
nameVersion[0] = DatabaseNamesConstants.DB2;
}
}
if (nameVersion[0].equalsIgnoreCase("AS") && nameVersion[2].equalsIgnoreCase("db2")) {
nameVersion[0] = DatabaseNamesConstants.DB2AS400;
}

if (nameVersion[0].toLowerCase().startsWith(DatabaseNamesConstants.FIREBIRD)) {
if (isFirebirdDialect1(connection)) {
Expand Down
@@ -0,0 +1,20 @@
package org.jumpmind.db.platform.db2;

import javax.sql.DataSource;

import org.jumpmind.db.sql.SqlTemplateSettings;

public class Db2As400DatabasePlatform extends Db2DatabasePlatform {

public Db2As400DatabasePlatform(DataSource dataSource, SqlTemplateSettings settings) {
super(dataSource, settings);
}

@Override
protected Db2DdlReader createDdlReader() {
Db2DdlReader reader = new Db2DdlReader(this);
reader.setSystemSchemaName("QSYS2");
return reader;
}

}
Expand Up @@ -54,7 +54,9 @@ public class Db2DdlReader extends AbstractJdbcDdlReader {
private Pattern db2TimestampPattern = Pattern
.compile("'(\\d{4}\\-\\d{2}\\-\\d{2})\\-(\\d{2}).(\\d{2}).(\\d{2})(\\.\\d{1,8})?'");

public Db2DdlReader(IDatabasePlatform platform) {
private String systemSchemaName = "SYSIBM";

public Db2DdlReader(IDatabasePlatform platform) {
super(platform);
setDefaultCatalogPattern(null);
setDefaultSchemaPattern(null);
Expand All @@ -76,7 +78,7 @@ protected Table readTable(Connection connection, DatabaseMetaDataWrapper metaDat
if (table != null) {
// DB2 does not return the auto-increment status via the database
// metadata
String sql = "SELECT NAME FROM SYSIBM.SYSCOLUMNS WHERE TBNAME=? AND IDENTITY=?";
String sql = "SELECT NAME FROM " + systemSchemaName + ".SYSCOLUMNS WHERE TBNAME=? AND IDENTITY=?";
if (StringUtils.isNotBlank(metaData.getSchemaPattern())) {
sql = sql + " AND TBCREATOR=?";
}
Expand Down Expand Up @@ -214,4 +216,9 @@ protected boolean isInternalPrimaryKeyIndex(Connection connection,
return pkNames.contains(index.getName());
}
}

public void setSystemSchemaName(String systemSchemaName) {
this.systemSchemaName = systemSchemaName;
}

}

0 comments on commit 2578dac

Please sign in to comment.