Comparison

util/sql.lua @ 8288:e9ac2d93de18

util.sql: Don't log at error level if a transaction failed and was retried ok
author Matthew Wild <mwild1@gmail.com>
date Wed, 04 Oct 2017 10:16:42 +0100
parent 8186:becb593ed86d
child 8378:6a098961bc00
comparison
equal deleted inserted replaced
8287:66ab0d1b7303 8288:e9ac2d93de18
215 engine.delete = engine.execute_update; 215 engine.delete = engine.execute_update;
216 engine.update = engine.execute_update; 216 engine.update = engine.execute_update;
217 end 217 end
218 end 218 end
219 local function handleerr(err) 219 local function handleerr(err)
220 log("error", "Error in SQL transaction: %s", debug_traceback(err, 3)); 220 local trace = debug_traceback(err, 3);
221 return err; 221 log("debug", "Error in SQL transaction: %s", trace);
222 return { err = err, traceback = trace };
222 end 223 end
223 function engine:_transaction(func, ...) 224 function engine:_transaction(func, ...)
224 if not self.conn then 225 if not self.conn then
225 local ok, err = self:connect(); 226 local ok, err = self:connect();
226 if not ok then return ok, err; end 227 if not ok then return ok, err; end
236 log("debug", "SQL transaction success [%s]", tostring(func)); 237 log("debug", "SQL transaction success [%s]", tostring(func));
237 local ok, err = self.conn:commit(); 238 local ok, err = self.conn:commit();
238 if not ok then return ok, err; end -- commit failed 239 if not ok then return ok, err; end -- commit failed
239 return success, a, b, c; 240 return success, a, b, c;
240 else 241 else
241 log("debug", "SQL transaction failure [%s]: %s", tostring(func), a); 242 log("debug", "SQL transaction failure [%s]: %s", tostring(func), a.err);
242 if self.conn then self.conn:rollback(); end 243 if self.conn then self.conn:rollback(); end
243 return success, a; 244 return success, a.err;
244 end 245 end
245 end 246 end
246 function engine:transaction(...) 247 function engine:transaction(...)
247 local ok, ret = self:_transaction(...); 248 local ok, ret = self:_transaction(...);
248 if not ok then 249 if not ok then
249 local conn = self.conn; 250 local conn = self.conn;
250 if not conn or not conn:ping() then 251 if not conn or not conn:ping() then
252 log("debug", "Database connection was closed. Will reconnect and retry.");
251 self.conn = nil; 253 self.conn = nil;
254 log("debug", "Retrying SQL transaction [%s]", tostring((...)));
252 ok, ret = self:_transaction(...); 255 ok, ret = self:_transaction(...);
256 log("debug", "SQL transaction retry %s", ok and "succeeded" or "failed");
257 else
258 log("debug", "SQL connection is up, so not retrying");
259 end
260 if not ok then
261 log("error", "Error in SQL transaction: %s", ret);
253 end 262 end
254 end 263 end
255 return ok, ret; 264 return ok, ret;
256 end 265 end
257 function engine:_create_index(index) 266 function engine:_create_index(index)