From 311d3cc7b0692e66edb9b9bb9285b2bfc094d571 Mon Sep 17 00:00:00 2001 From: Eugene Crosser Date: Mon, 9 May 2022 23:16:38 +0200 Subject: [PATCH] reimplement backlog query again --- gps303/backlog.py | 18 ------------------ gps303/evstore.py | 19 ++++++++++++------- gps303/wsgateway.py | 33 ++++++++++++++++++++++++++++----- webdemo/index.html | 2 +- 4 files changed, 41 insertions(+), 31 deletions(-) delete mode 100644 gps303/backlog.py diff --git a/gps303/backlog.py b/gps303/backlog.py deleted file mode 100644 index 1322286..0000000 --- a/gps303/backlog.py +++ /dev/null @@ -1,18 +0,0 @@ -""" Get backlog from evstore """ - -from .opencellid import qry_cell -from .evstore import initdb, fetch -from .gps303proto import GPS_POSITIONING, WIFI_POSITIONING, parse_message - - -def blinit(evdb): - initdb(evdb) - - -def backlog(imei, backlog): - result = [] - for packet in fetch( - imei, (GPS_POSITIONING.PROTO, WIFI_POSITIONING.PROTO), backlog - ): - msg = parse_message(packet) - return reversed(result) diff --git a/gps303/evstore.py b/gps303/evstore.py index bb47f3f..a52a64c 100644 --- a/gps303/evstore.py +++ b/gps303/evstore.py @@ -53,16 +53,21 @@ def stow(**kwargs): DB.commit() -def fetch(imei, protos, backlog): +def fetch(imei, matchlist, backlog): + # matchlist is a list of tuples (is_incoming, proto) + # returns a list of tuples (is_incoming, timestamp, packet) assert DB is not None - protosel = ", ".join(["?" for _ in range(len(protos))]) + selector = " or ".join( + (f"(is_incoming = ? and proto = ?)" for _ in range(len(matchlist))) + ) cur = DB.cursor() cur.execute( - f"""select packet from events - where proto in ({protosel}) and imei = ? + f"""select is_incoming, tstamp, packet from events + where ({selector}) and imei = ? order by tstamp desc limit ?""", - protos + (imei, backlog), + tuple(item for sublist in matchlist for item in sublist) + + (imei, backlog), ) - result = [row[0] for row in cur] + result = list(cur) cur.close() - return result + return list(reversed(result)) diff --git a/gps303/wsgateway.py b/gps303/wsgateway.py index d66070e..79937d8 100644 --- a/gps303/wsgateway.py +++ b/gps303/wsgateway.py @@ -18,7 +18,7 @@ from wsproto.utilities import RemoteProtocolError import zmq from . import common -from .backlog import blinit, backlog +from .evstore import initdb, fetch from .gps303proto import ( GPS_POSITIONING, WIFI_POSITIONING, @@ -30,6 +30,29 @@ log = getLogger("gps303/wsgateway") htmlfile = None +def backlog(imei, numback): + result = [] + for is_incoming, timestamp, packet in fetch( + imei, + ((True, GPS_POSITIONING.PROTO), (False, WIFI_POSITIONING.PROTO)), + numback, + ): + msg = parse_message(packet, is_incoming=is_incoming) + result.append( + { + "imei": imei, + "timestamp": str( + datetime.fromtimestamp(timestamp).astimezone( + tz=timezone.utc + ) + ), + "longitude": msg.longitude, + "latitude": msg.latitude, + } + ) + return result + + def try_http(data, fd, e): global htmlfile try: @@ -235,7 +258,7 @@ class Clients: def runserver(conf): global htmlfile - blinit(conf.get("storage", "dbfn")) + initdb(conf.get("storage", "dbfn")) htmlfile = conf.get("wsgateway", "htmlfile") zctx = zmq.Context() zsub = zctx.socket(zmq.SUB) @@ -314,10 +337,10 @@ def runserver(conf): for msg in received: log.debug("Received from %d: %s", sk, msg) if msg.get("type", None) == "subscribe": - imei = msg.get("imei") + imeis = msg.get("imei") numback = msg.get("backlog", 5) - for elem in imei: - tosend.extend(backlog(elem, numback)) + for imei in imeis: + tosend.extend(backlog(imei, numback)) towrite.add(sk) elif fl & zmq.POLLOUT: log.debug("Write now open for fd %d", sk) diff --git a/webdemo/index.html b/webdemo/index.html index d94ab92..c3fafb4 100644 --- a/webdemo/index.html +++ b/webdemo/index.html @@ -156,7 +156,7 @@ imei: Array.from(imeis), type: "subscribe", date: Date.now(), - backlog: 1 + backlog: maxmarkers }; console.log("sending" + JSON.stringify(msg)); ws.send(JSON.stringify(msg)); -- 2.39.2