comparison src/luan/modules/sql/Sql.luan @ 1267:9fa8b8389578

add LuanTable.luan; support metatable __gc(); add luan.sql;
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 12 Nov 2018 02:10:41 -0700
parents
children 725e52076f03
comparison
equal deleted inserted replaced
1266:05934fbf635a 1267:9fa8b8389578
1 java()
2 local Luan = require "luan:Luan.luan"
3 local error = Luan.error
4 local new_error = Luan.new_error or error()
5 local set_metatable = Luan.set_metatable or error()
6 local Database = require "java:luan.modules.sql.Database"
7 local Logging = require "luan:logging/Logging.luan"
8 local logger = Logging.logger "Sql"
9
10
11 local Sql = {}
12
13 local mt = {}
14
15 function mt.__gc(database)
16 if not database.is_closed then
17 logger.error(database.created)
18 database.close()
19 end
20 end
21
22 function Sql.database(spec)
23 local database = {}
24 set_metatable(database,mt)
25 local java_database = Database.get(spec)
26 java_database.uses = java_database.uses + 1
27 database.is_closed = false
28 database.java = java_database
29 database.created = new_error "not closed, created:"
30 database.update = java_database.update
31
32 function database.close()
33 if not database.is_closed then
34 database.is_closed = true
35 java_database.uses > 0 or error "java_database.uses <= 0"
36 java_database.uses = java_database.uses - 1
37 if java_database.uses == 0 then
38 java_database.close()
39 end
40 end
41 end
42
43 function database.query(sql,...)
44 local rs = java_database.query(sql,...)
45 local mt = {}
46 function mt.__index(_,key)
47 local rtn = rs.getObject(key)
48 return not rs.wasNull() and rtn or nil
49 end
50 local result = {}
51 set_metatable(result,mt)
52 return function()
53 if rs.isClosed() then
54 return nil
55 end
56 if not rs.next() then
57 rs.close()
58 return nil
59 end
60 return result
61 end
62 end
63
64 return database
65 end
66
67 return Sql