ReverseEngineeringMaxdb.java
上传用户:cccombo
上传日期:2021-01-31
资源大小:16445k
文件大小:43k
源码类别:

MySQL数据库

开发平台:

SQL

  1. package com.mysql.grt.modules;
  2. import java.sql.*;
  3. import com.mysql.grt.*;
  4. import com.mysql.grt.db.maxdb.*;
  5. /**
  6.  * GRT Reverse Engineering Class for MaxDB
  7.  * 
  8.  * @author Mike
  9.  * @version 1.0, 11/26/04
  10.  * 
  11.  */
  12. public class ReverseEngineeringMaxdb extends ReverseEngineeringGeneric {
  13. /**
  14.  * Static function to return information about this class to the GRT
  15.  * environment
  16.  * 
  17.  * @return returns a GRT XML string containing the infos about this class
  18.  */
  19. public static String getModuleInfo() {
  20. return Grt.getModuleInfoXml(ReverseEngineeringMaxdb.class,
  21. "ReverseEngineering");
  22. }
  23. /* MaxDB <=7.5 - no SQL schemata, schemata (namespaces) based on users */
  24. private static String schemataSelect75 = "SELECT USERNAME FROM USERS ORDER BY USERNAME ASC";
  25. /*
  26.  * MaxDB >=7.6 - real SQL schema and CREATE SCHEMA, in coexistance with the
  27.  * user logic
  28.  */
  29. private static String schemataSelect76 = "SELECT SCHEMANAME FROM SCHEMAS ORDER BY SCHEMANAME ASC";
  30. /**
  31.  * Returns a list of all schemata from the given JDBC connection
  32.  * 
  33.  * @param jdbcDriver
  34.  *            the class name of the JDBC driver
  35.  * @param jdbcConnectionString
  36.  *            a JDBC connection string
  37.  * @return returns a GRT XML string containing a list of schemata names
  38.  */
  39. public static GrtStringList getSchemata(
  40. com.mysql.grt.db.mgmt.Connection dbConn) throws Exception {
  41. String schemataSelect = "";
  42. // connect to the database
  43. Connection conn = establishConnection(dbConn);
  44. // As of 7.6 MaxDB has support for real SQL schemata (CREATE SCHEMA...)
  45. DatabaseMetaData metaData = conn.getMetaData();
  46. if ((metaData.getDatabaseMajorVersion() >= 7)
  47. && (metaData.getDatabaseMinorVersion() >= 6)) {
  48. schemataSelect = schemataSelect76;
  49. } else {
  50. schemataSelect = schemataSelect75;
  51. }
  52. Grt.getInstance().addMsg("Fetching schemata list...");
  53. Grt.getInstance().addMsgDetail(schemataSelect);
  54. Grt.getInstance().flushMessages();
  55. GrtStringList schemataList = new GrtStringList();
  56. Statement stmt = conn.createStatement();
  57. ResultSet rset = stmt.executeQuery(schemataSelect);
  58. while (rset.next()) {
  59. schemataList.add(rset.getString(1));
  60. }
  61. stmt.close();
  62. conn.close();
  63. Grt.getInstance().addMsg("Return schemata list.");
  64. Grt.getInstance().flushMessages();
  65. return schemataList;
  66. }
  67. /**
  68.  * Does the reverse engineering of the given schematas over the JDBC
  69.  * connection and returns the GRT objects
  70.  * 
  71.  * @param jdbcDriver
  72.  *            the class name of the JDBC driver
  73.  * @param jdbcConnectionString
  74.  *            a JDBC connection string
  75.  * @param schemataList
  76.  *            list of schematas to be reverse engineered
  77.  * @return returns a GRT XML string containing a the reverse engineered
  78.  *         objects
  79.  */
  80. public static com.mysql.grt.db.Catalog reverseEngineer(
  81. com.mysql.grt.db.mgmt.Connection dbConn, GrtStringList schemataList)
  82. throws Exception {
  83. boolean reverseEngineerOnlyTableObjects = (Grt.getInstance()
  84. .getGrtGlobalAsInt(
  85. "/migration/applicationData/"
  86. + "reverseEngineerOnlyTableObjects") == 1);
  87. // connect to the database
  88. Connection conn = establishConnection(dbConn);
  89. // create reveng instance
  90. ReverseEngineeringMaxdb revEng = new ReverseEngineeringMaxdb();
  91. Catalog catalog = new Catalog(null);
  92. catalog.setName("MaxdbCatalog");
  93. catalog.setVersion(getVersion(dbConn));
  94. Grt.getInstance().addMsg("Build simple MaxDB datatypes.");
  95. Grt.getInstance().flushMessages();
  96. revEng.buildSimpleDatatypes(dbConn, catalog);
  97. for (int i = 0; i < schemataList.size(); i++) {
  98. Schema schema = new Schema(catalog);
  99. schema.setName((String) (schemataList.get(i)));
  100. catalog.getSchemata().add(schema);
  101. // Get Tables
  102. if (revEng.reverseEngineerTables(conn, catalog, schema) == 0
  103. && !reverseEngineerOnlyTableObjects) {
  104. // Get Views
  105. revEng.reverseEngineerViews(conn, catalog, schema);
  106. // Get SPs
  107. if (revEng.reverseEngineerProcedures(conn, catalog, schema) == 0) {
  108. // Get Sequences
  109. if (revEng.reverseEngineerSequences(conn, catalog, schema) == 0) {
  110. // Get table Synonyms
  111. revEng.reverseEngineerSynonyms(conn, catalog, schema);
  112. }
  113. }
  114. }
  115. }
  116. // make sure the Fks use real references instead of
  117. // text names where possible
  118. revEng.reverseEngineerUpdateFkReferences(catalog);
  119. return catalog;
  120. }
  121. protected void buildSimpleDatatypes(
  122. com.mysql.grt.db.mgmt.Connection dbConn, Catalog catalog) {
  123. com.mysql.grt.db.mgmt.Driver driver = dbConn.getDriver();
  124. com.mysql.grt.db.mgmt.Rdbms rdbms = (com.mysql.grt.db.mgmt.Rdbms) driver
  125. .getOwner();
  126. com.mysql.grt.db.SimpleDatatypeList rdbmsDatatypeList = rdbms
  127. .getSimpleDatatypes();
  128. com.mysql.grt.db.SimpleDatatypeList catalogDatatypeList = new com.mysql.grt.db.SimpleDatatypeList();
  129. for (int i = 0; i < rdbmsDatatypeList.size(); i++) {
  130. catalogDatatypeList.add(rdbmsDatatypeList.get(i));
  131. }
  132. catalog.setSimpleDatatypes(catalogDatatypeList);
  133. }
  134. private static String tableCountSelect75 = "SELECT COUNT(*) AS TABLECOUNT FROM TABLES "
  135. + "WHERE OWNER=? AND TYPE='TABLE'";
  136. private static String tableCountSelect76 = "SELECT COUNT(*) AS TABLECOUNT FROM TABLES "
  137. + "WHERE SCHEMANAME=? AND TYPE='TABLE'";
  138. private static String tableSelect75 = "SELECT * FROM TABLES "
  139. + "WHERE OWNER=? AND TYPE='TABLE' ORDER BY TABLENAME ASC";
  140. private static String tableSelect76 = "SELECT * FROM TABLES "
  141. + "WHERE SCHEMANAME=? AND TYPE = 'TABLE' ORDER BY TABLENAME ASC";
  142. protected int reverseEngineerTables(Connection conn, Catalog catalog,
  143. Schema schema) throws Exception {
  144. int tableCount = 0;
  145. int currentTableNumber = 0;
  146. String sqlSelect = "";
  147. sqlSelect = (this.useRealSchema(conn)) ? tableCountSelect76
  148. : tableCountSelect75;
  149. Grt.getInstance().addMsg(
  150. "Fetch the number of tables in the schema " + schema.getName()
  151. + ".");
  152. Grt.getInstance().addMsgDetail(sqlSelect);
  153. PreparedStatement stmt = conn.prepareStatement(sqlSelect);
  154. stmt.setString(1, schema.getName());
  155. ResultSet tblRset = stmt.executeQuery();
  156. if (tblRset.next()) {
  157. tableCount = tblRset.getInt("TABLECOUNT");
  158. }
  159. stmt.close();
  160. sqlSelect = (this.useRealSchema(conn)) ? tableSelect76 : tableSelect75;
  161. Grt.getInstance().addMsg(
  162. "Fetching " + tableCount + " table(s) of the schema "
  163. + schema.getName() + ".");
  164. Grt.getInstance().addMsgDetail(sqlSelect);
  165. Grt.getInstance().flushMessages();
  166. stmt = conn.prepareStatement(sqlSelect);
  167. stmt.setString(1, schema.getName());
  168. tblRset = stmt.executeQuery();
  169. while (tblRset.next()) {
  170. // Create new table
  171. Table table = new Table(schema);
  172. schema.getTables().add(table);
  173. currentTableNumber++;
  174. table.setName(tblRset.getString("TABLENAME"));
  175. Grt.getInstance().addProgress(
  176. "Processing table " + table.getName() + ".",
  177. (currentTableNumber * 100) / tableCount);
  178. if (Grt.getInstance().flushMessages() != 0) {
  179. Grt.getInstance().addMsg("Migration canceled by user.");
  180. return 1;
  181. }
  182. table.setNoFixedLengthColumn((tblRset.getString("DYNAMIC")
  183. .compareToIgnoreCase("NO") == 0) ? 1 : 0);
  184. table.setSample((tblRset.getString("SAMPLE_ROWS") == "") ? tblRset
  185. .getString("SAMPLE_PERCENT") : tblRset
  186. .getString("SAMPLE_ROWS"));
  187. table.setAlterDate(tblRset.getString("ALTERDATE"));
  188. table.setAlterTime(tblRset.getString("ALTERTIME"));
  189. table.setArchive(tblRset.getString("ARCHIVE"));
  190. table.setComment(tblRset.getString("COMMENT"));
  191. table.setCreateDate(tblRset.getString("CREATEDATE"));
  192. table.setCreateTime(tblRset.getString("CREATETIME"));
  193. // TODO: this needs to be escaped, otherwise it breaks the XML
  194. // table.setTableid(tblRset.getString("TABLEID"));
  195. table.setUnloaded(tblRset.getString("UNLOADED"));
  196. table.setUpdStatDate(tblRset.getString("UPDSTATDATE"));
  197. table.setUpdStatTime(tblRset.getString("UPDSTATTIME"));
  198. table.setVariableColumns(tblRset.getString("VARIABLE_COLUMNS"));
  199. table.setPrivileges(tblRset.getString("PRIVILEGES"));
  200. reverseEngineerTableColumns(conn, catalog, schema, table);
  201. reverseEngineerTablePK(conn, catalog, schema, table);
  202. reverseEngineerTableIndices(conn, catalog, schema, table);
  203. reverseEngineerTableFKs(conn, catalog, schema, table);
  204. reverseEngineerTableTriggers(conn, catalog, schema, table);
  205. }
  206. Grt.getInstance().addProgress("", -1);
  207. Grt.getInstance().flushMessages();
  208. stmt.close();
  209. return 0;
  210. }
  211. private static String tableColumnSelect75 = "SELECT * FROM COLUMNS "
  212. + "WHERE OWNER=? AND TABLENAME=? "
  213. + "ORDER BY TABLENAME ASC, POS ASC, KEYPOS ASC";
  214. private static String tableColumnSelect76 = "SELECT * FROM COLUMNS "
  215. + "WHERE SCHEMANAME=? AND TABLENAME=? "
  216. + "ORDER BY TABLENAME ASC, POS ASC, KEYPOS ASC";
  217. protected void reverseEngineerTableColumns(Connection conn,
  218. Catalog catalog, Schema schema, Table table) {
  219. String defaultValue = "";
  220. try {
  221. Grt.getInstance().addMsg("Fetching column information.");
  222. Grt.getInstance().addMsgDetail(
  223. (this.useRealSchema(conn)) ? tableColumnSelect76
  224. : tableColumnSelect75);
  225. PreparedStatement stmt = conn.prepareStatement((this
  226. .useRealSchema(conn)) ? tableColumnSelect76
  227. : tableColumnSelect75);
  228. stmt.setString(1, schema.getName());
  229. stmt.setString(2, table.getName());
  230. ResultSet colRset = stmt.executeQuery();
  231. while (colRset.next()) {
  232. // create new column
  233. Column column = new Column(table);
  234. table.getColumns().add(column);
  235. column.setName(colRset.getString("COLUMNNAME"));
  236. column.setDatatypeName(colRset.getString("DATATYPE"));
  237. column.setComment(colRset.getString("COMMENT"));
  238. column.setDefaultFunction(colRset.getString("DEFAULTFUNCTION"));
  239. defaultValue = colRset.getString("DEFAULT");
  240. column.setDefaultValue(defaultValue);
  241. if ((colRset.wasNull())
  242. && (colRset.getString("NULLABLE").compareToIgnoreCase(
  243. "YES") == 0)) {
  244. column.setDefaultValueIsNull(1);
  245. } else {
  246. column.setDefaultValueIsNull(0);
  247. }
  248. if (colRset.getString("NULLABLE").compareToIgnoreCase("YES") == 0) {
  249. column.setIsNullable(1);
  250. } else {
  251. column.setIsNullable(0);
  252. }
  253. column.setCodeType(colRset.getString("CODETYPE"));
  254. // TODO: check the meaning of length
  255. // MaxDB manual: Length or precision of column
  256. column.setLength(colRset.getInt("LEN"));
  257. column.setPrecision(colRset.getInt("LEN"));
  258. // TODO: check meaning - OK for FIXED
  259. column.setScale(colRset.getInt("DEC"));
  260. column.setAlterDate(colRset.getString("ALTERDATE"));
  261. column.setAlterTime(colRset.getString("ALTERTIME"));
  262. column.setCreateDate(colRset.getString("CREATEDATE"));
  263. column.setCreateTime(colRset.getString("CREATETIME"));
  264. column.setPrivileges(colRset.getString("COLUMNPRIVILEGES"));
  265. column.setDomainOwner(colRset.getString("DOMAINOWNER"));
  266. column.setDomainName(colRset.getString("DOMAINNAME"));
  267. // Get Simple Type
  268. int datatypeIndex = catalog.getSimpleDatatypes()
  269. .getIndexOfName(column.getDatatypeName());
  270. if (datatypeIndex > -1) {
  271. column.setSimpleType(catalog.getSimpleDatatypes().get(
  272. datatypeIndex));
  273. } else {
  274. column.setSimpleType(catalog.getSimpleDatatypes().get(
  275. catalog.getSimpleDatatypes().getIndexOfName(
  276. "VARCHAR")));
  277. column.setLength(255);
  278. Grt.getInstance().addMsg(
  279. "WARNING: The datatype " + column.getDatatypeName()
  280. + " was not been defined yet.");
  281. }
  282. }
  283. stmt.close();
  284. } catch (Exception e) {
  285. Grt.getInstance().addErr(e.getMessage());
  286. }
  287. }
  288. private static String tablePKSelect75 = "SELECT COLUMNNAME FROM COLUMNS "
  289. + "WHERE OWNER=? AND TABLENAME=? AND MODE='KEY' "
  290. + "ORDER BY KEYPOS ASC";
  291. private static String tablePKSelect76 = "SELECT COLUMNNAME FROM COLUMNS "
  292. + "WHERE SCHEMANAME=? AND TABLENAME=? AND MODE='KEY' "
  293. + "ORDER BY KEYPOS ASC";
  294. protected void reverseEngineerTablePK(Connection conn, Catalog catalog,
  295. Schema schema, Table table) throws Exception {
  296. String tablePKSelect = "";
  297. try {
  298. Grt.getInstance().addMsg("Fetching primary key information.");
  299. tablePKSelect = (this.useRealSchema(conn)) ? tablePKSelect76
  300. : tablePKSelect75;
  301. Grt.getInstance().addMsgDetail(tablePKSelect);
  302. PreparedStatement stmt = conn.prepareStatement(tablePKSelect);
  303. stmt.setString(1, schema.getName());
  304. stmt.setString(2, table.getName());
  305. ResultSet colRset = stmt.executeQuery();
  306. Index primaryKey = null;
  307. while (colRset.next()) {
  308. if (primaryKey == null) {
  309. primaryKey = new Index(table);
  310. primaryKey.setName("PRIMARY");
  311. primaryKey.setIsPrimary(1);
  312. table.getIndices().add(primaryKey);
  313. table.setPrimaryKey(primaryKey);
  314. }
  315. String indexColumnName = colRset.getString("COLUMNNAME");
  316. int index = table.getColumns().getIndexOfName(indexColumnName);
  317. if (index > -1) {
  318. // create new index column
  319. IndexColumn indexColumn = new IndexColumn(primaryKey);
  320. indexColumn.setName(indexColumnName);
  321. // find reference table column
  322. for (int j = 0; j < table.getColumns().size(); j++) {
  323. Column column = (Column) (table.getColumns().get(j));
  324. if (column.getName().compareToIgnoreCase(
  325. indexColumn.getName()) == 0) {
  326. indexColumn.setReferedColumn(column);
  327. break;
  328. }
  329. }
  330. primaryKey.getColumns().add(indexColumn);
  331. }
  332. }
  333. stmt.close();
  334. } catch (Exception e) {
  335. Grt.getInstance().addErr(e.getMessage());
  336. }
  337. }
  338. private static String tableIndexSelect75 = "SELECT"
  339. + "  idx.OWNER, idx.INDEXNAME, "
  340. + "  idx.TYPE as INDEX_TYPE, idx.CREATEDATE as INDEX_CREATEDATE, "
  341. + "  idx.CREATETIME as INDEX_CREATETIME, idx.INDEX_USED, "
  342. + "  idx.DISABLED, idx.COMMENT as INDEX_COMMENT, "
  343. + "  idxcols.COLUMNNAME, "
  344. + "  idxcols.SORT, idxcols.COLUMNNO, idxcols.DATATYPE, idxcols.LEN, "
  345. + "  idxcols.CREATEDATE as COLUMN_CREATEDATE, idxcols.CREATETIME as COLUMN_CREATETIME, "
  346. + "  idxcols.COMMENT as COLUMN_COMMENT " + "FROM "
  347. + "  INDEXES AS idx, INDEXCOLUMNS as idxcols " + "WHERE "
  348. + "  idx.OWNER=? " + "  AND idx.TABLENAME=? "
  349. + "  AND idx.OWNER = idxcols.OWNER "
  350. + "  AND idx.TABLENAME = idxcols.TABLENAME "
  351. + "  AND idx.INDEXNAME = idxcols.INDEXNAME " + "ORDER BY "
  352. + "  INDEXNAME ASC, COLUMNNO ASC";
  353. private static String tableIndexSelect76 = "SELECT "
  354. + "  idx.SCHEMANAME, idx.OWNER, idx.INDEXNAME, idx.FILEID as INDEX_FILEID, "
  355. + "  idx.TYPE as INDEX_TYPE, idx.CREATEDATE as INDEX_CREATEDATE, "
  356. + "  idx.CREATETIME as INDEX_CREATETIME, idx.INDEX_USED, idx.FILESTATE as INDEX_FILESTATE, "
  357. + "  idx.DISABLED, idx.COMMENT as INDEX_COMMENT, "
  358. + "  idxcols.FILEID as COLUMN_FILEID, idxcols.COLUMNNAME, "
  359. + "  idxcols.FILESTATE as COLUMN_FILESTATE, "
  360. + "  idxcols.SORT, idxcols.COLUMNNO, idxcols.DATATYPE, idxcols.LEN, "
  361. + "  idxcols.CREATEDATE as COLUMN_CREATEDATE, idxcols.CREATETIME as COLUMN_CREATETIME, "
  362. + "  idxcols.COMMENT as COLUMN_COMMENT " + "FROM "
  363. + "  INDEXES AS idx, INDEXCOLUMNS as idxcols " + "WHERE "
  364. + "  idx.SCHEMANAME=? " + "  AND idx.TABLENAME=? "
  365. + "  AND idx.SCHEMANAME = idxcols.SCHEMANAME "
  366. + "  AND idx.TABLENAME = idxcols.TABLENAME "
  367. + "  AND idx.INDEXNAME = idxcols.INDEXNAME " + "ORDER BY "
  368. + "  INDEXNAME ASC, COLUMNNO ASC";
  369. private static String tableIndexStatisticsSelect75 = "SELECT * FROM INDEXSTATISTICS WHERE "
  370. + "OWNER=? AND TABLENAME=? AND INDEXNAME=?";
  371. private static String tableIndexStatisticsSelect76 = "SELECT * FROM INDEXSTATISTICS WHERE "
  372. + "SCHEMANAME=? AND TABLENAME=? AND INDEXNAME=?";
  373. protected void reverseEngineerTableIndices(Connection conn,
  374. Catalog catalog, Schema schema, Table table) {
  375. String tableIndexSelect = "";
  376. String tableIndexStatisticsSelect = "";
  377. try {
  378. if (this.useRealSchema(conn)) {
  379. tableIndexSelect = tableIndexSelect76;
  380. tableIndexStatisticsSelect = tableIndexStatisticsSelect76;
  381. } else {
  382. tableIndexSelect = tableIndexSelect75;
  383. tableIndexStatisticsSelect = tableIndexStatisticsSelect75;
  384. }
  385. Grt.getInstance().addMsg("Fetching indices information.");
  386. Grt.getInstance().addMsgDetail(tableIndexSelect);
  387. Grt.getInstance().addMsgDetail(tableIndexStatisticsSelect);
  388. PreparedStatement stmt = conn.prepareStatement(tableIndexSelect);
  389. stmt.setString(1, schema.getName());
  390. stmt.setString(2, table.getName());
  391. ResultSet rset = stmt.executeQuery();
  392. String indexName = "";
  393. Index index = null;
  394. while (rset.next()) {
  395. String newIndexName = rset.getString("INDEXNAME");
  396. if (indexName.compareTo(newIndexName) != 0) {
  397. if (index != null)
  398. table.getIndices().add(index);
  399. index = new Index(table);
  400. index.setName(newIndexName);
  401. indexName = newIndexName;
  402. /* Properties from the sytem table INDEXES */
  403. index.setCreateDate(rset.getString("INDEX_CREATEDATE"));
  404. index.setCreateTime(rset.getString("INDEX_CREATETIME"));
  405. index.setComment(rset.getString("INDEX_COMMENT"));
  406. index.setDeferability(0);
  407. if (rset.getString("DISABLED").compareToIgnoreCase("YES") == 0) {
  408. index.setDisabled(1);
  409. } else {
  410. index.setDisabled(0);
  411. }
  412. if (this.useRealSchema(conn)) {
  413. // TODO: this needs to be escaped, otherwise it breaks
  414. // the XML
  415. // index.setFileid(rset.getString("INDEX_FILEID"));
  416. /* TODO: currently SAP does not document the meaning */
  417. index.setFilestate(rset.getString("INDEX_FILESTATE"));
  418. }
  419. index.setIndexType(rset.getString("INDEX_TYPE"));
  420. if (rset.getInt("INDEX_USED") > 0) {
  421. index.setIndexUsed(1);
  422. } else {
  423. index.setIndexUsed(0);
  424. }
  425. if (rset.getString("INDEX_TYPE").compareToIgnoreCase(
  426. "UNIQUE") == 0) {
  427. index.setUnique(1);
  428. } else {
  429. index.setUnique(0);
  430. }
  431. // Index statistics
  432. PreparedStatement stmtStats = conn
  433. .prepareStatement(tableIndexStatisticsSelect);
  434. stmtStats.setString(1, schema.getName());
  435. stmtStats.setString(2, table.getName());
  436. stmtStats.setString(3, index.getName());
  437. // That code is ugly, but don't blame me for MaxDB's strange
  438. // storage
  439. // and Java's clean code philosophy - I love PHP ;-)
  440. String valueDesc = "";
  441. ResultSet rsetStats = stmtStats.executeQuery();
  442. while (rsetStats.next()) {
  443. valueDesc = rsetStats.getString("DESCRIPTION");
  444. if (valueDesc
  445. .compareToIgnoreCase("Avg primary keys per list") == 0) {
  446. index.setAvgNumPkPerList(rsetStats
  447. .getInt("NUMERIC_VALUE"));
  448. } else if (valueDesc
  449. .compareToIgnoreCase("Avg secondary key length") == 0) {
  450. index.setAverageSkLength(rsetStats
  451. .getInt("NUMERIC_VALUE"));
  452. } else if (valueDesc
  453. .compareToIgnoreCase("Avg separator length") == 0) {
  454. index.setAvgSeperatorLength(rsetStats
  455. .getInt("NUMERIC_VALUE"));
  456. } else if (valueDesc.compareToIgnoreCase("Filetype") == 0) {
  457. index.setFilestate(rsetStats
  458. .getString("CHAR_VALUE"));
  459. } else if (valueDesc
  460. .compareToIgnoreCase("Index levels") == 0) {
  461. index.setIndexLevels(rsetStats
  462. .getInt("NUMERIC_VALUE"));
  463. } else if (valueDesc.compareToIgnoreCase("Index pages") == 0) {
  464. index.setIndexPages(rsetStats
  465. .getInt("NUMERIC_VALUE"));
  466. } else if (valueDesc.compareToIgnoreCase("Leaf  pages") == 0) {
  467. index.setLeafPages(rsetStats
  468. .getInt("NUMERIC_VALUE"));
  469. } else if (valueDesc
  470. .compareToIgnoreCase("Max primary keys per list") == 0) {
  471. index.setMaxNumPkPerList(rsetStats
  472. .getInt("NUMERIC_VALUE"));
  473. } else if (valueDesc
  474. .compareToIgnoreCase("Max secondary key length") == 0) {
  475. index.setMaxSkLength(rsetStats
  476. .getInt("NUMERIC_VALUE"));
  477. } else if (valueDesc
  478. .compareToIgnoreCase("Max separator length") == 0) {
  479. index.setMaxSeperatorLength(rsetStats
  480. .getInt("NUMERIC_VALUE"));
  481. } else if (valueDesc
  482. .compareToIgnoreCase("Min primary keys per list") == 0) {
  483. index.setMinNumPkPerList(rsetStats
  484. .getInt("NUMERIC_VALUE"));
  485. } else if (valueDesc
  486. .compareToIgnoreCase("Min secondary key length") == 0) {
  487. index.setMinSkLength(rsetStats
  488. .getInt("NUMERIC_VALUE"));
  489. } else if (valueDesc
  490. .compareToIgnoreCase("Min separator length") == 0) {
  491. index.setMinSeperatorLength(rsetStats
  492. .getInt("NUMERIC_VALUE"));
  493. } else if (valueDesc
  494. .compareToIgnoreCase("Primary keys") == 0) {
  495. index.setNumRowsPk(rsetStats
  496. .getInt("NUMERIC_VALUE"));
  497. } else if (valueDesc.compareToIgnoreCase("Root pno") == 0) {
  498. index
  499. .setRootPage(rsetStats
  500. .getInt("NUMERIC_VALUE"));
  501. } else if (valueDesc
  502. .compareToIgnoreCase("Secondary keys (index lists)") == 0) {
  503. index.setNumDistinctValues(rsetStats
  504. .getInt("NUMERIC_VALUE"));
  505. } else if (valueDesc
  506. .compareToIgnoreCase("Space used in all   pages (%)") == 0) {
  507. index.setTotalSpaceUsed(rsetStats
  508. .getInt("NUMERIC_VALUE"));
  509. } else if (valueDesc
  510. .compareToIgnoreCase("Space used in index pages (%)") == 0) {
  511. index.setIndexPagesSpace(rsetStats
  512. .getInt("NUMERIC_VALUE"));
  513. } else if (valueDesc
  514. .compareToIgnoreCase("Space used in index pages (%) max") == 0) {
  515. index.setIndexPageSpaceMax(rsetStats
  516. .getInt("NUMERIC_VALUE"));
  517. } else if (valueDesc
  518. .compareToIgnoreCase("Space used in index pages (%) min") == 0) {
  519. index.setIndexPageSpaceMin(rsetStats
  520. .getInt("NUMERIC_VALUE"));
  521. } else if (valueDesc
  522. .compareToIgnoreCase("Space used in leaf  pages (%)") == 0) {
  523. index.setLeafPagesSpace(rsetStats
  524. .getInt("NUMERIC_VALUE"));
  525. } else if (valueDesc
  526. .compareToIgnoreCase("Space used in leaf  pages (%) max") == 0) {
  527. index.setLeafPagesSpaceMax(rsetStats
  528. .getInt("NUMERIC_VALUE"));
  529. } else if (valueDesc
  530. .compareToIgnoreCase("Space used in leaf  pages (%) min") == 0) {
  531. index.setLeafPagesSpaceMin(rsetStats
  532. .getInt("NUMERIC_VALUE"));
  533. } else if (valueDesc
  534. .compareToIgnoreCase("Space used in root  page  (%)") == 0) {
  535. index.setRootPageSpace(rsetStats
  536. .getInt("NUMERIC_VALUE"));
  537. } else if (valueDesc.compareToIgnoreCase("Used  pages") == 0) {
  538. index.setUsedPages(rsetStats
  539. .getInt("NUMERIC_VALUE"));
  540. } else if (valueDesc
  541. .compareToIgnoreCase("Values with selectivity <=  1%") == 0) {
  542. index.setSelectivityLess1Percent(rsetStats
  543. .getInt("NUMERIC_VALUE"));
  544. } else if (valueDesc
  545. .compareToIgnoreCase("Values with selectivity <=  5%") == 0) {
  546. index.setSelectivityLess5Percent(rsetStats
  547. .getInt("NUMERIC_VALUE"));
  548. } else if (valueDesc
  549. .compareToIgnoreCase("Values with selectivity <= 10%") == 0) {
  550. index.setSelectivityLess10Percent(rsetStats
  551. .getInt("NUMERIC_VALUE"));
  552. } else if (valueDesc
  553. .compareToIgnoreCase("Values with selectivity <= 25%") == 0) {
  554. index.setSelectivityLess25Percent(rsetStats
  555. .getInt("NUMERIC_VALUE"));
  556. } else if (valueDesc
  557. .compareToIgnoreCase("Values with selectivity >  25%") == 0) {
  558. index.setSelectivityGreater25Percent(rsetStats
  559. .getInt("NUMERIC_VALUE"));
  560. }
  561. }
  562. }
  563. IndexColumn indexColumn = new IndexColumn(index);
  564. indexColumn.setName(rset.getString("COLUMNNAME"));
  565. indexColumn.setColumnLength(rset.getInt("LEN"));
  566. indexColumn.setComment(rset.getString("COLUMN_COMMENT"));
  567. indexColumn.setCreateDate(rset.getString("COLUMN_CREATEDATE"));
  568. indexColumn.setCreateTime(rset.getString("COLUMN_CREATETIME"));
  569. if (rset.getString("SORT").compareToIgnoreCase("ASC") == 0) {
  570. indexColumn.setDescend(1);
  571. } else {
  572. indexColumn.setDescend(0);
  573. }
  574. if (this.useRealSchema(conn)) {
  575. // TODO: this needs to be escaped, otherwise it breaks the
  576. // XML
  577. // indexColumn.setFileid(rset.getString("COLUMN_FILEID"));
  578. indexColumn
  579. .setFilestate(rset.getString("COLUMN_FILESTATE"));
  580. }
  581. // find reference table column
  582. for (int j = 0; j < table.getColumns().size(); j++) {
  583. Column column = (Column) (table.getColumns().get(j));
  584. if (column.getName().compareTo(indexColumn.getName()) == 0) {
  585. indexColumn.setReferedColumn(column);
  586. break;
  587. }
  588. }
  589. index.getColumns().add(indexColumn);
  590. }
  591. if (index != null)
  592. table.getIndices().add(index);
  593. stmt.close();
  594. } catch (Exception e) {
  595. Grt.getInstance().addErr(e.getMessage());
  596. }
  597. }
  598. private static String tableFKSelect75 = "SELECT "
  599. + "  fk.OWNER, fk.TABLENAME, fk.FKEYNAME, fk.RULE, "
  600. + "  fk.CREATEDATE, fk.CREATETIME, "
  601. + "  fkcols.COLUMNNAME, fkcols.REFOWNER, "
  602. + "  fkcols.REFTABLENAME, fkcols.REFCOLUMNNAME, fkcols.RULE "
  603. + "FROM " + "  FOREIGNKEYS as fk, "
  604. + "  FOREIGNKEYCOLUMNS as fkcols " + "WHERE "
  605. + "  fk.OWNER=? AND fk.TABLENAME=?"
  606. + "  AND fk.OWNER = fkcols.OWNER "
  607. + "  AND fk.TABLENAME = fkcols.TABLENAME "
  608. + "  AND fk.FKEYNAME = fkcols.FKEYNAME " + "ORDER BY "
  609. + "  FKEYNAME ASC";
  610. private static String tableFKSelect76 = "SELECT "
  611. + "  fk.SCHEMANAME, fk.OWNER, fk.TABLENAME, fk.FKEYNAME, fk.RULE, "
  612. + "  fk.CREATEDATE, fk.CREATETIME, "
  613. + "  fkcols.COLUMNNAME, fkcols.REFSCHEMANAME, fkcols.REFOWNER, "
  614. + "  fkcols.REFTABLENAME, fkcols.REFCOLUMNNAME, fkcols.RULE "
  615. + "FROM " + "  FOREIGNKEYS as fk, "
  616. + "  FOREIGNKEYCOLUMNS as fkcols " + "WHERE "
  617. + "  fk.SCHEMANAME=? AND fk.TABLENAME=? "
  618. + "  AND fk.SCHEMANAME = fkcols.SCHEMANAME "
  619. + "  AND fk.TABLENAME = fkcols.TABLENAME "
  620. + "  AND fk.FKEYNAME = fkcols.FKEYNAME " + "ORDER BY "
  621. + "  FKEYNAME ASC";
  622. protected void reverseEngineerTableFKs(Connection conn, Catalog catalog,
  623. Schema schema, Table table) {
  624. String tableFKSelect = "";
  625. try {
  626. Grt.getInstance().addMsg("Fetching FK information.");
  627. tableFKSelect = (this.useRealSchema(conn)) ? tableFKSelect76
  628. : tableFKSelect75;
  629. Grt.getInstance().addMsgDetail(tableFKSelect);
  630. PreparedStatement stmt = conn.prepareStatement(tableFKSelect);
  631. stmt.setString(1, schema.getName());
  632. stmt.setString(2, table.getName());
  633. ResultSet rset = stmt.executeQuery();
  634. String fkName = "";
  635. ForeignKey foreignKey = null;
  636. while (rset.next()) {
  637. String newFkName = rset.getString("FKEYNAME");
  638. if (fkName.compareTo(newFkName) != 0) {
  639. if (foreignKey != null)
  640. table.getForeignKeys().add(foreignKey);
  641. foreignKey = new ForeignKey(table);
  642. foreignKey.setName(newFkName);
  643. foreignKey.setCreateDate(rset.getString("CREATEDATE"));
  644. foreignKey.setCreateTime(rset.getString("CREATETIME"));
  645. foreignKey.setDeferability(0);
  646. foreignKey.setDeleteRule(rset.getString("RULE")
  647. .substring(7));
  648. if (this.useRealSchema(conn)) {
  649. foreignKey.setReferedTableSchemaName(rset
  650. .getString("REFSCHEMANAME"));
  651. } else {
  652. foreignKey.setReferedTableSchemaName(rset
  653. .getString("REFOWNER"));
  654. }
  655. foreignKey.setReferedTableName(rset
  656. .getString("REFTABLENAME"));
  657. }
  658. foreignKey.getReferedColumnNames().add(
  659. rset.getString("REFCOLUMNNAME"));
  660. // find reference table column
  661. String colName = rset.getString("REFCOLUMNNAME");
  662. for (int j = 0; j < table.getColumns().size(); j++) {
  663. Column column = (Column) (table.getColumns().get(j));
  664. if (column.getName().compareTo(colName) == 0)
  665. foreignKey.getColumns().add(column);
  666. }
  667. }
  668. if (foreignKey != null)
  669. table.getForeignKeys().add(foreignKey);
  670. stmt.close();
  671. } catch (Exception e) {
  672. Grt.getInstance().addErr(e.getMessage());
  673. }
  674. }
  675. private static String tableTriggerSelect75 = "SELECT * FROM TRIGGERS WHERE "
  676. + "OWNER=? AND TABLENAME=? ORDER BY TRIGGERNAME ASC";
  677. private static String tableTriggerSelect76 = "SELECT * FROM TRIGGERS WHERE "
  678. + "SCHEMANAME=? AND TABLENAME=? ORDER BY TRIGGERNAME ASC";
  679. protected void reverseEngineerTableTriggers(Connection conn,
  680. Catalog catalog, Schema schema, Table table) {
  681. String tableTriggerSelect = "";
  682. String triggerStatements = "";
  683. try {
  684. Grt.getInstance().addMsg("Fetching FK information.");
  685. tableTriggerSelect = (this.useRealSchema(conn)) ? tableTriggerSelect76
  686. : tableTriggerSelect75;
  687. Grt.getInstance().addMsgDetail(tableTriggerSelect);
  688. PreparedStatement stmt = conn.prepareStatement(tableTriggerSelect);
  689. stmt.setString(1, schema.getName());
  690. stmt.setString(2, table.getName());
  691. ResultSet rset = stmt.executeQuery();
  692. while (rset.next()) {
  693. Trigger trigger = new Trigger(table);
  694. trigger.setName(rset.getString("TRIGGERNAME"));
  695. trigger.setOldName(trigger.getName());
  696. trigger.setComment(rset.getString("COMMENT"));
  697. trigger.setCreateDate(rset.getString("CREATEDATE"));
  698. trigger.setCreateTime(rset.getString("CREATETIME"));
  699. trigger.setDefinition(rset.getString("DEFINITION"));
  700. trigger.setTiming("AFTER");
  701. trigger.setOrder(0);
  702. trigger.setEnabled(1);
  703. if (rset.getString("INSERT").equalsIgnoreCase("YES")) {
  704. trigger.setEvent("INSERT");
  705. } else if (rset.getString("UPDATE").equalsIgnoreCase("YES")) {
  706. trigger.setEvent("UPDATE");
  707. } else if (rset.getString("DELETE").equalsIgnoreCase("YES")) {
  708. trigger.setEvent("DELETE");
  709. }
  710. triggerStatements = trigger.getDefinition().trim();
  711. triggerStatements = triggerStatements.substring(
  712. triggerStatements.indexOf("(") + 1, triggerStatements
  713. .lastIndexOf(")") - 1);
  714. trigger.setStatement(triggerStatements.trim());
  715. table.getTriggers().add(trigger);
  716. }
  717. stmt.close();
  718. } catch (Exception e) {
  719. Grt.getInstance().addErr(e.getMessage());
  720. }
  721. }
  722. private static String viewSelect75 = "SELECT " + "  v.*, vd.DEFINITION "
  723. + "FROM " + "  VIEWS AS v, " + "  VIEWDEFS AS vd " + "WHERE "
  724. + "  v.OWNER=? " + "  AND v.OWNER = vd.OWNER "
  725. + "  AND v.VIEWNAME = vd.VIEWNAME " + "  AND v.TYPE='VIEW'"
  726. + "ORDER BY " + "  VIEWNAME ASC";
  727. private static String viewSelect76 = "SELECT " + "  v.*, vd.DEFINITION "
  728. + "FROM " + "  VIEWS AS v, " + "  VIEWDEFS AS vd " + "WHERE "
  729. + "  v.SCHEMANAME=? " + "  AND v.SCHEMANAME = vd.SCHEMANAME "
  730. + "  AND v.VIEWNAME = vd.VIEWNAME " + "  AND v.TYPE='VIEW' "
  731. + "ORDER BY " + "  VIEWNAME ASC";
  732. protected void reverseEngineerViews(Connection conn, Catalog catalog,
  733. Schema schema) throws Exception {
  734. String viewSelect = "";
  735. viewSelect = (this.useRealSchema(conn)) ? viewSelect76 : viewSelect75;
  736. Grt.getInstance().addMsg(
  737. "Fetch all views of the schema " + schema.getName() + ".");
  738. Grt.getInstance().addMsgDetail(viewSelect);
  739. Grt.getInstance().flushMessages();
  740. PreparedStatement stmt = conn.prepareStatement(viewSelect);
  741. stmt.setString(1, schema.getName());
  742. ResultSet rset = stmt.executeQuery();
  743. while (rset.next()) {
  744. // Create new view
  745. View view = new View(schema);
  746. schema.getViews().add(view);
  747. view.setName(rset.getString("VIEWNAME"));
  748. Grt.getInstance().addMsg("Processing view " + view.getName() + ".");
  749. view.setAlterDate(rset.getString("ALTERDATE"));
  750. view.setAlterTime(rset.getString("ALTERTIME"));
  751. view.setComment(rset.getString("COMMENT"));
  752. view.setCreateDate(rset.getString("CREATEDATE"));
  753. view.setCreateTime(rset.getString("CREATETIME"));
  754. if (rset.getString("COMPLEX").compareToIgnoreCase("YES") == 0) {
  755. view.setIsReadOnly(1);
  756. } else {
  757. view.setIsReadOnly(0);
  758. }
  759. view.setPrivileges(rset.getString("PRIVILEGES"));
  760. view.setQueryExpression(rset.getString("DEFINITION"));
  761. view.setUnloaded(rset.getString("UNLOADED"));
  762. view.setUpdStatDate(rset.getString("UPDSTATDATE"));
  763. view.setUpdStatTime(rset.getString("UPDSTATTIME"));
  764. if (rset.getString("WITHCHECKOPTION").compareToIgnoreCase("YES") == 0) {
  765. view.setWithCheckCondition(1);
  766. } else {
  767. view.setWithCheckCondition(0);
  768. }
  769. }
  770. stmt.close();
  771. Grt.getInstance().addMsg("Views fetched.");
  772. }
  773. private static String ProcedureSelect = "SELECT "
  774. + "  DBPROCNAME AS PROCNAME, CREATEDATE, CREATETIME, "
  775. + "  OWNER, COMMENT, DEFINITION " + "FROM " + "  DBPROCEDURES "
  776. + "WHERE " + "  PACKAGE IS NULL " + "  AND EXECUTION_KIND IS NULL "
  777. + "  AND LANGUAGE = 'SPL' ";
  778. private static String FunctionSelect = "SELECT "
  779. + "  FUNCTIONNAME AS PROCNAME, CREATEDATE, CREATETIME, "
  780. + "  OWNER, COMMENT, DEFINITION " + "FROM " + "  FUNCTIONS "
  781. + "WHERE ";
  782. private static String ProcedureCountSelect = "SELECT "
  783. + "COUNT(*) AS NUM_PROCEDURES FROM DBPROCEDURES "
  784. + "WHERE PACKAGE IS NULL AND EXECUTION_KIND IS NULL AND LANGUAGE = 'SPL' ";
  785. private static String FunctionCountSelect = "SELECT "
  786. + "COUNT(*) AS NUM_FUNCTIONS FROM FUNCTIONS WHERE ";
  787. protected int reverseEngineerProcedures(Connection conn, Catalog catalog,
  788. Schema schema) throws Exception {
  789. int spCount = 0;
  790. int currentSpNumber = 0;
  791. String procedureSelect = "";
  792. String procedureCountSelect = "";
  793. if (this.useRealSchema(conn)) {
  794. procedureSelect = ProcedureSelect + "AND SCHEMANAME=?";
  795. procedureCountSelect = ProcedureCountSelect + "AND SCHEMANAME=?";
  796. } else {
  797. procedureSelect = ProcedureSelect + "AND OWNER=?";
  798. procedureCountSelect = ProcedureCountSelect + "AND OWNER=?";
  799. }
  800. procedureSelect += " ORDER BY PROCNAME ASC";
  801. Grt.getInstance().addMsg(
  802. "Fetch count of stored procedures of the schema "
  803. + schema.getName() + ".");
  804. Grt.getInstance().addMsgDetail(procedureCountSelect);
  805. try {
  806. PreparedStatement stmt = conn
  807. .prepareStatement(procedureCountSelect);
  808. stmt.setString(1, schema.getName());
  809. ResultSet rset = stmt.executeQuery();
  810. if (rset.next()) {
  811. spCount = rset.getInt("NUM_PROCEDURES");
  812. }
  813. Grt.getInstance().addMsg(
  814. "Fetching " + spCount
  815. + " stored procedure(s) of the schema "
  816. + schema.getName() + ".");
  817. Grt.getInstance().addMsgDetail(procedureSelect);
  818. Grt.getInstance().flushMessages();
  819. stmt = conn.prepareStatement(procedureSelect);
  820. stmt.setString(1, schema.getName());
  821. rset = stmt.executeQuery();
  822. while (rset.next()) {
  823. Routine proc = new Routine(schema);
  824. schema.getRoutines().add(proc);
  825. proc.setName(rset.getString("PROCNAME"));
  826. currentSpNumber++;
  827. Grt.getInstance().addProgress(
  828. "Processing procedure " + proc.getName() + ".",
  829. (currentSpNumber * 100) / spCount);
  830. if (Grt.getInstance().flushMessages() != 0) {
  831. Grt.getInstance().addMsg("Migration canceled by user.");
  832. return 1;
  833. }
  834. Grt.getInstance().addMsg(
  835. "Processing procedure " + proc.getName() + ".");
  836. proc.setComment(rset.getString("COMMENT"));
  837. proc.setRoutineCode(rset.getString("DEFINITION"));
  838. proc.setRoutineType("PROCEUDRE");
  839. proc.setCreateDate(rset.getString("CREATEDATE"));
  840. proc.setCreateTime(rset.getString("CREATETIME"));
  841. }
  842. stmt.close();
  843. Grt.getInstance().addMsg("Stored procedures fetched.");
  844. if (this.useRealSchema(conn)) {
  845. String functionSelect = FunctionSelect
  846. + "SCHEMANAME=? ORDER BY PROCNAME ASC";
  847. String functionCountSelect = FunctionCountSelect
  848. + "SCHEMANAME=?";
  849. stmt = conn.prepareStatement(functionCountSelect);
  850. stmt.setString(1, schema.getName());
  851. rset = stmt.executeQuery();
  852. if (rset.next()) {
  853. spCount = rset.getInt("NUM_FUNCTIONS");
  854. }
  855. Grt.getInstance().addMsg(
  856. "Fetching " + spCount
  857. + " stored functions(s) of the schema "
  858. + schema.getName() + ".");
  859. Grt.getInstance().addMsgDetail(functionSelect);
  860. Grt.getInstance().flushMessages();
  861. stmt = conn.prepareStatement(functionSelect);
  862. stmt.setString(1, schema.getName());
  863. rset = stmt.executeQuery();
  864. while (rset.next()) {
  865. Routine proc = new Routine(schema);
  866. schema.getRoutines().add(proc);
  867. proc.setName(rset.getString("PROCNAME"));
  868. currentSpNumber++;
  869. Grt.getInstance().addProgress(
  870. "Processing stored function " + proc.getName()
  871. + ".", (currentSpNumber * 100) / spCount);
  872. if (Grt.getInstance().flushMessages() != 0) {
  873. Grt.getInstance().addMsg("Migration canceled by user.");
  874. return 1;
  875. }
  876. Grt.getInstance().addMsg(
  877. "Processing function " + proc.getName() + ".");
  878. proc.setComment(rset.getString("COMMENT"));
  879. proc.setRoutineCode(rset.getString("DEFINITION"));
  880. proc.setRoutineType("PROCEUDRE");
  881. proc.setCreateDate(rset.getString("CREATEDATE"));
  882. proc.setCreateTime(rset.getString("CREATETIME"));
  883. }
  884. stmt.close();
  885. Grt.getInstance().addMsg("Stored functions fetched.");
  886. }
  887. Grt.getInstance().addProgress("", -1);
  888. } catch (Exception e) {
  889. Grt
  890. .getInstance()
  891. .addMsg(
  892. "Stored procedures and stored functions cannot be fetched.");
  893. Grt.getInstance().addMsgDetail(e.getMessage());
  894. }
  895. return 0;
  896. }
  897. private static String sequencesCountSelect76 = "SELECT COUNT(*) AS NUM_SEQUENCES "
  898. + "FROM SEQUENCES WHERE SCHEMANAME=?";
  899. private static String sequencesSelect76 = "SELECT * FROM SEQUENCES "
  900. + "WHERE SCHEMANAME=? ORDER BY SEQUENCE_NAME ASC";
  901. private static String sequencesCountSelect75 = "SELECT COUNT(*) AS NUM_SEQUENCES "
  902. + "FROM SEQUENCES WHERE OWNER=?";
  903. private static String sequencesSelect75 = "SELECT * FROM SEQUENCES "
  904. + "WHERE OWNER=?";
  905. protected int reverseEngineerSequences(Connection conn, Catalog catalog,
  906. Schema schema) throws Exception {
  907. int sequencesCount = 0;
  908. int currentSequenceNumber = 0;
  909. String sequencesSelect = "";
  910. String sequencesCountSelect = "";
  911. if (this.useRealSchema(conn)) {
  912. sequencesSelect = sequencesSelect76;
  913. sequencesCountSelect = sequencesCountSelect76;
  914. } else {
  915. sequencesSelect = sequencesSelect75;
  916. sequencesCountSelect = sequencesCountSelect75;
  917. }
  918. Grt.getInstance().addMsg(
  919. "Fetch the number sequences of the schema " + schema.getName()
  920. + ".");
  921. Grt.getInstance().addMsgDetail(sequencesCountSelect);
  922. try {
  923. PreparedStatement stmt = conn
  924. .prepareStatement(sequencesCountSelect);
  925. stmt.setString(1, schema.getName());
  926. ResultSet rset = stmt.executeQuery();
  927. if (rset.next()) {
  928. sequencesCount = rset.getInt("NUM_SEQUENCES");
  929. }
  930. Grt.getInstance().addMsg(
  931. "Fetch " + sequencesCount + " sequence(s) of the schema "
  932. + schema.getName() + ".");
  933. Grt.getInstance().addMsgDetail(sequencesSelect);
  934. Grt.getInstance().flushMessages();
  935. stmt = conn.prepareStatement(sequencesSelect);
  936. stmt.setString(1, schema.getName());
  937. rset = stmt.executeQuery();
  938. while (rset.next()) {
  939. Sequence seq = new Sequence(schema);
  940. seq.setName(rset.getString("SEQUENCE_NAME"));
  941. currentSequenceNumber++;
  942. if (currentSequenceNumber % 5 == 0) {
  943. Grt.getInstance().addProgress(
  944. "Processing sequence " + seq.getName() + ".",
  945. (currentSequenceNumber * 100) / sequencesCount);
  946. Grt.getInstance().flushMessages();
  947. }
  948. seq.setCacheSize(rset.getString("CACHE_SIZE"));
  949. seq.setComment(rset.getString("COMMENT"));
  950. seq.setCreateDate(rset.getString("CREATEDATE"));
  951. seq.setCreateTime(rset.getString("CREATETIME"));
  952. if (rset.getString("CYCLE_FLAG").compareToIgnoreCase("Y") == 0) {
  953. seq.setCycleFlag(1);
  954. } else {
  955. seq.setCycleFlag(0);
  956. }
  957. seq.setIncrementBy(rset.getString("INCREMENT_BY"));
  958. seq.setLastNumber(rset.getString("LAST_NUMBER"));
  959. seq.setMaxValue(rset.getString("MAX_VALUE"));
  960. seq.setMinValue(rset.getString("MIN_VALUE"));
  961. if (rset.getString("ORDER_FLAG").compareToIgnoreCase("Y") == 0) {
  962. seq.setOrderFlag(1);
  963. } else {
  964. seq.setOrderFlag(0);
  965. }
  966. schema.getSequences().add(seq);
  967. }
  968. stmt.close();
  969. Grt.getInstance().addMsg("Sequences fetched.");
  970. Grt.getInstance().addProgress("", -1);
  971. } catch (Exception e) {
  972. Grt.getInstance().addMsg("Sequences could not be fetched.");
  973. Grt.getInstance().addMsg(e.getMessage());
  974. }
  975. return 0;
  976. }
  977. private static String synonymsSelect76 = "SELECT * FROM SYNONYMS "
  978. + "WHERE TABLESCHEMANAME=? ORDER BY TABLENAME ASC";
  979. private static String synonymsSelect75 = "SELECT * FROM SYNONYMS "
  980. + "WHERE TABLEOWNER=? ORDER BY TABLENAME ASC";
  981. /**
  982.  * Creates a list of table synonyms
  983.  * 
  984.  * @param conn
  985.  * @param catalog
  986.  * @param schema
  987.  * @return int
  988.  * @throws Exception
  989.  */
  990. protected int reverseEngineerSynonyms(Connection conn, Catalog catalog,
  991. Schema schema) throws Exception {
  992. String synonymsSelect = "";
  993. synonymsSelect = (this.useRealSchema(conn)) ? synonymsSelect76
  994. : synonymsSelect75;
  995. Grt.getInstance().addMsg(
  996. "Fetch all table synonyms of the schema " + schema.getName()
  997. + ".");
  998. Grt.getInstance().addMsgDetail(synonymsSelect);
  999. Grt.getInstance().flushMessages();
  1000. PreparedStatement stmt = conn.prepareStatement(synonymsSelect);
  1001. stmt.setString(1, schema.getName());
  1002. ResultSet rset = stmt.executeQuery();
  1003. while (rset.next()) {
  1004. Synonym syn = new Synonym(schema);
  1005. schema.getSynonyms().add(syn);
  1006. syn.setName(rset.getString("SYNONYMNAME"));
  1007. Grt.getInstance().addMsg(
  1008. "Processing synonym " + syn.getName() + ".");
  1009. syn.setComment(rset.getString("COMMENT"));
  1010. syn.setCreateDate(rset.getString("CREATEDATE"));
  1011. syn.setCreateTime(rset.getString("CREATETIME"));
  1012. if (rset.getString("PUBLIC").compareToIgnoreCase("YES") == 0) {
  1013. syn.setIsPublic(1);
  1014. } else {
  1015. syn.setIsPublic(0);
  1016. }
  1017. // TODO: this is a consequence of the query
  1018. // How do we handle system internal synonyms?
  1019. syn.setReferedSchemaName(schema.getName());
  1020. // find reference table column
  1021. String tableName = rset.getString("TABLENAME");
  1022. for (int i = 0; i < schema.getTables().size(); i++) {
  1023. Table table = (Table) (schema.getTables().get(i));
  1024. if (table.getName().compareTo(tableName) == 0) {
  1025. syn.setReferedObject(table);
  1026. }
  1027. }
  1028. }
  1029. stmt.close();
  1030. Grt.getInstance().addMsg("Synonyms fetched.");
  1031. return 0;
  1032. }
  1033. /**
  1034.  * Checks the MaxDB version and returns 1 if the version supports real SQL
  1035.  * schemas
  1036.  * 
  1037.  * @param conn
  1038.  * @return
  1039.  * @throws Exception
  1040.  */
  1041. protected boolean useRealSchema(Connection conn) throws Exception {
  1042. DatabaseMetaData metaData = conn.getMetaData();
  1043. return ((metaData.getDatabaseMajorVersion() >= 7) && (metaData
  1044. .getDatabaseMinorVersion() >= 6));
  1045. }
  1046. }