When rebuilding the channel, subscribe via last seen ID, so we don't miss messages from the time we were disconnected.

This commit is contained in:
Ian Gulliver
2014-05-18 11:20:44 +03:00
parent 63ac321537
commit 0380679ddb
3 changed files with 24 additions and 7 deletions

View File

@@ -117,6 +117,15 @@ class Subject(db.Model):
num_messages = None
return reversed(query.fetch(limit=num_messages))
@db.transactional()
def GetMessagesSince(self, last_id):
query = (
Message.all()
.ancestor(self)
.filter('id_ >', last_id)
.order('id_'))
return list(query)
@db.transactional()
def GetKey(self, key):
messages = (
@@ -179,7 +188,7 @@ class Subscription(db.Model):
@classmethod
@db.transactional()
def FindOrCreate(cls, subject, client, messages):
def FindOrCreate(cls, subject, client, messages=0, last_id=None):
subscriptions = (
cls.all(keys_only=True)
.ancestor(subject)
@@ -187,9 +196,12 @@ class Subscription(db.Model):
.fetch(1))
if not subscriptions:
cls(parent=subject, client=client).put()
if messages == 0:
return []
return [m.ToEvent() for m in subject.GetRecentMessages(messages)]
events = []
if messages:
events.extend(m.ToEvent() for m in subject.GetRecentMessages(messages))
if last_id:
events.extend(m.ToEvent() for m in subject.GetMessagesSince(last_id))
return events
@classmethod
@db.transactional()