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

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 RdbmsInfoMysql.lua
  20. -- @brief Module that contains functionality for database management
  21. -- ----------------------------------------------------------------------------------------
  22. -- ----------------------------------------------------------------------------------------
  23. -- @brief Returns the information about this module
  24. --
  25. --   Every Grt module has to implement this function to return information about the 
  26. -- module. Note that new functions that should be exposed to the Grt have to be listed 
  27. -- here. Function that are not exposed should start with a underscore.
  28. --
  29. -- @return A dict that contains the name and the function names of the module
  30. -- ----------------------------------------------------------------------------------------
  31. function getModuleInfo()
  32.   local moduleInfo= {
  33.     name= "RdbmsInfoMysql", 
  34.     functions= {
  35.       "getRdbmsInfo::",
  36.       "getSimpleDatatypes::",
  37.       "getCharacterSets::"
  38.     }, 
  39.     extends= "RdbmsInfo"
  40.   }
  41.   return moduleInfo
  42. end
  43. -- ----------------------------------------------------------------------------------------
  44. -- @brief Function to get information about MySQL
  45. --
  46. --   Creates a db.mgmt.Rdbms structed GRT value and adds all simple datatypes and 
  47. -- drivers
  48. -- 
  49. -- @param owner a GRT object
  50. --
  51. -- @return a new created GRT value of struct "db.mgmt.Rdbms" containing the drivers infos
  52. -- ----------------------------------------------------------------------------------------
  53. function getRdbmsInfo(args)
  54.   local rdbmsMgmt= args[1]
  55.   -- create Rdbms object
  56.   local rdbms= grtV.newObj("db.mgmt.Rdbms", "Mysql", "{6D75781B-52CF-4252-9B3D-9F28B75C09F7}", grtV.toLua(rdbmsMgmt._id))
  57.   rdbms.caption= "MySQL Server"
  58.   rdbms.databaseObjectPackage= "db.mysql"
  59.   -- create simple datatypes for Rdbms
  60.   createSimpleDatatypes(rdbms.simpleDatatypes, rdbmsMgmt)
  61.   
  62.   -- create character sets for Rdbms
  63.   createCharacterSets(rdbms.characterSets, rdbmsMgmt)
  64.   -- add driver to the Rdbms' list of drivers
  65.   grtV.insert(rdbms.drivers, getDriverMysqlNative(rdbms))
  66.   grtV.insert(rdbms.drivers, getDriverMysqlJdbc(rdbms))
  67.   grtV.insert(rdbms.drivers, getDriverMysqlEmbedded(rdbms))
  68.   rdbms.defaultDriver= rdbms.drivers[1]
  69.   
  70.   return grt.success(rdbms)
  71. end
  72. -- ----------------------------------------------------------------------------------------
  73. -- @brief Adds all simple datatypes to a list
  74. --
  75. --   A function that adds all datatypes to the given list
  76. --
  77. -- @param datatypeList a GRT list that will hold all the datatypes
  78. -- @param owner a GRT object
  79. -- ----------------------------------------------------------------------------------------
  80. function getSimpleDatatypes(args)
  81.   if grtV.getn(args) == 2 then
  82.     createSimpleDatatypes(args[1], args[2])
  83.   else
  84.     createSimpleDatatypes(args[1], nil)
  85.   end
  86.   
  87.   return grt.success()
  88. end
  89. -- ----------------------------------------------------------------------------------------
  90. -- @brief Adds all character sets to a list
  91. --
  92. --   A function that adds all character sets to the given list
  93. --
  94. -- @param characterSetList a GRT list that will hold all the character sets
  95. -- @param owner a GRT object
  96. -- ----------------------------------------------------------------------------------------
  97. function getCharacterSets(args)
  98.   if grtV.getn(args) == 2 then
  99.     createCharacterSets(args[1], args[2])
  100.   else
  101.     createCharacterSets(args[1], nil)
  102.   end
  103.   
  104.   return grt.success()
  105. end
  106. -- ----------------------------------------------------------------------------------------
  107. -- @brief Builds the list of simple datatypes
  108. --
  109. --   Helper function to build the list of simple datatypes
  110. -- 
  111. -- @param datatypeList the list that will hold the datatypes
  112. -- @param owner the owner, if any
  113. -- ----------------------------------------------------------------------------------------
  114. function createSimpleDatatypes(datatypeList, owner)
  115.   local dt
  116.   local group
  117.   local owner_id
  118.   
  119.   if owner ~= nil then
  120.     owner_id= grtV.toLua(owner._id)
  121.   else
  122.     -- if the function is called without and rdbmsMgmt then assign all simpleDatatypes to the group userdefined
  123.     owner_id= ""
  124.     
  125.     -- Userdefined group
  126.     group= grtV.newObj("db.DatatypeGroup", "userdefined", "{3D44C889-03BA-4783-A02D-ACDF4943257E}", "")
  127.     group.caption= "Userdefined Types"
  128.     group.description= "Datatypes defined by a user"
  129.   end
  130.   -- --------------------------------------------------------------------------------------
  131.   -- numeric group
  132.   do
  133.     if owner ~= nil then
  134.       group= __RdbmsManagement_lua.getDatatypeGroupByNameLua(owner, "numeric")
  135.     end
  136.   
  137.     -- TINYINT
  138.     dt= grtV.newObj("db.SimpleDatatype", "TINYINT", "{3C75C19F-FCA4-44DE-8881-F477FEA32E62}", owner_id)
  139.     dt.group= group
  140.     dt.numericPrecision= 3
  141.     grtV.insert(dt.flags, "UNSIGNED")
  142.     grtV.insert(dt.flags, "ZEROFILL")
  143.     grtV.insert(datatypeList, dt)
  144.   
  145.     -- SMALLINT
  146.     dt= grtV.newObj("db.SimpleDatatype", "SMALLINT", "{B98335A2-603F-4042-9D59-88248D987309}", owner_id)
  147.     dt.group= group
  148.     dt.numericPrecision= 5
  149.     grtV.insert(dt.flags, "UNSIGNED")
  150.     grtV.insert(dt.flags, "ZEROFILL")
  151.     grtV.insert(datatypeList, dt)
  152.   
  153.     -- MEDIUMINT
  154.     dt= grtV.newObj("db.SimpleDatatype", "MEDIUMINT", "{A5A2A320-DAAD-416E-862C-FAA9AD90DF8C}", owner_id)
  155.     dt.group= group
  156.     grtV.insert(dt.flags, "UNSIGNED")
  157.     grtV.insert(dt.flags, "ZEROFILL")
  158.     dt.numericPrecision= 8
  159.     grtV.insert(datatypeList, dt)
  160.   
  161.     -- INT
  162.     dt= grtV.newObj("db.SimpleDatatype", "INT", "{014AB6FC-CA8A-4FA2-8BD9-E97D7F8D53AE}", owner_id)
  163.     dt.group= group
  164.     dt.numericPrecision= 10
  165.     grtV.insert(dt.synonyms, "INTEGER")
  166.     grtV.insert(dt.flags, "UNSIGNED")
  167.     grtV.insert(dt.flags, "ZEROFILL")
  168.     grtV.insert(datatypeList, dt)
  169.   
  170.     -- BIGINT
  171.     dt= grtV.newObj("db.SimpleDatatype", "BIGINT", "{B96B522A-48FE-431F-A0B4-D5E1B733FE3F}", owner_id)
  172.     dt.group= group
  173.     dt.numericPrecision= 20
  174.     grtV.insert(dt.flags, "UNSIGNED")
  175.     grtV.insert(dt.flags, "ZEROFILL")
  176.     grtV.insert(datatypeList, dt)
  177.   
  178.     -- FLOAT
  179.     dt= grtV.newObj("db.SimpleDatatype", "FLOAT", "{BEA67203-20CC-4A53-A4EC-B2F31E84DE1E}", owner_id)
  180.     dt.group= group
  181.     grtV.insert(dt.flags, "UNSIGNED")
  182.     grtV.insert(dt.flags, "ZEROFILL")
  183.     grtV.insert(datatypeList, dt)
  184.   
  185.     -- DOUBLE
  186.     dt= grtV.newObj("db.SimpleDatatype", "DOUBLE", "{3873BD96-9C60-4BB0-90B4-45F4C76485D9}", owner_id)
  187.     dt.group= group
  188.     grtV.insert(dt.flags, "UNSIGNED")
  189.     grtV.insert(dt.flags, "ZEROFILL")
  190.     grtV.insert(datatypeList, dt)
  191.   
  192.     -- DECIMAL
  193.     dt= grtV.newObj("db.SimpleDatatype", "DECIMAL", "{8CB74E5F-921A-4F6E-95C6-3AD94F2BB36F}", owner_id)
  194.     dt.group= group
  195.     dt.numericPrecision= 64
  196.     dt.numericScale= 30
  197.     grtV.insert(dt.flags, "UNSIGNED")
  198.     grtV.insert(dt.flags, "ZEROFILL")
  199.     grtV.insert(datatypeList, dt)
  200.   end
  201.   -- --------------------------------------------------------------------------------------
  202.   -- string group
  203.   do
  204.     if owner ~= nil then
  205.       group= __RdbmsManagement_lua.getDatatypeGroupByNameLua(owner, "string")
  206.     end
  207.   
  208.     -- CHAR
  209.     dt= grtV.newObj("db.SimpleDatatype", "CHAR", "{4B160881-85B7-4C25-BBD1-36C9CA1A0E80}", owner_id)
  210.     dt.group= group
  211.     dt.characterMaximumLength= 255
  212.     grtV.insert(dt.flags, "BINARY")
  213.     grtV.insert(dt.flags, "UNICODE")
  214.     grtV.insert(dt.flags, "ASCII")
  215.     grtV.insert(datatypeList, dt)
  216.   
  217.     -- VARCHAR
  218.     dt= grtV.newObj("db.SimpleDatatype", "VARCHAR", "{7198A7BD-968D-4BD9-B85C-4DE7504F0D83}", owner_id)
  219.     dt.group= group
  220.     dt.characterMaximumLength= 65535
  221.     grtV.insert(dt.flags, "BINARY")
  222.     grtV.insert(datatypeList, dt)
  223.   
  224.     -- BINARY
  225.     dt= grtV.newObj("db.SimpleDatatype", "BINARY", "{4159AB8E-78E7-41E7-AAFD-0DE3766C2935}", owner_id)
  226.     dt.group= group
  227.     dt.characterOctetLength= 255
  228.     grtV.insert(datatypeList, dt)
  229.   
  230.     -- VARBINARY
  231.     dt= grtV.newObj("db.SimpleDatatype", "VARBINARY", "{CD41C6AA-4BAC-42E8-A4FC-655CAE3534D0}", owner_id)
  232.     dt.group= group
  233.     dt.characterOctetLength= 65535
  234.     grtV.insert(datatypeList, dt)
  235.   end
  236.   -- --------------------------------------------------------------------------------------
  237.   -- text group
  238.   do
  239.     if owner ~= nil then
  240.       group= __RdbmsManagement_lua.getDatatypeGroupByNameLua(owner, "text")
  241.     end
  242.   
  243.     -- TINYTEXT
  244.     dt= grtV.newObj("db.SimpleDatatype", "TINYTEXT", "{B965148B-8E5B-46E9-999C-252D92B37B2C}", owner_id)
  245.     dt.group= group
  246.     dt.characterMaximumLength= 255
  247.     grtV.insert(dt.flags, "BINARY")
  248.     grtV.insert(datatypeList, dt)
  249.   
  250.     -- TEXT
  251.     dt= grtV.newObj("db.SimpleDatatype", "TEXT", "{52734DB8-D81D-4593-A74C-891967DFAC63}", owner_id)
  252.     dt.group= group
  253.     dt.characterMaximumLength= 65535
  254.     grtV.insert(dt.flags, "BINARY")
  255.     grtV.insert(datatypeList, dt)
  256.   
  257.     -- MEDIUMTEXT
  258.     dt= grtV.newObj("db.SimpleDatatype", "MEDIUMTEXT", "{7874D9C1-0F91-487C-822C-3ABC407452BE}", owner_id)
  259.     dt.group= group
  260.     dt.characterMaximumLength= -24
  261.     grtV.insert(dt.flags, "BINARY")
  262.     grtV.insert(datatypeList, dt)
  263.   
  264.     -- LONGTEXT
  265.     dt= grtV.newObj("db.SimpleDatatype", "LONGTEXT", "{BFDB5048-852A-4985-8772-5123FB7C23FE}", owner_id)
  266.     dt.group= group
  267.     dt.characterMaximumLength= -32
  268.     grtV.insert(dt.flags, "BINARY")
  269.     grtV.insert(datatypeList, dt)
  270.   end
  271.   -- --------------------------------------------------------------------------------------
  272.   -- blob group
  273.   do
  274.     if owner ~= nil then
  275.       group= __RdbmsManagement_lua.getDatatypeGroupByNameLua(owner, "blob")
  276.     end
  277.   
  278.     -- TINYBLOB
  279.     dt= grtV.newObj("db.SimpleDatatype", "TINYBLOB", "{D2A508F3-9636-400D-816E-68E0A172204C}", owner_id)
  280.     dt.group= group
  281.     dt.characterOctetLength= 255
  282.     grtV.insert(datatypeList, dt)
  283.   
  284.     -- BLOB
  285.     dt= grtV.newObj("db.SimpleDatatype", "BLOB", "{6A28850F-C54C-4722-80A0-6187798B35C0}", owner_id)
  286.     dt.group= group
  287.     dt.characterOctetLength= 65535
  288.     grtV.insert(datatypeList, dt)
  289.   
  290.     -- MEDIUMBLOB
  291.     dt= grtV.newObj("db.SimpleDatatype", "MEDIUMBLOB", "{EBCCD9D0-1497-4EEE-97FC-0C96DB3D2EBE}", owner_id)
  292.     dt.group= group
  293.     dt.characterOctetLength= -24
  294.     grtV.insert(datatypeList, dt)
  295.   
  296.     -- LONGBLOB
  297.     dt= grtV.newObj("db.SimpleDatatype", "LONGBLOB", "{6C2E3841-EA8D-48E1-A727-B0B2E71857BF}", owner_id)
  298.     dt.group= group
  299.     dt.characterOctetLength= -32
  300.     grtV.insert(datatypeList, dt)
  301.   end
  302.   -- --------------------------------------------------------------------------------------
  303.   -- datetime group
  304.   do
  305.     if owner ~= nil then
  306.       group= __RdbmsManagement_lua.getDatatypeGroupByNameLua(owner, "datetime")
  307.     end
  308.   
  309.     -- DATETIME
  310.     dt= grtV.newObj("db.SimpleDatatype", "DATETIME", "{9A2399C8-F3EA-4B6C-AAB1-830D3BFF164B}", owner_id)
  311.     dt.group= group
  312.     dt.dateTimePrecision= 8
  313.     grtV.insert(datatypeList, dt)
  314.   
  315.     -- DATE
  316.     dt= grtV.newObj("db.SimpleDatatype", "DATE", "{E3ACD2FE-A26F-4BB8-ADA6-433F92B0570D}", owner_id)
  317.     dt.group= group
  318.     dt.dateTimePrecision= 3
  319.     grtV.insert(datatypeList, dt)
  320.   
  321.     -- TIME
  322.     dt= grtV.newObj("db.SimpleDatatype", "TIME", "{65642303-376E-4C4A-B200-7E0DFAA47344}", owner_id)
  323.     dt.group= group
  324.     dt.dateTimePrecision= 3
  325.     grtV.insert(datatypeList, dt)
  326.   
  327.     -- YEAR
  328.     dt= grtV.newObj("db.SimpleDatatype", "YEAR", "{868AC4F9-F4BB-44AD-8512-4EBAD5E5D661}", owner_id)
  329.     dt.group= group
  330.     dt.dateTimePrecision= 1
  331.     grtV.insert(datatypeList, dt)
  332.   
  333.     -- TIMESTAMP
  334.     dt= grtV.newObj("db.SimpleDatatype", "TIMESTAMP", "{D8A1FD40-794F-464E-8E4A-E14C38D9C924}", owner_id)
  335.     dt.group= group
  336.     dt.dateTimePrecision= 4
  337.     grtV.insert(datatypeList, dt)
  338.   end
  339.   -- --------------------------------------------------------------------------------------
  340.   -- gis group
  341.   do
  342.     if owner ~= nil then
  343.       group= __RdbmsManagement_lua.getDatatypeGroupByNameLua(owner, "gis")
  344.     end
  345.   
  346.     -- GEOMETRY
  347.     dt= grtV.newObj("db.SimpleDatatype", "GEOMETRY", "{DC0345B1-52D4-497C-AFA1-17A00BCAA7FE}", owner_id)
  348.     dt.group= group
  349.     grtV.insert(datatypeList, dt)
  350.   
  351.     -- LINESTRING
  352.     dt= grtV.newObj("db.SimpleDatatype", "LINESTRING", "{739D4BC4-0188-46BB-84AB-DB97CE01B67F}", owner_id)
  353.     dt.group= group
  354.     grtV.insert(datatypeList, dt)
  355.   
  356.     -- POLYGON
  357.     dt= grtV.newObj("db.SimpleDatatype", "POLYGON", "{50C760E2-97A4-4BB0-ABA5-E0A2D11E683D}", owner_id)
  358.     dt.group= group
  359.     grtV.insert(datatypeList, dt)
  360.   
  361.     -- MULTIPOINT
  362.     dt= grtV.newObj("db.SimpleDatatype", "MULTIPOINT", "{86A060EB-F367-4890-8FFA-00840F281791}", owner_id)
  363.     dt.group= group
  364.     grtV.insert(datatypeList, dt)
  365.   
  366.     -- MULTILINESTRING
  367.     dt= grtV.newObj("db.SimpleDatatype", "MULTILINESTRING", "{04006513-2EA3-4785-A541-8C25E68E5E0A}", owner_id)
  368.     dt.group= group
  369.     grtV.insert(datatypeList, dt)
  370.   
  371.     -- MULTIPOLYGON
  372.     dt= grtV.newObj("db.SimpleDatatype", "MULTIPOLYGON", "{1D1FE4C9-6A0B-423C-A048-8830C430A93E}", owner_id)
  373.     dt.group= group
  374.     grtV.insert(datatypeList, dt)
  375.   
  376.     -- GEOMETRYCOLLECTION
  377.     dt= grtV.newObj("db.SimpleDatatype", "GEOMETRYCOLLECTION", "{E1609E12-9B2A-4EF7-9265-00D6D3BE0026}", owner_id)
  378.     dt.group= group
  379.     grtV.insert(datatypeList, dt)
  380.   end
  381.   -- --------------------------------------------------------------------------------------
  382.   -- various group
  383.   do
  384.     if owner ~= nil then
  385.       group= __RdbmsManagement_lua.getDatatypeGroupByNameLua(owner, "various")
  386.     end
  387.   
  388.     -- BIT
  389.     dt= grtV.newObj("db.SimpleDatatype", "BIT", "{855F4FED-94F7-4E28-812C-6882B28571AF}", owner_id)
  390.     dt.group= group
  391.     dt.numericPrecision= 2
  392.     grtV.insert(datatypeList, dt)
  393.   
  394.     -- BOOLEAN
  395.     dt= grtV.newObj("db.SimpleDatatype", "BOOLEAN", "{F496575F-5F75-4825-A059-7DFC75DB3DFD}", owner_id)
  396.     dt.group= group
  397.     dt.numericPrecision= 1
  398.     grtV.insert(datatypeList, dt)
  399.   
  400.     -- ENUM
  401.     dt= grtV.newObj("db.SimpleDatatype", "ENUM", "{D442887A-6402-4873-ADC5-6F875085C0A6}", owner_id)
  402.     dt.group= group
  403.     grtV.insert(datatypeList, dt)
  404.   
  405.     -- SET
  406.     dt= grtV.newObj("db.SimpleDatatype", "SET", "{D8F350D8-9522-478F-9233-28C52E26A067}", owner_id)
  407.     dt.group= group
  408.     grtV.insert(datatypeList, dt)
  409.   end
  410.   
  411. end
  412. -- ----------------------------------------------------------------------------------------
  413. -- @brief Builds the list of character sets
  414. --
  415. --   Helper function to build the list of character sets
  416. -- 
  417. -- @param list the list that will hold the character sets
  418. -- @param owner the owner, if any
  419. -- ----------------------------------------------------------------------------------------
  420. function createCharacterSets(list, owner)
  421.   local characterSetsXml
  422.   local characterSets
  423.   local i
  424.   
  425.   -- this XML string is generated from the value returned by 
  426.   -- ReverseEngineeringMysql:getCharacterSets()
  427.   do
  428.     characterSetsXml= [[<?xml version="1.0"?> <data>   <value type="list" content-type="dict" content-struct-name="db.CharacterSet">     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{43903B6E-F2D0-4529-9B67-E0717BF4EF9F}</value>       <value type="list" content-type="string" key="collations">         <value type="string">big5_chinese_ci</value>         <value type="string">big5_bin</value>       </value>       <value type="string" key="defaultCollation">big5_chinese_ci</value>       <value type="string" key="description">Big5 Traditional Chinese</value>       <value type="string" key="name">big5</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{3AC6FA9A-82A4-4F7A-98B9-1F12CFB202BF}</value>       <value type="list" content-type="string" key="collations">         <value type="string">dec8_swedish_ci</value>         <value type="string">dec8_bin</value>       </value>       <value type="string" key="defaultCollation">dec8_swedish_ci</value>       <value type="string" key="description">DEC West European</value>       <value type="string" key="name">dec8</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{9D4131DD-68A4-40BC-9D3F-82B4F7FA17B1}</value>       <value type="list" content-type="string" key="collations">         <value type="string">cp850_general_ci</value>         <value type="string">cp850_bin</value>       </value>       <value type="string" key="defaultCollation">cp850_general_ci</value>       <value type="string" key="description">DOS West European</value>       <value type="string" key="name">cp850</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{6ABFE754-D874-49FF-AC49-386F49B841AC}</value>       <value type="list" content-type="string" key="collations">         <value type="string">hp8_english_ci</value>         <value type="string">hp8_bin</value>       </value>       <value type="string" key="defaultCollation">hp8_english_ci</value>       <value type="string" key="description">HP West European</value>       <value type="string" key="name">hp8</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{E2E563B6-7240-4D2B-A665-CE22EBD29E9F}</value>       <value type="list" content-type="string" key="collations">         <value type="string">koi8r_general_ci</value>         <value type="string">koi8r_bin</value>       </value>       <value type="string" key="defaultCollation">koi8r_general_ci</value>       <value type="string" key="description">KOI8-R Relcom Russian</value>       <value type="string" key="name">koi8r</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{AEFED982-F313-40D4-ABA9-11583190507F}</value>       <value type="list" content-type="string" key="collations">         <value type="string">latin1_german1_ci</value>         <value type="string">latin1_swedish_ci</value>         <value type="string">latin1_danish_ci</value>         <value type="string">latin1_german2_ci</value>         <value type="string">latin1_bin</value>         <value type="string">latin1_general_ci</value>         <value type="string">latin1_general_cs</value>         <value type="string">latin1_spanish_ci</value>       </value>       <value type="string" key="defaultCollation">latin1_swedish_ci</value>       <value type="string" key="description">ISO 8859-1 West European</value>       <value type="string" key="name">latin1</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{A4E5546A-E0F8-4601-9DC3-D39C7DE1FD72}</value>       <value type="list" content-type="string" key="collations">         <value type="string">latin2_czech_cs</value>         <value type="string">latin2_general_ci</value>         <value type="string">latin2_hungarian_ci</value>         <value type="string">latin2_croatian_ci</value>         <value type="string">latin2_bin</value>       </value>       <value type="string" key="defaultCollation">latin2_general_ci</value>       <value type="string" key="description">ISO 8859-2 Central European</value>       <value type="string" key="name">latin2</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{2F780E59-D0CF-4175-8473-C86D73B33ED6}</value>       <value type="list" content-type="string" key="collations">         <value type="string">swe7_swedish_ci</value>         <value type="string">swe7_bin</value>       </value>       <value type="string" key="defaultCollation">swe7_swedish_ci</value>       <value type="string" key="description">7bit Swedish</value>       <value type="string" key="name">swe7</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{E986FF81-4A4E-4A5D-B792-8D70F05A1BDE}</value>       <value type="list" content-type="string" key="collations">         <value type="string">ascii_general_ci</value>         <value type="string">ascii_bin</value>       </value>       <value type="string" key="defaultCollation">ascii_general_ci</value>       <value type="string" key="description">US ASCII</value>       <value type="string" key="name">ascii</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{41103BE4-2115-4129-A4F3-0EC70E1A7CA6}</value>       <value type="list" content-type="string" key="collations">         <value type="string">ujis_japanese_ci</value>         <value type="string">ujis_bin</value>       </value>       <value type="string" key="defaultCollation">ujis_japanese_ci</value>       <value type="string" key="description">EUC-JP Japanese</value>       <value type="string" key="name">ujis</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{9069C68C-56AA-40EA-9C14-1542D5226355}</value>       <value type="list" content-type="string" key="collations">         <value type="string">sjis_japanese_ci</value>         <value type="string">sjis_bin</value>       </value>       <value type="string" key="defaultCollation">sjis_japanese_ci</value>       <value type="string" key="description">Shift-JIS Japanese</value>       <value type="string" key="name">sjis</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{A9BCA02E-A707-4832-A9A2-61F0A56F25C2}</value>       <value type="list" content-type="string" key="collations">         <value type="string">hebrew_general_ci</value>         <value type="string">hebrew_bin</value>       </value>       <value type="string" key="defaultCollation">hebrew_general_ci</value>       <value type="string" key="description">ISO 8859-8 Hebrew</value>       <value type="string" key="name">hebrew</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{091F9B2C-FC20-47D4-B7EC-E31EF07828FF}</value>       <value type="list" content-type="string" key="collations">         <value type="string">tis620_thai_ci</value>         <value type="string">tis620_bin</value>       </value>       <value type="string" key="defaultCollation">tis620_thai_ci</value>       <value type="string" key="description">TIS620 Thai</value>       <value type="string" key="name">tis620</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{FECE8C4D-B95C-4D06-B5E5-7C685B512607}</value>       <value type="list" content-type="string" key="collations">         <value type="string">euckr_korean_ci</value>         <value type="string">euckr_bin</value>       </value>       <value type="string" key="defaultCollation">euckr_korean_ci</value>       <value type="string" key="description">EUC-KR Korean</value>       <value type="string" key="name">euckr</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{52DEA621-FBB4-4FC5-88C6-936CC3F53579}</value>       <value type="list" content-type="string" key="collations">         <value type="string">koi8u_general_ci</value>         <value type="string">koi8u_bin</value>       </value>       <value type="string" key="defaultCollation">koi8u_general_ci</value>       <value type="string" key="description">KOI8-U Ukrainian</value>       <value type="string" key="name">koi8u</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{FD0CE66F-4075-48FB-AF79-C75453274791}</value>       <value type="list" content-type="string" key="collations">         <value type="string">gb2312_chinese_ci</value>         <value type="string">gb2312_bin</value>       </value>       <value type="string" key="defaultCollation">gb2312_chinese_ci</value>       <value type="string" key="description">GB2312 Simplified Chinese</value>       <value type="string" key="name">gb2312</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{AF1906F2-20B5-491C-8450-14F730DBECD8}</value>       <value type="list" content-type="string" key="collations">         <value type="string">greek_general_ci</value>         <value type="string">greek_bin</value>       </value>       <value type="string" key="defaultCollation">greek_general_ci</value>       <value type="string" key="description">ISO 8859-7 Greek</value>       <value type="string" key="name">greek</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{2BA9756D-C757-4770-B795-B1A4943359EC}</value>       <value type="list" content-type="string" key="collations">         <value type="string">cp1250_general_ci</value>         <value type="string">cp1250_czech_cs</value>         <value type="string">cp1250_croatian_ci</value>         <value type="string">cp1250_bin</value>       </value>       <value type="string" key="defaultCollation">cp1250_general_ci</value>       <value type="string" key="description">Windows Central European</value>       <value type="string" key="name">cp1250</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{B5603A47-2936-4144-BA74-5D4B6959F47F}</value>       <value type="list" content-type="string" key="collations">         <value type="string">gbk_chinese_ci</value>         <value type="string">gbk_bin</value>       </value>       <value type="string" key="defaultCollation">gbk_chinese_ci</value>       <value type="string" key="description">GBK Simplified Chinese</value>       <value type="string" key="name">gbk</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{A50D3C42-2BE0-49C7-A751-59ADDC334F01}</value>       <value type="list" content-type="string" key="collations">         <value type="string">latin5_turkish_ci</value>         <value type="string">latin5_bin</value>       </value>       <value type="string" key="defaultCollation">latin5_turkish_ci</value>       <value type="string" key="description">ISO 8859-9 Turkish</value>       <value type="string" key="name">latin5</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{38416973-B84F-48DF-A766-01022A48B7CB}</value>       <value type="list" content-type="string" key="collations">         <value type="string">armscii8_general_ci</value>         <value type="string">armscii8_bin</value>       </value>       <value type="string" key="defaultCollation">armscii8_general_ci</value>       <value type="string" key="description">ARMSCII-8 Armenian</value>       <value type="string" key="name">armscii8</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{FEDC8872-11CC-47CA-810A-6CCC2FAC6624}</value>       <value type="list" content-type="string" key="collations">         <value type="string">utf8_general_ci</value>         <value type="string">utf8_bin</value>         <value type="string">utf8_unicode_ci</value>         <value type="string">utf8_icelandic_ci</value>         <value type="string">utf8_latvian_ci</value>         <value type="string">utf8_romanian_ci</value>         <value type="string">utf8_slovenian_ci</value>         <value type="string">utf8_polish_ci</value>         <value type="string">utf8_estonian_ci</value>         <value type="string">utf8_spanish_ci</value>         <value type="string">utf8_swedish_ci</value>         <value type="string">utf8_turkish_ci</value>         <value type="string">utf8_czech_ci</value>         <value type="string">utf8_danish_ci</value>         <value type="string">utf8_lithuanian_ci</value>         <value type="string">utf8_slovak_ci</value>         <value type="string">utf8_spanish2_ci</value>         <value type="string">utf8_roman_ci</value>         <value type="string">utf8_persian_ci</value>       </value>       <value type="string" key="defaultCollation">utf8_general_ci</value>       <value type="string" key="description">UTF-8 Unicode</value>       <value type="string" key="name">utf8</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{B37E43B5-C83C-49A6-81FD-21424E22A0CC}</value>       <value type="list" content-type="string" key="collations">         <value type="string">ucs2_general_ci</value>         <value type="string">ucs2_bin</value>         <value type="string">ucs2_unicode_ci</value>         <value type="string">ucs2_icelandic_ci</value>         <value type="string">ucs2_latvian_ci</value>         <value type="string">ucs2_romanian_ci</value>         <value type="string">ucs2_slovenian_ci</value>         <value type="string">ucs2_polish_ci</value>         <value type="string">ucs2_estonian_ci</value>         <value type="string">ucs2_spanish_ci</value>         <value type="string">ucs2_swedish_ci</value>         <value type="string">ucs2_turkish_ci</value>         <value type="string">ucs2_czech_ci</value>         <value type="string">ucs2_danish_ci</value>         <value type="string">ucs2_lithuanian_ci</value>         <value type="string">ucs2_slovak_ci</value>         <value type="string">ucs2_spanish2_ci</value>         <value type="string">ucs2_roman_ci</value>         <value type="string">ucs2_persian_ci</value>       </value>       <value type="string" key="defaultCollation">ucs2_general_ci</value>       <value type="string" key="description">UCS-2 Unicode</value>       <value type="string" key="name">ucs2</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{69774387-87EB-4929-95F7-666E7081C341}</value>       <value type="list" content-type="string" key="collations">         <value type="string">cp866_general_ci</value>         <value type="string">cp866_bin</value>       </value>       <value type="string" key="defaultCollation">cp866_general_ci</value>       <value type="string" key="description">DOS Russian</value>       <value type="string" key="name">cp866</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{EFA25F7E-F252-4083-A7E7-0E0B51D2C7A6}</value>       <value type="list" content-type="string" key="collations">         <value type="string">keybcs2_general_ci</value>         <value type="string">keybcs2_bin</value>       </value>       <value type="string" key="defaultCollation">keybcs2_general_ci</value>       <value type="string" key="description">DOS Kamenicky Czech-Slovak</value>       <value type="string" key="name">keybcs2</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{82133B64-E91A-4EAB-96E7-5211E354E818}</value>       <value type="list" content-type="string" key="collations">         <value type="string">macce_general_ci</value>         <value type="string">macce_bin</value>       </value>       <value type="string" key="defaultCollation">macce_general_ci</value>       <value type="string" key="description">Mac Central European</value>       <value type="string" key="name">macce</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{3006DAE4-DDE9-4979-B982-8284D885ED2A}</value>       <value type="list" content-type="string" key="collations">         <value type="string">macroman_general_ci</value>         <value type="string">macroman_bin</value>       </value>       <value type="string" key="defaultCollation">macroman_general_ci</value>       <value type="string" key="description">Mac West European</value>       <value type="string" key="name">macroman</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{6C8C05CC-8859-4974-B756-497697DB875F}</value>       <value type="list" content-type="string" key="collations">         <value type="string">cp852_general_ci</value>         <value type="string">cp852_bin</value>       </value>       <value type="string" key="defaultCollation">cp852_general_ci</value>       <value type="string" key="description">DOS Central European</value>       <value type="string" key="name">cp852</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{99441A25-E2A8-4B71-A311-AA46C216D6A9}</value>       <value type="list" content-type="string" key="collations">         <value type="string">latin7_estonian_cs</value>         <value type="string">latin7_general_ci</value>         <value type="string">latin7_general_cs</value>         <value type="string">latin7_bin</value>       </value>       <value type="string" key="defaultCollation">latin7_general_ci</value>       <value type="string" key="description">ISO 8859-13 Baltic</value>       <value type="string" key="name">latin7</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{B670A3DE-8FD2-4508-A437-4EE82D3F184A}</value>       <value type="list" content-type="string" key="collations">         <value type="string">cp1251_bulgarian_ci</value>         <value type="string">cp1251_ukrainian_ci</value>         <value type="string">cp1251_bin</value>         <value type="string">cp1251_general_ci</value>         <value type="string">cp1251_general_cs</value>       </value>       <value type="string" key="defaultCollation">cp1251_general_ci</value>       <value type="string" key="description">Windows Cyrillic</value>       <value type="string" key="name">cp1251</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{EF353851-0BAE-450A-8751-D96E58402C08}</value>       <value type="list" content-type="string" key="collations">         <value type="string">cp1256_general_ci</value>         <value type="string">cp1256_bin</value>       </value>       <value type="string" key="defaultCollation">cp1256_general_ci</value>       <value type="string" key="description">Windows Arabic</value>       <value type="string" key="name">cp1256</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{25D735B3-3DBA-4EF7-95C9-B94E5A480D40}</value>       <value type="list" content-type="string" key="collations">         <value type="string">cp1257_lithuanian_ci</value>         <value type="string">cp1257_bin</value>         <value type="string">cp1257_general_ci</value>       </value>       <value type="string" key="defaultCollation">cp1257_general_ci</value>       <value type="string" key="description">Windows Baltic</value>       <value type="string" key="name">cp1257</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{F312E41B-8ECF-4B2D-B084-B22186F114AE}</value>       <value type="list" content-type="string" key="collations">         <value type="string">binary</value>       </value>       <value type="string" key="defaultCollation">binary</value>       <value type="string" key="description">Binary pseudo charset</value>       <value type="string" key="name">binary</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{7A92AB4C-BB3F-47B9-BC98-4F55CF8690A3}</value>       <value type="list" content-type="string" key="collations">         <value type="string">geostd8_general_ci</value>         <value type="string">geostd8_bin</value>       </value>       <value type="string" key="defaultCollation">geostd8_general_ci</value>       <value type="string" key="description">GEOSTD8 Georgian</value>       <value type="string" key="name">geostd8</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{3EE67D94-4290-4A37-A0A3-73E2602C2971}</value>       <value type="list" content-type="string" key="collations">         <value type="string">cp932_japanese_ci</value>         <value type="string">cp932_bin</value>       </value>       <value type="string" key="defaultCollation">cp932_japanese_ci</value>       <value type="string" key="description">SJIS for Windows Japanese</value>       <value type="string" key="name">cp932</value>     </value>     <value type="dict" struct-name="db.CharacterSet">       <value type="string" key="_id">{EF2A81A5-CB47-46E3-9FC5-203D7DA8EA10}</value>       <value type="list" content-type="string" key="collations">         <value type="string">eucjpms_japanese_ci</value>         <value type="string">eucjpms_bin</value>       </value>       <value type="string" key="defaultCollation">eucjpms_japanese_ci</value>       <value type="string" key="description">UJIS for Windows Japanese</value>       <value type="string" key="name">eucjpms</value>     </value>   </value> </data>
  429. ]]
  430.   end
  431.   characterSets= grtV.fromXml(characterSetsXml)
  432.   
  433.   for i= 1, grtV.getn(characterSets) do
  434.     if owner ~= nil then
  435.       characterSets[i].owner= owner
  436.     end
  437.     
  438.     grtV.insert(list, characterSets[i])
  439.   end
  440. end
  441. -- ----------------------------------------------------------------------------------------
  442. -- @brief Function to get the native MySQL driver
  443. --
  444. --   Helper function to return infos about the native MySQL driver
  445. -- 
  446. -- @param owner the Grt value of the Rdbms
  447. --
  448. -- @return a new created GRT value of struct "db.mgmt.Driver" containing the driver infos
  449. -- ----------------------------------------------------------------------------------------
  450. function getDriverMysqlNative(owner)
  451.   -- create driver object
  452.   local driver= grtV.newObj("db.mgmt.NativeDriver", "MysqlNative", 
  453.     "{D65C7567-0B84-4AC6-A1A4-0A4BB8C9F3F2}", grtV.toLua(owner._id))
  454.   -- set driver values
  455.   driver.caption= "MySQL Native Driver"
  456.   driver.description= "MySQL native driver using the MySQL client library"
  457.   driver.filesTarget= "."
  458.   grtV.insert(driver.files, "libmysql.dll")
  459.   driver.downloadUrl= "http://dev.mysql.com/downloads/mysql/"
  460.   -- add driver parameters
  461.   __RdbmsInfo_lua.addDriverParamDefaults(driver, driver.parameters, 1, "3306")
  462.   -- add additional parameters
  463.   local param= __RdbmsInfo_lua.getDriverParameter(owner, "schema", "Default Schema:", 
  464.     "The schema that will be used as default schema", "string", -1, 218, "", 0, 0)
  465.   param.lookupValueModule= "ReverseEngineeringMysql"
  466.   param.lookupValueMethod= "getSchemata"
  467.   grtV.insert(driver.parameters, param)
  468.   -- advanced parameters
  469.   grtV.insert(driver.parameters, __RdbmsInfo_lua.getDriverParameter(owner, "useCompression", "Use compression protocol", 
  470.     "Select this option for WAN connections.", "boolean", -1, 318, "", 1, 0))
  471.   grtV.insert(driver.parameters, __RdbmsInfo_lua.getDriverParameter(owner, "useSSL", 
  472.     "Use SSL if available (the client library needs to support it)", 
  473.     "This option turns on SSL encryption if the client library supports it", "boolean", -1, 318, "", 1, 0))
  474.   grtV.insert(driver.parameters, __RdbmsInfo_lua.getDriverParameter(owner, "useAnsiQuotes", "Use ANSI quotes to quote identifiers.", 
  475.     "If enabled this option overwrites the serverside settings.", "tristate", -1, 318, "", 1, 0))
  476.   if grt.getResLua(Base:getOsTypeName()) == "WINDOWS" then
  477.     grtV.insert(driver.parameters, __RdbmsInfo_lua.getDriverParameter(owner, "socket", "Named Pipe:", 
  478.       "Use the specified named pipe instead of a TCP/IP connection.", 
  479.       "string", -1, 218, "", 1, 0))
  480.   else
  481.     grtV.insert(driver.parameters, __RdbmsInfo_lua.getDriverParameter(owner, "socket", "Socket Name:", 
  482.       "Use the specified socket instead of a TCP/IP connection.", 
  483.       "string", -1, 218, "", 1, 0))
  484.   end
  485.   driver.defaultModules= 
  486.     {
  487.       ReverseEngineeringModule= "ReverseEngineeringMysql",
  488.       MigrationModule= "MigrationGeneric",
  489.       TransformationModule= "TransformationMysql",
  490.       QueryModule= "QueryMysql"
  491.     }
  492.   driver.isInstalled= 1
  493.   return driver
  494. end
  495. -- ----------------------------------------------------------------------------------------
  496. -- @brief Function to get the Jdbc MySQL driver
  497. --
  498. --   Helper function to return infos about the Jdbc driver
  499. -- 
  500. -- @param owner the Grt value of the Rdbms
  501. --
  502. -- @return a new created GRT value of struct "db.mgmt.Driver" containing the driver infos
  503. -- ----------------------------------------------------------------------------------------
  504. function getDriverMysqlJdbc(owner)
  505.   -- create driver object
  506.   local driver= grtV.newObj("db.mgmt.JdbcDriver", "MysqlJdbc31", 
  507.     "{8E33CDBA-2B8D-4221-96C4-506D398BC377}", grtV.toLua(owner._id))
  508.   -- set driver values
  509.   driver.caption= "MySQL JDBC Driver 5.0"
  510.   driver.description= "MySQL JDBC Driver"
  511.   driver.filesTarget= "./java/lib/"
  512.   grtV.insert(driver.files, "mysql-connector-java-5.0.4-bin.jar")
  513.   driver.downloadUrl= "http://dev.mysql.com/downloads/connector/j/5.0.html"
  514.   -- Jdbc specific settings
  515.   driver.className= "com.mysql.jdbc.Driver"
  516.   driver.connectionStringTemplate= "jdbc:mysql://%host%:%port%/?user=%username%&password=%password%" ..
  517.     "&useServerPrepStmts=false&characterEncoding=UTF-8"
  518.   -- add driver parameters
  519.   __RdbmsInfo_lua.addDriverParamDefaults(driver, driver.parameters, 1, "3306")
  520.   -- add additional parameters
  521.   local param= __RdbmsInfo_lua.getDriverParameter(owner, "schema", "Default Schema:", 
  522.     "The schema that will be used as default schema", "string", -1, 218, "", 0, 0)
  523.   param.lookupValueModule= "ReverseEngineeringMysqlJdbc"
  524.   param.lookupValueMethod= "getSchemata"
  525.   grtV.insert(driver.parameters, param)
  526.   -- advanced parameters
  527.   grtV.insert(driver.parameters, __RdbmsInfo_lua.getDriverParameter(owner, "jdbcConnStr", "Connection String:", 
  528.     "Jdbc Connection String", "string", -1, 218, "", 1, 0))
  529.   driver.defaultModules= 
  530.     {
  531.       ReverseEngineeringModule= "ReverseEngineeringMysqlJdbc",
  532.       MigrationModule= "MigrationMysql",
  533.       TransformationModule= "TransformationMysqlJdbc"
  534.     }
  535.   driver.isInstalled= 1
  536.   return driver
  537. end
  538. -- ----------------------------------------------------------------------------------------
  539. -- @brief Function to get the embedded MySQL driver
  540. --
  541. --   Helper function to return infos about the embedded MySQL driver
  542. -- 
  543. -- @param owner the Grt value of the Rdbms
  544. --
  545. -- @return a new created GRT value of struct "db.mgmt.Driver" containing the driver infos
  546. -- ----------------------------------------------------------------------------------------
  547. function getDriverMysqlEmbedded(owner)
  548.   -- create driver object
  549.   local driver= grtV.newObj("db.mgmt.NativeDriver", "MysqlEmbedded", 
  550.     "{64B098D9-57F1-44C6-9B6D-41852D159A38}", grtV.toLua(owner._id))
  551.   -- set driver values
  552.   driver.caption= "MySQL Native Driver for Embedded"
  553.   driver.description= "MySQL native driver for the use with Embedded"
  554.   driver.filesTarget= "."
  555.   grtV.insert(driver.files, "libmysqld.dll")
  556.   driver.downloadUrl= "http://dev.mysql.com/downloads/mysql/"
  557.   -- add driver parameters
  558.   grtV.insert(driver.parameters, __RdbmsInfo_lua.getDriverParameter(owner, "datadir", "Data Directory:", 
  559.     "The MySQL data directory to use", "dir", 1, 218, "", 0, 1))
  560.   -- add additional parameters
  561.   local param= __RdbmsInfo_lua.getDriverParameter(owner, "schema", "Default Schema:", 
  562.     "The schema that will be used as default schema", "string", 2, 218, "", 0, 0)
  563.   param.lookupValueModule= "ReverseEngineeringMysql"
  564.   param.lookupValueMethod= "getSchemata"
  565.   grtV.insert(driver.parameters, param)
  566.   driver.defaultModules= 
  567.     {
  568.       ReverseEngineeringModule= "ReverseEngineeringMysql",
  569.       MigrationModule= "MigrationGeneric",
  570.       TransformationModule= "TransformationMysql"
  571.     }
  572.   driver.isInstalled= 1
  573.   return driver
  574. end