update
This commit is contained in:
@@ -128,6 +128,63 @@ def gehoert_mir(zeile, session_id, user_id):
|
||||
return zeile["session_id"] == session_id
|
||||
|
||||
|
||||
# Dasselbe als WHERE-Klausel. Parameter: (user_id, user_id, session_id)
|
||||
WEM = "(user_id = ? OR (? IS NULL AND user_id IS NULL AND session_id = ?))"
|
||||
|
||||
|
||||
def user_id_nachruesten(conn, tabelle):
|
||||
"""Spalte ergänzen und aus der Sitzung füllen — einmalig je Datenbank."""
|
||||
spalten = {r[1] for r in conn.execute(f"PRAGMA table_info({tabelle})")}
|
||||
if "user_id" in spalten:
|
||||
return
|
||||
conn.execute(f"ALTER TABLE {tabelle} ADD COLUMN user_id INTEGER")
|
||||
conn.execute(
|
||||
f"UPDATE {tabelle} SET user_id = ("
|
||||
" SELECT user_id FROM user_sessions s WHERE s.session_id = "
|
||||
f" {tabelle}.session_id)"
|
||||
)
|
||||
|
||||
|
||||
def je_person(conn, tabelle, schema, *schluessel):
|
||||
"""Eindeutig je Person statt je Sitzung.
|
||||
|
||||
Früher stand das UNIQUE auf der Sitzung — dann blockierte der Eintrag
|
||||
des einen Namens den des nächsten, sobald beide denselben Browser
|
||||
benutzten. Mit Namen zählt jetzt der Name, ohne Namen die Sitzung.
|
||||
|
||||
Das alte UNIQUE steckt in der Spaltendefinition und lässt sich nicht
|
||||
ändern — die Tabelle wird dafür nach `schema` neu gebaut. Hat ein Name
|
||||
aus mehreren Browsern doppelt eingetragen, bleibt der jüngste Eintrag.
|
||||
"""
|
||||
user_id_nachruesten(conn, tabelle)
|
||||
alt = conn.execute(
|
||||
"SELECT sql FROM sqlite_master WHERE type='table' AND name=?", (tabelle,)
|
||||
).fetchone()
|
||||
if alt and "UNIQUE" in alt["sql"]:
|
||||
spalten = ", ".join(
|
||||
r[1] for r in conn.execute(f"PRAGMA table_info({tabelle})")
|
||||
)
|
||||
conn.executescript(
|
||||
f"ALTER TABLE {tabelle} RENAME TO {tabelle}_alt;"
|
||||
f"{schema}"
|
||||
f"INSERT INTO {tabelle} ({spalten}) "
|
||||
f"SELECT {spalten} FROM {tabelle}_alt;"
|
||||
f"DROP TABLE {tabelle}_alt;"
|
||||
)
|
||||
mit_name = ", ".join((*schluessel, "user_id"))
|
||||
ohne_name = ", ".join((*schluessel, "session_id"))
|
||||
conn.execute(
|
||||
f"DELETE FROM {tabelle} WHERE user_id IS NOT NULL AND id NOT IN "
|
||||
f"(SELECT MAX(id) FROM {tabelle} GROUP BY {mit_name})"
|
||||
)
|
||||
conn.executescript(
|
||||
f"CREATE UNIQUE INDEX IF NOT EXISTS {tabelle}_je_benutzer "
|
||||
f"ON {tabelle} ({mit_name}) WHERE user_id IS NOT NULL;"
|
||||
f"CREATE UNIQUE INDEX IF NOT EXISTS {tabelle}_je_sitzung "
|
||||
f"ON {tabelle} ({ohne_name}) WHERE user_id IS NULL;"
|
||||
)
|
||||
|
||||
|
||||
def name_von(session_id):
|
||||
"""Nur der Name, für Vorschläge und Wertungen."""
|
||||
benutzer = aktuell(session_id)
|
||||
|
||||
Reference in New Issue
Block a user