c9677d8cf8d71493012acea35011e3652a9c0f4f.svn-base 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. package org.jeecg.modules.online.config.util;
  2. import com.google.common.collect.Lists;
  3. import freemarker.template.TemplateException;
  4. import lombok.extern.slf4j.Slf4j;
  5. import java.io.ByteArrayInputStream;
  6. import java.io.IOException;
  7. import java.sql.Connection;
  8. import java.sql.DatabaseMetaData;
  9. import java.sql.ResultSet;
  10. import java.sql.SQLException;
  11. import java.sql.SQLSyntaxErrorException;
  12. import java.util.ArrayList;
  13. import java.util.EnumSet;
  14. import java.util.HashMap;
  15. import java.util.Iterator;
  16. import java.util.List;
  17. import java.util.Map;
  18. import org.apache.commons.lang.StringUtils;
  19. import org.hibernate.HibernateException;
  20. import org.hibernate.Session;
  21. import org.hibernate.boot.Metadata;
  22. import org.hibernate.boot.MetadataSources;
  23. import org.hibernate.boot.registry.StandardServiceRegistry;
  24. import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
  25. import org.hibernate.tool.hbm2ddl.SchemaExport;
  26. import org.hibernate.tool.schema.TargetType;
  27. import org.jeecg.common.constant.DataBaseConstant;
  28. import org.jeecg.common.util.oConvertUtils;
  29. import org.jeecg.modules.online.cgform.entity.OnlCgformField;
  30. import org.jeecg.modules.online.config.db.DataBaseConfig;
  31. import org.jeecg.modules.online.config.db.TableModel;
  32. import org.jeecg.modules.online.config.exception.DBException;
  33. import org.jeecg.modules.online.config.service.DbTableHandleI;
  34. @Slf4j
  35. public class SqlHelper {
  36. private static DbTableHandleI dbTableHandle;
  37. public SqlHelper() throws SQLException, DBException {
  38. dbTableHandle = TableUtil.getTableHandle();
  39. }
  40. public static void createTable(TableModel tableModel) throws IOException, TemplateException, HibernateException, SQLException, DBException {
  41. String databaseType = TableUtil.getDatabaseType();
  42. if (DataBaseConstant.DB_TYPE_ORACLE.equals(databaseType)) {
  43. List<OnlCgformField> fieldList = Lists.newArrayList();
  44. OnlCgformField field;
  45. for(Iterator<OnlCgformField> iterator = tableModel.getColumns().iterator(); iterator.hasNext(); fieldList.add(field)) {
  46. field = iterator.next();
  47. if (DbType.INT.equals(field.getDbType())) {
  48. field.setDbType(DbType.DOUBLE);
  49. field.setDbPointLength(0);
  50. }
  51. }
  52. tableModel.setColumns(fieldList);
  53. }
  54. String xml = FreemarkerHelper.process("org/jeecg/modules/online/config/engine/tableTemplate.ftl", getTableData(tableModel, databaseType));
  55. log.info(xml);
  56. Map<String,Object> hibernateConfig = new HashMap<>();
  57. DataBaseConfig dbConfig = tableModel.getDbConfig();
  58. hibernateConfig.put("hibernate.connection.driver_class", dbConfig.getDriverClassName());
  59. hibernateConfig.put("hibernate.connection.url", dbConfig.getUrl());
  60. hibernateConfig.put("hibernate.connection.username", dbConfig.getUsername());
  61. hibernateConfig.put("hibernate.connection.password", dbConfig.getPassword());
  62. hibernateConfig.put("hibernate.show_sql", true);
  63. hibernateConfig.put("hibernate.format_sql", true);
  64. hibernateConfig.put("hibernate.temp.use_jdbc_metadata_defaults", false);
  65. hibernateConfig.put("hibernate.dialect", TableUtil.getJdbcDriver(databaseType));
  66. hibernateConfig.put("hibernate.hbm2ddl.auto", "create");
  67. hibernateConfig.put("hibernate.connection.autocommit", false);
  68. hibernateConfig.put("hibernate.current_session_context_class", "thread");
  69. StandardServiceRegistry standardServiceRegistry = (new StandardServiceRegistryBuilder()).applySettings(hibernateConfig).build();
  70. MetadataSources metadataSources = new MetadataSources(standardServiceRegistry);
  71. ByteArrayInputStream input = new ByteArrayInputStream(xml.getBytes());
  72. metadataSources.addInputStream(input);
  73. Metadata metadata = metadataSources.buildMetadata();
  74. SchemaExport schemaExport = new SchemaExport();
  75. schemaExport.create(EnumSet.of(TargetType.DATABASE), metadata);
  76. input.close();
  77. List<Exception> exceptions = schemaExport.getExceptions();
  78. Iterator<Exception> exceptionIterator = exceptions.iterator();
  79. Exception exception;
  80. while(true) {
  81. if (!exceptionIterator.hasNext()) {
  82. return;
  83. }
  84. exception = exceptionIterator.next();
  85. if ("java.sql.SQLSyntaxErrorException".equals(exception.getCause().getClass().getName())) {
  86. SQLSyntaxErrorException e = (SQLSyntaxErrorException)exception.getCause();
  87. if ("42000".equals(e.getSQLState())) {
  88. continue;
  89. }
  90. break;
  91. } else {
  92. if (!"com.microsoft.sqlserver.jdbc.SQLServerException".equals(exception.getCause().getClass().getName())) {
  93. break;
  94. }
  95. if (exception.getCause().toString().indexOf("Incorrect syntax near the keyword") != -1) {
  96. exception.printStackTrace();
  97. throw new DBException(exception.getCause().getMessage());
  98. }
  99. log.error(exception.getMessage());
  100. }
  101. }
  102. throw new DBException(exception.getMessage());
  103. }
  104. public List<String> getUpdateTableSql(TableModel table) throws DBException, SQLException {
  105. String databaseType = TableUtil.getDatabaseType();
  106. String tableName = TableUtil.fixTableName(table.getTableName(), databaseType);
  107. String sql = "alter table " + tableName + " ";
  108. List<String> updateTableSql = new ArrayList<>();
  109. try {
  110. Map var6 = this.c((String)null, tableName);
  111. Map var7 = this.c(table);
  112. Map var8 = this.a(table.getColumns());
  113. Iterator var9 = var7.keySet().iterator();
  114. label72:
  115. while(true) {
  116. while(true) {
  117. String var10;
  118. while(var9.hasNext()) {
  119. var10 = (String)var9.next();
  120. ColumnMeta var11;
  121. if (!var6.containsKey(var10)) {
  122. var11 = (ColumnMeta)var7.get(var10);
  123. String var17 = (String)var8.get(var10);
  124. if (var8.containsKey(var10) && var6.containsKey(var17)) {
  125. ColumnMeta var13 = (ColumnMeta)var6.get(var17);
  126. String var14 = dbTableHandle.getReNameFieldName(var11);
  127. if (DataBaseConstant.DB_TYPE_SQLSERVER.equals(databaseType)) {
  128. updateTableSql.add(var14);
  129. } else {
  130. updateTableSql.add(sql + var14);
  131. }
  132. String var15 = this.getUpdateOnlCgformFieldSql(var10, var11.getColumnId());
  133. updateTableSql.add(var15);
  134. if (!var13.equals(var11)) {
  135. updateTableSql.add(sql + this.getUpdateColumnSql(var11, var13));
  136. if (DataBaseConstant.DB_TYPE_POSTGRESQL.equals(databaseType)) {
  137. updateTableSql.add(sql + this.getSpecialHandle(var11, var13));
  138. }
  139. }
  140. if (!DataBaseConstant.DB_TYPE_SQLSERVER.equals(databaseType) && !var13.b(var11)) {
  141. updateTableSql.add(this.getCommentSql(var11));
  142. }
  143. } else {
  144. updateTableSql.add(sql + this.getAddColumnSql(var11));
  145. if (!DataBaseConstant.DB_TYPE_SQLSERVER.equals(databaseType) && StringUtils.isNotEmpty(var11.getComment())) {
  146. updateTableSql.add(this.getCommentSql(var11));
  147. }
  148. }
  149. } else {
  150. var11 = (ColumnMeta)var6.get(var10);
  151. ColumnMeta var12 = (ColumnMeta)var7.get(var10);
  152. if (!var11.a(var12, databaseType)) {
  153. updateTableSql.add(sql + this.getUpdateColumnSql(var12, var11));
  154. }
  155. if (!DataBaseConstant.DB_TYPE_SQLSERVER.equals(databaseType) && !DataBaseConstant.DB_TYPE_ORACLE.equals(databaseType) && !var11.b(var12)) {
  156. updateTableSql.add(this.getCommentSql(var12));
  157. }
  158. }
  159. }
  160. var9 = var6.keySet().iterator();
  161. while(var9.hasNext()) {
  162. var10 = (String)var9.next();
  163. if (!var7.containsKey(var10.toLowerCase()) && !var8.containsValue(var10.toLowerCase())) {
  164. updateTableSql.add(sql + this.getDropColumnSql(var10));
  165. }
  166. }
  167. break label72;
  168. }
  169. }
  170. } catch (SQLException var16) {
  171. throw new RuntimeException();
  172. }
  173. log.info(" db update sql : " + updateTableSql.toString());
  174. return updateTableSql;
  175. }
  176. private static Map<String, Object> getTableData(TableModel var0, String var1) {
  177. HashMap var2 = new HashMap();
  178. Iterator var3 = var0.getColumns().iterator();
  179. while(var3.hasNext()) {
  180. OnlCgformField var4 = (OnlCgformField)var3.next();
  181. var4.setDbDefaultVal(c(var4.getDbDefaultVal()));
  182. }
  183. var2.put("entity", var0);
  184. var2.put("dataType", var1);
  185. return var2;
  186. }
  187. private Map<String, ColumnMeta> c(String var1, String var2) throws SQLException {
  188. HashMap var3 = new HashMap();
  189. Connection var4 = null;
  190. try {
  191. var4 = TableUtil.getConnection();
  192. } catch (Exception var17) {
  193. log.error(var17.getMessage(), var17);
  194. }
  195. DatabaseMetaData var5 = var4.getMetaData();
  196. ResultSet var6 = var5.getColumns((String)null, var1, var2, "%");
  197. while(var6.next()) {
  198. ColumnMeta var7 = new ColumnMeta();
  199. var7.setTableName(var2);
  200. String var8 = var6.getString("COLUMN_NAME").toLowerCase();
  201. var7.setColumnName(var8);
  202. String var9 = var6.getString("TYPE_NAME");
  203. int var10 = var6.getInt("DECIMAL_DIGITS");
  204. String var11 = dbTableHandle.getMatchClassTypeByDataType(var9, var10);
  205. var7.setColunmType(var11);
  206. int var12 = var6.getInt("COLUMN_SIZE");
  207. var7.setColumnSize(var12);
  208. var7.setDecimalDigits(var10);
  209. String var13 = var6.getInt("NULLABLE") == 1 ? "Y" : "N";
  210. var7.setIsNullable(var13);
  211. String var14 = var6.getString("REMARKS");
  212. var7.setComment(var14);
  213. String var15 = var6.getString("COLUMN_DEF");
  214. String var16 = c(var15) == null ? "" : c(var15);
  215. var7.setFieldDefault(var16);
  216. log.info("getColumnMetadataFormDataBase --->COLUMN_NAME:" + var8.toUpperCase() + " TYPE_NAME :" + var9 + " DECIMAL_DIGITS:" + var10 + " COLUMN_SIZE:" + var12);
  217. var3.put(var8, var7);
  218. }
  219. return var3;
  220. }
  221. private Map<String, ColumnMeta> c(TableModel var1) {
  222. HashMap var2 = new HashMap();
  223. List var3 = var1.getColumns();
  224. Iterator var5 = var3.iterator();
  225. while(var5.hasNext()) {
  226. OnlCgformField var6 = (OnlCgformField)var5.next();
  227. ColumnMeta var4 = new ColumnMeta();
  228. var4.setTableName(var1.getTableName().toLowerCase());
  229. var4.setColumnId(var6.getId());
  230. var4.setColumnName(var6.getDbFieldName().toLowerCase());
  231. var4.setColumnSize(var6.getDbLength());
  232. var4.setColunmType(var6.getDbType().toLowerCase());
  233. var4.setIsNullable(var6.getDbIsNull() == 1 ? "Y" : "N");
  234. var4.setComment(var6.getDbFieldTxt());
  235. var4.setDecimalDigits(var6.getDbPointLength());
  236. var4.setFieldDefault(c(var6.getDbDefaultVal()));
  237. var4.setPkType(var1.getJformPkType() == null ? "UUID" : var1.getJformPkType());
  238. var4.setOldColumnName(var6.getDbFieldNameOld() != null ? var6.getDbFieldNameOld().toLowerCase() : null);
  239. log.info("getColumnMetadataFormCgForm ----> DbFieldName: " + var6.getDbFieldName().toLowerCase() + " | DbType: " + var6.getDbType().toLowerCase() + " | DbPointLength:" + var6.getDbPointLength() + " | DbLength:" + var6.getDbLength());
  240. var2.put(var6.getDbFieldName().toLowerCase(), var4);
  241. }
  242. return var2;
  243. }
  244. private Map<String, String> a(List<OnlCgformField> var1) {
  245. HashMap var2 = new HashMap();
  246. Iterator var3 = var1.iterator();
  247. while(var3.hasNext()) {
  248. OnlCgformField var4 = (OnlCgformField)var3.next();
  249. var2.put(var4.getDbFieldName(), var4.getDbFieldNameOld());
  250. }
  251. return var2;
  252. }
  253. private String getDropColumnSql(String fieldName) {
  254. return dbTableHandle.getDropColumnSql(fieldName);
  255. }
  256. private String getUpdateColumnSql(ColumnMeta cgformcolumnMeta, ColumnMeta datacolumnMeta) throws DBException {
  257. return dbTableHandle.getUpdateColumnSql(cgformcolumnMeta, datacolumnMeta);
  258. }
  259. private String getSpecialHandle(ColumnMeta cgformcolumnMeta, ColumnMeta datacolumnMeta) {
  260. return dbTableHandle.getSpecialHandle(cgformcolumnMeta, datacolumnMeta);
  261. }
  262. private String getReNameFieldName(ColumnMeta columnMeta) {
  263. return dbTableHandle.getReNameFieldName(columnMeta);
  264. }
  265. private String getAddColumnSql(ColumnMeta columnMeta) {
  266. return dbTableHandle.getAddColumnSql(columnMeta);
  267. }
  268. private String getCommentSql(ColumnMeta columnMeta) {
  269. return dbTableHandle.getCommentSql(columnMeta);
  270. }
  271. private String getUpdateOnlCgformFieldSql(String oldDbFieldName, String id) {
  272. return "update onl_cgform_field set DB_FIELD_NAME_OLD = '" + oldDbFieldName + "' where ID ='" + id + "'";
  273. }
  274. private int a(String oldDbFieldName, String id, Session session) {
  275. return session.createSQLQuery("update onl_cgform_field set DB_FIELD_NAME_OLD= '" + oldDbFieldName + "' where ID ='" + id + "'").executeUpdate();
  276. }
  277. private static String c(String var0) {
  278. if (StringUtils.isNotEmpty(var0)) {
  279. try {
  280. Double.valueOf(var0);
  281. } catch (Exception var2) {
  282. if (!var0.startsWith("'") || !var0.endsWith("'")) {
  283. var0 = "'" + var0 + "'";
  284. }
  285. }
  286. }
  287. return var0;
  288. }
  289. public String getDropIndexsSql(String indexName, String tableName) {
  290. return dbTableHandle.dropIndexs(indexName, tableName);
  291. }
  292. public String getCountIndexSql(String indexName, String tableName) {
  293. return dbTableHandle.countIndex(indexName, tableName);
  294. }
  295. public static List<String> getIndexes(String table) throws SQLException {
  296. Connection conn = null;
  297. ResultSet indexInfo = null;
  298. ArrayList<String> indexes = new ArrayList<>();
  299. try {
  300. conn = TableUtil.getConnection();
  301. DatabaseMetaData metaData = conn.getMetaData();
  302. indexInfo = metaData.getIndexInfo(null, null, table, false, false);
  303. indexInfo.getMetaData();
  304. while(indexInfo.next()) {
  305. String indexName = indexInfo.getString("INDEX_NAME");
  306. if (oConvertUtils.isEmpty(indexName)) {
  307. indexName = indexInfo.getString("index_name");
  308. }
  309. if (oConvertUtils.isNotEmpty(indexName)) {
  310. indexes.add(indexName);
  311. }
  312. }
  313. } catch (SQLException e) {
  314. log.error(e.getMessage(), e);
  315. } finally {
  316. if (conn != null) {
  317. conn.close();
  318. }
  319. }
  320. return indexes;
  321. }
  322. }