DBTableProviderNew.java 60 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135
  1. //
  2. // Source code recreated from a .class file by IntelliJ IDEA
  3. // (powered by FernFlower decompiler)
  4. //
  5. package kd.bos.newdevportal.table;
  6. import java.sql.SQLException;
  7. import java.util.ArrayList;
  8. import java.util.Arrays;
  9. import java.util.Collections;
  10. import java.util.HashMap;
  11. import java.util.HashSet;
  12. import java.util.Iterator;
  13. import java.util.List;
  14. import java.util.Map;
  15. import java.util.Set;
  16. import java.util.stream.Collectors;
  17. import kd.bos.algo.DataSet;
  18. import kd.bos.algo.Row;
  19. import kd.bos.dataentity.entity.DynamicObject;
  20. import kd.bos.dataentity.entity.DynamicObjectCollection;
  21. import kd.bos.dataentity.entity.ILocaleString;
  22. import kd.bos.dataentity.entity.LocaleString;
  23. import kd.bos.dataentity.utils.StringUtils;
  24. import kd.bos.db.DB;
  25. import kd.bos.db.DBRoute;
  26. import kd.bos.db.DBType;
  27. import kd.bos.db.FieldInfo;
  28. import kd.bos.db.IndexInfo;
  29. import kd.bos.db.SqlBuilder;
  30. import kd.bos.db.SqlParameter;
  31. import kd.bos.db.tx.TX;
  32. import kd.bos.exception.ErrorCode;
  33. import kd.bos.exception.KDException;
  34. import kd.bos.logging.Log;
  35. import kd.bos.logging.LogFactory;
  36. import kd.bos.orm.query.QFilter;
  37. import kd.bos.servicehelper.QueryServiceHelper;
  38. import org.apache.commons.collections.map.CaseInsensitiveMap;
  39. class DBTableProviderNew extends TableInfoProvider {
  40. private static Log log = LogFactory.getLog(DBTableProviderNew.class);
  41. private static boolean distinct = Boolean.parseBoolean(System.getProperty("bos.dev.tableprovider.distinct", "true"));
  42. protected IGetTableHandler handler;
  43. DBTableProviderNew() {
  44. }
  45. public Map<String,DesignerTable> getTableInfo_youhua(List<String> tableNames,List<String> entityNumList) {
  46. Map<String, List<DesignerColumn>> column_map = this.handler.batchLoadColumns(this.route,tableNames);
  47. Map<String,DesignerTable> returnmap = new HashMap<>();
  48. for (int i = 0; i < tableNames.size(); i++) {
  49. DesignerTable table = this.buildTableInfo_youhua(column_map.get(tableNames.get(i)), tableNames.get(i),entityNumList.get(i));
  50. returnmap.put(tableNames.get(i), table);
  51. }
  52. return returnmap;
  53. }
  54. public DesignerTable getTableInfo(String tableName, String entityNum) {
  55. String lowerTableName = tableName.toLowerCase();
  56. List<DesignerColumn> cols = this.handler.getColumns(this.route, lowerTableName);
  57. List<DesignerIndex> idxs = this.handler.getIndexs(this.route, lowerTableName);
  58. List<DesignerConstaint> constraints = this.handler.getConstraints(this.route, lowerTableName);
  59. return this.buildTableInfo(cols, constraints, idxs, lowerTableName, entityNum, false);
  60. }
  61. private DesignerTable buildTableInfo_youhua(List<DesignerColumn> cols, String tableName,String entityNum) {
  62. DesignerTable tableInfo = new DesignerTable();
  63. tableInfo.setId(this.getRoute() + "#" + tableName);
  64. tableInfo.setComment(new LocaleString(""));
  65. tableInfo.setCode(tableName);
  66. tableInfo.setName(tableName);
  67. Iterator var8;
  68. if (cols != null) {
  69. var8 = cols.iterator();
  70. while(var8.hasNext()) {
  71. DesignerColumn column = (DesignerColumn)var8.next();
  72. tableInfo.getCols().add(DesignerColumn.copy(column));
  73. }
  74. }
  75. tableInfo.bindEntityMeta(entityNum, true);
  76. return tableInfo;
  77. }
  78. private DesignerTable buildTableInfo(List<DesignerColumn> cols, List<DesignerConstaint> constraints, List<DesignerIndex> idxs, String tableName, String entityNum, boolean fastMode) {
  79. DesignerTable tableInfo = new DesignerTable();
  80. tableInfo.setId(this.getRoute() + "#" + tableName);
  81. tableInfo.setComment(new LocaleString(""));
  82. tableInfo.setCode(tableName);
  83. tableInfo.setName(tableName);
  84. Iterator var8;
  85. if (cols != null) {
  86. var8 = cols.iterator();
  87. while(var8.hasNext()) {
  88. DesignerColumn column = (DesignerColumn)var8.next();
  89. tableInfo.getCols().add(DesignerColumn.copy(column));
  90. }
  91. }
  92. if (constraints != null) {
  93. var8 = constraints.iterator();
  94. while(var8.hasNext()) {
  95. DesignerConstaint constaint = (DesignerConstaint)var8.next();
  96. tableInfo.getConstaints().add(DesignerConstaint.copy(constaint));
  97. }
  98. }
  99. if (idxs != null) {
  100. var8 = idxs.iterator();
  101. while(var8.hasNext()) {
  102. DesignerIndex index = (DesignerIndex)var8.next();
  103. tableInfo.getIdxs().add(DesignerIndex.copy(index));
  104. }
  105. }
  106. if (distinct) {
  107. List<DesignerColumn> distinctCons = new ArrayList();
  108. if (!tableInfo.getCols().isEmpty()) {
  109. distinctCons = new ArrayList();
  110. List<DesignerColumn> colList = tableInfo.getCols();
  111. for (DesignerColumn col:colList) {
  112. if (!distinctCons.contains(col)) {
  113. distinctCons.add(col);
  114. }
  115. }
  116. tableInfo.setCols(distinctCons);
  117. }
  118. if (!tableInfo.getIdxs().isEmpty()) {
  119. ArrayList distinctCons_index = new ArrayList();
  120. List<DesignerIndex> colList = tableInfo.getIdxs();
  121. for (DesignerIndex col:colList) {
  122. if (!distinctCons_index.contains(col)) {
  123. distinctCons_index.add(col);
  124. }
  125. }
  126. tableInfo.setIdxs(distinctCons_index);
  127. }
  128. if (!tableInfo.getConstaints().isEmpty()) {
  129. ArrayList distinctCons_Constaint = new ArrayList();
  130. List<DesignerConstaint> colList = tableInfo.getConstaints();
  131. for (DesignerConstaint col:colList) {
  132. if (!distinctCons_Constaint.contains(col)) {
  133. distinctCons_Constaint.add(col);
  134. }
  135. }
  136. tableInfo.setConstaints(distinctCons_Constaint);
  137. }
  138. }
  139. tableInfo.bindEntityMeta(entityNum, fastMode);
  140. return tableInfo;
  141. }
  142. public List<DesignerTable> getTableInfoByAppId(List<String> appIds) {
  143. QFilter[] filter = new QFilter[]{new QFilter("entryentity.mainentity.bizapp.id", "in", appIds.toArray())};
  144. Map<String, Map<String, Set<String>>> routeTables = new CaseInsensitiveMap(appIds.size());
  145. Map<String, Map<String, EntityTableUtil.TableInfo>> entityTableMapping = new HashMap(appIds.size());
  146. String entityId;
  147. Iterator var38;
  148. Map.Entry it;
  149. if (Boolean.getBoolean("entitytable.export.fastmode")) {
  150. DynamicObjectCollection cols = QueryServiceHelper.query("bos_devp_tablediction", "entity.bizapp.dbroute,entity.bizapp.number,tablename,entity.number", filter);
  151. Iterator var6 = cols.iterator();
  152. while(var6.hasNext()) {
  153. DynamicObject row = (DynamicObject)var6.next();
  154. String dbroute = row.getString("entity.bizapp.dbroute");
  155. String tableName = row.getString("tablename");
  156. entityId = row.getString("entity.number");
  157. routeTables.putIfAbsent(dbroute, new HashMap());
  158. ((Map)routeTables.get(dbroute)).putIfAbsent(tableName, new HashSet());
  159. ((Set)((Map)routeTables.get(dbroute)).get(tableName)).add(entityId);
  160. }
  161. } else {
  162. SqlBuilder builder = new SqlBuilder();
  163. Map<String, Map<String, String>> entityRouteMap = new HashMap(16);
  164. builder.append("select t1.fid as entityid,t1.fnumber as entitynum,t2.fdbroute as route from t_meta_formdesign t1 inner join t_meta_bizapp t2 on t1.fbizappid = t2.fid where t1.ftype != '2' and ", new Object[0]).appendIn("t2.fid", appIds.toArray());
  165. DataSet dataSet = DB.queryDataSet("entitytable", DBRoute.meta, builder);
  166. Throwable var39 = null;
  167. try {
  168. while(dataSet.hasNext()) {
  169. Row row = dataSet.next();
  170. entityId = row.getString("entityid");
  171. String dbroute = row.getString("route");
  172. String num = row.getString("entitynum");
  173. if (!StringUtils.isBlank(entityId) && !StringUtils.isBlank(dbroute) && !StringUtils.isBlank(num)) {
  174. Map<String, String> entityIds = (Map)entityRouteMap.getOrDefault(dbroute, new HashMap(30));
  175. entityIds.put(entityId, num);
  176. entityRouteMap.put(dbroute, entityIds);
  177. }
  178. }
  179. } catch (Throwable var31) {
  180. var39 = var31;
  181. throw var31;
  182. } finally {
  183. if (dataSet != null) {
  184. if (var39 != null) {
  185. try {
  186. dataSet.close();
  187. } catch (Throwable var28) {
  188. var39.addSuppressed(var28);
  189. }
  190. } else {
  191. dataSet.close();
  192. }
  193. }
  194. }
  195. var38 = entityRouteMap.entrySet().iterator();
  196. while(var38.hasNext()) {
  197. it = (Map.Entry)var38.next();
  198. routeTables.put((String)it.getKey(), new HashMap(50));
  199. Iterator var42 = ((Map)it.getValue()).entrySet().iterator();
  200. while(var42.hasNext()) {
  201. Map.Entry<String, String> idNumEntry = (Map.Entry)var42.next();
  202. try {
  203. Map<String, EntityTableUtil.TableInfo> tableRef = EntityTableUtil.getTableRef((String)idNumEntry.getKey());
  204. entityTableMapping.put(idNumEntry.getValue(), tableRef);
  205. Iterator var48 = tableRef.entrySet().iterator();
  206. while(var48.hasNext()) {
  207. Map.Entry<String, EntityTableUtil.TableInfo> tables = (Map.Entry)var48.next();
  208. ((Map)routeTables.get(it.getKey())).putIfAbsent(tables.getKey(), new HashSet());
  209. ((Set)((Map)routeTables.get(it.getKey())).get(tables.getKey())).add(idNumEntry.getValue());
  210. }
  211. } catch (Exception var30) {
  212. log.error("导出数据表解析元数据报错:" + var30.getMessage(), var30);
  213. }
  214. }
  215. }
  216. }
  217. int batchSize = Integer.getInteger("devp.tableprovider.batchsize", 1000);
  218. List<DesignerTable> result = new ArrayList(10);
  219. var38 = routeTables.entrySet().iterator();
  220. while(var38.hasNext()) {
  221. it = (Map.Entry)var38.next();
  222. DBRoute route = DBRoute.of((String)it.getKey());
  223. try {
  224. DB.getDBType(route);
  225. } catch (Exception var29) {
  226. this.getLog().error(var29);
  227. continue;
  228. }
  229. List<String> tables = new ArrayList(((Map)it.getValue()).keySet());
  230. int max = tables.size();
  231. int i = 0;
  232. Map<String, List<DesignerColumn>> colMap = new CaseInsensitiveMap();
  233. Map<String, List<DesignerIndex>> indexMap = new CaseInsensitiveMap();
  234. CaseInsensitiveMap constraintMap;
  235. for(constraintMap = new CaseInsensitiveMap(); i <= max; i += batchSize) {
  236. int off = i + batchSize > max ? max : i + batchSize;
  237. colMap.putAll(this.handler.batchLoadColumns(route, tables.subList(i, off)));
  238. indexMap.putAll(this.handler.batchLoadIndexs(route, tables.subList(i, off)));
  239. constraintMap.putAll(this.handler.batchLoadConstraints(route, tables.subList(i, off)));
  240. }
  241. Iterator var52 = ((Map)it.getValue()).entrySet().iterator();
  242. while(var52.hasNext()) {
  243. Map.Entry<String, Set<String>> items = (Map.Entry)var52.next();
  244. DesignerTable designerTable;
  245. for(Iterator var18 = ((Set)items.getValue()).iterator(); var18.hasNext(); result.add(designerTable)) {
  246. String entityNum = (String)var18.next();
  247. designerTable = this.buildTableInfo((List)colMap.get(items.getKey()), (List)constraintMap.get(items.getKey()), (List)indexMap.get(items.getKey()), (String)items.getKey(), entityNum, true);
  248. Object extCaption = ((EntityTableUtil.TableInfo)((Map)entityTableMapping.getOrDefault(entityNum, new HashMap(0))).getOrDefault(items.getKey(), new EntityTableUtil.TableInfo())).getExtInfo().get("caption");
  249. if (extCaption instanceof ILocaleString) {
  250. designerTable.setName(extCaption.toString());
  251. }
  252. }
  253. }
  254. }
  255. return result;
  256. }
  257. protected void setRoute(DBRoute route) {
  258. super.setRoute(route);
  259. this.initHandler(route);
  260. }
  261. protected void initHandler(DBRoute route) {
  262. this.handler = new DefaultTableHandler();
  263. }
  264. interface IGetTableHandler {
  265. default List<DesignerColumn> getColumns(DBRoute route, String tablename) {
  266. List<String> list = new ArrayList(1);
  267. list.add(tablename);
  268. return (List)this.batchLoadColumns(route, list).get(tablename);
  269. }
  270. default List<DesignerIndex> getIndexs(DBRoute route, String tablename) {
  271. List<String> list = new ArrayList(1);
  272. list.add(tablename);
  273. return (List)this.batchLoadIndexs(route, list).get(tablename);
  274. }
  275. default List<DesignerConstaint> getConstraints(DBRoute route, String tablename) {
  276. List<String> list = new ArrayList(1);
  277. list.add(tablename);
  278. return (List)this.batchLoadConstraints(route, list).get(tablename);
  279. }
  280. default Map<String, Object> getTableExtInfo(DBRoute route, String tablename) {
  281. return Collections.emptyMap();
  282. }
  283. Map<String, List<DesignerColumn>> batchLoadColumns(DBRoute var1, List<String> var2);
  284. Map<String, List<DesignerIndex>> batchLoadIndexs(DBRoute var1, List<String> var2);
  285. Map<String, List<DesignerConstaint>> batchLoadConstraints(DBRoute var1, List<String> var2);
  286. default Map<String, Map<String, Object>> batchLoadTableExtInfo(DBRoute route, List<String> tableNames) {
  287. return Collections.emptyMap();
  288. }
  289. default Map<String, List<String>> getPrimaryKeys(DBType dbType, DBRoute route, List<String> tableNames) {
  290. if (tableNames.isEmpty()) {
  291. return new HashMap();
  292. } else {
  293. SqlBuilder builder = new SqlBuilder();
  294. List<String> lowerCaseTables = (List)tableNames.stream().map(String::toLowerCase).collect(Collectors.toList());
  295. List<String> upCaseTables = (List)tableNames.stream().map(String::toUpperCase).collect(Collectors.toList());
  296. if (DBType.Oracle != dbType && DBType.DM != dbType) {
  297. if (DBType.MySQL == dbType) {
  298. builder.append("/*dialect*/select column_name,table_name from information_schema.key_column_usage where TABLE_SCHEMA = schema() and constraint_name= 'PRIMARY' ", new Object[0]).append(" and ", new Object[0]).appendIn("table_name", tableNames.toArray());
  299. } else if (DBType.PostgreSQL == dbType) {
  300. builder.append("/*dialect*/select kcu.column_name,kcu.table_name as key_column from information_schema.table_constraints tco join information_schema.key_column_usage kcu on kcu.constraint_name = tco.constraint_name and kcu.constraint_schema = tco.constraint_schema and kcu.constraint_name = tco.constraint_name where tco.constraint_type = 'PRIMARY KEY' ", new Object[0]).append(" and ", new Object[0]).appendIn("kcu.table_name", lowerCaseTables.toArray()).append(" order by kcu.ordinal_position", new Object[0]);
  301. } else {
  302. if (DBType.SQLServer != dbType) {
  303. throw new RuntimeException("dbType " + dbType.name() + " not supported yet!");
  304. }
  305. builder.append("/*dialect*/select c.name,o.name from sysindexes i join sysindexkeys k on i.id = k.id and i.indid = k.indid join sysobjects o on i.id = o.id join syscolumns c on i.id=c.id and k.colid = c.colid where o.xtype = 'U' and exists(select 1 from sysobjects where xtype = 'PK' and name = i.name) ", new Object[0]).append(" and ", new Object[0]).appendIn("o.name", upCaseTables.toArray());
  306. }
  307. } else {
  308. builder.append("/*dialect*/select col.column_name,col.table_name from user_constraints con, user_cons_columns col where con.constraint_name = col.constraint_name and con.constraint_type='P'", new Object[0]).append(" and ", new Object[0]).appendIn("col.table_name", upCaseTables.toArray()).append(" order by position", new Object[0]);
  309. }
  310. return (Map)DB.query(route, builder, (rs) -> {
  311. Map<String, List<String>> cols = new HashMap(16);
  312. while(rs.next()) {
  313. String table = rs.getString(2);
  314. cols.put(table, new ArrayList());
  315. List<String> list = (List)cols.get(table);
  316. list.add(rs.getString(1));
  317. }
  318. return cols;
  319. });
  320. }
  321. }
  322. }
  323. static class DefaultTableHandler implements IGetTableHandler {
  324. DefaultTableHandler() {
  325. }
  326. public Map<String, List<DesignerColumn>> batchLoadColumns(DBRoute route, List<String> tableNames) {
  327. if (tableNames.isEmpty()) {
  328. return new HashMap();
  329. } else {
  330. List<String> lowerCaseTables = (List)tableNames.stream().map(String::toLowerCase).collect(Collectors.toList());
  331. Map<String, Map<String, DesignerColumn>> res = new HashMap(tableNames.size());
  332. Iterator var5 = lowerCaseTables.iterator();
  333. while(var5.hasNext()) {
  334. String lowerTable = (String)var5.next();
  335. res.putIfAbsent(lowerTable, new HashMap());
  336. List<FieldInfo> fields = DB.getFieldInfo(route, lowerTable);
  337. Iterator var8 = fields.iterator();
  338. while(var8.hasNext()) {
  339. FieldInfo field = (FieldInfo)var8.next();
  340. DesignerColumn col = new DesignerColumn();
  341. String name = field.getFieldName();
  342. col.setCode(String.valueOf(name));
  343. col.setName(name);
  344. col.setType(field.getDataType());
  345. col.setFullType(field.getDataType());
  346. String desc = "";
  347. col.setComment(new LocaleString(desc));
  348. Object defaultValue = field.getDataDefault();
  349. col.setDefValue(defaultValue == null ? null : String.valueOf(defaultValue));
  350. long fieldLenth = field.getDataLength();
  351. if (fieldLenth == 0L) {
  352. fieldLenth = (long)field.getDataPrecision();
  353. }
  354. col.setLength(fieldLenth);
  355. col.setPrecision((long)field.getDataPrecision());
  356. col.setScale(field.getDataScale());
  357. col.setNotnull(!field.isNullable());
  358. ((Map)res.get(lowerTable)).put(name, col);
  359. }
  360. }
  361. Map<String, List<DesignerColumn>> resultData = new HashMap(16);
  362. Iterator var17 = res.entrySet().iterator();
  363. while(var17.hasNext()) {
  364. Map.Entry<String, Map<String, DesignerColumn>> item = (Map.Entry)var17.next();
  365. resultData.put(item.getKey(), new ArrayList(((Map)item.getValue()).values()));
  366. }
  367. return resultData;
  368. }
  369. }
  370. public Map<String, List<DesignerIndex>> batchLoadIndexs(DBRoute route, List<String> tableNames) {
  371. Map<String, List<DesignerIndex>> datas = new HashMap(tableNames.size());
  372. if (tableNames.isEmpty()) {
  373. return datas;
  374. } else {
  375. try {
  376. List<String> lowerCaseTables = (List)tableNames.stream().map(String::toLowerCase).collect(Collectors.toList());
  377. Map<String, List<DesignerIndex>> res = new HashMap(tableNames.size());
  378. Iterator var6 = lowerCaseTables.iterator();
  379. while(var6.hasNext()) {
  380. String lowTable = (String)var6.next();
  381. res.putIfAbsent(lowTable, new ArrayList());
  382. List<IndexInfo> indexInfos = DB.getIndexInfo(route, lowTable);
  383. Iterator var9 = indexInfos.iterator();
  384. while(var9.hasNext()) {
  385. IndexInfo indexInfo = (IndexInfo)var9.next();
  386. List<DesignerIndex> idxs = (List)res.get(lowTable);
  387. DesignerIndex idx = new DesignerIndex();
  388. String indexName = indexInfo.getIndexName();
  389. idx.setName(indexName);
  390. idx.setCode(indexName);
  391. idx.setIndexdef(IndexType.Common.typeValue);
  392. idx.setIndexType(IndexType.Common);
  393. List<IndexInfo.IndexFieldInfo> indexfieldInfos = indexInfo.getIndexFieldInfo();
  394. List<String> fieldNames = new ArrayList(10);
  395. Iterator var16 = indexfieldInfos.iterator();
  396. while(var16.hasNext()) {
  397. IndexInfo.IndexFieldInfo indexfieldInfo = (IndexInfo.IndexFieldInfo)var16.next();
  398. fieldNames.add(indexfieldInfo.getFieldName());
  399. }
  400. idx.setRefCols(fieldNames);
  401. idxs.add(idx);
  402. }
  403. }
  404. datas.putAll(res);
  405. } catch (Exception var18) {
  406. DBTableProviderNew.log.error("数据表查询索引失败:" + var18.getMessage(), var18);
  407. }
  408. return datas;
  409. }
  410. }
  411. public Map<String, List<DesignerConstaint>> batchLoadConstraints(DBRoute route, List<String> tableNames) {
  412. if (tableNames.isEmpty()) {
  413. return new HashMap();
  414. } else {
  415. List<String> lowerCaseTables = (List)tableNames.stream().map(String::toLowerCase).collect(Collectors.toList());
  416. Map<String, List<DesignerConstaint>> res = new HashMap(10);
  417. Iterator var5 = lowerCaseTables.iterator();
  418. while(var5.hasNext()) {
  419. String lowerTable = (String)var5.next();
  420. res.putIfAbsent(lowerTable, new ArrayList());
  421. List<DesignerConstaint> constaints = (List)res.get(lowerTable);
  422. List<String> primaryKeys = DB.getPrimaryKeys(route, lowerTable);
  423. Iterator var9 = primaryKeys.iterator();
  424. while(var9.hasNext()) {
  425. String primaryKey = (String)var9.next();
  426. DesignerConstaint constaint = new DesignerConstaint();
  427. constaints.add(constaint);
  428. constaint.setName(primaryKey);
  429. constaint.setCode(primaryKey);
  430. constaint.setRefCols(primaryKeys);
  431. constaint.setConstaintType(ConstaintType.Primary);
  432. }
  433. }
  434. return res;
  435. }
  436. }
  437. }
  438. static class KSQLTableHandler implements IGetTableHandler {
  439. KSQLTableHandler() {
  440. }
  441. public Map<String, List<DesignerColumn>> batchLoadColumns(DBRoute route, List<String> tableNames) {
  442. if (tableNames.isEmpty()) {
  443. return new HashMap();
  444. } else {
  445. List<String> lowerCaseTables = (List)tableNames.stream().map(String::toLowerCase).collect(Collectors.toList());
  446. SqlBuilder builder = new SqlBuilder();
  447. builder.append("SELECT TABLE_NAME,COLUMN_DEFAULT,IS_NULLABLE", new Object[0]).append(",NUMERIC_SCALE,COLUMN_NAME,CHARACTER_MAXIMUM_LENGTH ", new Object[0]).append(",DATA_TYPE ", new Object[0]).append(",NUMERIC_PRECISION ", new Object[0]).append(" ", new Object[0]).append(" FROM KSQL_USERCOLUMNS WHERE ", new Object[0]).appendIn("KSQL_TABNAME", lowerCaseTables.toArray());
  448. Map<String, Map<String, DesignerColumn>> data = (Map)DB.query(route, builder, (rs) -> {
  449. Map<String, Map<String, DesignerColumn>> result = new HashMap(tableNames.size());
  450. while(rs.next()) {
  451. String tableName = rs.getString("TABLE_NAME");
  452. String name = rs.getString("COLUMN_NAME");
  453. result.putIfAbsent(tableName, new HashMap());
  454. DesignerColumn col = new DesignerColumn();
  455. Object defvalue = rs.getObject("COLUMN_DEFAULT");
  456. Object nullable = rs.getObject("IS_NULLABLE");
  457. String type = rs.getString("DATA_TYPE");
  458. Object length = rs.getObject("CHARACTER_MAXIMUM_LENGTH");
  459. Object precision = rs.getObject("NUMERIC_PRECISION");
  460. Object scale = rs.getObject("NUMERIC_SCALE");
  461. String desc = "";
  462. col.setCode(name);
  463. col.setName(name);
  464. col.setType(type);
  465. col.setFullType(type);
  466. col.setComment(new LocaleString(desc));
  467. String defstr = defvalue == null ? null : String.valueOf(defvalue);
  468. col.setDefValue(defstr == null ? null : defstr.split("::")[0]);
  469. col.setLength(length == null ? (long)Integer.parseInt(String.valueOf(precision == null ? "-1" : precision)) : (long)Integer.parseInt(String.valueOf(length)));
  470. col.setScale(scale == null ? 0 : Integer.parseInt(String.valueOf(scale)));
  471. col.setNotnull("NO".equalsIgnoreCase(String.valueOf(nullable)));
  472. ((Map)result.get(tableName)).put(name, col);
  473. }
  474. return result;
  475. });
  476. SqlBuilder typeBuild = new SqlBuilder();
  477. typeBuild.append("/*dialect*/", new Object[0]).append(" select c.relname as ftablename, a.attname as fname, format_type(a.atttypid, a.atttypmod) as ffulltype, t.typname as ftype from pg_class c inner join pg_attribute a on a.attrelid = c.oid\n inner join pg_type t on a.atttypid = t.oid where a.attnum > 0 and", new Object[0]).appendIn("c.relname", lowerCaseTables.toArray());
  478. DB.query(route, typeBuild, (rs) -> {
  479. while(rs.next()) {
  480. String table = rs.getString(1);
  481. String column = rs.getString(2);
  482. if (table != null && column != null) {
  483. String fullType = rs.getString(3);
  484. String type = rs.getString(4);
  485. Map<String, DesignerColumn> items = (Map)data.get(table);
  486. if (items != null) {
  487. DesignerColumn item = (DesignerColumn)items.get(column);
  488. if (item != null) {
  489. item.setType(type);
  490. }
  491. }
  492. }
  493. }
  494. return null;
  495. });
  496. Map<String, List<DesignerColumn>> resultData = new HashMap(16);
  497. Iterator var8 = data.entrySet().iterator();
  498. while(var8.hasNext()) {
  499. Map.Entry<String, Map<String, DesignerColumn>> item = (Map.Entry)var8.next();
  500. resultData.put(item.getKey(), new ArrayList(((Map)item.getValue()).values()));
  501. }
  502. return resultData;
  503. }
  504. }
  505. public Map<String, List<DesignerIndex>> batchLoadIndexs(DBRoute route, List<String> tableNames) {
  506. Map<String, List<DesignerIndex>> datas = new HashMap(tableNames.size());
  507. if (tableNames.isEmpty()) {
  508. return datas;
  509. } else {
  510. try {
  511. List<String> lowerCaseTables = (List)tableNames.stream().map(String::toLowerCase).collect(Collectors.toList());
  512. SqlBuilder builder = new SqlBuilder();
  513. builder.append(" SELECT ", new Object[0]).append(" INDEXNAME,INDEXDEF,TABLENAME ", new Object[0]).append(" FROM KSQL_INDEXES ", new Object[0]).append(" ", new Object[0]).append(" WHERE ", new Object[0]).appendIn("KSQL_TABNAME", lowerCaseTables.toArray());
  514. datas.putAll((Map)DB.query(route, builder, (rs) -> {
  515. Map<String, List<DesignerIndex>> result = new HashMap(tableNames.size());
  516. while(rs.next()) {
  517. String tableName = rs.getString("TABLENAME");
  518. result.putIfAbsent(tableName, new ArrayList());
  519. List<DesignerIndex> idxs = (List)result.get(tableName);
  520. DesignerIndex idx = new DesignerIndex();
  521. String name = rs.getString("INDEXNAME");
  522. String indexof = rs.getString("INDEXDEF");
  523. idx.setName(name);
  524. idx.setCode(name);
  525. idx.setIndexdef(indexof);
  526. idx.setIndexType(IndexType.of(this.exprIndexType(indexof, name)));
  527. idx.setRefCols(this.exprIndexRef(indexof));
  528. idxs.add(idx);
  529. }
  530. return result;
  531. }));
  532. } catch (Exception var10) {
  533. DBType type = DB.getDBType(route);
  534. if (DBType.MySQL == type) {
  535. Iterator var6 = tableNames.iterator();
  536. while(var6.hasNext()) {
  537. String tablename = (String)var6.next();
  538. StringBuilder sbuilder = new StringBuilder();
  539. sbuilder.append("/*dialect*/").append(" show index from ").append(tablename);
  540. datas.putIfAbsent(tablename, new ArrayList());
  541. Map<String, DesignerIndex> tableIndexs = (Map)DB.query(route, sbuilder.toString(), (rs) -> {
  542. Map<String, DesignerIndex> indexMap = new HashMap(5);
  543. while(rs.next()) {
  544. String indexName = rs.getString("Key_name");
  545. String column = rs.getString("Column_name");
  546. indexMap.putIfAbsent(indexName, new DesignerIndex());
  547. DesignerIndex index = (DesignerIndex)indexMap.get(indexName);
  548. index.setCode(indexName);
  549. index.setName(indexName);
  550. index.setComment(new LocaleString(indexName));
  551. index.getRefCols().add(column);
  552. index.setTablename(tablename);
  553. }
  554. return indexMap;
  555. });
  556. ((List)datas.get(tablename)).addAll(tableIndexs.values());
  557. }
  558. } else {
  559. DBTableProviderNew.log.error("数据表查询索引失败:" + var10.getMessage(), var10);
  560. }
  561. }
  562. return datas;
  563. }
  564. }
  565. private List<String> exprIndexRef(String createStr) {
  566. int start = createStr.indexOf(40) + 1;
  567. int end = createStr.indexOf(41);
  568. String data = createStr.substring(start, end);
  569. return Arrays.asList(data.split(","));
  570. }
  571. private String exprIndexType(String createStr, String idxNum) {
  572. String[] parts = createStr.split(idxNum);
  573. int index = parts[0].indexOf(" ") + 1;
  574. return parts[0].substring(index);
  575. }
  576. public Map<String, List<DesignerConstaint>> batchLoadConstraints(DBRoute route, List<String> tableNames) {
  577. if (tableNames.isEmpty()) {
  578. return new HashMap();
  579. } else {
  580. List<String> lowerCaseTables = (List)tableNames.stream().map(String::toLowerCase).collect(Collectors.toList());
  581. SqlBuilder builder = new SqlBuilder();
  582. builder.append("SELECT * FROM KSQL_CONSTRAINTS ", new Object[0]).append(" WHERE ", new Object[0]).appendIn("TABLE_NAME", lowerCaseTables.toArray()).append(" and CONSTRAINT_TYPE = 'PRIMARY KEY'", new Object[0]);
  583. Map<String, List<String>> pkInfos = this.getPrimaryKeys(DB.getDBType(route), route, lowerCaseTables);
  584. return (Map)DB.query(route, builder, (rs) -> {
  585. Map<String, List<DesignerConstaint>> result = new HashMap(10);
  586. while(rs.next()) {
  587. String tableName = rs.getString("TABLE_NAME");
  588. List<String> cols = (List)pkInfos.get(tableName);
  589. if (cols != null && !cols.isEmpty()) {
  590. result.putIfAbsent(tableName, new ArrayList());
  591. List<DesignerConstaint> constaints = (List)result.get(tableName);
  592. String name = rs.getString("CONSTRAINT_NAME");
  593. DesignerConstaint constaint = new DesignerConstaint();
  594. constaints.add(constaint);
  595. constaint.setName(name);
  596. constaint.setCode(name);
  597. constaint.getRefCols().addAll(cols);
  598. constaint.setConstaintType(ConstaintType.of(rs.getString("CONSTRAINT_TYPE")));
  599. }
  600. }
  601. return result;
  602. });
  603. }
  604. }
  605. }
  606. static class PostgreSQLHandler implements IGetTableHandler {
  607. PostgreSQLHandler() {
  608. }
  609. private boolean isNumricType(String type) {
  610. return "numeric".equalsIgnoreCase(type);
  611. }
  612. private List<String> exprIndexRef(String createStr) {
  613. int start = createStr.indexOf(40) + 1;
  614. int end = createStr.indexOf(41);
  615. String data = createStr.substring(start, end);
  616. return Arrays.asList(data.split(","));
  617. }
  618. private String exprIndexType(String createStr, String idxNum) {
  619. String[] parts = createStr.split(idxNum);
  620. int index = parts[0].indexOf(" ") + 1;
  621. return parts[0].substring(index);
  622. }
  623. public Map<String, List<DesignerColumn>> batchLoadColumns(DBRoute route, List<String> tableNames) {
  624. if (tableNames.isEmpty()) {
  625. return new HashMap();
  626. } else {
  627. List<String> lowerCaseTables = (List)tableNames.stream().map(String::toLowerCase).collect(Collectors.toList());
  628. SqlBuilder builder = new SqlBuilder();
  629. builder.append("/*dialect*/ select distinct c.relname as ftablename,\n", new Object[0]).append("a.attname as fname,\n", new Object[0]).append("format_type(a.atttypid, a.atttypmod) as ffulltype,\n", new Object[0]).append("(case when a.attlen > 0 then a.attlen else a.atttypmod - 4 end) as flength,\n", new Object[0]).append(" a.attnotnull as fnullable,\n", new Object[0]).append(" pg_get_expr(d.adbin,d.adrelid) as fdefvalue,\n", new Object[0]).append(" col_description(a.attrelid, a.attnum) as fdesc,\n", new Object[0]).append(" a.attlen as fattlen, a.atttypmod as fatttypmod ,t.typname as ftype", new Object[0]).append(" from pg_class c,\n", new Object[0]).append(" pg_attribute a\n", new Object[0]).append(" inner join (select distinct a.attname, ad.adbin,ad.adrelid\n", new Object[0]).append(" from pg_class c,\n", new Object[0]).append(" pg_attribute a,\n", new Object[0]).append(" pg_attrdef ad,\n", new Object[0]).append(" pg_type t", new Object[0]).append(" where ", new Object[0]).appendIn("relname", lowerCaseTables.toArray()).append(" and ad.adrelid = c.oid\n", new Object[0]).append(" and adnum = a.attnum\n", new Object[0]).append(" and attrelid = c.oid) as d on a.attname = d.attname\n", new Object[0]).append(" , pg_type t ", new Object[0]).append("where ", new Object[0]).appendIn("c.relname", lowerCaseTables.toArray()).append(" and a.attrelid = c.oid\n", new Object[0]).append(" and a.attnum > 0 and a.atttypid = t.oid;", new Object[0]);
  630. return (Map)DB.query(route, builder, (rs) -> {
  631. HashMap result;
  632. List cols;
  633. DesignerColumn col;
  634. for(result = new HashMap(16); rs.next(); cols.add(col)) {
  635. String tableName = rs.getString("ftablename");
  636. result.putIfAbsent(tableName, new ArrayList());
  637. cols = (List)result.get(tableName);
  638. col = new DesignerColumn();
  639. String name = rs.getString("fname");
  640. String type = rs.getString("ftype");
  641. int lenght = rs.getInt("flength");
  642. boolean nullable = rs.getBoolean("fnullable");
  643. Object defvalue = rs.getObject("fdefvalue");
  644. String desc = rs.getString("fdesc");
  645. col.setCode(name);
  646. col.setName(name);
  647. col.setType(type);
  648. col.setFullType(rs.getString("ffulltype"));
  649. Integer atttypmod = rs.getInt("fatttypmod");
  650. col.setLength((long)lenght);
  651. if (this.isNumricType(type)) {
  652. int precision = atttypmod - 4 >> 16 & '\uffff';
  653. int scale = atttypmod - 4 & '\uffff';
  654. col.setLength((long)precision);
  655. col.setPrecision((long)precision);
  656. col.setScale(scale);
  657. }
  658. col.setNotnull(!nullable);
  659. String defstr = defvalue == null ? null : String.valueOf(defvalue);
  660. col.setDefValue(defstr == null ? null : defstr.split("::")[0]);
  661. if (StringUtils.isNotBlank(desc)) {
  662. col.setComment(new LocaleString(desc));
  663. } else {
  664. col.setComment(new LocaleString(name));
  665. }
  666. }
  667. return result;
  668. });
  669. }
  670. }
  671. public Map<String, List<DesignerIndex>> batchLoadIndexs(DBRoute route, List<String> tableNames) {
  672. if (tableNames.isEmpty()) {
  673. return new HashMap();
  674. } else {
  675. List<String> lowerCaseTables = (List)tableNames.stream().map(String::toLowerCase).collect(Collectors.toList());
  676. SqlBuilder builder = new SqlBuilder();
  677. builder.append("/*dialect*/", new Object[0]).append(" SELECT TABLENAME,INDEXNAME,INDEXDEF ", new Object[0]).append(" FROM PG_INDEXES ", new Object[0]).append(" WHERE ", new Object[0]).appendIn("TABLENAME", lowerCaseTables.toArray());
  678. return (Map)DB.query(route, builder, (rs) -> {
  679. Map<String, List<DesignerIndex>> result = new HashMap(tableNames.size());
  680. while(rs.next()) {
  681. String tableName = rs.getString(1);
  682. result.putIfAbsent(tableName, new ArrayList());
  683. List<DesignerIndex> idxs = (List)result.get(tableName);
  684. DesignerIndex idx = new DesignerIndex();
  685. String name = rs.getString(2);
  686. String indexof = rs.getString(3);
  687. idx.setName(name);
  688. idx.setCode(name);
  689. idx.setIndexdef(indexof);
  690. idx.setIndexType(IndexType.of(this.exprIndexType(indexof, name)));
  691. idx.setRefCols(this.exprIndexRef(indexof));
  692. idxs.add(idx);
  693. }
  694. return result;
  695. });
  696. }
  697. }
  698. public Map<String, List<DesignerConstaint>> batchLoadConstraints(DBRoute route, List<String> tableNames) {
  699. if (tableNames.isEmpty()) {
  700. return new HashMap();
  701. } else {
  702. List<String> lowerCaseTables = (List)tableNames.stream().map(String::toLowerCase).collect(Collectors.toList());
  703. SqlBuilder builder = new SqlBuilder();
  704. builder.append("/*dialect*/", new Object[0]).append(" SELECT TC.TABLE_NAME,TC.CONSTRAINT_NAME, KCU.COLUMN_NAME,", new Object[0]).append(" TC.CONSTRAINT_TYPE ", new Object[0]).append(" FROM ", new Object[0]).append(" INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC \n", new Object[0]).append(" JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU ON TC.CONSTRAINT_NAME = KCU.CONSTRAINT_NAME ", new Object[0]).append(" JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS CCU ON CCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME ", new Object[0]).append(" WHERE ", new Object[0]).appendIn("TC.TABLE_NAME", lowerCaseTables.toArray());
  705. return (Map)DB.query(route, builder, (rs) -> {
  706. Map<String, List<DesignerConstaint>> result = new HashMap(10);
  707. while(rs.next()) {
  708. String tableName = rs.getString(1);
  709. result.putIfAbsent(tableName, new ArrayList());
  710. List<DesignerConstaint> constaints = (List)result.get(tableName);
  711. String name = rs.getString(2);
  712. DesignerConstaint constaint = new DesignerConstaint();
  713. constaints.add(constaint);
  714. constaint.setName(name);
  715. constaint.setCode(name);
  716. constaint.setComment(new LocaleString(""));
  717. constaint.getRefCols().add(rs.getString(3));
  718. constaint.setConstaintType(ConstaintType.of(rs.getString(4)));
  719. }
  720. return result;
  721. });
  722. }
  723. }
  724. }
  725. static class OracleHandler implements IGetTableHandler {
  726. OracleHandler() {
  727. }
  728. public Map<String, List<DesignerColumn>> batchLoadColumns(DBRoute route, List<String> tableNames) {
  729. if (tableNames.isEmpty()) {
  730. return new HashMap();
  731. } else {
  732. List<String> upperTables = (List)tableNames.stream().map(String::toUpperCase).collect(Collectors.toList());
  733. SqlBuilder builder = new SqlBuilder();
  734. builder.append("/*dialect*/", new Object[0]).append("select ", new Object[0]).append("T.TABLE_NAME AS TABLENAME,T.COLUMN_NAME AS COLUMNNAME, T.DATA_TYPE AS COLTYPE, T.DATA_LENGTH LENGTH,T.DATA_PRECISION AS COLPRECISION,T.DATA_SCALE AS COLSCALE,T.NULLABLE AS NULLABLE,C.COMMENTS AS COMMENTS ,T.DATA_DEFAULT AS COLDEFAULT ", new Object[0]).append(" FROM USER_TAB_COLUMNS T, USER_COL_COMMENTS C WHERE T.TABLE_NAME = C.TABLE_NAME AND T.COLUMN_NAME = C.COLUMN_NAME AND ", new Object[0]).appendIn("T.TABLE_NAME", upperTables.toArray());
  735. return (Map)DB.query(route, builder, (rs) -> {
  736. Map<String, List<DesignerColumn>> result = new CaseInsensitiveMap(tableNames.size());
  737. while(rs.next()) {
  738. String tableName = rs.getString("TABLENAME");
  739. result.putIfAbsent(tableName, new ArrayList());
  740. List<DesignerColumn> dbcols = (List)result.get(tableName);
  741. DesignerColumn col = new DesignerColumn();
  742. String name = rs.getString("COLUMNNAME");
  743. Object nullable = rs.getObject("NULLABLE");
  744. String type = rs.getString("COLTYPE");
  745. Object length = rs.getObject("LENGTH");
  746. Object precision = rs.getObject("COLPRECISION");
  747. Object scale = rs.getObject("COLSCALE");
  748. Object comment = rs.getObject("COMMENTS");
  749. Object defvalue = rs.getObject("COLDEFAULT");
  750. String desc = comment == null ? "" : comment.toString();
  751. col.setCode(name);
  752. col.setName(name);
  753. col.setType(type);
  754. col.setFullType(type);
  755. col.setComment(new LocaleString(desc));
  756. col.setDefValue(defvalue == null ? null : String.valueOf(defvalue));
  757. try {
  758. col.setLength(precision == null ? (long)Integer.parseInt(String.valueOf(length)) : (long)Integer.parseInt(String.valueOf(precision)));
  759. } catch (Exception var16) {
  760. col.setLength(-1L);
  761. }
  762. col.setScale(scale == null ? 0 : Integer.parseInt(String.valueOf(scale)));
  763. col.setNotnull("N".equalsIgnoreCase(String.valueOf(nullable)));
  764. dbcols.add(col);
  765. }
  766. return result;
  767. });
  768. }
  769. }
  770. public Map<String, List<DesignerIndex>> batchLoadIndexs(DBRoute route, List<String> tableNames) {
  771. if (tableNames.isEmpty()) {
  772. return new HashMap();
  773. } else {
  774. List<String> upperTables = (List)tableNames.stream().map(String::toUpperCase).collect(Collectors.toList());
  775. SqlBuilder builder = new SqlBuilder();
  776. builder.append("/*dialect*/", new Object[0]).append("SELECT T1.INDEX_NAME , T1.INDEX_TYPE, T1.UNIQUENESS,T1.TABLE_NAME, T2.COLUMN_NAME FROM USER_INDEXES T1 ", new Object[0]).append("INNER JOIN USER_IND_COLUMNS T2 ON T1.INDEX_NAME = T2.INDEX_NAME WHERE ", new Object[0]).appendIn("T1.TABLE_NAME", upperTables.toArray());
  777. Map<String, Map<String, DesignerIndex>> queryResult = (Map)DB.query(route, builder, (rs) -> {
  778. Map<String, Map<String, DesignerIndex>> result = new CaseInsensitiveMap(tableNames.size());
  779. while(rs.next()) {
  780. String tableName = rs.getString("TABLE_NAME");
  781. result.putIfAbsent(tableName, new CaseInsensitiveMap());
  782. Map<String, DesignerIndex> idxs = (Map)result.get(tableName);
  783. String name = rs.getString("INDEX_NAME");
  784. Object unique = rs.getObject("UNIQUENESS");
  785. DesignerIndex idx = (DesignerIndex)idxs.getOrDefault(name, new DesignerIndex());
  786. idxs.put(name, idx);
  787. idx.setName(name);
  788. idx.setTablename(tableName);
  789. idx.setCode(name);
  790. idx.getRefCols().add(rs.getString("COLUMN_NAME"));
  791. if ("unique".equalsIgnoreCase(String.valueOf(unique))) {
  792. idx.setIndexType(IndexType.Unique);
  793. } else {
  794. String type = rs.getString("INDEX_TYPE");
  795. idx.setIndexType(IndexType.of(type));
  796. }
  797. }
  798. return result;
  799. });
  800. Map<String, List<DesignerIndex>> resultData = new CaseInsensitiveMap(16);
  801. Iterator var7 = queryResult.entrySet().iterator();
  802. while(var7.hasNext()) {
  803. Map.Entry<String, Map<String, DesignerIndex>> item = (Map.Entry)var7.next();
  804. resultData.put(item.getKey(), new ArrayList(((Map)item.getValue()).values()));
  805. }
  806. return resultData;
  807. }
  808. }
  809. public Map<String, List<DesignerConstaint>> batchLoadConstraints(DBRoute route, List<String> tableNames) {
  810. if (tableNames.isEmpty()) {
  811. return new HashMap();
  812. } else {
  813. List<String> upperTables = (List)tableNames.stream().map(String::toUpperCase).collect(Collectors.toList());
  814. SqlBuilder builder = new SqlBuilder();
  815. builder.append("/*dialect*/", new Object[0]).append("SELECT ", new Object[0]).append(" USER_CONS_COLUMNS.CONSTRAINT_NAME AS CONNAME , USER_CONS_COLUMNS.TABLE_NAME AS TABLENAME ,USER_CONS_COLUMNS.COLUMN_NAME AS COLNAME ", new Object[0]).append(" FROM USER_CONSTRAINTS JOIN USER_CONS_COLUMNS ON (USER_CONSTRAINTS.CONSTRAINT_NAME = USER_CONS_COLUMNS.CONSTRAINT_NAME) WHERE ", new Object[0]).append(" CONSTRAINT_TYPE = 'P' AND", new Object[0]).appendIn("USER_CONS_COLUMNS.TABLE_NAME", upperTables.toArray());
  816. Map<String, Map<String, DesignerConstaint>> data = (Map)DB.query(route, builder, (rs) -> {
  817. Map<String, Map<String, DesignerConstaint>> result = new CaseInsensitiveMap();
  818. while(rs.next()) {
  819. String tableName = rs.getString("TABLENAME");
  820. String name = rs.getString("CONNAME");
  821. result.putIfAbsent(tableName, new HashMap());
  822. ((Map)result.get(tableName)).putIfAbsent(name, new DesignerConstaint());
  823. DesignerConstaint constaint = (DesignerConstaint)((Map)result.get(tableName)).get(name);
  824. constaint.setName(name);
  825. constaint.setCode(name);
  826. constaint.setComment(new LocaleString(""));
  827. constaint.getRefCols().add(rs.getString(3));
  828. constaint.setConstaintType(ConstaintType.Primary);
  829. }
  830. return result;
  831. });
  832. Map<String, List<DesignerConstaint>> resultData = new CaseInsensitiveMap(16);
  833. Iterator var7 = data.entrySet().iterator();
  834. while(var7.hasNext()) {
  835. Map.Entry<String, Map<String, DesignerConstaint>> item = (Map.Entry)var7.next();
  836. resultData.put(item.getKey(), new ArrayList(((Map)item.getValue()).values()));
  837. }
  838. return resultData;
  839. }
  840. }
  841. }
  842. static class MySQLHandler implements IGetTableHandler {
  843. MySQLHandler() {
  844. }
  845. public Map<String, List<DesignerColumn>> batchLoadColumns(DBRoute route, List<String> tableNames) {
  846. if (tableNames.isEmpty()) {
  847. return new HashMap();
  848. } else {
  849. List<String> lowerCaseTables = (List)tableNames.stream().map(String::toLowerCase).collect(Collectors.toList());
  850. String schema = this.getTableScheme(route);
  851. SqlBuilder builder = new SqlBuilder();
  852. builder.append("/*dialect*/", new Object[0]).append(" SELECT TABLE_NAME,COLUMN_NAME ,COLUMN_DEFAULT ,IS_NULLABLE ,DATA_TYPE ,CHARACTER_MAXIMUM_LENGTH ,NUMERIC_PRECISION ,NUMERIC_SCALE,COLLATION_NAME ,COLUMN_KEY ,COLUMN_COMMENT,COLUMN_TYPE ", new Object[0]).append(" FROM information_schema.COLUMNS ", new Object[0]).append(" WHERE ", new Object[0]);
  853. if (StringUtils.isNotBlank(schema)) {
  854. builder.append(" TABLE_SCHEMA = ? ", new Object[]{new SqlParameter(":TABLE_SCHEMA", 12, schema)}).append(" AND ", new Object[0]);
  855. }
  856. builder.appendIn(" TABLE_NAME ", lowerCaseTables.toArray());
  857. Map<String, List<DesignerColumn>> data = (Map)DB.query(route, builder, (rs) -> {
  858. Map<String, List<DesignerColumn>> result = new HashMap(tableNames.size());
  859. while(rs.next()) {
  860. String tableName = rs.getString("TABLE_NAME");
  861. result.putIfAbsent(tableName, new ArrayList());
  862. List<DesignerColumn> dbcols = (List)result.get(tableName);
  863. DesignerColumn col = new DesignerColumn();
  864. String name = rs.getString("COLUMN_NAME");
  865. Object defvalue = rs.getObject("COLUMN_DEFAULT");
  866. Object nullable = rs.getObject("IS_NULLABLE");
  867. String type = rs.getString("DATA_TYPE");
  868. Object length = rs.getObject("CHARACTER_MAXIMUM_LENGTH");
  869. Object precision = rs.getObject("NUMERIC_PRECISION");
  870. Object scale = rs.getObject("NUMERIC_SCALE");
  871. Object comment = rs.getObject("COLUMN_COMMENT");
  872. String desc = comment == null ? "" : comment.toString();
  873. col.setCode(name);
  874. col.setName(name);
  875. col.setType(type);
  876. col.setFullType(rs.getString("COLUMN_TYPE"));
  877. col.setComment(new LocaleString(desc));
  878. col.setDefValue(defvalue == null ? null : String.valueOf(defvalue));
  879. try {
  880. col.setScale(scale == null ? 0 : Integer.parseInt(String.valueOf(scale)));
  881. col.setLength(length == null ? (precision == null ? -1L : Long.parseLong(String.valueOf(precision))) : Long.parseLong(String.valueOf(length)));
  882. col.setPrecision(col.getLength());
  883. } catch (Exception var16) {
  884. col.setLength(-1L);
  885. col.setScale(0);
  886. }
  887. col.setNotnull("NO".equalsIgnoreCase(String.valueOf(nullable)));
  888. dbcols.add(col);
  889. }
  890. return result;
  891. });
  892. return data;
  893. }
  894. }
  895. private String getTableScheme(DBRoute route) {
  896. String schema = null;
  897. try {
  898. schema = TX.__getConnection(route.getRouteKey(), true).getSchema();
  899. return schema;
  900. } catch (SQLException var4) {
  901. throw new KDException(new ErrorCode("env.tablequery.err", "query databasename err"), new Object[]{var4});
  902. }
  903. }
  904. public Map<String, List<DesignerIndex>> batchLoadIndexs(DBRoute route, List<String> tableNames) {
  905. if (tableNames.isEmpty()) {
  906. return new HashMap();
  907. } else {
  908. List<String> lowerCaseTables = (List)tableNames.stream().map(String::toLowerCase).collect(Collectors.toList());
  909. Map<String, List<DesignerIndex>> result = new HashMap(16);
  910. Iterator var5 = lowerCaseTables.iterator();
  911. while(var5.hasNext()) {
  912. String tablename = (String)var5.next();
  913. result.putIfAbsent(tablename, new ArrayList());
  914. try {
  915. StringBuilder sbuilder = new StringBuilder();
  916. sbuilder.append("/*dialect*/").append(" show index from ").append(tablename);
  917. Map<String, DesignerIndex> tableIndexs = (Map)DB.query(route, sbuilder.toString(), (Object[])null, (rs) -> {
  918. Map<String, DesignerIndex> indexMap = new HashMap(5);
  919. while(rs.next()) {
  920. String indexName = rs.getString("Key_name");
  921. String column = rs.getString("Column_name");
  922. indexMap.putIfAbsent(indexName, new DesignerIndex());
  923. DesignerIndex index = (DesignerIndex)indexMap.get(indexName);
  924. index.setCode(indexName);
  925. index.setName(indexName);
  926. String uniqueStr = rs.getString("Non_unique");
  927. if ("0".equals(uniqueStr)) {
  928. index.setIndexType(IndexType.Unique);
  929. } else {
  930. index.setIndexType(IndexType.Common);
  931. }
  932. index.setIndexdef("");
  933. index.setComment(new LocaleString(indexName));
  934. index.getRefCols().add(column);
  935. index.setTablename(tablename);
  936. }
  937. return indexMap;
  938. });
  939. ((List)result.get(tablename)).addAll(tableIndexs.values());
  940. } catch (Exception var9) {
  941. DBTableProviderNew.log.error("devp.DBTableProviderNew.err", var9);
  942. }
  943. }
  944. return result;
  945. }
  946. }
  947. public Map<String, List<DesignerConstaint>> batchLoadConstraints(DBRoute route, List<String> tableNames) {
  948. if (tableNames.isEmpty()) {
  949. return new HashMap();
  950. } else {
  951. List<String> lowerCaseTables = (List)tableNames.stream().map(String::toLowerCase).collect(Collectors.toList());
  952. String schema = this.getTableScheme(route);
  953. SqlBuilder builder = new SqlBuilder();
  954. builder.append("/*dialect*/", new Object[0]).append("select CONSTRAINT_NAME ,CONSTRAINT_TYPE,TABLE_NAME FROM information_schema.TABLE_CONSTRAINTS ", new Object[0]).append(" WHERE ", new Object[0]);
  955. if (StringUtils.isNotBlank(schema)) {
  956. builder.append(" CONSTRAINT_SCHEMA = ? ", new Object[]{new SqlParameter(":CONSTRAINT_SCHEMA", 12, schema)}).append(" AND ", new Object[0]);
  957. }
  958. builder.appendIn("TABLE_NAME", lowerCaseTables.toArray());
  959. Map<String, List<String>> pkInfos = this.getPrimaryKeys(DB.getDBType(route), route, lowerCaseTables);
  960. Map<String, Map<String, DesignerConstaint>> data = (Map)DB.query(route, builder, (rs) -> {
  961. Map<String, Map<String, DesignerConstaint>> result = new HashMap(16);
  962. while(rs.next()) {
  963. String tableName = rs.getString("TABLE_NAME");
  964. result.putIfAbsent(tableName, new HashMap());
  965. List<String> cols = (List)pkInfos.get(tableName);
  966. if (cols != null && !cols.isEmpty()) {
  967. Map<String, DesignerConstaint> constaints = (Map)result.get(tableName);
  968. String name = rs.getString("CONSTRAINT_NAME");
  969. DesignerConstaint constaint = (DesignerConstaint)constaints.getOrDefault(name, new DesignerConstaint());
  970. constaints.put(name, constaint);
  971. constaint.setName(name);
  972. constaint.setCode(name);
  973. constaint.setComment(new LocaleString(""));
  974. if (constaint.getRefCols().isEmpty()) {
  975. constaint.getRefCols().add(cols.get(0));
  976. } else {
  977. constaint.getRefCols().set(0, cols.get(0));
  978. }
  979. constaint.setConstaintType(ConstaintType.of(rs.getString("CONSTRAINT_TYPE")));
  980. }
  981. }
  982. return result;
  983. });
  984. Map<String, List<DesignerConstaint>> returnData = new HashMap(data.size());
  985. data.forEach((k, v) -> {
  986. returnData.put(k, new ArrayList(v.values()));
  987. });
  988. return returnData;
  989. }
  990. }
  991. }
  992. }