diff options
Diffstat (limited to 'atoidejouer/db/story.py')
-rw-r--r-- | atoidejouer/db/story.py | 108 |
1 files changed, 107 insertions, 1 deletions
diff --git a/atoidejouer/db/story.py b/atoidejouer/db/story.py index 476b610..515be85 100644 --- a/atoidejouer/db/story.py +++ b/atoidejouer/db/story.py @@ -1,5 +1,5 @@ # python import -import logging +import copy, logging # get application logger logger = logging.getLogger('atoidejouer') @@ -163,6 +163,112 @@ class Key(object): else: return "%s %s" % (q, self.where()) + def _query_duration(self, time, sign='=', order=''): + return "select * from story where %s order by %stime" % ( + " and ".join([ + "%s='%s'" % ("title", self.title), + "%s='%s'" % ("mime_type", self.mime_type), + "%s='%s'" % ("timestamp", self.timestamp), + "%s=%s" % ("layer", self.layer), + "%s%s%s" % ("time", sign, time), + ]), + order) + + def update_duration(self, duration): + # list next keys + key_dura = duration + start = self.time + 1 + _range = self.duration if self.duration > duration else duration + for time in range(start, start + _range): + key = None + for key in DB()._all(query=self._query_duration(time)): + break + key_dura -= 1 + # DEBUG + # print '\nup time: %s' % time + # print 'up query : %s' % self._query_duration(time) + # print 'up key : %s' % key + # print 'up key_dura: %s' % key_dura + # no key? + if key is None: + new_key = copy.copy(self) + new_key.id = None + new_key.time = time + new_key.duration = key_dura + # DEBUG + # print 'up new_key: %s' % new_key + DB().add(new_key) + # remove next keys + elif key.time > self.time + duration: + key._del(refresh=False) + break + # update duration of existing key + else: + key.duration = key_dura + DB().update(key) + # update key duration after check + self.duration = duration + DB().update(self) + # need some refresh + self._duration_refresh() + + def _duration_refresh(self): + """Ensure valid duration logic. + """ + def _do_fresh(iter_): + """Common method for our generator. + """ + cur = None + for key in iter_: + if cur is None or key.time < cur - 1: + cur = 0 + key.duration = cur + else: + cur += 1 + key.duration = cur + # DEBUG + # print 'fresh: %s' % key + # and update + DB().update(key) + # update previous + end = self.time + _do_fresh(DB()._all(query=self._query_duration(end, sign='<', order='-'))) + # update next + start = self.time + self.duration + _do_fresh(DB()._all(query=self._query_duration(start, sign='>', order='-'))) + + def _del(self, refresh=True): + # list next keys + key_dura = 0 + ran_time = self.time + 1 + ran_dura = self.duration + for time in range(ran_time, ran_time + ran_dura): + key = None + for key in DB()._all(query=self._query_duration(time)): + break + # DEBUG + # print '\ndel time: %s' % time + # print 'del query : %s' % self._query_duration(time) + # print 'del key : %s' % key + # print 'del key_dura: %s' % key_dura + if key is None: + pass + # finish + elif key.time > time: + break + # update duration of existing key + else: + key.duration = key_dura + DB()._del(key) + # update next duration + key_dura += 1 + # DEBUG + # print 'del old key: %s' % self + # and del + DB()._del(self) + # need some refresh + if refresh is True: + self._duration_refresh() class DB(object): |