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());
}
}