منتدى تعليمي متعلق بالاتوبلاي ميديا ستوديو
 
الرئيسيةالتسجيلدخول

شاطر | 
 

 اخواني أريد شرح هذا الكود

استعرض الموضوع السابق استعرض الموضوع التالي اذهب الى الأسفل 
كاتب الموضوعرسالة
باسمة



المساهمات : 352
تاريخ التسجيل : 14/03/2013

مُساهمةموضوع: اخواني أريد شرح هذا الكود   الخميس يناير 16, 2014 2:36 am

السلام عليكم ورحمة الله
اخواني أريد شرح هذا الكود


  1. require"luacom"
  2. local libName = "luasql"
  3.  
  4. local Private = {}
  5.  
  6. luasql = type(_G[libName]) == "table" and _G[libName] or {}
  7.  
  8. local ADOTypes = {}
  9.  
  10. do
  11. local conn = luacom.CreateObject("ADODB.Connection")
  12. local typeinfo = luacom.GetTypeInfo(conn)
  13. local typelib = typeinfo:GetTypeLib()
  14. local enums = typelib:ExportEnumerations()
  15. for k, v in pairs(enums.DataTypeEnum) do
  16. ADOTypes[k] = v
  17. ADOTypes[v] = k
  18. end
  19. end
  20.  
  21. local metatable = {
  22. __metatable = "LuaSQL: you're not allowed to get this metatable"
  23. }
  24.  
  25. luasql._COPYRIGHT = "Copyright (C) 2003-2006 Kepler Project"
  26. luasql._DESCRIPTION = "LuaSQL is a simple interface from Lua to a DBMS"
  27. luasql._VERSION = "LuaSQL 2.1.1"
  28. function luasql.ado()
  29. local isClosed = false
  30. local openConns = {}
  31. openConns.n = 0
  32.  
  33. local env = {}

  34. setmetatable(env, metatable)

  35. env.ADOTypes = ADOTypes

  36. local function closeConn(con)

  37. if not openConns[con] then
  38. return false
  39. end

  40. openConns[con] = nil
  41. openConns.n = openConns.n - 1

  42. return true
  43. end

  44. function env:close()
  45. if not self then error("You must provide a self parameter") end

  46. if isClosed or openConns.n ~= 0 then
  47. return false
  48. end

  49. isClosed = true

  50. return true
  51. end

  52. function env:connect(sourcestr, user, pass, opts)
  53. if not self then error("You must provide a self parameter") end

  54. if isClosed then
  55. error("Environment closed")
  56. end

  57. if type(sourcestr) ~= "string" then
  58. error("Sourcename must be a string")
  59. end
  60.  
  61. local conn = luacom.CreateObject("ADODB.Connection")
  62. local ok, errmsg = pcall(conn.Open, conn, sourcestr, user, pass, opts)

  63. if not ok then
  64. return nil, errmsg
  65. end

  66. if conn.State == 0 then
  67. return nil, "Invalid sourcename"
  68. end

  69. openConns[conn] = true
  70. openConns.n = openConns.n + 1
  71.  
  72. ok, errmsg = pcall(conn.BeginTrans, conn)

  73. return Private.createConnection(conn, closeConn)
  74. end

  75. return env
  76. end;
  77. function Private.createConnection(conObj, closeFunc)
  78.  
  79. local openCursors = {}
  80. openCursors.n = 0
  81. local isClosed = false

  82. local con = {}
  83.  
  84. setmetatable(con, metatable)
  85.  
  86. local autocommit = true

  87. local function closeCursor(cursor)

  88. if not openCursors[cursor] then
  89. return false
  90. end

  91. openCursors[cursor] = nil
  92. openCursors.n = openCursors.n - 1
  93. end

  94. function con:close()
  95. if not self then error("You must provide a self parameter") end
  96.  
  97. if isClosed or openCursors.n ~= 0 then
  98. return false
  99. end

  100. isClosed = true
  101. local cond, err = pcall(conObj.RollbackTrans, conObj)
  102. conObj:Close()
  103. closeFunc(conObj)

  104. return true
  105. end

  106. function con:commit()
  107. if not self then error("You must provide a self parameter") end
  108.  
  109. if isClosed then
  110. error("Connection closed")
  111. end

  112. local cond, err = pcall(conObj.CommitTrans, conObj)
  113. if not cond then
  114. return false, err
  115. end
  116.  
  117. local cond, err = pcall(conObj.BeginTrans, conObj)
  118. if not cond then
  119. return false, err
  120. end

  121. return true
  122. end

  123. function con:execute(sql)
  124. if not self then error("You must provide a self parameter") end
  125.  
  126. if isClosed then
  127. error("Connection closed")
  128. end

  129. local cond, res, upcount = pcall(conObj.Execute, conObj, sql)
  130. if not cond then
  131. return nil, res
  132. end

  133. if not upcount then upcount = 0 end

  134. if autocommit then
  135. local cond, err = con:commit()
  136. if not cond then
  137. return nil, err
  138. end
  139. end
  140.  
  141. if res and res.State ~= 0 then
  142. res = Private.createCursor(res, con, closeCursor)
  143. openCursors[res] = true
  144. openCursors.n = openCursors.n + 1
  145. else
  146. res = upcount
  147. end

  148. return res
  149. end

  150. function con:rollback()
  151. if not self then error("You must provide a self parameter") end
  152.  
  153. if isClosed then
  154. error("Connection closed")
  155. end

  156. local cond, err = pcall(conObj.RollbackTrans, conObj)
  157. if not cond then
  158. return false, err
  159. end
  160.  
  161. local cond, err = pcall(conObj.BeginTrans, conObj)
  162. if not cond then
  163. return false, err
  164. end

  165. return true
  166. end

  167. function con:setautocommit(bool)
  168. if not self then error("You must provide a self parameter") end
  169.  
  170. if isClosed then
  171. error("Connection closed")
  172. end
  173.  
  174. local cond, err = pcall(conObj.CommitTrans, conObj)
  175. if not cond then
  176. return false, err
  177. end
  178.  
  179. autocommit = bool
  180.  
  181. local cond, err = pcall(conObj.BeginTrans, conObj)
  182. if not cond then
  183. return false, err
  184. end
  185.  
  186. return true
  187. end

  188. return con
  189. end;
  190. function Private.createCursor(rs, con, closeFunc)
  191.  
  192. local isClosed = false
  193. local cursor = rs
  194. local res = {}
  195. local col_names = nil
  196. local col_types = nil
  197.  
  198. setmetatable(res, metatable)

  199. function res:close()
  200. if not self then error("You must provide a self parameter") end

  201. if isClosed then
  202. return false
  203. end

  204. rs:Close()
  205. closeFunc(res, con)

  206. isClosed = true

  207. return true
  208. end

  209. function res:fetch(tb, modestring)
  210. if not self then error("You must provide a self parameter") end
  211.  
  212. if isClosed then
  213. error("Cursor closed")
  214. end
  215.  
  216. local arg_tb = tb

  217. if cursor.EOF then
  218. return nil, "End of cursor reached"
  219. end

  220. if tb == nil or type(tb) ~= "table" then
  221. tb = {}
  222. end

  223. if modestring == nil or type(modestring) ~= "string" then
  224. modestring = "n"
  225. end

  226. for i = 0, cursor.Fields.Count-1 do
  227. local fields = cursor.Fields
  228. local cond, field = pcall(fields.Item, fields, i)
  229. if not cond then
  230. return nil, field
  231. end
  232. if modestring == "n" or modestring == "an" or modestring == "na" then
  233. tb[i+1] = field.Value
  234. end
  235. if modestring == "a" or modestring == "an" or modestring == "na" then
  236. tb[field.Name] = field.Value
  237. end
  238. end
  239. local cond, err = pcall(cursor.MoveNext, cursor)
  240. if not cond then
  241. return nil, err
  242. end

  243. if modestring == "n" and not arg_tb then
  244. return unpack(tb)
  245. else
  246. return tb
  247. end
  248. end

  249. function res:getcolnames()
  250. if not self then error("You must provide a self parameter") end
  251.  
  252. if isClosed then
  253. error("Cursor closed")
  254. end
  255.  
  256. if col_names then return col_names end

  257. col_names = {}
  258. local tb = col_names

  259. for i = 0, cursor.Fields.Count-1 do
  260. local fields = cursor.Fields
  261. local cond, field = pcall(fields.Item, fields, i)
  262. if not cond then
  263. return nil, field
  264. end
  265. tb[i+1] = field.Name
  266. end

  267. return tb
  268. end

  269. function res:getcoltypes()
  270. if not self then error("You must provide a self parameter") end
  271.  
  272. if isClosed then
  273. error("Cursor closed")
  274. end
  275.  
  276. if col_types then return col_types end

  277. col_types = {}
  278. local tb = col_types

  279. for i = 0, cursor.Fields.Count-1 do
  280. local fields = cursor.Fields
  281. local cond, field = pcall(fields.Item, fields, i)
  282. if not cond then
  283. return nil, field
  284. end
  285. tb[i+1] = ADOTypes[field.Type]
  286. end

  287. return tb
  288. end

  289. return res
  290. end;



الرجوع الى أعلى الصفحة اذهب الى الأسفل
 
اخواني أريد شرح هذا الكود
استعرض الموضوع السابق استعرض الموضوع التالي الرجوع الى أعلى الصفحة 
صفحة 1 من اصل 1

صلاحيات هذا المنتدى:لاتستطيع الرد على المواضيع في هذا المنتدى
ams 4 arab :: منتدى الطلبات والاستفسارات-
انتقل الى: