MonitorHandler implemented as a replacement for the OOBHandler monitor functionality, as per #924.

This commit is contained in:
Griatch 2016-03-05 19:51:09 +01:00
parent 198a348d73
commit 8090d92d85
5 changed files with 506 additions and 408 deletions

View file

@ -28,7 +28,6 @@ except ImportError:
from pickle import dumps, loads
from django.core.exceptions import ObjectDoesNotExist
from django.contrib.contenttypes.models import ContentType
from evennia.server.models import ServerConfig
from evennia.utils.utils import to_str, uses_database
from evennia.utils import logger
@ -36,6 +35,22 @@ __all__ = ("to_pickle", "from_pickle", "do_pickle", "do_unpickle")
PICKLE_PROTOCOL = 2
def _get_mysql_db_version(self):
"""
This is a helper method for specifically getting the version
string of a MySQL database.
Returns:
mysql_version (str): The currently used mysql database
version.
"""
from django.db import connection
conn = connection.cursor()
conn.execute("SELECT VERSION()")
version = conn.fetchone()
return version and str(version[0]) or ""
# initialization and helpers
_GA = object.__getattribute__
@ -43,7 +58,7 @@ _SA = object.__setattr__
_FROM_MODEL_MAP = None
_TO_MODEL_MAP = None
_IS_PACKED_DBOBJ = lambda o: type(o) == tuple and len(o) == 4 and o[0] == '__packed_dbobj__'
if uses_database("mysql") and ServerConfig.objects.get_mysql_db_version() < '5.6.4':
if uses_database("mysql") and _get_mysql_db_version() < '5.6.4':
# mysql <5.6.4 don't support millisecond precision
_DATESTRING = "%Y:%m:%d-%H:%M:%S:000000"
else:
@ -416,4 +431,4 @@ def dbserialize(data):
def dbunserialize(data, db_obj=None):
"Un-serialize in one step. See from_pickle for help db_obj."
return do_unpickle(from_pickle(data, db_obj=db_obj))
return from_pickle(do_unpickle(data), db_obj=db_obj)

View file

@ -27,7 +27,7 @@ AUTO_FLUSH_MIN_INTERVAL = 60.0 * 5 # at least 5 mins between cache flushes
_GA = object.__getattribute__
_SA = object.__setattr__
_DA = object.__delattr__
_MONITOR_HANDLER = None
# References to db-updated objects are stored here so the
# main process can be informed to re-cache itself.
@ -361,6 +361,9 @@ class SharedMemoryModel(with_metaclass(SharedMemoryModelBase, Model)):
self._oob_at_<fieldname>_postsave())
"""
global _MONITOR_HANDLER
if not _MONITOR_HANDLER:
from evennia.scripts.monitorhandler import MONITOR_HANDLER as _MONITORHANDLER
if _IS_SUBPROCESS:
# we keep a store of objects modified in subprocesses so
@ -390,15 +393,18 @@ class SharedMemoryModel(with_metaclass(SharedMemoryModelBase, Model)):
update_fields = self._meta.fields
for field in update_fields:
fieldname = field.name
# trigger eventual monitors
_MONITORHANDLER.at_update(self, fieldname)
# if a hook is defined it must be named exactly on this form
hookname = "at_%s_postsave" % fieldname
if hasattr(self, hookname) and callable(_GA(self, hookname)):
_GA(self, hookname)(new)
# if a trackerhandler is set on this object, update it with the
# fieldname and the new value
fieldtracker = "_oob_at_%s_postsave" % fieldname
if hasattr(self, fieldtracker):
_GA(self, fieldtracker)(fieldname)
# # if a trackerhandler is set on this object, update it with the
# # fieldname and the new value
# fieldtracker = "_oob_at_%s_postsave" % fieldname
# if hasattr(self, fieldtracker):
# _GA(self, fieldtracker)(fieldname)
class WeakSharedMemoryModelBase(SharedMemoryModelBase):