Mercurial Hosting > luan
view 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 source
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