Add database backup and restore
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Restore a backup to an isolated temporary database and verify its integrity."""
|
||||
|
||||
import argparse
|
||||
import shutil
|
||||
import sqlite3
|
||||
import sys
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Test an Eternity Project database backup by restoring it safely.")
|
||||
parser.add_argument("backup", type=Path, help="Path to a .db backup created by backup-database.py")
|
||||
args = parser.parse_args()
|
||||
source = args.backup.resolve()
|
||||
if not source.is_file():
|
||||
print(f"BACKUP_VERIFY_FAILED: Backup does not exist: {source}", file=sys.stderr)
|
||||
return 2
|
||||
|
||||
with tempfile.TemporaryDirectory(prefix="eternity-restore-") as directory:
|
||||
restored = Path(directory) / "eternity-restored.db"
|
||||
shutil.copy2(source, restored)
|
||||
try:
|
||||
database = sqlite3.connect(f"file:{restored}?mode=ro", uri=True)
|
||||
integrity = database.execute("PRAGMA integrity_check").fetchone()[0]
|
||||
users = database.execute("SELECT COUNT(*) FROM users").fetchone()[0]
|
||||
posts = database.execute("SELECT COUNT(*) FROM posts").fetchone()[0]
|
||||
database.close()
|
||||
except sqlite3.DatabaseError as error:
|
||||
print(f"BACKUP_VERIFY_FAILED: {error}", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
if integrity != "ok":
|
||||
print(f"BACKUP_VERIFY_FAILED: integrity_check returned {integrity}", file=sys.stderr)
|
||||
return 1
|
||||
print(f"BACKUP_RESTORE_VERIFIED: users={users} posts={posts} source={source}")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user