Skip to content

Commit 2d756f7

Browse files
committed
always store data as serialized json
1 parent e3a9aad commit 2d756f7

File tree

1 file changed

+19
-12
lines changed

1 file changed

+19
-12
lines changed

configurable_http_proxy/dbstore.py

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import json
12
import logging
23
import os
34
from datetime import datetime
@@ -92,10 +93,13 @@ def get(self, path, trie=False):
9293
# -- if trie is True, will return the data and the matching prefix
9394
try_routes = self._split_routes(path) if trie else [path]
9495
for path in try_routes:
95-
doc = self.table.find_one(path=path)
96+
doc = self.table.find_one(path=path, order_by="id")
9697
if doc:
97-
data = self._from_json(doc["data"] if not trie else doc)
98-
if trie:
98+
if not trie:
99+
data = self._from_json(doc["data"])
100+
else:
101+
data = doc
102+
data["data"] = self._from_json(doc["data"])
99103
data["prefix"] = path
100104
break
101105
else:
@@ -104,13 +108,15 @@ def get(self, path, trie=False):
104108

105109
def add(self, path, data):
106110
# add the data for the given exact path
107-
self.table.insert(self._clean_json({"path": path, "data": data}))
111+
self.table.insert({"path": path, "data": self._to_json(data)})
108112

109113
def update(self, path, data):
110114
# update the data for the given exact path
111-
doc = self.table.find_one(path=path)
115+
doc = self.table.find_one(path=path, order_by="id")
116+
doc["data"] = self._from_json(doc["data"])
112117
doc["data"].update(data)
113-
self.table.update(self._clean_json(doc), "id")
118+
doc["data"] = self._to_json(doc["data"])
119+
self.table.update(doc, "id")
114120

115121
def remove(self, path):
116122
# remove all matching routes for the given path
@@ -119,23 +125,24 @@ def remove(self, path):
119125

120126
def all(self):
121127
# return all data for all paths
122-
return self._from_json({item["path"]: item["data"] for item in self.table.find()})
128+
return {item["path"]: self._from_json(item["data"]) for item in self.table.find(order_by="id")}
123129

124-
def _clean_json(self, data):
130+
def _to_json(self, data):
125131
# simple converter for serializable data
126132
for k, v in dict(data).items():
127133
if isinstance(v, datetime):
128134
data[k] = f"_dt_:{v.isoformat()}"
129-
if isinstance(v, dict):
130-
data[k] = self._clean_json(v)
131-
return data
135+
elif isinstance(v, dict):
136+
data[k] = self._to_json(v)
137+
return json.dumps(data)
132138

133139
def _from_json(self, data):
134140
# simple converter from serialized data
141+
data = json.loads(data) if isinstance(data, (str, bytes)) else data
135142
for k, v in dict(data).items():
136143
if isinstance(v, str) and v.startswith("_dt_:"):
137144
data[k] = datetime.fromisoformat(v.split(":", 1)[-1])
138-
if isinstance(v, dict):
145+
elif isinstance(v, dict):
139146
data[k] = self._from_json(v)
140147
return data
141148

0 commit comments

Comments
 (0)