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

MySQL数据库

开发平台:

SQL

  1. package com.mysql.grt.modules;
  2. import java.sql.*;
  3. import com.mysql.grt.*;
  4. import com.mysql.grt.db.IndexColumn;
  5. import com.mysql.grt.db.mssql.*;
  6. /**
  7.  * GRT Reverse Engineering Class for MSSQL 2000
  8.  * 
  9.  * @author MikeZ
  10.  * @version 1.0, 05/23/04
  11.  * 
  12.  */
  13. public class ReverseEngineeringMssql extends ReverseEngineeringGeneric {
  14. /**
  15.  * Static function to return information about this class to the GRT
  16.  * environment
  17.  * 
  18.  * @return returns a GRT XML string containing the infos about this class
  19.  */
  20. public static String getModuleInfo() {
  21. return Grt.getModuleInfoXml(ReverseEngineeringMssql.class,
  22. "ReverseEngineering");
  23. }
  24. /*
  25.  * private static String catalogsSelect = "SELECT TABLE_SCHEMA FROM
  26.  * INFORMATION_SCHEMA.TABLES " + "GROUP BY TABLE_SCHEMA UNION " + "SELECT
  27.  * ROUTINE_SCHEMA AS SCHEMANAME FROM INFORMATION_SCHEMA.ROUTINES " + "GROUP
  28.  * BY ROUTINE_SCHEMA";
  29.  */
  30. /**
  31.  * Returns a list of all catalogs from the given JDBC connection
  32.  * 
  33.  * @param dbConn
  34.  *            the connection to use
  35.  * 
  36.  * @return returns a GRT XML string containing a list of schemata names
  37.  */
  38. public static GrtStringList getCatalogs(
  39. com.mysql.grt.db.mgmt.Connection dbConn) throws Exception {
  40. GrtStringList catalogList = new GrtStringList();
  41. GrtStringHashMap paramValues = dbConn.getParameterValues();
  42. paramValues.add("database", "");
  43. // connect to the database
  44. Connection conn = establishConnection(dbConn);
  45. try {
  46. Grt.getInstance().addMsg("Fetching catalog list.");
  47. Grt.getInstance().addMsgDetail("CALL sp_databases;");
  48. Grt.getInstance().flushMessages();
  49. CallableStatement stmt = conn.prepareCall("sp_databases");
  50. try {
  51. ResultSet rset = stmt.executeQuery();
  52. while (rset.next()) {
  53. catalogList.add(rset.getString(1));
  54. }
  55. } finally {
  56. stmt.close();
  57. }
  58. } finally {
  59. conn.close();
  60. }
  61. return catalogList;
  62. }
  63. private static String schemataSelect = "SELECT TABLE_SCHEMA AS SCHEMANAME, "
  64. + " max(TABLE_CATALOG) AS CATALOGNAME FROM INFORMATION_SCHEMA.TABLES "
  65. + "GROUP BY TABLE_SCHEMA UNION "
  66. + "SELECT ROUTINE_SCHEMA AS SCHEMANAME, max(ROUTINE_CATALOG) AS CATALOGNAME "
  67. + "FROM INFORMATION_SCHEMA.ROUTINES " + "GROUP BY ROUTINE_SCHEMA";
  68. private static String schemataSelect70 = "SELECT TABLE_SCHEMA AS SCHEMANAME, "
  69. + " max(TABLE_CATALOG) AS CATALOGNAME FROM INFORMATION_SCHEMA.TABLES "
  70. + "GROUP BY TABLE_SCHEMA";
  71. /**
  72.  * Returns a list of all schemata from the given JDBC connection
  73.  * 
  74.  * @param dbConn
  75.  *            the connection to use
  76.  * 
  77.  * @return returns a GRT XML string containing a list of schemata names
  78.  */
  79. public static GrtStringList getSchemata(
  80. com.mysql.grt.db.mgmt.Connection dbConn) throws Exception {
  81. GrtStringList schemataList = new GrtStringList();
  82. // connect to the database
  83. Connection conn = establishConnection(dbConn);
  84. try {
  85. String sql;
  86. DatabaseMetaData metaData = conn.getMetaData();
  87. if (metaData.getDatabaseMajorVersion() <= 7)
  88. sql = schemataSelect70;
  89. else
  90. sql = schemataSelect;
  91. Grt.getInstance().addMsg("Fetching schemata list.");
  92. Grt.getInstance().addMsgDetail(sql);
  93. Grt.getInstance().flushMessages();
  94. Statement stmt = conn.createStatement();
  95. try {
  96. ResultSet rset = stmt.executeQuery(sql);
  97. while (rset.next()) {
  98. schemataList.add(rset.getString(2) + "."
  99. + rset.getString(1));
  100. }
  101. } finally {
  102. stmt.close();
  103. }
  104. } finally {
  105. conn.close();
  106. }
  107. Grt.getInstance().addMsg("Return schemata list.");
  108. Grt.getInstance().flushMessages();
  109. return schemataList;
  110. }
  111. /**
  112.  * Does the reverse engineering of the given schematas over the JDBC
  113.  * connection and returns the GRT objects
  114.  * 
  115.  * @param jdbcDriver
  116.  *            the class name of the JDBC driver
  117.  * @param jdbcConnectionString
  118.  *            a JDBC connection string
  119.  * @param schemataList
  120.  *            list of schematas to be reverse engineered
  121.  * @return returns a GRT XML string containing a the reverse engineered
  122.  *         objects
  123.  */
  124. public static com.mysql.grt.db.Catalog reverseEngineer(
  125. com.mysql.grt.db.mgmt.Connection dbConn, GrtStringList schemataList)
  126. throws Exception {
  127. boolean reverseEngineerOnlyTableObjects = (Grt.getInstance()
  128. .getGrtGlobalAsInt(
  129. "/migration/applicationData/"
  130. + "reverseEngineerOnlyTableObjects") == 1);
  131. // connect to the database
  132. Connection conn = establishConnection(dbConn);
  133. // create reveng instance
  134. ReverseEngineeringMssql revEng = new ReverseEngineeringMssql();
  135. Catalog catalog = new Catalog(null);
  136. catalog.setName(dbConn.getParameterValues().get("database"));
  137. catalog.setVersion(getVersion(dbConn));
  138. Grt.getInstance().addMsg("Build simple MSSQL datatypes.");
  139. Grt.getInstance().flushMessages();
  140. revEng.buildSimpleDatatypes(dbConn, catalog);
  141. for (int i = 0; i < schemataList.size(); i++) {
  142. String schemaName = schemataList.get(i);
  143. schemaName = schemaName.substring(catalog.getName().length() + 1);
  144. Schema schema = new Schema(catalog);
  145. schema.setName(schemaName);
  146. catalog.getSchemata().add(schema);
  147. // Get Tables
  148. if (revEng.reverseEngineerTables(conn, catalog, schema) == 0
  149. && !reverseEngineerOnlyTableObjects) {
  150. // Get Views
  151. revEng.reverseEngineerViews(conn, catalog, schema);
  152. // Get SPs
  153. revEng.reverseEngineerProcedures(conn, catalog, schema);
  154. }
  155. }
  156. // make sure the Fks use real references instead of
  157. // text names where possible
  158. revEng.reverseEngineerUpdateFkReferences(catalog);
  159. return catalog;
  160. }
  161. protected void buildSimpleDatatypes(
  162. com.mysql.grt.db.mgmt.Connection dbConn, Catalog catalog) {
  163. com.mysql.grt.db.mgmt.Driver driver = dbConn.getDriver();
  164. com.mysql.grt.db.mgmt.Rdbms rdbms = (com.mysql.grt.db.mgmt.Rdbms) driver
  165. .getOwner();
  166. com.mysql.grt.db.SimpleDatatypeList rdbmsDatatypeList = rdbms
  167. .getSimpleDatatypes();
  168. com.mysql.grt.db.SimpleDatatypeList schemaDatatypeList = new com.mysql.grt.db.SimpleDatatypeList();
  169. for (int i = 0; i < rdbmsDatatypeList.size(); i++) {
  170. schemaDatatypeList.add(rdbmsDatatypeList.get(i));
  171. }
  172. catalog.setSimpleDatatypes(schemaDatatypeList);
  173. }
  174. private static String tableCountSelect = "SELECT COUNT(*) AS TABLECOUNT "
  175. + "FROM INFORMATION_SCHEMA.TABLES "
  176. + "WHERE TABLE_TYPE='BASE TABLE' AND TABLE_SCHEMA=?";
  177. private static String tableSelect = "SELECT * FROM INFORMATION_SCHEMA.TABLES "
  178. + "WHERE TABLE_TYPE='BASE TABLE' AND TABLE_SCHEMA=?";
  179. protected int reverseEngineerTables(Connection conn, Catalog catalog,
  180. Schema schema) throws Exception {
  181. int tableCount = 0;
  182. int currentTableNumber = 0;
  183. Grt.getInstance().addMsg(
  184. "Fetch the number of tables in the schema " + schema.getName()
  185. + ".");
  186. Grt.getInstance().addMsgDetail(tableCountSelect);
  187. PreparedStatement stmt = conn.prepareStatement(tableCountSelect);
  188. stmt.setString(1, schema.getName());
  189. ResultSet tblRset = stmt.executeQuery();
  190. if (tblRset.next()) {
  191. tableCount = tblRset.getInt(1);
  192. }
  193. stmt.close();
  194. Grt.getInstance().addMsg(
  195. "Fetching " + tableCount + " table(s) of the schema "
  196. + schema.getName() + ".");
  197. Grt.getInstance().addMsgDetail(tableSelect);
  198. Grt.getInstance().flushMessages();
  199. stmt = conn.prepareStatement(tableSelect);
  200. stmt.setString(1, schema.getName());
  201. tblRset = stmt.executeQuery();
  202. while (tblRset.next()) {
  203. // Create new table
  204. Table table = new Table(schema);
  205. schema.getTables().add(table);
  206. currentTableNumber++;
  207. table.setName(tblRset.getString("TABLE_NAME"));
  208. Grt.getInstance().addProgress(
  209. "Processing table " + table.getName() + ".",
  210. (currentTableNumber * 100) / tableCount);
  211. if (Grt.getInstance().flushMessages() != 0) {
  212. Grt.getInstance().addMsg("Migration canceled by user.");
  213. return 1;
  214. }
  215. reverseEngineerTableColumns(conn, catalog, schema, table);
  216. reverseEngineerTablePK(conn, catalog, schema, table);
  217. reverseEngineerTableIndices(conn, catalog, schema, table);
  218. reverseEngineerTableFKs(conn, catalog, schema, table);
  219. }
  220. Grt.getInstance().addProgress("", -1);
  221. Grt.getInstance().flushMessages();
  222. stmt.close();
  223. return 0;
  224. }
  225. private static String tableColumnSelect = "SELECT COLUMN_NAME, COLUMN_DEFAULT, "
  226. + " IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH, "
  227. + " NUMERIC_PRECISION, NUMERIC_PRECISION_RADIX, NUMERIC_SCALE, DATETIME_PRECISION, "
  228. + " CHARACTER_SET_CATALOG, CHARACTER_SET_SCHEMA, CHARACTER_SET_NAME, "
  229. + " COLLATION_NAME, DOMAIN_CATALOG, DOMAIN_SCHEMA, DOMAIN_NAME, "
  230. + " (c.status & 128) / 128 AS IS_IDENTITY_COLUMN "
  231. + "FROM INFORMATION_SCHEMA.COLUMNS, sysobjects t, sysusers u, syscolumns c "
  232. + "WHERE TABLE_SCHEMA=? AND TABLE_NAME=? AND "
  233. + "u.name=TABLE_SCHEMA AND t.name=TABLE_NAME AND "
  234. + "u.uid=t.uid AND c.id=t.id AND "
  235. + "c.name=COLUMN_NAME "
  236. + "ORDER BY ORDINAL_POSITION";
  237. private static String tableColumnSelect2005 = "SELECT COLUMN_NAME, COLUMN_DEFAULT, "
  238. + " IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH, "
  239. + " NUMERIC_PRECISION, NUMERIC_PRECISION_RADIX, NUMERIC_SCALE, DATETIME_PRECISION, "
  240. + " CHARACTER_SET_CATALOG, CHARACTER_SET_SCHEMA, CHARACTER_SET_NAME, "
  241. + " COLLATION_NAME, DOMAIN_CATALOG, DOMAIN_SCHEMA, DOMAIN_NAME, "
  242. + " (c.status & 128) / 128 AS IS_IDENTITY_COLUMN "
  243. + "FROM INFORMATION_SCHEMA.COLUMNS, sysobjects t, syscolumns c "
  244. + "WHERE TABLE_SCHEMA=? AND TABLE_NAME=? AND "
  245. + "t.name=TABLE_NAME AND "
  246. + "c.id=t.id AND "
  247. + "c.name=COLUMN_NAME "
  248. + "ORDER BY ORDINAL_POSITION";
  249. protected void reverseEngineerTableColumns(Connection conn,
  250. Catalog catalog, Schema schema, Table table) {
  251. try {
  252. Grt.getInstance().addMsg("Fetching column information.");
  253. int version = conn.getMetaData().getDatabaseMajorVersion();
  254. String columnSelect;
  255. switch (version)
  256. {
  257. case 9:
  258. // Starting with version 9 the assignments between schemata and sysusers seems to have changed. 
  259. columnSelect = tableColumnSelect2005;
  260. break;
  261. default:
  262. columnSelect = tableColumnSelect;
  263. }
  264. Grt.getInstance().addMsgDetail(columnSelect);
  265. PreparedStatement stmt = conn.prepareStatement(columnSelect);
  266. stmt.setString(1, schema.getName());
  267. stmt.setString(2, table.getName());
  268. ResultSet colRset = stmt.executeQuery();
  269. while (colRset.next()) {
  270. // create new column
  271. Column column = new Column(table);
  272. table.getColumns().add(column);
  273. column.setName(colRset.getString("COLUMN_NAME"));
  274. column.setDatatypeName(colRset.getString("DATA_TYPE"));
  275. // Get Simple Type
  276. int datatypeIndex = catalog.getSimpleDatatypes()
  277. .getIndexOfName(column.getDatatypeName().toUpperCase());
  278. if (datatypeIndex > -1) {
  279. column.setSimpleType(catalog.getSimpleDatatypes().get(
  280. datatypeIndex));
  281. } else {
  282. column.setSimpleType(catalog.getSimpleDatatypes().get(
  283. catalog.getSimpleDatatypes().getIndexOfName(
  284. "VARCHAR")));
  285. column.setLength(255);
  286. Grt.getInstance().addMsg(
  287. "WARNING: The datatype " + column.getDatatypeName()
  288. + " was not been defined yet.");
  289. }
  290. column.setLength(colRset.getInt("CHARACTER_MAXIMUM_LENGTH"));
  291. column.setPrecision(colRset.getInt("NUMERIC_PRECISION"));
  292. column.setScale(colRset.getInt("NUMERIC_SCALE"));
  293. // Nullable
  294. if (colRset.getString("IS_NULLABLE").compareToIgnoreCase("YES") == 0) {
  295. column.setIsNullable(1);
  296. } else {
  297. column.setIsNullable(0);
  298. }
  299. // Character set
  300. column.setCharacterSetName(colRset
  301. .getString("CHARACTER_SET_NAME"));
  302. column.setCollationName(colRset.getString("COLLATION_NAME"));
  303. // Default Value
  304. String defaultValue = colRset.getString("COLUMN_DEFAULT");
  305. if (defaultValue != null) {
  306. // remove () and (N) from (N'xxxx') but not from (NULL)
  307. if ((defaultValue.startsWith("(N")) && (defaultValue
  308. .endsWith(")"))
  309. && !(defaultValue.equalsIgnoreCase("(NULL)")))
  310. defaultValue = defaultValue.substring(2, defaultValue
  311. .length() - 1);
  312. else if (!defaultValue.equals(""))
  313. defaultValue = defaultValue.substring(1, defaultValue
  314. .length() - 1);
  315. // remove (()) from numeric types
  316. if ((column.getSimpleType().getGroup().getName()
  317. .equals("numeric"))
  318. && defaultValue.startsWith("((")
  319. && defaultValue.endsWith("))")) {
  320. defaultValue = defaultValue.substring(2, defaultValue
  321. .length() - 3);
  322. }
  323. // remove () from numeric types
  324. if ((column.getSimpleType().getGroup().getName()
  325. .equals("numeric"))
  326. && defaultValue.startsWith("(")
  327. && defaultValue.endsWith(")")) {
  328. defaultValue = defaultValue.substring(1, defaultValue
  329. .length() - 1);
  330. }
  331. column.setDefaultValue(defaultValue);
  332. }
  333. // Identity column
  334. column.setIdentity(colRset.getInt("IS_IDENTITY_COLUMN"));
  335. }
  336. stmt.close();
  337. } catch (Exception e) {
  338. Grt.getInstance().addErr(e.getMessage());
  339. }
  340. }
  341. private static String tablePKSP = "sp_pkeys @table_owner=?, @table_name=?";
  342. protected void reverseEngineerTablePK(Connection conn, Catalog catalog,
  343. Schema schema, Table table) {
  344. // String sql;
  345. try {
  346. Grt.getInstance().addMsg("Fetching primary key information.");
  347. Grt.getInstance().addMsgDetail(tablePKSP);
  348. PreparedStatement stmt = conn.prepareCall(tablePKSP);
  349. stmt.setString(1, schema.getName());
  350. stmt.setString(2, table.getName());
  351. ResultSet colRset = stmt.executeQuery();
  352. Index primaryKey = null;
  353. while (colRset.next()) {
  354. if (primaryKey == null) {
  355. primaryKey = new Index(table);
  356. primaryKey.setName("PRIMARY");
  357. primaryKey.setIsPrimary(1);
  358. table.getIndices().add(primaryKey);
  359. table.setPrimaryKey(primaryKey);
  360. }
  361. IndexColumn indexColumn = new IndexColumn(primaryKey);
  362. indexColumn.setName(colRset.getString("COLUMN_NAME"));
  363. indexColumn.setColumnLength(0);
  364. indexColumn.setDescend(0);
  365. // find reference table column
  366. for (int j = 0; j < table.getColumns().size(); j++) {
  367. Column column = (Column) (table.getColumns().get(j));
  368. if (column.getName().compareToIgnoreCase(
  369. indexColumn.getName()) == 0) {
  370. indexColumn.setReferedColumn(column);
  371. break;
  372. }
  373. }
  374. primaryKey.getColumns().add(indexColumn);
  375. }
  376. stmt.close();
  377. } catch (Exception e) {
  378. Grt.getInstance().addErr(e.getMessage());
  379. }
  380. }
  381. private static String tableIndexSelect = "SELECT u.name as TABLE_SCHEMA, "
  382. + " o.name as TABLE_NAME, i.name AS INDEX_NAME, c.name AS COLUMN_NAME, "
  383. + " (i.status & 1) AS IGNORE_DUPLICATE_KEYS, "
  384. + " (i.status & 2) / 2 AS IS_UNIQUE, "
  385. + " (i.status & 4) / 4 AS IGNORE_DUPLICATE_ROWS, "
  386. + " (i.status & 16) / 16 AS IS_CLUSTERED, "
  387. + " (i.status & 2048) / 2048 AS IS_PRIMARY_KEY, "
  388. + " (i.status & 4096) / 4096 AS IS_UNIQUE_KEY "
  389. + "FROM sysindexes i, sysobjects o, sysusers u, sysindexkeys k, syscolumns c "
  390. + "WHERE u.uid=o.uid AND i.id = o.id AND k.indid=i.indid AND k.id=i.id AND "
  391. + " c.id=i.id AND c.colid=k.colid AND "
  392. + " i.indid > 0 AND i.indid < 255 AND o.type = 'U' AND "
  393. + " (i.status & 64)=0 AND (i.status & 8388608)=0 AND "
  394. + " (i.status & 2048)=0 AND " + " u.name=? AND o.name=? "
  395. + "ORDER BY i.name, k.keyno";
  396. protected void reverseEngineerTableIndices(Connection conn,
  397. Catalog catalog, Schema schema, Table table) {
  398. try {
  399. Grt.getInstance().addMsg("Fetching indices information.");
  400. Grt.getInstance().addMsgDetail(tableIndexSelect);
  401. PreparedStatement stmt = conn.prepareStatement(tableIndexSelect);
  402. stmt.setString(1, schema.getName());
  403. stmt.setString(2, table.getName());
  404. ResultSet rset = stmt.executeQuery();
  405. String indexName = "";
  406. Index index = null;
  407. while (rset.next()) {
  408. String newIndexName = rset.getString("INDEX_NAME");
  409. if ((rset.getInt("IS_PRIMARY_KEY") != 0)
  410. || (newIndexName.equalsIgnoreCase("PRIMARY")))
  411. continue;
  412. if (indexName.compareToIgnoreCase(newIndexName) != 0) {
  413. if (index != null)
  414. table.getIndices().add(index);
  415. index = new Index(table);
  416. index.setName(newIndexName);
  417. indexName = newIndexName;
  418. if (rset.getInt("IS_UNIQUE") != 0)
  419. index.setUnique(1);
  420. else
  421. index.setUnique(0);
  422. index.setDeferability(0);
  423. index.setClustered(rset.getInt("IS_CLUSTERED"));
  424. index.setIgnoreDuplicateRows(rset
  425. .getInt("IGNORE_DUPLICATE_ROWS"));
  426. }
  427. IndexColumn indexColumn = new IndexColumn(index);
  428. indexColumn.setName(rset.getString("COLUMN_NAME"));
  429. indexColumn.setColumnLength(0);
  430. indexColumn.setDescend(0);
  431. // find reference table column
  432. for (int j = 0; j < table.getColumns().size(); j++) {
  433. Column column = (Column) (table.getColumns().get(j));
  434. if (column.getName().compareToIgnoreCase(
  435. indexColumn.getName()) == 0) {
  436. indexColumn.setReferedColumn(column);
  437. break;
  438. }
  439. }
  440. index.getColumns().add(indexColumn);
  441. }
  442. if (index != null)
  443. table.getIndices().add(index);
  444. stmt.close();
  445. } catch (Exception e) {
  446. Grt.getInstance().addErr(e.getMessage());
  447. }
  448. }
  449. private static String tableFKSelect = "SELECT fk.name AS CONSTRAINT_NAME, "
  450. + " c.name AS COLUMN_NAME, ref_u.name AS REF_SCHEMA_NAME, "
  451. + " ref_tbl.name AS REF_TABLE_NAME, ref_c.name AS REF_COLUMN_NAME, "
  452. + " CASE WHEN (ObjectProperty(sfk.constid, 'CnstIsUpdateCascade')=1) THEN "
  453. + "  'CASCADE' ELSE 'NO ACTION' END as UPDATE_RULE, "
  454. + " CASE WHEN (ObjectProperty(sfk.constid, 'CnstIsDeleteCascade')=1) THEN "
  455. + "  'CASCADE' ELSE 'NO ACTION' END as DELETE_RULE "
  456. + "FROM sysusers u, sysobjects t, sysobjects fk, sysforeignkeys sfk, "
  457. + " syscolumns c, sysobjects ref_tbl, sysusers ref_u, syscolumns ref_c "
  458. + "WHERE u.name=? AND t.name=? AND "
  459. + " t.uid=u.uid AND t.xtype='U' AND "
  460. + " sfk.fkeyid=t.id AND fk.id=sfk.constid AND "
  461. + " c.id=t.id AND c.colid=sfk.fkey AND "
  462. + " ref_tbl.id=sfk.rkeyid AND ref_tbl.uid=ref_u.uid AND "
  463. + " ref_c.id=ref_tbl.id AND ref_c.colid=sfk.rkey "
  464. + "ORDER BY sfk.constid, sfk.keyno";
  465. protected void reverseEngineerTableFKs(Connection conn, Catalog catalog,
  466. Schema schema, Table table) {
  467. try {
  468. Grt.getInstance().addMsg("Fetching FK information.");
  469. Grt.getInstance().addMsgDetail(tableFKSelect);
  470. PreparedStatement stmt = conn.prepareStatement(tableFKSelect);
  471. stmt.setString(1, schema.getName());
  472. stmt.setString(2, table.getName());
  473. ResultSet rset = stmt.executeQuery();
  474. String fkName = "";
  475. ForeignKey foreignKey = null;
  476. while (rset.next()) {
  477. String newFkName = rset.getString("CONSTRAINT_NAME");
  478. if (fkName.compareToIgnoreCase(newFkName) != 0) {
  479. if (foreignKey != null)
  480. table.getForeignKeys().add(foreignKey);
  481. fkName = newFkName;
  482. foreignKey = new ForeignKey(table);
  483. foreignKey.setName(newFkName);
  484. foreignKey.setDeferability(0);
  485. foreignKey.setDeleteRule(rset.getString("DELETE_RULE"));
  486. foreignKey.setUpdateRule(rset.getString("UPDATE_RULE"));
  487. foreignKey.setReferedTableSchemaName(rset
  488. .getString("REF_SCHEMA_NAME"));
  489. foreignKey.setReferedTableName(rset
  490. .getString("REF_TABLE_NAME"));
  491. }
  492. foreignKey.getReferedColumnNames().add(
  493. rset.getString("REF_COLUMN_NAME"));
  494. // find reference table column
  495. String colName = rset.getString("COLUMN_NAME");
  496. for (int j = 0; j < table.getColumns().size(); j++) {
  497. Column column = (Column) (table.getColumns().get(j));
  498. if (column.getName().compareToIgnoreCase(colName) == 0)
  499. foreignKey.getColumns().add(column);
  500. }
  501. }
  502. if (foreignKey != null)
  503. table.getForeignKeys().add(foreignKey);
  504. stmt.close();
  505. } catch (Exception e) {
  506. Grt.getInstance().addErr(e.getMessage());
  507. }
  508. }
  509. private static String viewSelect = "SELECT * FROM INFORMATION_SCHEMA.VIEWS "
  510. + "WHERE TABLE_SCHEMA=?";
  511. protected void reverseEngineerViews(Connection conn, Catalog catalog,
  512. Schema schema) throws Exception {
  513. Grt.getInstance().addMsg(
  514. "Fetch all views of the schema " + schema.getName() + ".");
  515. Grt.getInstance().addMsgDetail(viewSelect);
  516. Grt.getInstance().flushMessages();
  517. PreparedStatement stmt = conn.prepareStatement(viewSelect);
  518. stmt.setString(1, schema.getName());
  519. ResultSet rset = stmt.executeQuery();
  520. while (rset.next()) {
  521. // Create new view
  522. View view = new View(schema);
  523. schema.getViews().add(view);
  524. view.setName(rset.getString("TABLE_NAME"));
  525. Grt.getInstance().addMsg("Processing view " + view.getName() + ".");
  526. view.setQueryExpression(rset.getString("VIEW_DEFINITION"));
  527. if (rset.getString("CHECK_OPTION").equalsIgnoreCase("NONE"))
  528. view.setWithCheckCondition(0);
  529. else
  530. view.setWithCheckCondition(1);
  531. }
  532. stmt.close();
  533. Grt.getInstance().addMsg("Views fetched.");
  534. }
  535. private static String procedureCountSelect = "SELECT COUNT(*) AS NUM "
  536. + "FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA=?";
  537. private static String procedureSelect = "SELECT ROUTINE_NAME, ROUTINE_TYPE, "
  538. + "MODULE_NAME, ROUTINE_DEFINITION "
  539. + "FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA=?";
  540. protected int reverseEngineerProcedures(Connection conn, Catalog catalog,
  541. Schema schema) throws Exception {
  542. int spCount = 0;
  543. int currentSpNumber = 0;
  544. Grt.getInstance().addMsg(
  545. "Fetch count of stored procedures of the schema "
  546. + schema.getName() + ".");
  547. Grt.getInstance().addMsgDetail(procedureCountSelect);
  548. try {
  549. PreparedStatement stmt = conn
  550. .prepareStatement(procedureCountSelect);
  551. stmt.setString(1, schema.getName());
  552. ResultSet rset = stmt.executeQuery();
  553. if (rset.next()) {
  554. spCount = rset.getInt("NUM");
  555. }
  556. Grt.getInstance().addMsg(
  557. "Fetching " + spCount
  558. + " stored procedure(s) of the schema "
  559. + schema.getName() + ".");
  560. Grt.getInstance().addMsgDetail(procedureSelect);
  561. Grt.getInstance().flushMessages();
  562. stmt = conn.prepareStatement(procedureSelect);
  563. stmt.setString(1, schema.getName());
  564. rset = stmt.executeQuery();
  565. while (rset.next()) {
  566. // Create new view
  567. Routine proc = new Routine(schema);
  568. schema.getRoutines().add(proc);
  569. proc.setName(rset.getString("ROUTINE_NAME"));
  570. currentSpNumber++;
  571. Grt.getInstance().addProgress(
  572. "Processing procedure " + proc.getName() + ".",
  573. (currentSpNumber * 100) / spCount);
  574. if (Grt.getInstance().flushMessages() != 0) {
  575. Grt.getInstance().addMsg("Migration canceled by user.");
  576. return 1;
  577. }
  578. Grt.getInstance().addMsg(
  579. "Processing procedure " + proc.getName() + ".");
  580. proc.setRoutineType(rset.getString("ROUTINE_TYPE"));
  581. proc.setRoutineCode(rset.getString("ROUTINE_DEFINITION"));
  582. }
  583. stmt.close();
  584. Grt.getInstance().addMsg("Routines fetched.");
  585. Grt.getInstance().addProgress("", -1);
  586. } catch (Exception e) {
  587. Grt.getInstance().addMsg("Stored procedures cannot be fetched.");
  588. Grt.getInstance().addMsgDetail(e.getMessage());
  589. }
  590. return 0;
  591. }
  592. }