Mercurial Hosting > luan
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/luan/modules/sql/Sql.luan Mon Nov 12 02:10:41 2018 -0700 @@ -0,0 +1,67 @@ +java() +local Luan = require "luan:Luan.luan" +local error = Luan.error +local new_error = Luan.new_error or error() +local set_metatable = Luan.set_metatable or error() +local Database = require "java:luan.modules.sql.Database" +local Logging = require "luan:logging/Logging.luan" +local logger = Logging.logger "Sql" + + +local Sql = {} + +local mt = {} + +function mt.__gc(database) + if not database.is_closed then + logger.error(database.created) + database.close() + end +end + +function Sql.database(spec) + local database = {} + set_metatable(database,mt) + local java_database = Database.get(spec) + java_database.uses = java_database.uses + 1 + database.is_closed = false + database.java = java_database + database.created = new_error "not closed, created:" + database.update = java_database.update + + function database.close() + if not database.is_closed then + database.is_closed = true + java_database.uses > 0 or error "java_database.uses <= 0" + java_database.uses = java_database.uses - 1 + if java_database.uses == 0 then + java_database.close() + end + end + end + + function database.query(sql,...) + local rs = java_database.query(sql,...) + local mt = {} + function mt.__index(_,key) + local rtn = rs.getObject(key) + return not rs.wasNull() and rtn or nil + end + local result = {} + set_metatable(result,mt) + return function() + if rs.isClosed() then + return nil + end + if not rs.next() then + rs.close() + return nil + end + return result + end + end + + return database +end + +return Sql