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

MySQL数据库

开发平台:

SQL

  1. -- ----------------------------------------------------------------------------------------
  2. -- Copyright (C) 2004 MySQL AB
  3. --
  4. -- This program is free software; you can redistribute it and/or modify
  5. -- it under the terms of the GNU General Public License as published by
  6. -- the Free Software Foundation; either version 2 of the License, or
  7. -- (at your option) any later version.
  8. --
  9. -- This program is distributed in the hope that it will be useful,
  10. -- but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. -- GNU General Public License for more details.
  13. --
  14. -- You should have received a copy of the GNU General Public License
  15. -- along with this program; if not, write to the Free Software
  16. -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17. -- ----------------------------------------------------------------------------------------
  18. -- ----------------------------------------------------------------------------------------
  19. -- @file MigrationScript.lua
  20. -- @brief Script that handles a migration process
  21. -- ----------------------------------------------------------------------------------------
  22. -- ------------------------------------------------------------------
  23. -- MySQL Migration Toolkit - Migration script
  24. -- ------------------------------------------------------------------
  25. Mig = {
  26.   version= "1.1.9exp",
  27.   sourceConn= nil,
  28.   targetConn= nil,
  29.   sourceSchemataNames= nil,
  30.   selectedSchemataNames= nil,
  31.   sourceObjects= nil,
  32.   migrationMethods= nil,
  33.   objTypes= nil
  34. }
  35. -- ------------------------------------------------------------------
  36. -- The run method that is called to perform the migration
  37. function Mig:run()
  38.   self:printTitle("MySQL Migration Toolkit - Script Version " .. self.version)
  39.   self:init()
  40.   
  41.   -- Source connection
  42.   self:printTitle(_("Source database connection."), 1)
  43.   self.sourceConn= self:getConnection("db.mgmt.JdbcDriver")
  44.   if self.sourceConn == nil then
  45.     return -1
  46.   end
  47.   
  48.   -- Target connection
  49.   self:printTitle(_("Target database connection."), 1)
  50.   self.targetConn= self:getConnection("db.mgmt.JdbcDriver", {"TransformationModule"}) 
  51.   if self.targetConn == nil then
  52.     return -1
  53.   end
  54.   grtV.setGlobal("/migration/targetConnection", self.sourceConn)
  55.   
  56.   -- Get schemata list
  57.   self:printTitle(_("Fetching source schemata."), 1)
  58.   self.sourceSchemataNames= self:getSourceSchemata()
  59.   if self.sourceSchemataNames == nil then
  60.     return -1
  61.   end
  62.   grtV.setGlobal("/migration/sourceSchemataNames", self.sourceSchemataNames)
  63.   
  64.   -- Selected schemata
  65.   self:printTitle(_("Schema selection."), 1)
  66.   self.selectedSchemataNames= self:chooseSourceSchemata()
  67.   if self.selectedSchemataNames == nil then
  68.     return -1
  69.   end
  70.   grtV.setGlobal("/migration/selectedSchemataNames", self.selectedSchemataNames)
  71.   
  72.   -- Reverse engineering
  73.   self:printTitle(_("Reverse engineering."), 1)
  74.   local catalog= self:reverseEngineering()
  75.   if catalog == nil then
  76.     return -1
  77.   end
  78.   grtV.setGlobal("/migration/sourceCatalog", catalog)
  79.   
  80.   -- Get migration methods
  81.   self:printTitle(_("Get migration methods."), 1)
  82.   self.migrationMethods= self:getMigrationMethods()
  83.   if self.migrationMethods == nil then
  84.     return -1
  85.   end
  86.   grtV.setGlobal("/migration/migrationMethods", self.migrationMethods)  
  87.   
  88.   -- Let the user setup the ignore list
  89.   self:printTitle(_("Setup ignore list."), 1)
  90.   local ignoreList= self:getIgnoreList()
  91.   if ignoreList == nil then
  92.     return -1
  93.   end
  94.   grtV.setGlobal("/migration/ignoreList", ignoreList)
  95.   
  96.   -- Do migration
  97.   self:printTitle(_("Performing migration."), 1)
  98.   if not(self:doMigration()) then
  99.     return -1
  100.   end
  101.   
  102.   -- Generate objects
  103.   self:printTitle(_("Generate target objects"), 1)
  104.   if not(self:generateObjects()) then
  105.     return -1
  106.   end
  107.   
  108.   -- Bulk data transfer
  109.   self:printTitle(_("Bulk data transfer"), 1)
  110.   if not(self:bulkDataTransfer()) then
  111.     return -1
  112.   end
  113.   self:printTitle(_("Migration finished."))
  114. end
  115. -- ------------------------------------------------------------------
  116. -- Initialize the migration environment
  117. function Mig:init()
  118.   print(_("Initializing migration environment..."))
  119.   Migration:initMigration()
  120.   print(_("Initialisation complete."))
  121.   self.root = grtV.getGlobal("/")
  122. end
  123. -- ------------------------------------------------------------------
  124. -- Print a title
  125. function Mig:printTitle(title, style)
  126.   if style ~= 1 then
  127.     print("")
  128.     print(title)
  129.     print(string.rep("-", string.len(title)))
  130.   else
  131.     print("")
  132.     print(string.rep("*", string.len(title) + 4))
  133.     print("* " .. title .. " *")
  134.     print(string.rep("*", string.len(title) + 4))
  135.   end
  136. end
  137. -- ------------------------------------------------------------------
  138. -- Print an error
  139. function Mig:printError(msg)
  140.   if grtError ~= nil then
  141.     print(msg)
  142.     print(grtError.error)
  143.     if grtError.detail ~= nil then
  144.       print(grtError.detail)
  145.     end
  146.   end
  147. end
  148. function Mig:inputNumber(caption)
  149.   local res= tonumber(input(caption))
  150.   if res == nil then
  151.     print("")
  152.     print(_("Incorrect input. Please enter a number."))
  153.     return self:inputNumber(caption)
  154.   else
  155.     return res
  156.   end
  157. end
  158. -- ------------------------------------------------------------------
  159. -- Select and test a connection
  160. function Mig:getConnection(driverStruct, requiredModules)
  161.   local conn= self:selectConnection(driverStruct, requiredModules) 
  162.   
  163.   if conn ~= nil then
  164.     if self:testConnection(conn) ~= 1 then
  165.       print("")
  166.       local retry= self:inputNumber(_("Choose different connection: (1. Yes, 0. Abort) "))
  167.       
  168.       if retry == 0 then
  169.         return nil
  170.       else
  171.         conn= self:getConnection(driverStruct, requiredModules)
  172.       end
  173.     end
  174.   end
  175.   
  176.   return conn
  177. end
  178. function Mig:driverMeetsRequirements(driver, driverStruct, requiredModules)
  179.   local allRequirementsMet= false
  180.   
  181.   -- check struct name
  182.   if (driverStruct == nil) or (grtS.get(driver) == driverStruct) then        
  183.     -- check required modules
  184.     if requiredModules ~= nil then
  185.       local moduleFound
  186.       local k
  187.       for k= 1, table.getn(requiredModules) do
  188.         local l
  189.         moduleFound= false
  190.         
  191.         for l= 1, grtV.getn(driver.defaultModules) do
  192.           local moduleName= grtV.toLua(driver.defaultModules[requiredModules[k]])
  193.           if (moduleName ~= nil) and (moduleName ~= "") then
  194.             moduleFound= true
  195.             break
  196.           end
  197.         end
  198.         
  199.         if not(moduleFound) then
  200.           break
  201.         end
  202.       end
  203.       
  204.       if (moduleFound) then
  205.         allRequirementsMet= true
  206.       end
  207.     else
  208.       allRequirementsMet= true
  209.     end
  210.   end
  211.   return allRequirementsMet
  212. end
  213. -- ------------------------------------------------------------------
  214. -- Ask user to select a connection
  215. function Mig:selectConnection(driverStruct, requiredModules)
  216.   -- Let the user select the database system
  217.   self:printTitle(_("Please choose a database system:"))
  218.   
  219.   local i
  220.   local rdbms
  221.   local rdbmsList= {}
  222.   local count= 0;
  223.   
  224.   for i= 1, grtV.getn(self.root.rdbmsMgmt.rdbms) do
  225.     local rdbms= self.root.rdbmsMgmt.rdbms[i]
  226.     local driverCount= 0
  227.     
  228.     if (driverStruct == nil) and (requiredModules == nil) then
  229.       allRequirementsMet= true
  230.     else
  231.       local j
  232.       for j= 1, grtV.getn(rdbms.drivers) do
  233.         local driver= rdbms.drivers[j]
  234.         
  235.         if self:driverMeetsRequirements(driver, driverStruct, requiredModules) then
  236.           driverCount= driverCount + 1
  237.         end
  238.       end
  239.     end
  240.     
  241.     if driverCount > 0 then
  242.       table.insert(rdbmsList, rdbms)
  243.       count= count + 1
  244.       print(count .. ". " .. grtV.toLua(rdbms.caption))
  245.     end
  246.   end
  247.   
  248.   print(_("0. Abort"))
  249.   print("")
  250.   
  251.   local rdbmsIndex= self:inputNumber(_("Source Database System: "))
  252.   
  253.   if (rdbmsIndex > 0) and (rdbmsIndex <= table.getn(rdbmsList)) then
  254.     rdbms= rdbmsList[rdbmsIndex]
  255.   else   
  256.     return nil
  257.   end
  258.   
  259.   -- Let the user select a stored connection or to create a new one
  260.   self:printTitle(_("Please choose a connection:"))
  261.   
  262.   print(_("1. Create new connection"))
  263.   
  264.   local connCount= 1
  265.   local connList= {}
  266.   for i= 1, grtV.getn(self.root.rdbmsMgmt.storedConns) do
  267.     if grtV.toLua(self.root.rdbmsMgmt.storedConns[i].driver.owner._id) == 
  268.       grtV.toLua(rdbms._id) then
  269.       
  270.       local conn= self.root.rdbmsMgmt.storedConns[i]
  271.       
  272.       if self:driverMeetsRequirements(conn.driver, driverStruct, requiredModules) then
  273.         print(connCount + 1 .. ". " .. grtV.toLua(conn.name))      
  274.         table.insert(connList, conn)
  275.         
  276.         connCount= connCount + 1
  277.       end
  278.     end
  279.   end
  280.   
  281.   print(_("0. Abort"))
  282.   if connCount > 1 then
  283.     print(_("-1.Delete a connection"))
  284.   end
  285.   print("")
  286.   
  287.   local connIndex= self:inputNumber(_("Connection: "))
  288.   
  289.   if connIndex == 0 then
  290.     return nil
  291.   elseif connIndex > 1 and connIndex <= connCount + 1 then
  292.     -- display selected connection
  293.     local conn= connList[connIndex - 1]
  294.     
  295.     self:printTitle(string.format(_("Selected connection: %s"), grtV.toLua(conn.name)))
  296.     
  297.     for i= 1, grtV.getn(conn.parameterValues) do
  298.       local key= grtV.getKey(conn.parameterValues, i)
  299.       
  300.       if (key ~= "password") then
  301.         print(key .. ": " .. grtV.toLua(conn.parameterValues[key]))
  302.       else
  303.         print(key .. ": ********")
  304.       end
  305.     end
  306.     
  307.     print("")
  308.     
  309.     local isCorrect= self:inputNumber(_("Accept connection: (1. Yes, 2. Choose another connection, 0. Abort) "))
  310.     
  311.     if isCorrect == 0 then
  312.       return nil
  313.     elseif isCorrect == 1 then
  314.       return conn
  315.     else
  316.       return self:selectConnection(driverStruct, requiredModules)
  317.     end
  318.   elseif connIndex == -1 then
  319.     -- Handle connection deletion
  320.     local delIndex= self:inputNumber(string.format(_("Connection to delete: (2 - %d, 0 to cancel) "), connCount))
  321.     
  322.     if delIndex ~= 0 then
  323.       grtV.remove(self.root.rdbmsMgmt.storedConns, delIndex - 1)
  324.       
  325.       RdbmsManagement:storeConns({self.root.rdbmsMgmt.storedConns})
  326.     end
  327.     
  328.     return self:selectConnection(driverStruct, requiredModules)
  329.   else
  330.     -- create a new connection
  331.     return Mig:newConnection(driverStruct, rdbms)
  332.   end
  333. end
  334. -- ------------------------------------------------------------------
  335. -- Ask user to select a connection
  336. function Mig:newConnection(driverStruct, rdbms)
  337.   self:printTitle(string.format(_("Creating new connection to %s ..."), grtV.toLua(rdbms.caption)))
  338.   print(_("Please enter the connection parameters."))
  339.   
  340.   local i
  341.   local driver
  342.   local conn= grtV.newObj("db.mgmt.Connection", "newConnection", grt.newGuid(), "")
  343.   
  344.   -- Choose a driver
  345.   if (grtV.getn(rdbms.drivers) == 1) then
  346.     driver= rdbms.drivers[1]
  347.   else
  348.     print(_("Please choose a driver:"))
  349.     
  350.     local driverList= {}
  351.     local count= 0
  352.     
  353.     for i= 1, grtV.getn(rdbms.drivers) do
  354.       if (driverStruct == nil) or (grtS.get(rdbms.drivers[i]) == driverStruct) then    
  355.         count= count + 1
  356.         table.insert(driverList, rdbms.drivers[i])
  357.         
  358.         print(count .. ". " .. grtV.toLua(rdbms.drivers[i].caption))
  359.       end
  360.     end
  361.     
  362.     print(_("0. Abort"))
  363.     print("")
  364.     
  365.     local driverIndex= self:inputNumber(_("Driver: "))
  366.     
  367.     if (driverIndex > 0) and (driverIndex <= count) then
  368.       driver= driverList[driverIndex]
  369.     else
  370.       return nil      
  371.     end
  372.   end
  373.   
  374.   conn.driver= driver
  375.   
  376.   print("")
  377.   
  378.   -- Get parameters
  379.   for i= 1, grtV.getn(driver.parameters) do
  380.     local param= driver.parameters[i]
  381.     local paramDefault= grtV.toLua(param.defaultValue)
  382.     local paramValue
  383.     local paramLookup= ""
  384.     if grtV.toLua(param.lookupValueModule) ~= "" then
  385.       local j
  386.       local lookupList= grtM.callFunction(grtV.toLua(param.lookupValueModule), 
  387.         grtV.toLua(param.lookupValueMethod), {conn}, 1)
  388.       
  389.       if lookupList ~= nil then
  390.         for j= 1, grtV.getn(lookupList) do
  391.           paramLookup= paramLookup .. grtV.toLua(lookupList[j])
  392.           
  393.           if j < grtV.getn(lookupList) then
  394.             paramLookup= paramLookup .. ", "
  395.           end
  396.         end
  397.       end
  398.     end
  399.     
  400.     if paramDefault ~= "" then
  401.       paramValue= input(grtV.toLua(param.caption) .. " [" .. paramDefault .. "] ")
  402.       if paramValue == "" then
  403.         paramValue= paramDefault
  404.       end
  405.     elseif paramLookup ~= "" then
  406.       paramValue= input(grtV.toLua(param.caption) .. " (" .. paramLookup .. ") ")
  407.     else
  408.       paramValue= input(grtV.toLua(param.caption) .. " ")
  409.     end
  410.     conn.parameterValues[grtV.toLua(param.name)]= paramValue
  411.   end
  412.   
  413.   -- Copy modules
  414.   for i= 1, grtV.getn(driver.defaultModules) do
  415.     local moduleName= grtV.getKey(driver.defaultModules, i)
  416.     
  417.     conn.modules[moduleName]= driver.defaultModules[moduleName]
  418.   end
  419.   
  420.   print("")
  421.   
  422.   local connName= input(_("Connection name (leave blank not to store): "))
  423.   
  424.   if connName ~= "" then
  425.     conn.name= connName
  426.     grtV.insert(self.root.rdbmsMgmt.storedConns, conn)
  427.     
  428.     RdbmsManagement:storeConns({self.root.rdbmsMgmt.storedConns})
  429.   end
  430.   
  431.   return conn
  432. end
  433. -- ------------------------------------------------------------------
  434. -- Tests the connection
  435. function Mig:testConnection(conn)
  436.   self:printTitle(string.format(_("Testing connection to %s ..."), grtV.toLua(conn.driver.owner.caption)))
  437.   local res= grtM.callFunction(grtV.toLua(conn.modules["ReverseEngineeringModule"]), "getVersion", {conn})
  438.   if res == nil then
  439.     print(string.format(_("The connection to the %s database could not be established."), 
  440.       grtV.toLua(conn.driver.owner.caption))
  441.     )
  442.     
  443.     self:printError(_("The following error occured."))
  444.     
  445.     return 0
  446.   end
  447.   -- store target version for the migration process
  448.   grtV.setGlobal("/migration/targetVersion", res)
  449.   print(_("Test completed successfully."))
  450.   
  451.   return 1
  452. end
  453. -- ------------------------------------------------------------------
  454. -- Get list of source schemata
  455. function Mig:getSourceSchemata()
  456.   local schemaList= grtM.callFunction(grtV.toLua(self.sourceConn.modules["ReverseEngineeringModule"]), 
  457.     "getSchemata", {self.sourceConn}, 1
  458.   )
  459.   
  460.   if schemaList ~= nil then
  461.     print(_("List of source schemata fetched successfully."))
  462.     print("")
  463.   end
  464.   
  465.   return schemaList
  466. end
  467. -- ------------------------------------------------------------------
  468. -- Let the use choose from the list of source schemata
  469. function Mig:chooseSourceSchemata()
  470.   local schemaList= grtV.duplicate(self.sourceSchemataNames)
  471.   self:printTitle(_("Choose the schemata to migrate ..."))
  472.   
  473.   local i
  474.   
  475.   for i= 1, grtV.getn(schemaList) do
  476.     print(i .. ". " .. grtV.toLua(schemaList[i]))
  477.   end
  478.   
  479.   print("0. Abort")
  480.   print("")
  481.   
  482.   local selectedSchemataStr= self:inputNumber(_("Schemata: (ids seperate with ,) "))
  483.   -- catch exit
  484.   if selectedSchemataStr == 0 then
  485.     return -1
  486.   end
  487.   local selectedSchemataIds= grt.split(selectedSchemataStr, ",")
  488.   for i= grtV.getn(schemaList), 1, -1 do
  489.     local key
  490.     local value
  491.     local selected= false
  492.     
  493.     for key, value in selectedSchemataIds do
  494.       if i == value + 0 then
  495.         selected= true
  496.         break
  497.       end
  498.     end
  499.     
  500.     if not(selected) then
  501.       grtV.remove(schemaList, i)
  502.     end
  503.   end
  504.   
  505.   print("")
  506.   self:printTitle(_("Selected schema(ta):"))
  507.   
  508.   for i= 1, grtV.getn(schemaList) do
  509.     print(grtV.toLua(schemaList[i]))
  510.   end
  511.   
  512.   print("")
  513.   local acceptIndex= self:inputNumber(_("Accept selection: (1. Yes, 2. Reselect, 0. Abort) "))
  514.   
  515.   if acceptIndex == 2 then
  516.     schemaList= self:chooseSourceSchemata()
  517.   end
  518.   
  519.   return schemaList
  520. end
  521. -- ------------------------------------------------------------------
  522. -- Let the use choose from the list of source schemata
  523. function Mig:reverseEngineering()
  524.   self:printTitle(string.format(_("Reverse engineering %s ..."), grtV.toLua(self.sourceConn.driver.owner.caption)))
  525.   
  526.   local catalog= grtM.callFunction(grtV.toLua(self.sourceConn.modules.ReverseEngineeringModule),
  527.     "reverseEngineer", {self.sourceConn, self.selectedSchemataNames}
  528.   )
  529.   if catalog ~= nil then
  530.     print("")
  531.     print(_("Reverse engineering completed successfully."))
  532.     print("")
  533.   else
  534.     print("")
  535.     self:printError(_("The following error occured during reverse engineering."))
  536.   end
  537.   
  538.   return catalog
  539. end
  540. -- ------------------------------------------------------------------
  541. -- Get the available migration methods
  542. function Mig:getMigrationMethods()
  543.   self:printTitle(_("Fetching available migration methods ..."))
  544.   
  545.   local methods= grtM.callFunction(grtV.toLua(self.sourceConn.modules.MigrationModule),
  546.     "migrationMethods", nil
  547.   )
  548.   
  549.   if methods == nil then
  550.     print("")
  551.     print(_("Could not fetch migration methods."))
  552.     print("")
  553.   else
  554.     -- build source object list
  555.     self.sourceObjects= {}
  556.     self.objTypes= {}
  557.     
  558.     local schemaList= grtV.getGlobal("/migration/sourceCatalog/schemata")
  559.     
  560.     -- loop over all source schemata
  561.     local i
  562.     for i=1, grtV.getn(schemaList) do
  563.       local schema= grtV.getGlobal("/migration/sourceCatalog/schemata/" .. i - 1)
  564.       
  565.       table.insert(self.objTypes, grtS.get(schema))
  566.       
  567.       local schemaStructMembers= grtS.getMembers(grtS.get(schema))
  568.       
  569.       local j      
  570.       for j= 1, table.getn(schemaStructMembers) do
  571.         if grtS.getMemberType(grtS.get(schema), schemaStructMembers[j]) == "list" then
  572.           local memberContentStruct= grtS.getMemberContentStruct(grtS.get(schema), schemaStructMembers[j])
  573.           -- only take objects from lists, that hold db.DatabaseObject dicts
  574.           if (memberContentStruct ~= nil) and
  575.             (grtS.inheritsFrom(memberContentStruct, "db.DatabaseObject")) then
  576.           
  577.             local k
  578.             for k= 1, grtV.getn(schema[schemaStructMembers[j]]) do
  579.               table.insert(self.sourceObjects, schema[schemaStructMembers[j]][k])
  580.             
  581.               if k == 1 then
  582.                 table.insert(self.objTypes, grtS.get(schema[schemaStructMembers[j]][k]))
  583.               end
  584.             end
  585.           end
  586.         end
  587.       end
  588.     end
  589.     
  590.     -- add default mappings for all objTypes
  591.     local defaultMappings= grtV.getGlobal("/migration/mappingDefaults")
  592.     for i= 1, table.getn(self.objTypes) do
  593.       local j
  594.       local bestMethod= nil
  595.       local bestMethodRating= -1
  596.       
  597.       for j=1, grtV.getn(methods) do
  598.         local sourceStructName= grtV.toLua(methods[j].sourceStructName)
  599.         local targetPackageName= grtV.toLua(methods[j].targetPackageName)
  600.         local methodRating= tonumber(grtV.toLua(methods[j].rating))
  601.                 
  602.         if (grtS.inheritsFrom(self.objTypes[i], sourceStructName) or 
  603.             (self.objTypes[i] == sourceStructName)) and 
  604.           (grtV.toLua(self.targetConn.driver.owner.databaseObjectPackage) == targetPackageName) and
  605.           (bestMethodRating < methodRating) then
  606.           bestMethod= methods[j]
  607.           bestMethodRating= methodRating
  608.         end
  609.       end
  610.       
  611.       if bestMethod ~= nil then
  612.         -- create mapping entry
  613.         local mapping= grtV.newObj("db.migration.Mapping", 
  614.           "DefaultMapping" .. grtV.toLua(bestMethod.sourceStructName), grt.newGuid(), ""
  615.         )
  616.         
  617.         mapping.sourceStructName= sourceStructName
  618.         mapping.method= bestMethod
  619.         mapping.methodName= bestMethod.name
  620.         mapping.moduleName= moduleName
  621.         mapping.params= bestMethod.paramGroups[1]
  622.         
  623.         grtV.insert(defaultMappings, mapping)
  624.       end
  625.     end
  626.   end
  627.   
  628.   return methods
  629. end
  630. -- ------------------------------------------------------------------
  631. -- Setting up ignore list
  632. function Mig:getIgnoreList(ignoreList)
  633.   if ignoreList == nil then
  634.     ignoreList= grtV.newList("string")
  635.   end
  636.   
  637.   self:printTitle(_("Your current ignore list:"))
  638.   
  639.   local i
  640.   local j
  641.   local ignoreListIds= {}
  642.   local totalCount= 0
  643.   
  644.   for j= 1, table.getn(self.objTypes) do    
  645.     local count= 0
  646.     
  647.     if not(grtS.inheritsFrom(self.objTypes[j], "db.Schema")) then
  648.       print("")
  649.       print(grtS.getCaption(self.objTypes[j]))
  650.       
  651.       for i= 1, grtV.getn(ignoreList) do
  652.         if string.sub(grtV.toLua(ignoreList[i]), 1, string.len(self.objTypes[j])) == self.objTypes[j] then
  653.           count= count + 1          
  654.           totalCount= totalCount + 1
  655.           
  656.           print("   " .. totalCount .. ". " .. string.sub(grtV.toLua(ignoreList[i]), string.len(self.objTypes[j]) + 2))
  657.           
  658.           table.insert(ignoreListIds, totalCount, i)
  659.         end
  660.       end
  661.       
  662.       if count == 0 then
  663.         print("   " .. _("None"))
  664.       end 
  665.     end
  666.   end
  667.   
  668.   print("")
  669.   print(_("1. Accept ignore list"))
  670.   print(_("2. Add item to ignore list"))
  671.   print(_("3. Delete item from ignore list"))
  672.   print(_("0. Abort"))
  673.   print("")
  674.   
  675.   local selection= self:inputNumber(_("Selection: "))
  676.   
  677.   if selection == 0 then
  678.     return nil
  679.   elseif selection == 1 then
  680.     return ignoreList
  681.   elseif selection == 2 then
  682.     print("")
  683.     
  684.     -- ignore schema
  685.     for j= 2, table.getn(self.objTypes) do    
  686.       print(j - 1 .. ". " .. grtS.getCaption(self.objTypes[j]))
  687.     end
  688.     
  689.     print("")
  690.     
  691.     local objType= self:inputNumber(string.format(
  692.       _("Please enter the object type: (1 - %d, 0. Abort) "), table.getn(self.objTypes) - 1)
  693.     )
  694.     
  695.     if objType == 0 then
  696.       ignoreList= self:getIgnoreList(ignoreList)
  697.     else
  698.       local i
  699.       local s= ""
  700.       local objs= {}
  701.       local index= 0
  702.       
  703.       -- ignore schema
  704.       objType= objType + 1
  705.       
  706.       for i= 1, grtV.getn(self.sourceObjects) do
  707.         if grtS.get(self.sourceObjects[i]) == self.objTypes[objType] then
  708.           local onIgnoreList= false
  709.           local j        
  710.           
  711.           -- check if obj is already on the ignore list
  712.           for j= 1, grtV.getn(ignoreList) do
  713.             objIgnoreStr= self.objTypes[objType] .. ":" .. grtV.toLua(self.sourceObjects[i].name)
  714.             
  715.             if grtV.toLua(Base:patternMatch({objIgnoreStr, grtV.toLua(ignoreList[j]), 1})) == 1 then
  716.               onIgnoreList= true
  717.               break
  718.             end
  719.           end
  720.         
  721.           -- if not, list it
  722.           if not(onIgnoreList) then
  723.             table.insert(objs, self.sourceObjects[i])
  724.           
  725.             index= index + 1
  726.             s= s .. grt.alignLeft(index .. ". " .. grtV.toLua(self.sourceObjects[i].name) .. " ", 25)
  727.               
  728.             if math.mod(index, 4) == 0 then
  729.               print(s)
  730.               s= ""
  731.             end
  732.           end
  733.         end
  734.       end
  735.       
  736.       if s ~= "" then
  737.         print(s)
  738.       end
  739.       
  740.       print("")
  741.       local ignoreObjs= input(_("Add to ignore list: (id or pattern - separate by , use no spaces) "))
  742.       
  743.       local ignoreObjsIds= grt.split(ignoreObjs, ",")
  744.       
  745.       for i=1, table.getn(ignoreObjsIds) do
  746.         local index= tonumber(ignoreObjsIds[i])
  747.         
  748.         if index ~= nil then
  749.           grtV.insert(ignoreList, self.objTypes[objType] .. ":" .. grtV.toLua(objs[index].name))  
  750.         elseif (ignoreObjsIds[i] ~= nil) and (ignoreObjsIds[i] ~= "") then
  751.           grtV.insert(ignoreList, self.objTypes[objType] .. ":" .. ignoreObjsIds[i])
  752.         end
  753.       end
  754.       
  755.       ignoreList= self:getIgnoreList(ignoreList)
  756.     end
  757.   elseif selection == 3 then
  758.     print("")
  759.     
  760.     local index= self:inputNumber(_("Please enter the number of the entry to remove: (0 to cancel) "))
  761.     
  762.     if (index > 0) and (ignoreListIds[index] ~= nil) then
  763.       grtV.remove(ignoreList, ignoreListIds[index])
  764.     end
  765.     
  766.     ignoreList= self:getIgnoreList(ignoreList)
  767.   end
  768.   
  769.   return ignoreList
  770. end
  771. -- ------------------------------------------------------------------
  772. -- Perform migration
  773. function Mig:doMigration()
  774.   print("")
  775.   
  776.   grtM.callFunction(
  777.     grtV.toLua(self.sourceConn.modules.MigrationModule), "migrate", 
  778.     {"global::/migration", "global::/rdbmsMgmt/rdbms/" .. grtV.toLua(self.targetConn.driver.owner.name), "global::/migration/targetVersion"}
  779.   )
  780.   if grtError == nil then
  781.     print(_("Migration completed successfully."))
  782.     
  783.     return true
  784.   else
  785.     self:printError(_("The following error occured during migration."))
  786.     
  787.     return false
  788.   end
  789. end
  790. -- ------------------------------------------------------------------
  791. -- Generate SQL
  792. function Mig:generateObjects()
  793.   print("")
  794.   
  795.   local selection= self:inputNumber(
  796.     _("Create object online or write a SQL create script? (1. online, 2. script, 3. both, 0. abort) ")
  797.   )
  798.   
  799.   if selection == 0 then
  800.     return false
  801.   else
  802.     if (selection == 2) or (selection == 3) then
  803.       print("")
  804.       
  805.       grtM.callFunction(
  806.         grtV.toLua(self.targetConn.modules.TransformationModule), "generateSqlCreateStatements", 
  807.         {"global::/migration/targetCatalog", "global::/migration/objectCreationParams"}
  808.       )
  809.       self:printError(_("The SQL create statements cannot be created."))
  810.     
  811.       -- write sql create script to file
  812.       print("Write create script.")
  813.       
  814.       local script= grtM.callFunction(
  815.         grtV.toLua(self.targetConn.modules.TransformationModule), "getSqlScript", 
  816.         {"global::/migration/targetCatalog", "global::/migration/objectCreationParams"}
  817.       )
  818.       self:printError(_("The SQL create script cannot be created."))
  819.       local f= io.open("creates.sql", "w+")
  820.       if f ~= nil then
  821.         f:write(grtV.toLua(script))
  822.         
  823.         f:flush()
  824.         f:close()
  825.       end
  826.     end
  827.     
  828.     if (selection == 1) or (selection == 3) then
  829.       -- create database objects online
  830.       print("Create database objects.")
  831.       
  832.       grtM.callFunction(
  833.         grtV.toLua(self.targetConn.modules.TransformationModule), "executeSqlStatements", 
  834.         {self.targetConn, "global::/migration/targetCatalog", "global::/migration/creationLog"}
  835.       )
  836.       self:printError(_("The SQL create script cannot be executed."))
  837.     end
  838.   end
  839.   
  840.   return (grtError == nil)
  841. end
  842. -- ------------------------------------------------------------------
  843. -- Generate SQL
  844. function Mig:bulkDataTransfer()
  845.   print("")
  846.   
  847.   local selection= self:inputNumber(
  848.     _("Write a SQL insert script? (1. yes, 2. no, 0. abort) ")
  849.   )
  850.   -- set transfer parameters
  851.   grtV.setGlobal("/migration/dataBulkTransferParams", {
  852.       CreateScript= (selection == 1) and "yes" or "no", 
  853.       TransferData= "no",
  854.       ScriptFileName="inserts.sql"
  855.     }
  856.   )
  857.   grtV.setContentType(grtV.getGlobal("/migration/dataBulkTransferParams"), "string")
  858.   
  859.   self:printTitle("Execute bulk data transfer")
  860.   
  861.   grtM.callFunction(
  862.     grtV.toLua(self.sourceConn.modules.MigrationModule), "dataBulkTransfer", 
  863.     {self.sourceConn, "global::/migration/sourceCatalog", 
  864.       self.targetConn, "global::/migration/targetCatalog", 
  865.       "global::/migration/dataBulkTransferParams",
  866.       "global::/migration/dataTransferLog"
  867.     }
  868.   )
  869.   self:printError(_("The bulk data transfer returned an error."))
  870.   
  871.   return true
  872. end
  873. -- ------------------------------------------------------------------
  874. -- ------------------------------------------------------------------
  875. -- Start the Migration script
  876. Mig:run()