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

MySQL数据库

开发平台:

SQL

  1. package com.mysql.grt.modules;
  2. import com.mysql.grt.*;
  3. import com.mysql.grt.db.Catalog;
  4. import com.mysql.grt.db.migration.*;
  5. import com.mysql.grt.db.oracle.*;
  6. /**
  7.  * GRT Migration Class for Oracle 8i/9i
  8.  * 
  9.  * @author Mike
  10.  * @version 1.0, 01/11/05
  11.  * 
  12.  */
  13. public class MigrationOracle extends MigrationGeneric {
  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 info about this class
  19.  */
  20. public static String getModuleInfo() {
  21. return Grt.getModuleInfoXml(MigrationOracle.class, "MigrationGeneric");
  22. }
  23. /**
  24.  * Collects information about the migration methods to let the user choose
  25.  * which one to take
  26.  * 
  27.  * @return returns a Method with predefined migration parameters
  28.  */
  29. public static MethodList migrationMethods() {
  30. MethodList methods = MigrationGeneric.migrationMethods();
  31. // add methods to method list
  32. MigrationOracle mig = new MigrationOracle();
  33. methods.add(mig.getMigrateSchemaToMysqlInfo());
  34. methods.add(mig.getMigrateTableToMysqlInfo());
  35. methods.add(mig.getMigrateColumnToMysqlInfo());
  36. methods.add(mig.getMigrateViewToMysqlInfo());
  37. methods.add(mig.getMigrateRoutineToMysqlInfo());
  38. return methods;
  39. }
  40. /**
  41.  * Performs a migration based on a Migration object
  42.  * 
  43.  * @param migObj
  44.  *            migration object to migrate
  45.  * @param targetPackageName
  46.  *            name of the package that should be used to generate the target
  47.  *            objects, e.g. db.mysql
  48.  */
  49. public static void migrate(com.mysql.grt.db.migration.Migration migObj,
  50. com.mysql.grt.db.mgmt.Rdbms targetRdbms,
  51. com.mysql.grt.db.Version version) throws Exception {
  52. Grt.getInstance().addMsg("Starting Oracle migration...");
  53. new MigrationOracle().migrateCatalog(migObj, targetRdbms, version);
  54. }
  55. /**
  56.  * Performs a data transfer from the given source catalog to the target
  57.  * catalog
  58.  * 
  59.  * @param sourceJdbcDriver
  60.  *            class name of the source jdbc driver
  61.  * @param sourceJdbcConnectionString
  62.  *            jdbc connection string to the source database
  63.  * @param sourceCatalog
  64.  *            the source catalog
  65.  * @param targetJdbcDriver
  66.  *            class name of the target jdbc driver
  67.  * @param targetJdbcConnectionString
  68.  *            jdbc connection string to the target database
  69.  * @param targetCatalog
  70.  *            the target catalog
  71.  * @param params
  72.  *            parameters that define how the migration is performed
  73.  */
  74. public static void dataBulkTransfer(
  75. com.mysql.grt.db.mgmt.Connection sourceDbConn,
  76. Catalog sourceCatalog,
  77. com.mysql.grt.db.mgmt.Connection targetDbConn,
  78. com.mysql.grt.db.Catalog targetCatalog, GrtStringHashMap params,
  79. com.mysql.grt.base.ObjectLogList logList) throws Exception {
  80. new MigrationOracle().doDataBulkTransfer(sourceDbConn, sourceCatalog,
  81. targetDbConn, targetCatalog, params, logList);
  82. }
  83. /**
  84.  * migrates the name of an identifier
  85.  * 
  86.  * @param name
  87.  *            the source name of the identifier
  88.  * @return the migrated identifier name
  89.  */
  90. protected String migrateIdentifier(String name) {
  91. return name.toLowerCase();
  92. }
  93. /**
  94.  * migrates the sourceSchema and stores the targetCatalog in the global
  95.  * migration object
  96.  * 
  97.  * @param migObj
  98.  *            migration object to migrate
  99.  * @param targetPackageName
  100.  *            name of the package that should be used to generate the target
  101.  *            objects, e.g. db.mysql
  102.  * @param sourceSchema
  103.  *            the source schema that should be migrated
  104.  */
  105. protected com.mysql.grt.db.mysql.Schema migrateSchemaToMysql(
  106. com.mysql.grt.db.migration.Migration migObj, Schema sourceSchema,
  107. GrtStringHashMap migrationParams, GrtObject parent) {
  108. // call super migrate function to do basic migration
  109. com.mysql.grt.db.mysql.Schema targetSchema = super
  110. .migrateSchemaToMysql(migObj, sourceSchema, migrationParams,
  111. parent);
  112. // migrate sequences
  113. for (int i = 0; i < sourceSchema.getSequences().size(); i++) {
  114. Sequence sourceSequence = (Sequence) sourceSchema.getSequences()
  115. .get(i);
  116. migUtils.migrateObject(this, migObj, sourceSequence, targetSchema);
  117. }
  118. return targetSchema;
  119. }
  120. /**
  121.  * Migrates an Oracle table to a MySQL table
  122.  * 
  123.  * @param sourceTable
  124.  *            the object to migrate
  125.  * @param migrationParams
  126.  *            parameters used to define the target object
  127.  * 
  128.  * @return returns MySQL table object
  129.  */
  130. protected com.mysql.grt.db.mysql.Table migrateTableToMysql(
  131. com.mysql.grt.db.migration.Migration migObj, Table sourceTable,
  132. GrtStringHashMap migrationParams, GrtObject parent) {
  133. // call migration method from the super class
  134. com.mysql.grt.db.mysql.Table targetTable;
  135. targetTable = super.migrateTableToMysql(migObj, sourceTable,
  136. migrationParams, parent);
  137. // do oracle specific things
  138. // return new created, migrated object
  139. return targetTable;
  140. }
  141. /**
  142.  * Migrates a column to a MySQL column
  143.  * 
  144.  * @param migObj
  145.  *            the migration object
  146.  * @param sourceColumn
  147.  *            the object to migrate
  148.  * @param migrationParams
  149.  *            parameters used to define the target object
  150.  * @param parent
  151.  *            parent object of the migrated object
  152.  * 
  153.  * @return returns a MySQL object
  154.  */
  155. protected com.mysql.grt.db.mysql.Column migrateColumnToMysql(
  156. com.mysql.grt.db.migration.Migration migObj, Column sourceColumn,
  157. GrtStringHashMap migrationParams, GrtObject parent) {
  158. // create target table
  159. com.mysql.grt.db.mysql.Column targetColumn;
  160. targetColumn = new com.mysql.grt.db.mysql.Column(parent);
  161. // log creation of target object
  162. migUtils.addMigrationLogEntry(migObj, sourceColumn, targetColumn);
  163. // do migration
  164. targetColumn.setName(migUtils.getTargetName(migrationParams,
  165. migrateIdentifier(sourceColumn.getName())));
  166. targetColumn.setOldName(sourceColumn.getName());
  167. targetColumn.setDefaultValue(sourceColumn.getDefaultValue());
  168. targetColumn.setIsNullable(sourceColumn.getIsNullable());
  169. targetColumn.setPrecision(sourceColumn.getPrecision());
  170. targetColumn.setScale(sourceColumn.getScale());
  171. targetColumn.setLength(sourceColumn.getLength());
  172. // migrate datatype
  173. com.mysql.grt.db.SimpleDatatypeList simpleDatatypes = migObj
  174. .getTargetCatalog().getSimpleDatatypes();
  175. String sourceDatatypeName = sourceColumn.getDatatypeName();
  176. if (!migrateColumnParamsToMySql(targetColumn, migrationParams)) {
  177. // character types
  178. if (sourceDatatypeName.equals("VARCHAR2")
  179. || sourceDatatypeName.equals("NVARCHAR2")) {
  180. GrtStringList columnFlags = new GrtStringList();
  181. columnFlags.add("BINARY");
  182. targetColumn.setFlags(columnFlags);
  183. if (sourceColumn.getLength() < 256) {
  184. // normal varchar up to 255 chars
  185. targetColumn.setDatatypeName("VARCHAR");
  186. } else if (sourceColumn.getLength() < 65536) {
  187. // MySQL 5 can deal with VARCHAR holding up to 65535
  188. // characters
  189. if (migObj.getTargetCatalog().getVersion().getMajor() >= 5)
  190. targetColumn.setDatatypeName("VARCHAR");
  191. // for older versions use medium text up to 65535
  192. else
  193. targetColumn.setDatatypeName("MEDIUMTEXT");
  194. } else {
  195. // long text
  196. targetColumn.setDatatypeName("LONGTEXT");
  197. }
  198. }
  199. // character types with fixed length
  200. else if (sourceDatatypeName.equals("CHAR")
  201. || sourceDatatypeName.equals("NCHAR")) {
  202. GrtStringList columnFlags = new GrtStringList();
  203. columnFlags.add("BINARY");
  204. targetColumn.setFlags(columnFlags);
  205. // fixed length character types
  206. if (sourceColumn.getLength() < 256) {
  207. // normal varchar up to 255 chars
  208. targetColumn.setDatatypeName("CHAR");
  209. } else if (sourceColumn.getLength() < 65536) {
  210. // MySQL 5 can deal with VARCHAR holding up to 65535
  211. // characters and in InnoDB CHAR == VARCHAR
  212. if (migObj.getTargetCatalog().getVersion().getMajor() >= 5)
  213. targetColumn.setDatatypeName("VARCHAR");
  214. // for older versions use medium text up to 65535
  215. else
  216. targetColumn.setDatatypeName("MEDIUMTEXT");
  217. } else {
  218. // long text
  219. targetColumn.setDatatypeName("LONGTEXT");
  220. }
  221. }
  222. // character types with unknown length
  223. else if (sourceDatatypeName.equals("CLOB")
  224. || sourceDatatypeName.equals("LONG")) {
  225. GrtStringList columnFlags = new GrtStringList();
  226. columnFlags.add("BINARY");
  227. targetColumn.setFlags(columnFlags);
  228. targetColumn.setDatatypeName("LONGTEXT");
  229. }
  230. // binary types
  231. else if (sourceDatatypeName.equals("RAW")) {
  232. targetColumn.setDatatypeName("MEDIUMBLOB");
  233. }
  234. // binary types
  235. else if (sourceDatatypeName.equals("LONG RAW")
  236. || sourceDatatypeName.equals("BLOB")) {
  237. targetColumn.setDatatypeName("LONGBLOB");
  238. }
  239. // numeric types
  240. else if (sourceDatatypeName.equals("NUMBER")
  241. || sourceDatatypeName.equals("DECIMAL")) {
  242. if (sourceColumn.getScale() == 0) {
  243. if (targetColumn.getPrecision() < 10) {
  244. targetColumn.setDatatypeName("INT");
  245. } else {
  246. if (targetColumn.getPrecision() < 19)
  247. targetColumn.setDatatypeName("BIGINT");
  248. else
  249. targetColumn.setDatatypeName("DECIMAL");
  250. }
  251. } else {
  252. targetColumn.setDatatypeName("DECIMAL");
  253. }
  254. // make sure Precision and Scale are set correctly
  255. if (targetColumn.getPrecision() > 65) {
  256. targetColumn.setPrecision(65);
  257. }
  258. if (targetColumn.getScale() > 30) {
  259. targetColumn.setScale(30);
  260. migUtils.addMigrationLogEntry(migObj, sourceColumn,
  261. targetColumn, "The precision of this column has been set to the maximum allowed value (30). "
  262. + "This might cause loss of data.",
  263. MigrationUtils.logWarning);
  264. }
  265. if (targetColumn.getScale() > targetColumn.getPrecision()) {
  266. targetColumn.setScale(targetColumn.getPrecision() - 1);
  267. }
  268. } else if (sourceDatatypeName.equals("REAL")
  269. || sourceDatatypeName.equals("DOUBLE PRECISION")) {
  270. targetColumn.setDatatypeName("DECIMAL");
  271. targetColumn.setScale(30);
  272. } else if (sourceDatatypeName.equals("FLOAT")) {
  273. targetColumn.setDatatypeName("DOUBLE");
  274. targetColumn.setPrecision(-1);
  275. targetColumn.setScale(-1);
  276. // datetime types
  277. } else if (sourceDatatypeName.equals("DATE")) {
  278. targetColumn.setDatatypeName("DATETIME");
  279. if ((sourceColumn.getDefaultValue() != null)
  280. && sourceColumn.getDefaultValue().equalsIgnoreCase(
  281. "sysdate"))
  282. targetColumn.setDefaultValue("");
  283. }
  284. // timestamp types
  285. else if (sourceDatatypeName.indexOf("TIMESTAMP") > -1) {
  286. // timestamp types
  287. targetColumn.setDatatypeName("DATETIME");
  288. }
  289. // not covered yet
  290. else {
  291. targetColumn.setDatatypeName("VARCHAR");
  292. targetColumn.setLength(255);
  293. migUtils.addMigrationLogEntry(migObj, sourceColumn,
  294. targetColumn, "The datatype "
  295. + sourceColumn.getDatatypeName()
  296. + " cannot be migrated.",
  297. MigrationUtils.logError);
  298. }
  299. }
  300. // lookup the simple datatype and set it in the column
  301. int simpleDatatypeIndex = simpleDatatypes.getIndexOfName(targetColumn
  302. .getDatatypeName());
  303. if (simpleDatatypeIndex > -1)
  304. targetColumn
  305. .setSimpleType(simpleDatatypes.get(simpleDatatypeIndex));
  306. // make sure N* are utf8
  307. if (sourceDatatypeName.equals("NVARCHAR2")
  308. || sourceDatatypeName.equals("NCHAR")
  309. || sourceDatatypeName.equals("NCLOB")) {
  310. targetColumn.setCharacterSetName("utf8");
  311. targetColumn.setCollationName("utf8_bin");
  312. }
  313. // return new created, migrated object
  314. return targetColumn;
  315. }
  316. /**
  317.  * Migrates an Oracle view to a MySQL view
  318.  * 
  319.  * @param sourceView
  320.  *            the object to migrate
  321.  * @param migrationParams
  322.  *            parameters used to define the target object
  323.  * 
  324.  * @return returns MySQL view object
  325.  */
  326. protected com.mysql.grt.db.mysql.View migrateViewToMysql(
  327. com.mysql.grt.db.migration.Migration migObj, View sourceView,
  328. GrtStringHashMap migrationParams, GrtObject parent) {
  329. // create target view
  330. com.mysql.grt.db.mysql.View targetView = super.migrateViewToMysql(
  331. migObj, sourceView, migrationParams, parent);
  332. // return new created, migrated object
  333. return targetView;
  334. }
  335. /**
  336.  * Migrates an Oracle Routine to a MySQL Routine
  337.  * 
  338.  * @param sourceView
  339.  *            the object to migrate
  340.  * @param migrationParams
  341.  *            parameters used to define the target object
  342.  * 
  343.  * @return returns MySQL view object
  344.  */
  345. protected com.mysql.grt.db.mysql.Routine migrateRoutineToMysql(
  346. com.mysql.grt.db.migration.Migration migObj, Routine sourceProc,
  347. GrtStringHashMap migrationParams, GrtObject parent) {
  348. // create target Routine
  349. com.mysql.grt.db.mysql.Routine targetProc = super
  350. .migrateRoutineToMysql(migObj, sourceProc, migrationParams,
  351. parent);
  352. // return new created, migrated object
  353. return targetProc;
  354. }
  355. /**
  356.  * Generates information about the schema to MySQL migration method
  357.  * 
  358.  * @return returns a Method with predefined migration parameters
  359.  */
  360. private Method getMigrateSchemaToMysqlInfo() {
  361. // create method description
  362. Method method = new Method(null);
  363. method.setName("migrateSchemaToMysql");
  364. method.setModuleName("MigrationOracle");
  365. method.setCaption("Oracle Default");
  366. method.setDesc("Default method to migrate an Oracle schema to MySQL.");
  367. method.setSourceStructName("db.oracle.Schema");
  368. method.setTargetPackageName("db.mysql");
  369. method.setRating(1);
  370. addMigrateSchemaToMysqlInfoParameters(method);
  371. return method;
  372. }
  373. /**
  374.  * Generates information about the Oracle Table to MySQL migration method
  375.  * 
  376.  * @return returns a Method with predefined migration parameters
  377.  */
  378. private Method getMigrateTableToMysqlInfo() {
  379. // create migrateOracleTable method
  380. Method method = new Method(null);
  381. method.setName("migrateTableToMysql");
  382. method.setModuleName("MigrationOracle");
  383. method.setCaption("Oracle Default");
  384. method.setDesc("Default method to migrate an Oracle table to MySQL.");
  385. method.setSourceStructName("db.oracle.Table");
  386. method.setTargetPackageName("db.mysql");
  387. method.setRating(1);
  388. addMigrateTableToMysqlInfoParameters(method);
  389. return method;
  390. }
  391. /**
  392.  * Generates information about the Column to MySQL migration method
  393.  * 
  394.  * @return returns a Method with predefined migration parameters
  395.  */
  396. private Method getMigrateColumnToMysqlInfo() {
  397. // create method description
  398. Method method = new Method(null);
  399. method.setName("migrateColumnToMysql");
  400. method.setModuleName("MigrationOracle");
  401. method.setCaption("Oracle Default");
  402. method.setDesc("Default method to migrate a Oracle column to MySQL.");
  403. method.setSourceStructName("db.oracle.Column");
  404. method.setTargetPackageName("db.mysql");
  405. method.setRating(1);
  406. addMigrateColumnToMysqlInfoParameters(method);
  407. return method;
  408. }
  409. /**
  410.  * Generates information about the View to MySQL migration method
  411.  * 
  412.  * @return returns a Method with predefined migration parameters
  413.  */
  414. private Method getMigrateViewToMysqlInfo() {
  415. // create migrateOracleTable method
  416. Method method = new Method(null);
  417. method.setName("migrateViewToMysql");
  418. method.setModuleName("MigrationOracle");
  419. method.setCaption("Oracle Default");
  420. method.setDesc("Default method to migrate an Oracle view to MySQL.");
  421. method.setSourceStructName("db.oracle.View");
  422. method.setTargetPackageName("db.mysql");
  423. method.setRating(1);
  424. addMigrateViewToMysqlInfoParameters(method);
  425. return method;
  426. }
  427. /**
  428.  * Generates information about the View to MySQL migration method
  429.  * 
  430.  * @return returns a Method with predefined migration parameters
  431.  */
  432. private Method getMigrateRoutineToMysqlInfo() {
  433. // create migrateOracleTable method
  434. Method method = new Method(null);
  435. method.setName("migrateRoutineToMysql");
  436. method.setModuleName("MigrationOracle");
  437. method.setCaption("Oracle Default");
  438. method.setDesc("Default method to migrate an "
  439. + "Oracle routine to MySQL.");
  440. method.setSourceStructName("db.oracle.Routine");
  441. method.setTargetPackageName("db.mysql");
  442. method.setRating(1);
  443. addMigrateRoutineToMysqlInfoParameters(method);
  444. return method;
  445. }
  446. }