61 lines
2.0 KiB
Python
61 lines
2.0 KiB
Python
import hashlib
|
|
|
|
from .database import Database
|
|
|
|
|
|
class ArchiverManager:
|
|
def __init__(self, db: Database):
|
|
self.db = db
|
|
|
|
def archive_page(
|
|
self,
|
|
destination_hash,
|
|
page_path,
|
|
content,
|
|
max_versions=5,
|
|
max_storage_gb=1,
|
|
):
|
|
content_hash = hashlib.sha256(content.encode("utf-8")).hexdigest()
|
|
|
|
# Check if already exists
|
|
existing = self.db.provider.fetchone(
|
|
"SELECT id FROM archived_pages WHERE destination_hash = ? AND page_path = ? AND hash = ?",
|
|
(destination_hash, page_path, content_hash),
|
|
)
|
|
if existing:
|
|
return
|
|
|
|
# Insert new version
|
|
self.db.misc.archive_page(destination_hash, page_path, content, content_hash)
|
|
|
|
# Enforce max versions per page
|
|
versions = self.db.misc.get_archived_page_versions(destination_hash, page_path)
|
|
if len(versions) > max_versions:
|
|
# Delete older versions
|
|
to_delete = versions[max_versions:]
|
|
for version in to_delete:
|
|
self.db.provider.execute(
|
|
"DELETE FROM archived_pages WHERE id = ?",
|
|
(version["id"],),
|
|
)
|
|
|
|
# Enforce total storage limit (approximate)
|
|
total_size_row = self.db.provider.fetchone(
|
|
"SELECT SUM(LENGTH(content)) as total_size FROM archived_pages",
|
|
)
|
|
total_size = total_size_row["total_size"] or 0
|
|
max_bytes = max_storage_gb * 1024 * 1024 * 1024
|
|
|
|
while total_size > max_bytes:
|
|
oldest = self.db.provider.fetchone(
|
|
"SELECT id, LENGTH(content) as size FROM archived_pages ORDER BY created_at ASC LIMIT 1",
|
|
)
|
|
if oldest:
|
|
self.db.provider.execute(
|
|
"DELETE FROM archived_pages WHERE id = ?",
|
|
(oldest["id"],),
|
|
)
|
|
total_size -= oldest["size"]
|
|
else:
|
|
break
|