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