Diff

plugins/mod_storage_sql.lua @ 4007:062b849ca088

mod_storage_sql: Catch Lua errors during SQL transactions, and rollback.
author Waqas Hussain <waqas20@gmail.com>
date Wed, 05 Jan 2011 06:56:36 +0500
parent 4004:c1b3ecbed6c0
child 4096:3b991ceb228e
line wrap: on
line diff
--- a/plugins/mod_storage_sql.lua	Wed Jan 05 06:34:23 2011 +0500
+++ b/plugins/mod_storage_sql.lua	Wed Jan 05 06:56:36 2011 +0500
@@ -25,6 +25,7 @@
 local pairs = pairs;
 local next = next;
 local setmetatable = setmetatable;
+local xpcall = xpcall;
 local json = require "util.json";
 
 local connection;
@@ -115,10 +116,7 @@
 	return ...;
 end
 
-local keyval_store = {};
-keyval_store.__index = keyval_store;
-function keyval_store:get(username)
-	user,store = username,self.store;
+local function keyval_store_get()
 	local stmt, err = getsql("SELECT * FROM `Prosody` WHERE `host`=? AND `user`=? AND `store`=?");
 	if not stmt then return nil, err; end
 	
@@ -138,9 +136,7 @@
 	end
 	return commit(haveany and result or nil);
 end
-function keyval_store:set(username, data)
-	user,store = username,self.store;
-	-- start transaction
+local function keyval_store_set(data)
 	local affected, err = setsql("DELETE FROM `Prosody` WHERE `host`=? AND `user`=? AND `store`=?");
 	
 	if data and next(data) ~= nil then
@@ -165,10 +161,20 @@
 	return commit(true);
 end
 
-local map_store = {};
-map_store.__index = map_store;
-function map_store:get(username, key)
+local keyval_store = {};
+keyval_store.__index = keyval_store;
+function keyval_store:get(username)
 	user,store = username,self.store;
+	local success, ret, err = xpcall(keyval_store_get, debug.traceback);
+	if success then return ret, err; else return rollback(nil, ret); end
+end
+function keyval_store:set(username, data)
+	user,store = username,self.store;
+	local success, ret, err = xpcall(function() return keyval_store_set(data); end, debug.traceback);
+	if success then return ret, err; else return rollback(nil, ret); end
+end
+
+local function map_store_get(key)
 	local stmt, err = getsql("SELECT * FROM `Prosody` WHERE `host`=? AND `user`=? AND `store`=? AND `key`=?", key or "");
 	if not stmt then return nil, err; end
 	
@@ -188,9 +194,7 @@
 	end
 	return commit(haveany and result[key] or nil);
 end
-function map_store:set(username, key, data)
-	user,store = username,self.store;
-	-- start transaction
+local function map_store_set(key, data)
 	local affected, err = setsql("DELETE FROM `Prosody` WHERE `host`=? AND `user`=? AND `store`=? AND `key`=?", key or "");
 	
 	if data and next(data) ~= nil then
@@ -206,6 +210,19 @@
 	return commit(true);
 end
 
+local map_store = {};
+map_store.__index = map_store;
+function map_store:get(username, key)
+	user,store = username,self.store;
+	local success, ret, err = xpcall(function() return map_store_get(key); end, debug.traceback);
+	if success then return ret, err; else return rollback(nil, ret); end
+end
+function map_store:set(username, key, data)
+	user,store = username,self.store;
+	local success, ret, err = xpcall(function() return map_store_set(key, data); end, debug.traceback);
+	if success then return ret, err; else return rollback(nil, ret); end
+end
+
 local list_store = {};
 list_store.__index = list_store;
 function list_store:scan(username, from, to, jid, typ)