diff --git a/dbswitch-core/pom.xml b/dbswitch-core/pom.xml index a9a72eee..d26d1770 100644 --- a/dbswitch-core/pom.xml +++ b/dbswitch-core/pom.xml @@ -110,12 +110,6 @@ commons-lang3 - - com.alibaba - druid - 1.1.5 - - \ No newline at end of file diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/constant/Const.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/constant/Const.java index 90d30e10..c43d51b5 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/constant/Const.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/constant/Const.java @@ -50,22 +50,22 @@ public final class Const { /** * Create Table Statement Prefix String */ - public static final String CREATE_TABLE = " CREATE TABLE "; + public static final String CREATE_TABLE = "CREATE TABLE "; /** * Drop Table Statement Prefix String */ - public static final String DROP_TABLE = " DROP TABLE "; + public static final String DROP_TABLE = "DROP TABLE "; /** * Constant Keyword String */ - public static final String IF_NOT_EXISTS = " IF NOT EXISTS "; + public static final String IF_NOT_EXISTS = "IF NOT EXISTS "; /** * Constant Keyword String */ - public static final String IF_EXISTS = " IF EXISTS "; + public static final String IF_EXISTS = "IF EXISTS "; /** * Constructor Function diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/AbstractDatabase.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/AbstractDatabase.java index 7dd167af..cf65f68f 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/AbstractDatabase.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/AbstractDatabase.java @@ -248,9 +248,6 @@ public abstract class AbstractDatabase implements IDatabaseInterface { return ""; } - @Override - public abstract String formatSQL(String sql); - /************************************** * internal function **************************************/ diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/IDatabaseInterface.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/IDatabaseInterface.java index 0d6dfab9..c48be103 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/IDatabaseInterface.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/IDatabaseInterface.java @@ -112,12 +112,4 @@ public interface IDatabaseInterface extends AutoCloseable { * @return 主键字段拼接串 */ public String getPrimaryKeyAsString(List pks); - - /** - * SQL语句格式化 - * - * @param sql SQL的语句 - * @return 格式化后的SQL语句 - */ - public String formatSQL(String sql); } diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseDB2Impl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseDB2Impl.java index f5b74e78..f4e48e28 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseDB2Impl.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseDB2Impl.java @@ -46,11 +46,6 @@ public class DatabaseDB2Impl extends AbstractDatabase implements IDatabaseInterf return String.format("explain %s", sql.replace(";", "")); } - @Override - public String formatSQL(String sql) { - return sql; - } - @Override public String getFieldDefinition(ColumnMetaData v, List pks, boolean useAutoInc, boolean addCr) { String fieldname = v.getName(); diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseDmImpl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseDmImpl.java index 3c89695d..a2f90089 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseDmImpl.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseDmImpl.java @@ -10,7 +10,6 @@ package com.gitee.dbswitch.core.database.impl; import java.util.List; -import com.alibaba.druid.sql.SQLUtils; import com.gitee.dbswitch.common.constant.DatabaseTypeEnum; import com.gitee.dbswitch.core.constant.Const; import com.gitee.dbswitch.core.database.AbstractDatabase; @@ -46,11 +45,6 @@ public class DatabaseDmImpl extends AbstractDatabase implements IDatabaseInterfa return String.format("explain %s", sql.replace(";", "")); } - @Override - public String formatSQL(String sql) { - return SQLUtils.formatOracle(sql); - } - @Override public String getFieldDefinition(ColumnMetaData v, List pks, boolean useAutoInc, boolean addCr) { String fieldname = v.getName(); diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseGreenplumImpl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseGreenplumImpl.java index 4927a5b1..cbc1f4d2 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseGreenplumImpl.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseGreenplumImpl.java @@ -11,7 +11,6 @@ package com.gitee.dbswitch.core.database.impl; import java.util.Collections; import java.util.List; -import com.alibaba.druid.sql.SQLUtils; import com.gitee.dbswitch.core.constant.Const; import com.gitee.dbswitch.common.constant.DatabaseTypeEnum; import com.gitee.dbswitch.core.database.AbstractDatabase; @@ -47,11 +46,6 @@ public class DatabaseGreenplumImpl extends AbstractDatabase implements IDatabase protected String getTestQuerySQL(String sql) { return String.format("explain %s", sql.replace(";", "")); } - - @Override - public String formatSQL(String sql) { - return SQLUtils.formatPGSql(sql, null); - } @Override public String getFieldDefinition(ColumnMetaData v, List pks, boolean useAutoInc, boolean addCr) { diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseKingbaseImpl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseKingbaseImpl.java index 26243e25..3f2ce098 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseKingbaseImpl.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseKingbaseImpl.java @@ -10,7 +10,6 @@ package com.gitee.dbswitch.core.database.impl; import java.util.List; -import com.alibaba.druid.sql.SQLUtils; import com.gitee.dbswitch.common.constant.DatabaseTypeEnum; import com.gitee.dbswitch.core.constant.Const; import com.gitee.dbswitch.core.database.AbstractDatabase; @@ -47,11 +46,6 @@ public class DatabaseKingbaseImpl extends AbstractDatabase implements IDatabaseI return String.format("explain %s", sql.replace(";", "")); } - @Override - public String formatSQL(String sql) { - return SQLUtils.formatPGSql(sql, null); - } - @Override public String getFieldDefinition(ColumnMetaData v, List pks, boolean useAutoInc, boolean addCr) { String fieldname = v.getName(); diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseMysqlImpl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseMysqlImpl.java index 960d2096..515131d8 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseMysqlImpl.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseMysqlImpl.java @@ -17,7 +17,6 @@ import java.sql.ResultSet; import java.sql.SQLException; import org.apache.commons.lang3.StringUtils; import com.gitee.dbswitch.core.constant.Const; -import com.alibaba.druid.sql.SQLUtils; import com.gitee.dbswitch.common.constant.DatabaseTypeEnum; import com.gitee.dbswitch.core.database.AbstractDatabase; import com.gitee.dbswitch.core.database.IDatabaseInterface; @@ -116,11 +115,6 @@ public class DatabaseMysqlImpl extends AbstractDatabase implements IDatabaseInte return String.format(" `%s`.`%s` ", schemaName, tableName); } - @Override - public String formatSQL(String sql) { - return SQLUtils.formatMySql(sql); - } - @Override public String getFieldDefinition(ColumnMetaData v, List pks, boolean useAutoInc, boolean addCr) { String fieldname = v.getName(); diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseOracleImpl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseOracleImpl.java index 741ead38..d745a85e 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseOracleImpl.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseOracleImpl.java @@ -16,7 +16,6 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; -import com.alibaba.druid.sql.SQLUtils; import com.gitee.dbswitch.core.constant.Const; import com.gitee.dbswitch.common.constant.DatabaseTypeEnum; import com.gitee.dbswitch.core.database.AbstractDatabase; @@ -122,11 +121,6 @@ public class DatabaseOracleImpl extends AbstractDatabase implements IDatabaseInt protected String getTestQuerySQL(String sql) { return String.format("explain plan for %s", sql.replace(";", "")); } - - @Override - public String formatSQL(String sql) { - return SQLUtils.formatOracle(sql); - } @Override public String getFieldDefinition(ColumnMetaData v, List pks, boolean useAutoInc, boolean addCr) { diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabasePostgresImpl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabasePostgresImpl.java index 1362c7a6..c02c1a6f 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabasePostgresImpl.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabasePostgresImpl.java @@ -10,7 +10,6 @@ package com.gitee.dbswitch.core.database.impl; import java.util.List; -import com.alibaba.druid.sql.SQLUtils; import com.gitee.dbswitch.core.constant.Const; import com.gitee.dbswitch.common.constant.DatabaseTypeEnum; import com.gitee.dbswitch.core.database.AbstractDatabase; @@ -46,11 +45,6 @@ public class DatabasePostgresImpl extends AbstractDatabase implements IDatabaseI protected String getTestQuerySQL(String sql) { return String.format("explain %s", sql.replace(";", "")); } - - @Override - public String formatSQL(String sql) { - return SQLUtils.formatPGSql(sql,null); - } @Override public String getFieldDefinition(ColumnMetaData v, List pks, boolean useAutoInc, boolean addCr) { diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseSqlserverImpl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseSqlserverImpl.java index 0a69d7dc..8db0d95c 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseSqlserverImpl.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseSqlserverImpl.java @@ -17,7 +17,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.commons.lang3.StringUtils; -import com.alibaba.druid.sql.SQLUtils; import com.gitee.dbswitch.core.constant.Const; import com.gitee.dbswitch.common.constant.DatabaseTypeEnum; import com.gitee.dbswitch.core.database.AbstractDatabase; @@ -198,11 +197,6 @@ public class DatabaseSqlserverImpl extends AbstractDatabase implements IDatabase return String.format(" [%s].[%s] ", schemaName, tableName); } - @Override - public String formatSQL(String sql) { - return SQLUtils.formatSQLServer(sql); - } - @Override public String getFieldDefinition(ColumnMetaData v, List pks, boolean useAutoInc, boolean addCr) { String fieldname = v.getName(); diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/util/DDLFormatterUtils.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/util/DDLFormatterUtils.java new file mode 100644 index 00000000..d30ec220 --- /dev/null +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/util/DDLFormatterUtils.java @@ -0,0 +1,129 @@ +// 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) +// Data : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.core.util; + +import java.util.Locale; +import java.util.StringTokenizer; + +/** + * DDL的SQL语句格式化(摘自hibernate) + * + * @author tang + */ +public class DDLFormatterUtils { + + public static String format(String sql) { + if (null == sql || 0 == sql.length()) { + return sql; + } + if (sql.toLowerCase(Locale.ROOT).startsWith("create table")) { + return formatCreateTable(sql); + } else if (sql.toLowerCase(Locale.ROOT).startsWith("alter table")) { + return formatAlterTable(sql); + } else if (sql.toLowerCase(Locale.ROOT).startsWith("comment on")) { + return formatCommentOn(sql); + } else { + return "\n " + sql; + } + } + + private static String formatCommentOn(String sql) { + final StringBuilder result = new StringBuilder(60).append(" "); + final StringTokenizer tokens = new StringTokenizer(sql, " '[]\"", true); + + boolean quoted = false; + while (tokens.hasMoreTokens()) { + final String token = tokens.nextToken(); + result.append(token); + if (isQuote(token)) { + quoted = !quoted; + } else if (!quoted) { + if ("is".equals(token)) { + result.append("\n "); + } + } + } + + return result.toString(); + } + + private static String formatAlterTable(String sql) { + final StringBuilder result = new StringBuilder(60).append(" "); + final StringTokenizer tokens = new StringTokenizer(sql, " (,)'[]\"", true); + + boolean quoted = false; + while (tokens.hasMoreTokens()) { + final String token = tokens.nextToken(); + if (isQuote(token)) { + quoted = !quoted; + } else if (!quoted) { + if (isBreak(token)) { + result.append("\n "); + } + } + result.append(token); + } + + return result.toString(); + } + + private static String formatCreateTable(String sql) { + final StringBuilder result = new StringBuilder(60).append(" "); + final StringTokenizer tokens = new StringTokenizer(sql, "(,)'[]\"", true); + + int depth = 0; + boolean quoted = false; + while (tokens.hasMoreTokens()) { + final String token = tokens.nextToken(); + if (isQuote(token)) { + quoted = !quoted; + result.append(token); + } else if (quoted) { + result.append(token); + } else { + if (")".equals(token)) { + depth--; + if (depth == 0) { + result.append("\n "); + } + } + result.append(token); + if (",".equals(token) && depth == 1) { + result.append("\n "); + } + if ("(".equals(token)) { + depth++; + if (depth == 1) { + result.append("\n "); + } + } + } + } + + return result.toString(); + } + + private static boolean isBreak(String token) { + return "drop".equals(token) || + "add".equals(token) || + "references".equals(token) || + "foreign".equals(token) || + "on".equals(token); + } + + private static boolean isQuote(String tok) { + return "\"".equals(tok) || + "`".equals(tok) || + "]".equals(tok) || + "[".equals(tok) || + "'".equals(tok); + } + +} diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/util/GenerateSqlUtils.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/util/GenerateSqlUtils.java index 50363970..d032d9c8 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/util/GenerateSqlUtils.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/util/GenerateSqlUtils.java @@ -40,8 +40,8 @@ public class GenerateSqlUtils { // if(ifNotExist && type!=DatabaseType.ORACLE) { // retval.append( Const.IF_NOT_EXISTS ); // } - retval.append(db.getQuotedSchemaTableCombination(schemaName, tableName) + Const.CR); - retval.append("(").append(Const.CR); + retval.append(db.getQuotedSchemaTableCombination(schemaName, tableName)); + retval.append("("); for (int i = 0; i < fieldNames.size(); i++) { if (i > 0) { @@ -51,19 +51,19 @@ public class GenerateSqlUtils { } ColumnMetaData v = fieldNames.get(i).getMetaData(); - retval.append(db.getFieldDefinition(v, pks, autoIncr, true)); + retval.append(db.getFieldDefinition(v, pks, autoIncr, false)); } if (!pks.isEmpty()) { String pk = db.getPrimaryKeyAsString(pks); - retval.append(", PRIMARY KEY (").append(pk).append(")").append(Const.CR); + retval.append(", PRIMARY KEY (").append(pk).append(")"); } - retval.append(")").append(Const.CR); + retval.append(")"); if (DatabaseTypeEnum.MYSQL == type) { - retval.append("ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin").append(Const.CR); + retval.append("ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin"); } - return db.formatSQL(retval.toString()); + return DDLFormatterUtils.format(retval.toString()); } }