ReverseEngineeringSybase.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.sybase.*;
  5. /**
  6.  * GRT Reverse Engineering Class for Sybase
  7.  * 
  8.  * @author MikeZ
  9.  * @version 1.0, 06/23/06
  10.  * 
  11.  */
  12. public class ReverseEngineeringSybase 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(ReverseEngineeringSybase.class,
  21. "ReverseEngineering");
  22. }
  23. private static String catalogsSelect = "SELECT name FROM master.dbo.sysdatabases "
  24. + "ORDER BY 1";
  25. /**
  26.  * Returns a list of all catalogs from the given JDBC connection
  27.  * 
  28.  * @param dbConn
  29.  *            the connection to use
  30.  * 
  31.  * @return returns a GRT XML string containing a list of schemata names
  32.  */
  33. public static GrtStringList getCatalogs(
  34. com.mysql.grt.db.mgmt.Connection dbConn) throws Exception {
  35. GrtStringList catalogList = new GrtStringList();
  36. GrtStringHashMap paramValues = dbConn.getParameterValues();
  37. paramValues.add("database", "");
  38. // connect to the database
  39. Connection conn = establishConnection(dbConn);
  40. try {
  41. Grt.getInstance().addMsg("Fetching catalog list.");
  42. Grt.getInstance().addMsgDetail(catalogsSelect);
  43. Grt.getInstance().flushMessages();
  44. PreparedStatement stmt = conn.prepareStatement(catalogsSelect);
  45. try {
  46. ResultSet rset = stmt.executeQuery();
  47. while (rset.next()) {
  48. catalogList.add(rset.getString(1));
  49. }
  50. } finally {
  51. stmt.close();
  52. }
  53. } finally {
  54. conn.close();
  55. }
  56. return catalogList;
  57. }
  58. private static String schemataSelect = "SELECT USERNAME = name "
  59. + "FROM sysusers WHERE gid != uid ORDER BY 1";
  60. /**
  61.  * Returns a list of all schemata from the given JDBC connection
  62.  * 
  63.  * @param dbConn
  64.  *            the connection to use
  65.  * 
  66.  * @return returns a GRT XML string containing a list of schemata names
  67.  */
  68. public static GrtStringList getSchemata(
  69. com.mysql.grt.db.mgmt.Connection dbConn) throws Exception {
  70. GrtStringList schemataList = new GrtStringList();
  71. // connect to the database
  72. Connection conn = establishConnection(dbConn);
  73. try {
  74. String catalog = dbConn.getParameterValues().get("database");
  75. Grt.getInstance().addMsg("Fetching schemata list.");
  76. Grt.getInstance().addMsgDetail(schemataSelect);
  77. Grt.getInstance().flushMessages();
  78. Statement stmt = conn.createStatement();
  79. try {
  80. ResultSet rset = stmt.executeQuery(schemataSelect);
  81. while (rset.next()) {
  82. schemataList.add(catalog + "." + rset.getString(1));
  83. }
  84. } finally {
  85. stmt.close();
  86. }
  87. } finally {
  88. conn.close();
  89. }
  90. Grt.getInstance().addMsg("Return schemata list.");
  91. Grt.getInstance().flushMessages();
  92. return schemataList;
  93. }
  94. /**
  95.  * Does the reverse engineering of the given schematas over the JDBC
  96.  * connection and returns the GRT objects
  97.  * 
  98.  * @param jdbcDriver
  99.  *            the class name of the JDBC driver
  100.  * @param jdbcConnectionString
  101.  *            a JDBC connection string
  102.  * @param schemataList
  103.  *            list of schematas to be reverse engineered
  104.  * @return returns a GRT XML string containing a the reverse engineered
  105.  *         objects
  106.  */
  107. public static com.mysql.grt.db.Catalog reverseEngineer(
  108. com.mysql.grt.db.mgmt.Connection dbConn, GrtStringList schemataList)
  109. throws Exception {
  110. boolean reverseEngineerOnlyTableObjects = (Grt.getInstance()
  111. .getGrtGlobalAsInt(
  112. "/migration/applicationData/"
  113. + "reverseEngineerOnlyTableObjects") == 1);
  114. // connect to the database
  115. Connection conn = establishConnection(dbConn);
  116. // create reveng instance
  117. ReverseEngineeringSybase revEng = new ReverseEngineeringSybase();
  118. Catalog catalog = new Catalog(null);
  119. catalog.setName(dbConn.getParameterValues().get("database"));
  120. catalog.setVersion(getVersion(dbConn));
  121. Grt.getInstance().addMsg("Build simple Sybase datatypes.");
  122. Grt.getInstance().flushMessages();
  123. revEng.buildSimpleDatatypes(dbConn, catalog);
  124. for (int i = 0; i < schemataList.size(); i++) {
  125. String schemaName = schemataList.get(i);
  126. schemaName = schemaName.substring(catalog.getName().length() + 1);
  127. Schema schema = new Schema(catalog);
  128. schema.setName(schemaName);
  129. catalog.getSchemata().add(schema);
  130. // Get Tables
  131. if (revEng.reverseEngineerTables(conn, catalog, schema) == 0
  132. && !reverseEngineerOnlyTableObjects) {
  133. // Get Views
  134. revEng.reverseEngineerViews(conn, catalog, schema);
  135. // Get SPs
  136. revEng.reverseEngineerProcedures(conn, catalog, schema);
  137. }
  138. }
  139. // make sure the Fks use real references instead of
  140. // text names where possible
  141. revEng.reverseEngineerUpdateFkReferences(catalog);
  142. return catalog;
  143. }
  144. protected void buildSimpleDatatypes(
  145. com.mysql.grt.db.mgmt.Connection dbConn, Catalog catalog) {
  146. com.mysql.grt.db.mgmt.Driver driver = dbConn.getDriver();
  147. com.mysql.grt.db.mgmt.Rdbms rdbms = (com.mysql.grt.db.mgmt.Rdbms) driver
  148. .getOwner();
  149. com.mysql.grt.db.SimpleDatatypeList rdbmsDatatypeList = rdbms
  150. .getSimpleDatatypes();
  151. com.mysql.grt.db.SimpleDatatypeList schemaDatatypeList = new com.mysql.grt.db.SimpleDatatypeList();
  152. for (int i = 0; i < rdbmsDatatypeList.size(); i++) {
  153. schemaDatatypeList.add(rdbmsDatatypeList.get(i));
  154. }
  155. catalog.setSimpleDatatypes(schemaDatatypeList);
  156. }
  157. private static String tableCountSelect = "SELECT TABLE_COUNT = COUNT(*) "
  158. + "FROM sysobjects O, sysindexes I "
  159. + "WHERE USER_NAME(uid) = ? AND O.type = 'U' AND O.id = I.id AND I.indid IN (0, 1)";
  160. private static String tableSelect = "SELECT TABLE_NAME = O.name "
  161. + "FROM sysobjects O, sysindexes I "
  162. + "WHERE USER_NAME(uid) = ? AND O.type = 'U' AND O.id = I.id AND I.indid IN (0, 1) "
  163. + "ORDER BY 1";
  164. protected int reverseEngineerTables(Connection conn, Catalog catalog,
  165. Schema schema) throws Exception {
  166. int tableCount = 0;
  167. int currentTableNumber = 0;
  168. Grt.getInstance().addMsg(
  169. "Fetch the number of tables in the schema " + schema.getName()
  170. + ".");
  171. Grt.getInstance().addMsgDetail(tableCountSelect);
  172. PreparedStatement stmt = conn.prepareStatement(tableCountSelect);
  173. stmt.setString(1, schema.getName());
  174. ResultSet tblRset = stmt.executeQuery();
  175. if (tblRset.next()) {
  176. tableCount = tblRset.getInt(1);
  177. }
  178. stmt.close();
  179. Grt.getInstance().addMsg(
  180. "Fetching " + tableCount + " table(s) of the schema "
  181. + schema.getName() + ".");
  182. Grt.getInstance().addMsgDetail(tableSelect);
  183. Grt.getInstance().flushMessages();
  184. stmt = conn.prepareStatement(tableSelect);
  185. stmt.setString(1, schema.getName());
  186. tblRset = stmt.executeQuery();
  187. while (tblRset.next()) {
  188. // Create new table
  189. Table table = new Table(schema);
  190. schema.getTables().add(table);
  191. currentTableNumber++;
  192. table.setName(tblRset.getString("TABLE_NAME"));
  193. Grt.getInstance().addProgress(
  194. "Processing table " + table.getName() + ".",
  195. (currentTableNumber * 100) / tableCount);
  196. if (Grt.getInstance().flushMessages() != 0) {
  197. Grt.getInstance().addMsg("Migration canceled by user.");
  198. return 1;
  199. }
  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. }
  205. Grt.getInstance().addProgress("", -1);
  206. Grt.getInstance().flushMessages();
  207. stmt.close();
  208. return 0;
  209. }
  210. private static String tableColumnSelect = "SELECT COLUMN_NAME = ISNULL(C.name, ''), "
  211. + " DATA_TYPE = T.name, C.length, NUMERIC_PRECISION = C.prec, "
  212. + " NUMERIC_SCALE = C.scale, "
  213. + " IS_NULLABLE = CONVERT(BIT, (C.status & 0x08)) "
  214. + "FROM syscolumns C, systypes T, sysobjects A "
  215. + "WHERE USER_NAME(A.uid) = ? AND "
  216. + " A.id = C.id AND C.id = OBJECT_ID(?) AND "
  217. + "C.usertype*=T.usertype " + "ORDER BY C.colid";
  218. protected void reverseEngineerTableColumns(Connection conn,
  219. Catalog catalog, Schema schema, Table table) {
  220. try {
  221. Grt.getInstance().addMsg("Fetching column information.");
  222. Grt.getInstance().addMsgDetail(tableColumnSelect);
  223. PreparedStatement stmt = conn.prepareStatement(tableColumnSelect);
  224. stmt.setString(1, schema.getName());
  225. stmt.setString(2, table.getName());
  226. ResultSet colRset = stmt.executeQuery();
  227. while (colRset.next()) {
  228. // create new column
  229. Column column = new Column(table);
  230. table.getColumns().add(column);
  231. column.setName(colRset.getString("COLUMN_NAME"));
  232. column.setDatatypeName(colRset.getString("DATA_TYPE"));
  233. // Get Simple Type
  234. int datatypeIndex = catalog.getSimpleDatatypes()
  235. .getIndexOfName(column.getDatatypeName().toUpperCase());
  236. if (datatypeIndex > -1) {
  237. column.setSimpleType(catalog.getSimpleDatatypes().get(
  238. datatypeIndex));
  239. } else {
  240. column.setSimpleType(catalog.getSimpleDatatypes().get(
  241. catalog.getSimpleDatatypes().getIndexOfName(
  242. "VARCHAR")));
  243. column.setLength(255);
  244. Grt.getInstance().addMsg(
  245. "WARNING: The datatype " + column.getDatatypeName()
  246. + " was not been defined yet.");
  247. }
  248. column.setLength(colRset.getInt("LENGTH"));
  249. column.setPrecision(colRset.getInt("NUMERIC_PRECISION"));
  250. column.setScale(colRset.getInt("NUMERIC_SCALE"));
  251. // Nullable
  252. if (colRset.getString("IS_NULLABLE").compareToIgnoreCase("1") == 0) {
  253. column.setIsNullable(1);
  254. } else {
  255. column.setIsNullable(0);
  256. }
  257. }
  258. stmt.close();
  259. } catch (Exception e) {
  260. Grt.getInstance().addErr(e.getMessage());
  261. }
  262. }
  263. private static String tablePKSP = "sp_pkeys @table_owner=?, @table_name=?";
  264. protected void reverseEngineerTablePK(Connection conn, Catalog catalog,
  265. Schema schema, Table table) {
  266. // String sql;
  267. try {
  268. Grt.getInstance().addMsg("Fetching primary key information.");
  269. Grt.getInstance().addMsgDetail(tablePKSP);
  270. PreparedStatement stmt = conn.prepareCall(tablePKSP);
  271. stmt.setString(1, schema.getName());
  272. stmt.setString(2, table.getName());
  273. ResultSet colRset = stmt.executeQuery();
  274. Index primaryKey = null;
  275. while (colRset.next()) {
  276. if (primaryKey == null) {
  277. primaryKey = new Index(table);
  278. primaryKey.setName("PRIMARY");
  279. primaryKey.setIsPrimary(1);
  280. table.getIndices().add(primaryKey);
  281. table.setPrimaryKey(primaryKey);
  282. }
  283. IndexColumn indexColumn = new IndexColumn(primaryKey);
  284. indexColumn.setName(colRset.getString("COLUMN_NAME"));
  285. indexColumn.setColumnLength(0);
  286. indexColumn.setDescend(0);
  287. // find reference table column
  288. for (int j = 0; j < table.getColumns().size(); j++) {
  289. Column column = (Column) (table.getColumns().get(j));
  290. if (column.getName().compareToIgnoreCase(
  291. indexColumn.getName()) == 0) {
  292. indexColumn.setReferedColumn(column);
  293. break;
  294. }
  295. }
  296. primaryKey.getColumns().add(indexColumn);
  297. }
  298. stmt.close();
  299. } catch (Exception e) {
  300. Grt.getInstance().addErr(e.getMessage());
  301. }
  302. }
  303. private static String tableIndexSelect = "SELECT INDEX_NAME = A.name, "
  304. + " INDEX_TYPE = CASE WHEN ((A.status&16) = 16 OR (A.status2&512) = 512) THEN 'Clustered' "
  305. + "  WHEN (A.indid = 255) THEN 'Text/Image' "
  306. + "  ELSE 'NonClustered' END, "
  307. + " IS_UNIQUE = CASE WHEN ((A.status&2) = 2) THEN 1 ELSE 0 END, "
  308. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 1), "
  309. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 2), "
  310. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 3), "
  311. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 4), "
  312. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 5), "
  313. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 6), "
  314. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 7), "
  315. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 8), "
  316. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 9), "
  317. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 10), "
  318. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 11), "
  319. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 12), "
  320. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 13), "
  321. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 14), "
  322. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 15), "
  323. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 16), "
  324. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 17), "
  325. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 18), "
  326. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 19), "
  327. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 20), "
  328. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 21), "
  329. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 22), "
  330. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 23), "
  331. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 24), "
  332. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 25), "
  333. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 26), "
  334. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 27), "
  335. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 28), "
  336. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 29), "
  337. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 30), "
  338. + " INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 31) "
  339. + "FROM sysindexes A,  sysobjects B "
  340. + "WHERE A.indid > 0 AND A.indid < 255 AND A.status2 & 2 != 2 AND "
  341. + " B.id = A.id AND B.type = 'U' AND "
  342. + " USER_NAME(B.uid) = ? AND B.name=? " + "ORDER BY 1, 2, 3";
  343. protected void reverseEngineerTableIndices(Connection conn,
  344. Catalog catalog, Schema schema, Table table) {
  345. try {
  346. Grt.getInstance().addMsg("Fetching indices information.");
  347. Grt.getInstance().addMsgDetail(tableIndexSelect);
  348. PreparedStatement stmt = conn.prepareStatement(tableIndexSelect);
  349. stmt.setString(1, schema.getName());
  350. stmt.setString(2, table.getName());
  351. ResultSet rset = stmt.executeQuery();
  352. Index index = null;
  353. while (rset.next()) {
  354. String newIndexName = rset.getString("INDEX_NAME");
  355. index = new Index(table);
  356. index.setName(newIndexName);
  357. if (rset.getInt("IS_UNIQUE") != 0)
  358. index.setUnique(1);
  359. else
  360. index.setUnique(0);
  361. index.setDeferability(0);
  362. String indexType = rset.getString("INDEX_TYPE");
  363. if (indexType.equalsIgnoreCase("Clustered"))
  364. index.setClustered(1);
  365. else
  366. index.setClustered(0);
  367. int indexColumnPos = 4;
  368. String indexColumnName = rset.getString(indexColumnPos++);
  369. while (indexColumnPos < 31 + 4 && indexColumnName != null) {
  370. IndexColumn indexColumn = new IndexColumn(index);
  371. indexColumn.setName(indexColumnName);
  372. indexColumn.setColumnLength(0);
  373. indexColumn.setDescend(0);
  374. // find reference table column
  375. for (int j = 0; j < table.getColumns().size(); j++) {
  376. Column column = (Column) (table.getColumns().get(j));
  377. if (column.getName().compareToIgnoreCase(
  378. indexColumn.getName()) == 0) {
  379. indexColumn.setReferedColumn(column);
  380. break;
  381. }
  382. }
  383. index.getColumns().add(indexColumn);
  384. indexColumnName = rset.getString(indexColumnPos++);
  385. }
  386. table.getIndices().add(index);
  387. }
  388. stmt.close();
  389. } catch (Exception e) {
  390. Grt.getInstance().addErr(e.getMessage());
  391. }
  392. }
  393. private static String tableFKSelect = "SELECT CONSTRAINT_NAME = OBJECT_NAME(A.constrid), "
  394. + " REF_CATALOG_NAME = ISNULL(A.pmrydbname,DB_NAME()), "
  395. + " REF_SCHEMA_NAME = USER_NAME(B.uid), "
  396. + " REF_TABLE_NAME = OBJECT_NAME(A.reftabid), "
  397. + " COLUMN_COUNT = A.keycnt, "
  398. + " FK_COLUMN1 = COL_NAME(A.tableid, A.fokey1, DB_ID(A.frgndbname)), "
  399. + " COL_NAME(A.tableid, A.fokey2, DB_ID(A.frgndbname)), "
  400. + " COL_NAME(A.tableid, A.fokey3, DB_ID(A.frgndbname)), "
  401. + " COL_NAME(A.tableid, A.fokey4, DB_ID(A.frgndbname)), "
  402. + " COL_NAME(A.tableid, A.fokey5, DB_ID(A.frgndbname)), "
  403. + " COL_NAME(A.tableid, A.fokey6, DB_ID(A.frgndbname)), "
  404. + " COL_NAME(A.tableid, A.fokey7, DB_ID(A.frgndbname)), "
  405. + " COL_NAME(A.tableid, A.fokey8, DB_ID(A.frgndbname)), "
  406. + " COL_NAME(A.tableid, A.fokey9, DB_ID(A.frgndbname)), "
  407. + " COL_NAME(A.tableid, A.fokey10, DB_ID(A.frgndbname)), "
  408. + " COL_NAME(A.tableid, A.fokey11, DB_ID(A.frgndbname)), "
  409. + " COL_NAME(A.tableid, A.fokey12, DB_ID(A.frgndbname)), "
  410. + " COL_NAME(A.tableid, A.fokey13, DB_ID(A.frgndbname)), "
  411. + " COL_NAME(A.tableid, A.fokey14, DB_ID(A.frgndbname)), "
  412. + " COL_NAME(A.tableid, A.fokey15, DB_ID(A.frgndbname)), "
  413. + " COL_NAME(A.tableid, A.fokey16, DB_ID(A.frgndbname)), "
  414. + " REFERENCED_COLUMN1 = COL_NAME(A.reftabid, A.refkey1, DB_ID(A.pmrydbname)), "
  415. + " COL_NAME(A.reftabid, A.refkey2, DB_ID(A.pmrydbname)), "
  416. + " COL_NAME(A.reftabid, A.refkey3, DB_ID(A.pmrydbname)), "
  417. + " COL_NAME(A.reftabid, A.refkey4, DB_ID(A.pmrydbname)), "
  418. + " COL_NAME(A.reftabid, A.refkey5, DB_ID(A.pmrydbname)), "
  419. + " COL_NAME(A.reftabid, A.refkey6, DB_ID(A.pmrydbname)), "
  420. + " COL_NAME(A.reftabid, A.refkey7, DB_ID(A.pmrydbname)), "
  421. + " COL_NAME(A.reftabid, A.refkey8, DB_ID(A.pmrydbname)), "
  422. + " COL_NAME(A.reftabid, A.refkey9, DB_ID(A.pmrydbname)), "
  423. + " COL_NAME(A.reftabid, A.refkey10, DB_ID(A.pmrydbname)), "
  424. + " COL_NAME(A.reftabid, A.refkey11, DB_ID(A.pmrydbname)), "
  425. + " COL_NAME(A.reftabid, A.refkey12, DB_ID(A.pmrydbname)), "
  426. + " COL_NAME(A.reftabid, A.refkey13, DB_ID(A.pmrydbname)), "
  427. + " COL_NAME(A.reftabid, A.refkey14, DB_ID(A.pmrydbname)), "
  428. + " COL_NAME(A.reftabid, A.refkey15, DB_ID(A.pmrydbname)), "
  429. + " COL_NAME(A.reftabid, A.refkey16, DB_ID(A.pmrydbname)) "
  430. + "FROM sysreferences A, sysobjects B "
  431. + "WHERE USER_NAME(B.uid) = ? AND "
  432. + " A.tableid = OBJECT_ID(?) AND "
  433. + " A.reftabid = B.id AND (A.pmrydbname IS NULL) ";
  434. protected void reverseEngineerTableFKs(Connection conn, Catalog catalog,
  435. Schema schema, Table table) {
  436. try {
  437. Grt.getInstance().addMsg("Fetching FK information.");
  438. Grt.getInstance().addMsgDetail(tableFKSelect);
  439. PreparedStatement stmt = conn.prepareStatement(tableFKSelect);
  440. stmt.setString(1, schema.getName());
  441. stmt.setString(2, table.getName());
  442. ResultSet rset = stmt.executeQuery();
  443. ForeignKey foreignKey = null;
  444. while (rset.next()) {
  445. String newFkName = rset.getString("CONSTRAINT_NAME");
  446. foreignKey = new ForeignKey(table);
  447. foreignKey.setName(newFkName);
  448. foreignKey.setDeferability(0);
  449. foreignKey.setDeleteRule("NO ACTION");
  450. foreignKey.setUpdateRule("NO ACTION");
  451. foreignKey.setReferedTableSchemaName(rset
  452. .getString("REF_SCHEMA_NAME"));
  453. foreignKey
  454. .setReferedTableName(rset.getString("REF_TABLE_NAME"));
  455. int fkColumnPos = 6;
  456. int fkColumnCount = rset.getInt("COLUMN_COUNT");
  457. String refColumnName = rset.getString(fkColumnPos + 16);
  458. String fkColumnName = rset.getString(fkColumnPos);
  459. while (fkColumnPos < fkColumnCount + 6 && fkColumnName != null) {
  460. foreignKey.getReferedColumnNames().add(refColumnName);
  461. // find reference table column
  462. for (int j = 0; j < table.getColumns().size(); j++) {
  463. Column column = (Column) (table.getColumns().get(j));
  464. if (column.getName().compareToIgnoreCase(fkColumnName) == 0)
  465. foreignKey.getColumns().add(column);
  466. }
  467. refColumnName = rset.getString(fkColumnPos + 16);
  468. fkColumnName = rset.getString(fkColumnPos++);
  469. }
  470. table.getForeignKeys().add(foreignKey);
  471. }
  472. stmt.close();
  473. } catch (Exception e) {
  474. Grt.getInstance().addErr(e.getMessage());
  475. }
  476. }
  477. private static String viewSelect = "SELECT VIEW_NAME = B.name, VIEW_DEFINITION = A.text "
  478. + "FROM syscomments A,sysobjects B "
  479. + "WHERE USER_NAME(B.uid) = ? AND " + "B.type='V' AND A.id=B.id";
  480. protected void reverseEngineerViews(Connection conn, Catalog catalog,
  481. Schema schema) throws Exception {
  482. Grt.getInstance().addMsg(
  483. "Fetch all views of the schema " + schema.getName() + ".");
  484. Grt.getInstance().addMsgDetail(viewSelect);
  485. Grt.getInstance().flushMessages();
  486. PreparedStatement stmt = conn.prepareStatement(viewSelect);
  487. stmt.setString(1, schema.getName());
  488. ResultSet rset = stmt.executeQuery();
  489. while (rset.next()) {
  490. // Create new view
  491. View view = new View(schema);
  492. schema.getViews().add(view);
  493. view.setName(rset.getString("VIEW_NAME"));
  494. Grt.getInstance().addMsg("Processing view " + view.getName() + ".");
  495. view.setQueryExpression(rset.getString("VIEW_DEFINITION"));
  496. view.setWithCheckCondition(0);
  497. }
  498. stmt.close();
  499. Grt.getInstance().addMsg("Views fetched.");
  500. }
  501. private static String procedureCountSelect = "SELECT NUM = COUNT(*) "
  502. + "FROM sysobjects O "
  503. + "WHERE USER_NAME(O.uid) = ? AND O.type = 'P'";
  504. private static String procedureSelect = "SELECT ROUTINE_NAME = O.name, "
  505. + " ROUTINE_DEFINITION = A.text "
  506. + "FROM syscomments A, sysobjects O "
  507. + "WHERE USER_NAME(O.uid) = ? AND A.id=O.id AND O.type = 'P'";
  508. protected int reverseEngineerProcedures(Connection conn, Catalog catalog,
  509. Schema schema) throws Exception {
  510. int spCount = 0;
  511. int currentSpNumber = 0;
  512. Grt.getInstance().addMsg(
  513. "Fetch count of stored procedures of the schema "
  514. + schema.getName() + ".");
  515. Grt.getInstance().addMsgDetail(procedureCountSelect);
  516. try {
  517. PreparedStatement stmt = conn
  518. .prepareStatement(procedureCountSelect);
  519. stmt.setString(1, schema.getName());
  520. ResultSet rset = stmt.executeQuery();
  521. if (rset.next()) {
  522. spCount = rset.getInt("NUM");
  523. }
  524. Grt.getInstance().addMsg(
  525. "Fetching " + spCount
  526. + " stored procedure(s) of the schema "
  527. + schema.getName() + ".");
  528. Grt.getInstance().addMsgDetail(procedureSelect);
  529. Grt.getInstance().flushMessages();
  530. stmt = conn.prepareStatement(procedureSelect);
  531. stmt.setString(1, schema.getName());
  532. rset = stmt.executeQuery();
  533. while (rset.next()) {
  534. // Create new view
  535. Routine proc = new Routine(schema);
  536. schema.getRoutines().add(proc);
  537. proc.setName(rset.getString("ROUTINE_NAME"));
  538. currentSpNumber++;
  539. Grt.getInstance().addProgress(
  540. "Processing procedure " + proc.getName() + ".",
  541. (currentSpNumber * 100) / spCount);
  542. if (Grt.getInstance().flushMessages() != 0) {
  543. Grt.getInstance().addMsg("Migration canceled by user.");
  544. return 1;
  545. }
  546. Grt.getInstance().addMsg(
  547. "Processing procedure " + proc.getName() + ".");
  548. proc.setRoutineType("PROCEDURE");
  549. proc.setRoutineCode(rset.getString("ROUTINE_DEFINITION"));
  550. }
  551. stmt.close();
  552. Grt.getInstance().addMsg("Routines fetched.");
  553. Grt.getInstance().addProgress("", -1);
  554. } catch (Exception e) {
  555. Grt.getInstance().addMsg("Stored procedures cannot be fetched.");
  556. Grt.getInstance().addMsgDetail(e.getMessage());
  557. }
  558. return 0;
  559. }
  560. }