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

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. run("lua/_textforms.lua")
  23. GO_NEXT="next"
  24. GO_BACK="back"
  25. GO_QUIT="quit"
  26. BACK_NEXT_BUTTONS= {{GO_BACK, _("Back")}, {GO_NEXT, _("Next")}}
  27. -- ------------------------------------------------------------------
  28. -- MySQL Migration Toolkit - Migration script
  29. -- ------------------------------------------------------------------
  30. Mig = {
  31.   version= "1.1.9exp",
  32.   sourceConn= nil,
  33.   targetConn= nil,
  34.   sourceSchemataNames= nil,
  35.   selectedSchemataNames= nil,
  36.   sourceObjects= nil,
  37.   migrationMethods= nil,
  38.   objTypes= nil
  39. }
  40. function centerLabel(y, width, text)
  41.     return dlg.Label((width - string.len(text))/2, y, text)
  42. end
  43. -- ------------------------------------------------------------------
  44. -- The run method that is called to perform the migration
  45. function Mig:run()
  46.   local result
  47.   local state= 1
  48.   self:init()
  49.   self:initscr()
  50.   while true do
  51.     if state == 1 then
  52.       -- Source connection
  53.       result= self:getConnection(_("Source database connection."), "db.mgmt.JdbcDriver")
  54.       if result[1] == GO_BACK then
  55.         return -1
  56.       elseif result[1] == GO_QUIT then
  57.         return -1
  58.       else
  59.         state= 2   
  60.       end
  61.       self.sourceConn= result[2]
  62.     end
  63.     if state == 2 then
  64.       -- Target connection
  65.       result= self:getConnection(_("Target database connection."), "db.mgmt.JdbcDriver", {"TransformationModule"})
  66.       if result[1] == GO_BACK then
  67.         state= 1
  68.       elseif result[1] == GO_QUIT then
  69.         return -1
  70.       else
  71.         self.targetConn= result[2]
  72.         grtV.setGlobal("/migration/targetConnection", self.sourceConn)
  73.         self:endscr()
  74.         
  75.         -- Get schemata list
  76.         self:printTitle(_("Fetching source schemata."), 1)
  77.         self.sourceSchemataNames= self:getSourceSchemata()
  78.         if self.sourceSchemataNames == nil then
  79.           return -1
  80.         else
  81.           state= 3
  82.           grtV.setGlobal("/migration/sourceSchemataNames", self.sourceSchemataNames)
  83.         end
  84.       end
  85.     end
  86.     if state == 3 then
  87.       self:initscr()
  88.       -- Selected schemata
  89.       result= self:selectSourceSchemata(_("Schema selection."))
  90.       if result[1] == GO_QUIT then
  91.         return -1
  92.       elseif result[1] == GO_BACK then
  93.         state= 2
  94.       else
  95.         state= 4
  96.         self.selectedSchemataNames= result[2]
  97.         grtV.setGlobal("/migration/selectedSchemataNames", self.selectedSchemataNames)
  98.         self:endscr()
  99.         -- Reverse engineering
  100.         local catalog= self:reverseEngineering(_("Reverse engineering."))
  101.         if catalog == nil then
  102.           return -1
  103.         end
  104.         grtV.setGlobal("/migration/sourceCatalog", catalog)
  105.         -- Get migration methods
  106.         self.migrationMethods= self:getMigrationMethods(_("Get migration methods."))
  107.         if self.migrationMethods == nil then
  108.           return -1
  109.         end
  110.         grtV.setGlobal("/migration/migrationMethods", self.migrationMethods)
  111.         self:initscr()
  112.       end
  113.     end
  114.     if state == 4 then
  115.       -- Let the user setup the ignore list
  116.       result= self:selectIgnoreList(_("Setup Ignore List"))
  117.       if result[1] == GO_QUIT then
  118.         return -1
  119.       elseif result[1] == GO_BACK then
  120.         state= 3
  121.       else
  122.         state= 5
  123.         grtV.setGlobal("/migration/ignoreList", result[2])
  124.       end
  125.     end
  126.     if state == 5 then
  127.       self:endscr()
  128.       -- Do migration
  129.       self:printTitle(_("Performing migration."), 1)
  130.       if not(self:doMigration()) then
  131.         return -1
  132.       end
  133.       self:initscr()
  134.       state= 6
  135.     end
  136.     if state == 6 then
  137.       -- Generate objects
  138.       if not(self:generateObjects(_("Generate target objects"))) then
  139.         return -1
  140.       end
  141.       -- Bulk data transfer
  142.       if not(self:bulkDataTransfer(_("Bulk data transfer"))) then
  143.         return -1
  144.       end
  145.     end
  146.   end
  147. end
  148. -- ------------------------------------------------------------------
  149. -- Initialize the migration environment
  150. function Mig:init()
  151.   print(_("Initializing migration environment..."))
  152.   Migration:initMigration()
  153.   print(_("Initialisation complete."))
  154.   self.root = grtV.getGlobal("/")
  155. end
  156. -- ------------------------------------------------------------------
  157. -- Print a title
  158. function Mig:printTitle(title, style)
  159.   if style ~= 1 then
  160.     print("")
  161.     print(title)
  162.     print(string.rep("-", string.len(title)))
  163.   else
  164.     print("")
  165.     print(string.rep("*", string.len(title) + 4))
  166.     print("* " .. title .. " *")
  167.     print(string.rep("*", string.len(title) + 4))
  168.   end
  169. end
  170. -- ------------------------------------------------------------------
  171. -- Print an error
  172. function Mig:printError(msg)
  173.   if grtError ~= nil then
  174.     print(msg)
  175.     print(grtError.error)
  176.     if grtError.detail ~= nil then
  177.       print(grtError.detail)
  178.     end
  179.   end
  180. end
  181. -- ------------------------------------------------------------------
  182. -- Select and test a connection
  183. function Mig:getConnection(title, driverStruct, requiredModules)
  184.   while 1 do
  185.     local result= self:selectConnection(title, driverStruct, requiredModules)
  186.     if result[1] == GO_NEXT then
  187.       local conn= result[2]
  188.       if self:testConnection(conn) ~= 1 then
  189.         local form= SimpleForm:new()
  190.         form:init(title, 40)
  191.         
  192.         form:addLabel(_("There was an error with the connection"), SF_CENTER)
  193.         form:addSpace()
  194.         form:addLabel(_("Choose a different connection?"), SF_CENTER)
  195.         form:addSpace()
  196.         form:setButtons({}, {{GO_NEXT,"Yes"},{GO_QUIT,"Cancel"}})
  197.         result= form:run()
  198.         if result ~= GO_NEXT then
  199.           return {GO_QUIT, nil}
  200.         end
  201.       else
  202.         return {GO_NEXT, conn}
  203.       end
  204.     else
  205.       return result
  206.     end
  207.   end
  208. end
  209. function Mig:driverMeetsRequirements(driver, driverStruct, requiredModules)
  210.   local allRequirementsMet= false
  211.   
  212.   -- check struct name
  213.   if (driverStruct == nil) or (grtS.get(driver) == driverStruct) then        
  214.     -- check required modules
  215.     if requiredModules ~= nil then
  216.       local moduleFound
  217.       local k
  218.       for k= 1, table.getn(requiredModules) do
  219.         local l
  220.         moduleFound= false
  221.         
  222.         for l= 1, grtV.getn(driver.defaultModules) do
  223.           local moduleName= grtV.toLua(driver.defaultModules[requiredModules[k]])
  224.           if (moduleName ~= nil) and (moduleName ~= "") then
  225.             moduleFound= true
  226.             break
  227.           end
  228.         end
  229.         
  230.         if not(moduleFound) then
  231.           break
  232.         end
  233.       end
  234.       
  235.       if (moduleFound) then
  236.         allRequirementsMet= true
  237.       end
  238.     else
  239.       allRequirementsMet= true
  240.     end
  241.   end
  242.   return allRequirementsMet
  243. end
  244. -- ------------------------------------------------------------------
  245. -- Ask user to select a connection
  246. function Mig:selectDBSystem(title, driverStruct, requiredModules)
  247.   local options
  248.   local form
  249.   local rdbmsList= {}
  250.   
  251.   -- Let the user select the database system
  252.   options= {}
  253.   for i= 1, grtV.getn(self.root.rdbmsMgmt.rdbms) do
  254.     local rdbms= self.root.rdbmsMgmt.rdbms[i]
  255.     local driverCount= 0
  256.     if (driverStruct == nil) and (requiredModules == nil) then
  257.       allRequirementsMet= true
  258.     else
  259.       local j
  260.       for j= 1, grtV.getn(rdbms.drivers) do
  261.         local driver= rdbms.drivers[j]
  262.         
  263.         if self:driverMeetsRequirements(driver, driverStruct, requiredModules) then
  264.           driverCount= driverCount + 1
  265.         end
  266.       end
  267.     end
  268.     
  269.     if driverCount > 0 then
  270.       table.insert(rdbmsList, rdbms)
  271.       table.insert(options, grtV.toLua(rdbms.caption))
  272.     end
  273.   end
  274.   
  275.   form= SimpleForm:new()
  276.   form:init(title, 40)
  277.   form:addLabel(_("Please choose a database system:"), SF_CENTER)
  278.   form:addSpace()
  279.   form:addListbox("lbox", options, 6)
  280.   form:addSpace()
  281.   form:setButtons({}, BACK_NEXT_BUTTONS)
  282.   result= form:run()
  283.   if result == GO_NEXT then
  284.     return {result, rdbmsList[form:getValue("lbox")]}
  285.   else
  286.     return {result, nil}
  287.   end
  288. end
  289. function Mig:selectStoredConnection(title, rdbms)
  290.   local i
  291.   local form
  292.   -- Let the user select a stored connection or to create a new one
  293.   while 1 do
  294.     local clist= {}
  295.     local options= {}
  296.     for i= 1, grtV.getn(self.root.rdbmsMgmt.storedConns) do
  297.       if grtV.toLua(self.root.rdbmsMgmt.storedConns[i].driver.owner._id) ==
  298.       grtV.toLua(rdbms._id) then
  299.         
  300.         local conn= self.root.rdbmsMgmt.storedConns[i]
  301.         table.insert(options, grtV.toLua(conn.name))
  302.         table.insert(clist, i)
  303.       end
  304.     end
  305.     table.insert(options, 1, _("Create new connection"))
  306.     form= SimpleForm:new()
  307.     form:init(title, 60)
  308.     form:addLabel(_("Please choose a connection:"), SF_CENTER)
  309.     form:addSpace()
  310.     form:addListbox("lbox", options, 6)
  311.     form:addSpace()
  312.     form:setButtons({{"DELETE", "Delete Selected"}}, BACK_NEXT_BUTTONS)
  313.     local result= form:run()
  314.     if result == "DELETE" then
  315.       local delIndex= form:getValue("lbox")
  316.       if (delIndex > 1) and (delIndex ~= nil) then
  317.         grtV.remove(self.root.rdbmsMgmt.storedConns, clist[delIndex-1])
  318.       
  319.         RdbmsManagement:storeConns({self.root.rdbmsMgmt.storedConns})
  320.       end
  321.     elseif result == GO_BACK then
  322.       return {GO_BACK,nil}
  323.     elseif result == GO_NEXT then
  324.       local index= form:getValue("lbox")-1
  325.       if index > 0 then
  326.         return {GO_NEXT, self.root.rdbmsMgmt.storedConns[clist[index]]}
  327.       else
  328.         return {GO_NEXT, nil}
  329.       end
  330.     else
  331. return {result, nil}
  332.     end
  333.   end
  334. end
  335. function Mig:confirmConnection(title, conn)
  336.   local i
  337.   local form
  338.   form= SimpleForm:new()
  339.   form:init(title, 40)
  340.   form:addLabel(string.format(_("Selected connection: %s"), grtV.toLua(conn.name)), SF_LEFT)
  341.   form:addSpace()
  342.   for i= 1, grtV.getn(conn.parameterValues) do
  343.     local key= grtV.getKey(conn.parameterValues, i)
  344.     if (key ~= "password") then
  345.       form:addLabel(key .. ": " .. grtV.toLua(conn.parameterValues[key]), SF_LEFT)
  346.     else
  347.       form:addLabel(key .. ": ********", SF_LEFT)
  348.     end
  349.   end
  350.   form:addSpace()
  351.   
  352.   form:addLabel(_("Accept connection?"), SF_LEFT)
  353.   form:setButtons({}, {{GO_NEXT, "Yes"},{GO_BACK, "No"}})
  354.   local result= form:run()
  355.   return {result, nil}
  356. end
  357. function Mig:selectConnection(title, driverStruct, requiredModules)
  358.   local res
  359.   local rdbms
  360.   local conn
  361.   local step
  362.   step= 1
  363.   while 1 do
  364.     if step == 1 then
  365.       res= self:selectDBSystem(title, driverStruct, requiredModules)
  366.       if res[1] == GO_BACK then
  367.         return {GO_BACK, nil}
  368.       elseif res[1] == GO_QUIT then
  369.         return {GO_QUIT, nil}
  370.       else
  371.         step= 2
  372.         rdbms= res[2]
  373.       end
  374.     end  
  375.     if step == 2 then
  376.       res= self:selectStoredConnection(title, rdbms)
  377.       if res[1] == GO_NEXT then
  378.         step= 3
  379.         conn= res[2]
  380.       elseif res[1] == GO_BACK then
  381.         step= 1
  382.       else
  383.         return {GO_QUIT, nil}
  384.       end
  385.     end
  386.     if step == 3 then
  387.       if conn ~= nil then
  388.         -- display selected connection
  389.         res= self:confirmConnection(title, conn)
  390.         if res[1] == GO_NEXT then
  391.           return {GO_NEXT, conn}
  392.         elseif res[1] == GO_QUIT then
  393.           return {GO_QUIT, nil}
  394.         else
  395.           step= 2
  396.         end
  397.       else
  398.         -- create a new connection
  399.         res= Mig:newConnection(title, driverStruct, rdbms)
  400.         if res[1] == GO_BACK then
  401.           step= 2
  402.         elseif res[1] == GO_NEXT then
  403.           return {GO_NEXT, res[2]}
  404.         else
  405.           return {GO_QUIT, nil}  
  406.         end
  407.       end
  408.     end
  409.   end
  410. end
  411. -- ------------------------------------------------------------------
  412. -- Ask user to select a connection
  413. function Mig:selectDriver(title, driverStruct, rdbms)
  414.   local options, form
  415.   local driverList= {}
  416.   -- Choose a driver
  417.   options={}
  418.   for i= 1, grtV.getn(rdbms.drivers) do
  419.     if (driverStruct == nil) or (grtS.get(rdbms.drivers[i]) == driverStruct) then
  420.       table.insert(driverList, rdbms.drivers[i])
  421.       table.insert(options, grtV.toLua(rdbms.drivers[i].caption))
  422.     end
  423.   end
  424.   form= SimpleForm:new()
  425.   form:init(title, 60)
  426.   form:addLabel(string.format(_("New Connection to %s"), grtV.toLua(rdbms.caption)), SF_CENTER)
  427.   form:addLabel(_("Please select a driver to use for the connection:"), SF_CENTER)
  428.   form:addSpace()
  429.   form:addLabel(_("Driver:"), SF_LEFT)
  430.   form:addListbox("driver", options, 5)
  431.   form:addSpace()
  432.     
  433.   form:setButtons({}, BACK_NEXT_BUTTONS)
  434.   local result= form:run()
  435.   if result ~= GO_NEXT then
  436.     return {result, nil}
  437.   else
  438.     return {GO_NEXT, driverList[form:getValue("driver")]}
  439.   end
  440. end
  441. function Mig:newConnectionWithDriver(title, rdbms, driver)
  442.   local result
  443.   local form
  444.   local i
  445.   local options
  446.   local conn= grtV.newObj("db.mgmt.Connection", "newConnection", grt.newGuid(), "")
  447.   conn.driver= driver
  448.   -- Get parameters
  449.   form= SimpleForm:new()
  450.   form:init(title, 60)
  451.     
  452.   form:addLabel(string.format(_("New Connection to %s"), grtV.toLua(rdbms.caption)), SF_CENTER)
  453.   form:addLabel(_("Please enter the connection parameters."), SF_CENTER)
  454.   form:addSpace()
  455.   form:addLabel(_("Driver: ") .. grtV.toLua(driver.caption))
  456.   form:addEntries({{"name", _("Connection Name:"), "", SFT_TEXT}})
  457.   form:addLabel(_("(leave blank to not store)"), SF_RIGHT)
  458.   options= {}
  459.   local y= 8
  460.   for i= 1, grtV.getn(driver.parameters) do
  461.     local param= driver.parameters[i]
  462.     local paramDefault= grtV.toLua(param.defaultValue)
  463.     local paramValue
  464.     local paramLookup= 0
  465.     local suboptions
  466.     local items= {}
  467.     suboptions= {}
  468.     if grtV.toLua(param.lookupValueModule) ~= "" then
  469.       local j
  470.       local lookupList= grtM.callFunction(grtV.toLua(param.lookupValueModule),
  471.         grtV.toLua(param.lookupValueMethod), {conn}, 1)
  472.       if lookupList ~= nil then
  473.         for j= 1, grtV.getn(lookupList) do
  474.           table.insert(suboptions, grtV.toLua(lookupList[j]))
  475.           items:insert(grtV.toLua(lookupList[j]))
  476.           paramLookup=1
  477.         end
  478.       end
  479.     end
  480.     if paramLookup==1 then
  481.       table.insert(options, {grtV.toLua(param.name), grtV.toLua(param.caption), suboptions, SFT_LIST})
  482.     else
  483.       if grtV.toLua(param.name) == "password" then
  484.         table.insert(options, {grtV.toLua(param.name), grtV.toLua(param.caption), "", SFT_PASSWORD})
  485.       elseif grtV.toLua(param.name) == "port" then
  486.         table.insert(options, {grtV.toLua(param.name), grtV.toLua(param.caption), paramDefault, SFT_NUMBER})
  487.       else
  488.         table.insert(options, {grtV.toLua(param.name), grtV.toLua(param.caption), paramDefault, SFT_TEXT})
  489.       end
  490.     end
  491.   end
  492.   form:addEntries(options)
  493.   form:addSpace()
  494.   form:setButtons({}, BACK_NEXT_BUTTONS)
  495.   result= form:run()
  496.   if result == GO_BACK then
  497.     return {GO_BACK, nil}
  498.   elseif result == GO_QUIT then
  499.     return {GO_QUIT, nil}
  500.   else
  501.     for i= 1, grtV.getn(driver.parameters) do
  502.       local param= driver.parameters[i]
  503.       conn.parameterValues[grtV.toLua(param.name)]= form:getValue(grtV.toLua(param.name))
  504.     end
  505.     -- Copy modules
  506.     for i= 1, grtV.getn(driver.defaultModules) do
  507.       local moduleName= grtV.getKey(driver.defaultModules, i)
  508.     
  509.       conn.modules[moduleName]= driver.defaultModules[moduleName]
  510.     end
  511.  
  512.     local connName= form:getValue("name")
  513.     if connName ~= "" then
  514.       conn.name= connName
  515.       grtV.insert(self.root.rdbmsMgmt.storedConns, conn)
  516.       RdbmsManagement:storeConns({self.root.rdbmsMgmt.storedConns})
  517.     end
  518.     return {GO_NEXT, conn}
  519.   end
  520. end
  521. function Mig:newConnection(title, driverStruct, rdbms)
  522.   local result  
  523.   while 1 do
  524.     local count= 0
  525.     local driverIndex= nil
  526.     for i= 1, grtV.getn(rdbms.drivers) do
  527.       if (driverStruct == nil) or (grtS.get(rdbms.drivers[i]) == driverStruct) then
  528.         count= count+1
  529.         driverIndex= i
  530.       end
  531.     end
  532.     if count > 1 then
  533.       result= self:selectDriver(title, driverStruct, rdbms)
  534.       if result[1] == GO_BACK then
  535.         return {GO_BACK, nil}
  536.       else
  537.         result= self:newConnectionWithDriver(title, rdbms, result[2])
  538.         if result[1] == GO_QUIT then
  539.           return {GO_QUIT, nil}
  540.         elseif result[1] == GO_NEXT then
  541.           return result
  542.         end
  543.       end
  544.     else
  545.       result= self:newConnectionWithDriver(title, rdbms, rdbms.drivers[driverIndex])
  546.       return result
  547.     end
  548.   end
  549. end
  550. -- ------------------------------------------------------------------
  551. -- Tests the connection
  552. function Mig:testConnection(conn)
  553.   self:endscr()
  554.   
  555.   self:printTitle(string.format(_("Testing connection to %s ..."), grtV.toLua(conn.driver.owner.caption)))
  556.   local res= grtM.callFunction(grtV.toLua(conn.modules["ReverseEngineeringModule"]), "getVersion", {conn})
  557.   if res == nil then
  558.     print(string.format(_("The connection to the %s database could not be established."), 
  559.       grtV.toLua(conn.driver.owner.caption))
  560.     )
  561.     
  562.     self:printError(_("The following error occured."))
  563.     print(_("Press enter to continue."))
  564.     input("")
  565.     self:initscr()
  566.     
  567.     return 0
  568.   end
  569.   -- store target version for the migration process
  570.   grtV.setGlobal("/migration/targetVersion", res)
  571.   self:initscr()
  572.   
  573.   return 1
  574. end
  575. -- ------------------------------------------------------------------
  576. -- Get list of source schemata
  577. function Mig:getSourceSchemata()
  578.   local schemaList= grtM.callFunction(grtV.toLua(self.sourceConn.modules["ReverseEngineeringModule"]),
  579.     "getSchemata", {self.sourceConn}, 1
  580.   )
  581.   
  582.   if schemaList ~= nil then
  583.     print(_("List of source schemata fetched successfully."))
  584.     print("")
  585.   end
  586.   
  587.   return schemaList
  588. end
  589. -- ------------------------------------------------------------------
  590. -- Let the use choose from the list of source schemata
  591. function Mig:selectSourceSchemata(title)
  592.   local schemaList= grtV.duplicate(self.sourceSchemataNames)
  593.   local form
  594.   local i
  595.   local list
  596.   form= SimpleForm:new()
  597.   form:init(title, 60)
  598.   list= {}
  599.   for i= 1, grtV.getn(schemaList) do
  600.     table.insert(list, {grtV.toLua(schemaList[i]), 0, i})
  601.   end
  602.   form:addLabel(_("Select the schemas to migrate:"), SF_LEFT)
  603.   form:addSpace()
  604.   form:addCheckList("list", list, 10)
  605.   form:addSpace()
  606.   form:setButtons({}, BACK_NEXT_BUTTONS)
  607.   local result= form:run()
  608.   if result ~= GO_NEXT then
  609.     return {result, nil}
  610.   end
  611.   self:endscr()
  612.   local selectedSchemas= form:getValue("list")
  613.   for i= grtV.getn(schemaList), 1, -1 do
  614.     local key
  615.     local value
  616.     local selected= false
  617.     for key, value in selectedSchemas do
  618.       if i == value + 0 then
  619.         selected= true
  620.         break
  621.       end
  622.     end
  623.     
  624.     if not(selected) then
  625.       grtV.remove(schemaList, i)
  626.     end
  627.   end
  628.   return {GO_NEXT, schemaList}
  629. end
  630. -- ------------------------------------------------------------------
  631. -- Let the use choose from the list of source schemata
  632. function Mig:reverseEngineering(title)
  633.   self:printTitle(title, 1)
  634.   self:printTitle(string.format(_("Reverse engineering %s ..."), grtV.toLua(self.sourceConn.driver.owner.caption)))
  635.   
  636.   local catalog= grtM.callFunction(grtV.toLua(self.sourceConn.modules.ReverseEngineeringModule),
  637.     "reverseEngineer", {self.sourceConn, self.selectedSchemataNames}
  638.   )
  639.   if catalog ~= nil then
  640.     print("")
  641.     print(_("Reverse engineering completed successfully."))
  642.     print("")
  643.   else
  644.     print("")
  645.     self:printError(_("The following error occured during reverse engineering."))
  646.   end
  647.   return catalog
  648. end
  649. -- ------------------------------------------------------------------
  650. -- Get the available migration methods
  651. function Mig:getMigrationMethods(title)
  652.   self:printTitle(title, 1)
  653.   self:printTitle(_("Fetching available migration methods ..."))
  654.   
  655.   local methods= grtM.callFunction(grtV.toLua(self.sourceConn.modules.MigrationModule),
  656.     "migrationMethods", nil
  657.   )
  658.   
  659.   if methods == nil then
  660.     print("")
  661.     print(_("Could not fetch migration methods."))
  662.     print("")
  663.   else
  664.     -- build source object list
  665.     self.sourceObjects= {}
  666.     self.objTypes= {}
  667.     
  668.     local schemaList= grtV.getGlobal("/migration/sourceCatalog/schemata")
  669.     -- loop over all source schemata
  670.     local i
  671.     for i=1, grtV.getn(schemaList) do
  672.       local schema= grtV.getGlobal("/migration/sourceCatalog/schemata/" .. i - 1)
  673.       table.insert(self.objTypes, grtS.get(schema))
  674.       
  675.       local schemaStructMembers= grtS.getMembers(grtS.get(schema))
  676.       
  677.       local j      
  678.       for j= 1, table.getn(schemaStructMembers) do
  679.         if grtS.getMemberType(grtS.get(schema), schemaStructMembers[j]) == "list" then
  680.           local memberContentStruct= grtS.getMemberContentStruct(grtS.get(schema), schemaStructMembers[j])
  681.         
  682.           -- only take objects from lists, that hold db.DatabaseObject dicts
  683.           if (memberContentStruct ~= nil) and 
  684.             (grtS.inheritsFrom(memberContentStruct, "db.DatabaseObject")) then
  685.           
  686.             local k
  687.             for k= 1, grtV.getn(schema[schemaStructMembers[j]]) do
  688.               table.insert(self.sourceObjects, schema[schemaStructMembers[j]][k])
  689.             
  690.               if k == 1 then
  691.                 table.insert(self.objTypes, grtS.get(schema[schemaStructMembers[j]][k]))
  692.               end
  693.             end
  694.           end
  695.         end
  696.       end
  697.     end
  698.     
  699.     -- add default mappings for all objTypes
  700.     local defaultMappings= grtV.getGlobal("/migration/mappingDefaults")
  701.     for i= 1, table.getn(self.objTypes) do
  702.       local j
  703.       local bestMethod= nil
  704.       local bestMethodRating= -1
  705.       
  706.       for j=1, grtV.getn(methods) do
  707.         local sourceStructName= grtV.toLua(methods[j].sourceStructName)
  708.         local targetPackageName= grtV.toLua(methods[j].targetPackageName)
  709.         local methodRating= tonumber(grtV.toLua(methods[j].rating))
  710.                 
  711.         if (grtS.inheritsFrom(self.objTypes[i], sourceStructName) or 
  712.             (self.objTypes[i] == sourceStructName)) and 
  713.           (grtV.toLua(self.targetConn.driver.owner.databaseObjectPackage) == targetPackageName) and
  714.           (bestMethodRating < methodRating) then
  715.           bestMethod= methods[j]
  716.           bestMethodRating= methodRating
  717.         end
  718.       end
  719.       
  720.       if bestMethod ~= nil then
  721.         -- create mapping entry
  722.         local mapping= grtV.newObj("db.migration.Mapping", 
  723.           "DefaultMapping" .. grtV.toLua(bestMethod.sourceStructName), grt.newGuid(), ""
  724.         )
  725.         
  726.         mapping.sourceStructName= sourceStructName
  727.         mapping.method= bestMethod
  728.         mapping.methodName= bestMethod.name
  729.         mapping.moduleName= moduleName
  730.         mapping.params= bestMethod.paramGroups[1]
  731.         
  732.         grtV.insert(defaultMappings, mapping)
  733.       end
  734.     end
  735.   end
  736.   
  737.   return methods
  738. end
  739. -- ------------------------------------------------------------------
  740. -- Setting up ignore list
  741. function Mig:addIgnoreListItem(title, ignoreList)
  742.   local form= SimpleForm:new()
  743.   local items= {}
  744.   
  745.   form:init(title, 50)
  746.   form:addLabel(_("Select objects to ignore:"), SF_LEFT)
  747.   -- ignore schema
  748.   local i
  749.   local objs= {}
  750.   local objType
  751.   -- ignore schema
  752.   for objType=2,table.getn(self.objTypes) do
  753.     local subitems= {}
  754.     for i= 1, grtV.getn(self.sourceObjects) do
  755.       if grtS.get(self.sourceObjects[i]) == self.objTypes[objType] then
  756.         local onIgnoreList= false
  757.         local j
  758.         objIgnoreStr= self.objTypes[objType] .. ":" .. grtV.toLua(self.sourceObjects[i].name)
  759.         -- check if obj is already on the ignore list
  760.         for j= 1, grtV.getn(ignoreList) do            
  761.           if grtV.toLua(Base:patternMatch({objIgnoreStr, grtV.toLua(ignoreList[j]), 1})) == 1 then
  762.             onIgnoreList= true
  763.             break
  764.           end
  765.         end
  766.         
  767.         -- if not, list it
  768.         if not(onIgnoreList) then
  769.           table.insert(objs, self.sourceObjects[i])
  770.           table.insert(subitems, {grtV.toLua(self.sourceObjects[i].name), objIgnoreStr})
  771.         end
  772.       end
  773.     end
  774.     table.insert(items, {self.objTypes[objType], subitems})
  775.   end
  776.   form:addCheckTree("ignore", items, 15)
  777.   form:addSpace()
  778.   form:setButtons({}, {{"CANCEL", "Cancel"},{"OK","OK"}})
  779.   
  780.   local result= form:run()
  781.   if result == "OK" then
  782.     local obj
  783.     items= form:getValue("ignore")
  784.     for i,obj in items do
  785.       grtV.insert(ignoreList, obj)
  786.     end
  787.   end
  788.   return ignoreList
  789. end
  790. function Mig:selectIgnoreList(title, ignoreList)
  791.   local form
  792.   
  793.   if ignoreList == nil then
  794.     ignoreList= grtV.newList("string")
  795.   end
  796.   form= SimpleForm:new()
  797.   form:init(title, 60)
  798.   form:addLabel(_("Your current ignore list:"), SF_LEFT)
  799.   
  800.   local i
  801.   local j
  802.   local totalCount= 0
  803.   local itemList= {}
  804.   
  805.   for j= 1, table.getn(self.objTypes) do    
  806.     local count= 0
  807.     
  808.     if not(grtS.inheritsFrom(self.objTypes[j], "db.Schema")) then
  809.       local items= {}
  810.       table.insert(itemList, {grtS.getCaption(self.objTypes[j]), items})
  811.       
  812.       for i= 1, grtV.getn(ignoreList) do
  813.         if string.sub(grtV.toLua(ignoreList[i]), 1, string.len(self.objTypes[j])) == self.objTypes[j] then
  814.           count= count + 1          
  815.           totalCount= totalCount + 1
  816.           table.insert(items, {string.sub(grtV.toLua(ignoreList[i]), string.len(self.objTypes[j]) + 2), grtV.toLua(ignoreList[i])})
  817.         end
  818.       end
  819.       if table.getn(items) == 0 then
  820.         table.insert(items, {"None", ""})
  821.       end
  822.     end
  823.   end
  824.   form:addCheckTree("list", itemList, 10)
  825.   form:addLabel(_("Objects in the ignore list will not be migrated."), SF_LEFT)
  826.   form:addLabel(_("Select objects and press Delete to remove from ignore list."), SF_LEFT)
  827.   form:addSpace()
  828.   form:setButtons({{"ADD","Add New"},{"DEL","Delete"}}, BACK_NEXT_BUTTONS)
  829.   local result= form:run(true)
  830.   if result == GO_NEXT then
  831.     form:pop()
  832.     return {GO_NEXT, ignoreList}
  833.   elseif result == GO_BACK then
  834.     form:pop()
  835.     return {GO_BACK, nil}   
  836.   elseif result == GO_QUIT then
  837.     form:pop()
  838.     return {GO_QUIT, nil}
  839.   elseif result == "ADD" then
  840.     ignoreList= self:addIgnoreListItem(title, ignoreList)
  841.     form:pop()
  842.     return self:selectIgnoreList(title, ignoreList)
  843.   elseif result == "DEL" then
  844.     local obj, item
  845.     items= form:getValue("list")
  846.     for i= grtV.getn(ignoreList),1,-1 do
  847.       for j,item in items do
  848.         if item == grtV.toLua(ignoreList[i]) then
  849.           grtV.remove(ignoreList, i)
  850.           break
  851.         end
  852.       end
  853.     end
  854.     return self:selectIgnoreList(title, ignoreList)
  855.   end
  856. end
  857. -- ------------------------------------------------------------------
  858. -- Perform migration
  859. function Mig:doMigration()
  860.   print("")
  861.   
  862.   grtM.callFunction(
  863.     grtV.toLua(self.sourceConn.modules.MigrationModule), "migrate", 
  864.     {"global::/migration", "global::/rdbmsMgmt/rdbms/" .. grtV.toLua(self.targetConn.driver.owner.name), "global::/migration/targetVersion"}
  865.   )
  866.   if grtError == nil then
  867.     print(_("Migration completed successfully."))
  868.     
  869.     return true
  870.   else
  871.     self:printError(_("The following error occured during migration."))
  872.     
  873.     return false
  874.   end
  875. end
  876. -- ------------------------------------------------------------------
  877. -- Generate SQL
  878. function Mig:generateObjects(title)
  879.   local form= SimpleForm:new()
  880.   form:init(title, 40)
  881.   form:addLabel("Select actions to perform:", SF_LEFT)
  882.   form:addSpace()
  883.   form:addCheck("online", _("Create objects online"))
  884.   form:addCheck("script", _("Write a script file"))
  885.   form:addSpace()
  886.   form:setButtons({}, {{GO_NEXT, _("OK")}, {GO_QUIT, _("Abort")}})
  887.   local result= form:run()
  888.   
  889.   if (result == GO_QUIT) then
  890.     return false
  891.   else
  892.     self:endscr()
  893.       
  894.     if form:getValue("script")==1 then      
  895.       grtM.callFunction(
  896.         grtV.toLua(self.targetConn.modules.TransformationModule), "generateSqlCreateStatements", 
  897.         {"global::/migration/targetCatalog", "global::/migration/objectCreationParams"}
  898.       )
  899.       self:printError(_("The SQL create statements cannot be created."))
  900.     
  901.       -- write sql create script to file
  902.       print("Write create script.")
  903.       
  904.       local script= grtM.callFunction(
  905.         grtV.toLua(self.targetConn.modules.TransformationModule), "getSqlScript", 
  906.         {"global::/migration/targetCatalog", "global::/migration/objectCreationParams"}
  907.       )
  908.       self:printError(_("The SQL create script cannot be created."))
  909.       local f= io.open("creates.sql", "w+")
  910.       if f ~= nil then
  911.         f:write(grtV.toLua(script))
  912.         
  913.         f:flush()
  914.         f:close()
  915.       end
  916.     end
  917.     
  918.     if form:getValue("online")==1 then
  919.       -- create database objects online
  920.       print("Create database objects.")
  921.       
  922.       grtM.callFunction(
  923.         grtV.toLua(self.targetConn.modules.TransformationModule), "executeSqlStatements", 
  924.         {self.targetConn, "global::/migration/targetCatalog", "global::/migration/creationLog"}
  925.       )
  926.       self:printError(_("The SQL create script cannot be executed."))
  927.     end
  928.     print("Press <Enter> to continue.")
  929.     input("")
  930.     self:initscr()
  931.   end
  932.   
  933.   return (grtError == nil)
  934. end
  935. -- ------------------------------------------------------------------
  936. -- Generate SQL
  937. function Mig:bulkDataTransfer(title)
  938.   local form= SimpleForm:new()
  939.   form:init(title, 40)
  940.   form:addLabel(_("Write a SQL insert script?"))
  941.   form:addSpace()
  942.   form:setButtons({}, {{"yes","Yes"},{"no","No"}})
  943.   local result= form:run()
  944.   -- set transfer parameters
  945.   grtV.setGlobal("/migration/dataBulkTransferParams", {
  946.       CreateScript= result,
  947.       TransferData= "no",
  948.       ScriptFileName="inserts.sql"
  949.     }
  950.   )
  951.   grtV.setContentType(grtV.getGlobal("/migration/dataBulkTransferParams"), "string")
  952.   self:endscr()
  953.   self:printTitle("Execute bulk data transfer")
  954.   
  955.   grtM.callFunction(
  956.     grtV.toLua(self.sourceConn.modules.MigrationModule), "dataBulkTransfer", 
  957.     {self.sourceConn, "global::/migration/sourceCatalog", 
  958.       self.targetConn, "global::/migration/targetCatalog", 
  959.       "global::/migration/dataBulkTransferParams",
  960.       "global::/migration/dataTransferLog"
  961.     }
  962.   )
  963.   self:printError(_("The bulk data transfer returned an error."))
  964.   
  965.   return true
  966. end
  967. function Mig:initscr()
  968.   dlg.init()
  969.   dlg.drawRootText(0, 0, "MySQL Migration Toolkit - Script Version " .. self.version)
  970.   dlg.pushHelpLine(_(" <tab> - switch between elements  |  <space> - select  |  <return> - activate"))
  971. end
  972. function Mig:endscr()
  973.   dlg.finish()
  974. end
  975. -- ------------------------------------------------------------------
  976. -- ------------------------------------------------------------------
  977. -- Start the Migration script
  978. Mig:run()
  979. Mig:endscr()