def _getResult(self, function, passErrors =None): # SLAVE models are read-only, so make sure to lock the table in read mode only to prevent # lock collisions. MASTER models query for updates, so use the stronger update lockmode # to prevent read collisions. # 3 iterations is significant to SQLAlchemy. for i in range(3): try: result = function() if self._lock: if self._modelClass.IS_MASTER: result = result.with_lockmode("update") else: result = result.with_lockmode("read") return result except passErrors as err: raise err except Exception as err: stackData = Logger.getStackData() self._modelClass._log.writeError('[%s] BAD CURSOR ACTION: %s' % (str(i), str(function)), err) pass # Sleeps away collisions. time.sleep(1) try: result = function() if self._lock: if self._modelClass.IS_MASTER: result = result.with_lockmode("update") else: result = result.with_lockmode("read") return result except passErrors as err: raise err except Exception as err: stackData = Logger.getStackData() # noinspection PyProtectedMember self._modelClass._log.writeError('FAILED CURSOR ACTION: %s'% str(function), err) return None
if self._modelClass.IS_MASTER: result = result.with_lockmode("update") else: result = result.with_lockmode("read") return result except passErrors, err: raise err except Exception, err: stackData = Logger.getStackData() self._modelClass._log.writeError("[%s] BAD CURSOR ACTION: %s" % (str(i), str(function)), err) pass # Sleeps away collisions. time.sleep(1) try: result = function() if self._lock: if self._modelClass.IS_MASTER: result = result.with_lockmode("update") else: result = result.with_lockmode("read") return result except passErrors, err: raise err except Exception, err: stackData = Logger.getStackData() self._modelClass._log.writeError("FAILED CURSOR ACTION: %s" % str(function), err) return None