Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/atoidejouer/db/story.py
diff options
context:
space:
mode:
Diffstat (limited to 'atoidejouer/db/story.py')
-rw-r--r--atoidejouer/db/story.py108
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):