mirror of
https://github.com/element-hq/synapse.git
synced 2024-11-23 10:05:55 +03:00
Store full JSON of events in db
This commit is contained in:
parent
dbc98c4e43
commit
ec2b5d8c28
3 changed files with 49 additions and 55 deletions
|
@ -155,6 +155,25 @@ class DataStore(RoomMemberStore, RoomStore,
|
||||||
if hasattr(event, "outlier"):
|
if hasattr(event, "outlier"):
|
||||||
outlier = event.outlier
|
outlier = event.outlier
|
||||||
|
|
||||||
|
event_dict = {
|
||||||
|
k: v
|
||||||
|
for k, v in event.get_full_dict().items()
|
||||||
|
if k not in [
|
||||||
|
"redacted",
|
||||||
|
"redacted_because",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
self._simple_insert_txn(
|
||||||
|
txn,
|
||||||
|
table="event_json",
|
||||||
|
values={
|
||||||
|
"event_id": event.event_id,
|
||||||
|
"json": json.dumps(event_dict, separators=(',', ':')),
|
||||||
|
},
|
||||||
|
or_replace=True,
|
||||||
|
)
|
||||||
|
|
||||||
vals = {
|
vals = {
|
||||||
"topological_ordering": event.depth,
|
"topological_ordering": event.depth,
|
||||||
"event_id": event.event_id,
|
"event_id": event.event_id,
|
||||||
|
|
|
@ -479,66 +479,30 @@ class SQLBaseStore(object):
|
||||||
)
|
)
|
||||||
|
|
||||||
def _parse_events_txn(self, txn, rows):
|
def _parse_events_txn(self, txn, rows):
|
||||||
events = [self._parse_event_from_row(r) for r in rows]
|
event_ids = [r["event_id"] for r in rows]
|
||||||
|
|
||||||
select_event_sql = (
|
events = []
|
||||||
"SELECT * FROM events WHERE event_id = ? ORDER BY rowid asc"
|
for event_id in event_ids:
|
||||||
|
js = self._simple_select_one_onecol_txn(
|
||||||
|
txn,
|
||||||
|
table="event_json",
|
||||||
|
keyvalues={"event_id": event_id},
|
||||||
|
retcol="json",
|
||||||
|
allow_none=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
for i, ev in enumerate(events):
|
if not js:
|
||||||
signatures = self._get_event_signatures_txn(
|
# FIXME (erikj): What should we actually do here?
|
||||||
txn, ev.event_id,
|
continue
|
||||||
|
|
||||||
|
d = json.loads(js)
|
||||||
|
|
||||||
|
ev = self.event_factory.create_event(
|
||||||
|
etype=d["type"],
|
||||||
|
**d
|
||||||
)
|
)
|
||||||
|
|
||||||
ev.signatures = {
|
if hasattr(ev, "redacted") and ev.redacted:
|
||||||
n: {
|
|
||||||
k: encode_base64(v) for k, v in s.items()
|
|
||||||
}
|
|
||||||
for n, s in signatures.items()
|
|
||||||
}
|
|
||||||
|
|
||||||
hashes = self._get_event_content_hashes_txn(
|
|
||||||
txn, ev.event_id,
|
|
||||||
)
|
|
||||||
|
|
||||||
ev.hashes = {
|
|
||||||
k: encode_base64(v) for k, v in hashes.items()
|
|
||||||
}
|
|
||||||
|
|
||||||
prevs = self._get_prev_events_and_state(txn, ev.event_id)
|
|
||||||
|
|
||||||
ev.prev_events = [
|
|
||||||
(e_id, h)
|
|
||||||
for e_id, h, is_state in prevs
|
|
||||||
if is_state == 0
|
|
||||||
]
|
|
||||||
|
|
||||||
ev.auth_events = self._get_auth_events(txn, ev.event_id)
|
|
||||||
|
|
||||||
if hasattr(ev, "state_key"):
|
|
||||||
ev.prev_state = [
|
|
||||||
(e_id, h)
|
|
||||||
for e_id, h, is_state in prevs
|
|
||||||
if is_state == 1
|
|
||||||
]
|
|
||||||
|
|
||||||
if hasattr(ev, "replaces_state"):
|
|
||||||
# Load previous state_content.
|
|
||||||
# FIXME (erikj): Handle multiple prev_states.
|
|
||||||
cursor = txn.execute(
|
|
||||||
select_event_sql,
|
|
||||||
(ev.replaces_state,)
|
|
||||||
)
|
|
||||||
prevs = self.cursor_to_dict(cursor)
|
|
||||||
if prevs:
|
|
||||||
prev = self._parse_event_from_row(prevs[0])
|
|
||||||
ev.prev_content = prev.content
|
|
||||||
|
|
||||||
if not hasattr(ev, "redacted"):
|
|
||||||
logger.debug("Doesn't have redacted key: %s", ev)
|
|
||||||
ev.redacted = self._has_been_redacted_txn(txn, ev)
|
|
||||||
|
|
||||||
if ev.redacted:
|
|
||||||
# Get the redaction event.
|
# Get the redaction event.
|
||||||
select_event_sql = "SELECT * FROM events WHERE event_id = ?"
|
select_event_sql = "SELECT * FROM events WHERE event_id = ?"
|
||||||
txn.execute(select_event_sql, (ev.redacted,))
|
txn.execute(select_event_sql, (ev.redacted,))
|
||||||
|
@ -549,9 +513,10 @@ class SQLBaseStore(object):
|
||||||
|
|
||||||
if del_evs:
|
if del_evs:
|
||||||
ev = prune_event(ev)
|
ev = prune_event(ev)
|
||||||
events[i] = ev
|
|
||||||
ev.redacted_because = del_evs[0]
|
ev.redacted_because = del_evs[0]
|
||||||
|
|
||||||
|
events.append(ev)
|
||||||
|
|
||||||
return events
|
return events
|
||||||
|
|
||||||
def _has_been_redacted_txn(self, txn, event):
|
def _has_been_redacted_txn(self, txn, event):
|
||||||
|
|
|
@ -32,6 +32,16 @@ CREATE INDEX IF NOT EXISTS events_stream_ordering ON events (stream_ordering);
|
||||||
CREATE INDEX IF NOT EXISTS events_topological_ordering ON events (topological_ordering);
|
CREATE INDEX IF NOT EXISTS events_topological_ordering ON events (topological_ordering);
|
||||||
CREATE INDEX IF NOT EXISTS events_room_id ON events (room_id);
|
CREATE INDEX IF NOT EXISTS events_room_id ON events (room_id);
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS event_json(
|
||||||
|
event_id TEXT NOT NULL,
|
||||||
|
json BLOB NOT NULL,
|
||||||
|
CONSTRAINT ev_j_uniq UNIQUE (event_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS event_json_id ON event_json(event_id);
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS state_events(
|
CREATE TABLE IF NOT EXISTS state_events(
|
||||||
event_id TEXT NOT NULL,
|
event_id TEXT NOT NULL,
|
||||||
room_id TEXT NOT NULL,
|
room_id TEXT NOT NULL,
|
||||||
|
|
Loading…
Reference in a new issue