TM-SGNL-iOS/Scripts/schema_dump
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

100 lines
2.6 KiB
Python
Executable file

#!/usr/bin/env python3
import argparse
import os
import re
import subprocess
SCHEMA_PATH = "SignalServiceKit/Resources/schema.sql"
TABLES_TO_IGNORE = [
"grdb_migrations",
"sqlite_sequence",
"indexable_text_fts_data",
"indexable_text_fts_idx",
"indexable_text_fts_docsize",
"indexable_text_fts_config",
"SearchableNameFTS_data",
"SearchableNameFTS_idx",
"SearchableNameFTS_docsize",
"SearchableNameFTS_config",
]
def main(ns):
repo_root = os.path.abspath(os.path.join(__file__, "../.."))
args = ["Scripts/sqlclient", "--quiet"]
if ns.staging:
args.extend(["--staging"])
if ns.path is not None:
args.extend(["--path", ns.path])
if ns.passphrase is not None:
args.extend(["--passphrase", ns.passphrase])
args.extend(["--", ".schema"])
schema = subprocess.run(
args,
check=True,
encoding="utf8",
capture_output=True,
cwd=repo_root,
).stdout
# Drop the "ok" from setting the passphrase.
assert schema.startswith("ok\n")
schema = schema[3:]
# Normalize the formatting.
schema = subprocess.run(
["bundle", "exec", "anbt-sql-formatter"],
check=True,
input=schema,
encoding="utf8",
capture_output=True,
).stdout
# Remove tables that don't need to be included. (Generally, some other
# mechanism creates these so that we don't need to.)
for table in TABLES_TO_IGNORE:
schema = re.sub(
r"CREATE\s+TABLE\s+(IF NOT EXISTS\s+)?'?" + table + r".*?;\n\n",
"",
schema,
flags=re.MULTILINE | re.DOTALL,
)
file_path = os.path.join(repo_root, SCHEMA_PATH)
with open(file_path, "r") as file:
old_schema = file.read()
if schema == old_schema:
return
with open(file_path, "w") as file:
file.write(schema)
def parse_args():
parser = argparse.ArgumentParser()
target = parser.add_mutually_exclusive_group()
target.add_argument(
"--staging",
action="store_true",
help="Target the staging database of the currently-booted simulator.",
)
target.add_argument(
"--path",
metavar="/a/b/c",
help="Target the database at the provided path.",
)
parser.add_argument(
"--passphrase",
metavar="abcdef0123456789",
help="Use the provided passphrase to decrypt the database. "
"(Or you can use “Settings” -> “Internal” -> “Misc” -> “Save plaintext database key”.)",
)
return parser.parse_args()
if __name__ == "__main__":
ns = parse_args()
main(ns)