version for 1.6.11 : support SQLite

This commit is contained in:
inrgihc
2022-07-02 17:46:13 +08:00
parent 432a470eba
commit fd312588c7
73 changed files with 716 additions and 165 deletions

View File

@@ -5,7 +5,7 @@
<parent>
<groupId>com.gitee.dbswitch</groupId>
<artifactId>dbswitch-parent</artifactId>
<version>1.6.10</version>
<version>1.6.11</version>
</parent>
<artifactId>dbswitch-core</artifactId>
@@ -41,6 +41,11 @@
<artifactId>ojdbc8</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.oracle.ojdbc</groupId>
<artifactId>orai18n</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
@@ -110,6 +115,12 @@
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.31.1</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>

View File

@@ -19,11 +19,12 @@ import com.gitee.dbswitch.core.database.impl.DatabaseMariaDBImpl;
import com.gitee.dbswitch.core.database.impl.DatabaseMysqlImpl;
import com.gitee.dbswitch.core.database.impl.DatabaseOracleImpl;
import com.gitee.dbswitch.core.database.impl.DatabasePostgresImpl;
import com.gitee.dbswitch.core.database.impl.DatabaseSqliteImpl;
import com.gitee.dbswitch.core.database.impl.DatabaseSqlserver2000Impl;
import com.gitee.dbswitch.core.database.impl.DatabaseSqlserverImpl;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import java.util.concurrent.Callable;
/**
* 数据库实例构建工厂类
@@ -32,30 +33,32 @@ import javax.sql.DataSource;
*/
public final class DatabaseFactory {
private static final Map<DatabaseTypeEnum, String> DATABASE_MAPPER = new HashMap<DatabaseTypeEnum, String>() {
private static final Map<DatabaseTypeEnum, Callable<AbstractDatabase>> DATABASE_MAPPER
= new HashMap<DatabaseTypeEnum, Callable<AbstractDatabase>>() {
private static final long serialVersionUID = 9202705534880971997L;
{
put(DatabaseTypeEnum.MYSQL, DatabaseMysqlImpl.class.getName());
put(DatabaseTypeEnum.ORACLE, DatabaseOracleImpl.class.getName());
put(DatabaseTypeEnum.SQLSERVER2000, DatabaseSqlserver2000Impl.class.getName());
put(DatabaseTypeEnum.SQLSERVER, DatabaseSqlserverImpl.class.getName());
put(DatabaseTypeEnum.POSTGRESQL, DatabasePostgresImpl.class.getName());
put(DatabaseTypeEnum.GREENPLUM, DatabaseGreenplumImpl.class.getName());
put(DatabaseTypeEnum.MARIADB, DatabaseMariaDBImpl.class.getName());
put(DatabaseTypeEnum.DB2, DatabaseDB2Impl.class.getName());
put(DatabaseTypeEnum.DM, DatabaseDmImpl.class.getName());
put(DatabaseTypeEnum.KINGBASE, DatabaseKingbaseImpl.class.getName());
put(DatabaseTypeEnum.HIVE, DatabaseHiveImpl.class.getName());
put(DatabaseTypeEnum.MYSQL, DatabaseMysqlImpl::new);
put(DatabaseTypeEnum.ORACLE, DatabaseOracleImpl::new);
put(DatabaseTypeEnum.SQLSERVER2000, DatabaseSqlserver2000Impl::new);
put(DatabaseTypeEnum.SQLSERVER, DatabaseSqlserverImpl::new);
put(DatabaseTypeEnum.POSTGRESQL, DatabasePostgresImpl::new);
put(DatabaseTypeEnum.GREENPLUM, DatabaseGreenplumImpl::new);
put(DatabaseTypeEnum.MARIADB, DatabaseMariaDBImpl::new);
put(DatabaseTypeEnum.DB2, DatabaseDB2Impl::new);
put(DatabaseTypeEnum.DM, DatabaseDmImpl::new);
put(DatabaseTypeEnum.KINGBASE, DatabaseKingbaseImpl::new);
put(DatabaseTypeEnum.HIVE, DatabaseHiveImpl::new);
put(DatabaseTypeEnum.SQLITE3, DatabaseSqliteImpl::new);
}
};
public static AbstractDatabase getDatabaseInstance(DatabaseTypeEnum type) {
if (DATABASE_MAPPER.containsKey(type)) {
String className = DATABASE_MAPPER.get(type);
Callable<AbstractDatabase> callable = DATABASE_MAPPER.get(type);
if (null != callable) {
try {
return (AbstractDatabase) Class.forName(className).newInstance();
return callable.call();
} catch (Exception e) {
throw new RuntimeException(e);
}
@@ -66,6 +69,7 @@ public final class DatabaseFactory {
}
private DatabaseFactory() {
throw new IllegalStateException();
}
}

View File

@@ -0,0 +1,164 @@
// Copyright tang. All rights reserved.
// https://gitee.com/inrgihc/dbswitch
//
// Use of this source code is governed by a BSD-style license
//
// Author: tang (inrgihc@126.com)
// Date : 2020/1/2
// Location: beijing , china
/////////////////////////////////////////////////////////////
package com.gitee.dbswitch.core.database.impl;
import com.gitee.dbswitch.common.constant.Const;
import com.gitee.dbswitch.common.type.DatabaseTypeEnum;
import com.gitee.dbswitch.core.database.AbstractDatabase;
import com.gitee.dbswitch.core.database.IDatabaseInterface;
import com.gitee.dbswitch.core.model.ColumnDescription;
import com.gitee.dbswitch.core.model.ColumnMetaData;
import com.gitee.dbswitch.core.model.TableDescription;
import com.gitee.dbswitch.core.util.DDLFormatterUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collections;
import java.util.List;
/**
* 支持SQLite数据库的元信息实现
*
* @author tang
*/
public class DatabaseSqliteImpl extends AbstractDatabase implements IDatabaseInterface {
public DatabaseSqliteImpl() {
super("org.sqlite.JDBC");
}
@Override
public DatabaseTypeEnum getDatabaseType() {
return DatabaseTypeEnum.SQLITE3;
}
@Override
public List<String> querySchemaList(Connection connection) {
return Collections.singletonList("main");
}
@Override
public String getTableDDL(Connection connection, String schemaName, String tableName) {
String sql = "SELECT sql FROM \"sqlite_master\" where type='table' and tbl_name=? ";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, tableName);
try (ResultSet rs = ps.executeQuery()) {
if (rs != null && rs.next()) {
return DDLFormatterUtils.format(rs.getString(1));
}
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
return "";
}
@Override
public String getViewDDL(Connection connection, String schemaName, String tableName) {
String sql = "SELECT sql FROM \"sqlite_master\" where type='view' and tbl_name=? ";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, tableName);
try (ResultSet rs = ps.executeQuery()) {
if (rs != null && rs.next()) {
return DDLFormatterUtils.format(rs.getString(1));
}
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
return "";
}
@Override
public List<ColumnDescription> querySelectSqlColumnMeta(Connection connection, String sql) {
String querySQL = String.format(" %s LIMIT 0 ", sql.replace(";", ""));
return this.getSelectSqlColumnMeta(connection, querySQL);
}
@Override
protected String getTableFieldsQuerySQL(String schemaName, String tableName) {
return String.format("SELECT * FROM \"%s\".\"%s\" ", schemaName, tableName);
}
@Override
protected String getTestQuerySQL(String sql) {
return String.format("explain %s", sql.replace(";", ""));
}
@Override
public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc,
boolean addCr, boolean withRemarks) {
String fieldname = v.getName();
int length = v.getLength();
int precision = v.getPrecision();
int type = v.getType();
String retval = " \"" + fieldname + "\" ";
switch (type) {
case ColumnMetaData.TYPE_TIMESTAMP:
case ColumnMetaData.TYPE_TIME:
case ColumnMetaData.TYPE_DATE:
// sqlite中没有时间数据类型
retval += "DATETIME";
break;
case ColumnMetaData.TYPE_BOOLEAN:
retval += "CHAR(1)";
break;
case ColumnMetaData.TYPE_NUMBER:
case ColumnMetaData.TYPE_INTEGER:
case ColumnMetaData.TYPE_BIGNUMBER:
if (null != pks && !pks.isEmpty() && pks.contains(fieldname)) {
// 关键字 AUTOINCREMENT 只能⽤于整型INTEGER字段。
if (useAutoInc) {
retval += "INTEGER PRIMARY KEY AUTOINCREMENT";
} else {
retval += "BIGINT ";
}
} else {
if (precision != 0 || length < 0 || length > 18) {
retval += "NUMERIC";
} else {
retval += "INTEGER";
}
}
break;
case ColumnMetaData.TYPE_STRING:
if (length < 1 || length >= AbstractDatabase.CLOB_LENGTH) {
retval += "BLOB";
} else {
retval += "TEXT";
}
break;
case ColumnMetaData.TYPE_BINARY:
retval += "BLOB";
break;
default:
retval += "TEXT";
break;
}
if (addCr) {
retval += Const.CR;
}
return retval;
}
@Override
public List<String> getTableColumnCommentDefinition(TableDescription td,
List<ColumnDescription> cds) {
return Collections.emptyList();
}
}

View File

@@ -26,7 +26,7 @@ import org.apache.commons.lang3.StringUtils;
*
* @author tang
*/
public class GenerateSqlUtils {
public final class GenerateSqlUtils {
public static String getDDLCreateTableSQL(
DatabaseTypeEnum type,
@@ -108,7 +108,7 @@ public class GenerateSqlUtils {
AbstractDatabase db = DatabaseFactory.getDatabaseInstance(type);
String createTableSql = getDDLCreateTableSQL(db, fieldNames, primaryKeys, schemaName,
tableName, true, tableRemarks, autoIncr);
if (DatabaseTypeEnum.MYSQL == type || DatabaseTypeEnum.HIVE == type) {
if (type.noCommentStatement()) {
return Arrays.asList(createTableSql);
}
@@ -122,4 +122,8 @@ public class GenerateSqlUtils {
return results;
}
private GenerateSqlUtils() {
throw new IllegalStateException();
}
}

View File

@@ -126,11 +126,11 @@ public class JdbcUrlUtils {
// + "(CONNECT_DATA=(SERVICE_NAME=%s)))",
/// db.getHost(), db.getPort(), db.getDbname());
//
// (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=172.17.207.158)(PORT=1521)))(CONNECT_DATA=(SID=orcl)))
// (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=172.17.20.58)(PORT=1521)))(CONNECT_DATA=(SID=orcl)))
//
// or
//
// (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=172.17.207.158)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl.ruijie.com.cn)))
// (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=172.17.20.58)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl.test.com.cn)))
return String.format("jdbc:oracle:thin:@%s", db.getDbname());
} else {
return String.format("jdbc:oracle:thin:@%s:%d:%s",

View File

@@ -18,5 +18,7 @@ public final class PostgresUtils {
}
private PostgresUtils() {
throw new IllegalStateException();
}
}