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