ArchiveBox_ArchiveBox/archivebox/machine/migrations/0005_converge_binary_model.py

73 lines
2.8 KiB
Python

# Generated by hand on 2026-01-01
# Converges machine app for 0.8.6rc0 → 0.9.x migration path
# Drops old InstalledBinary table and ensures Binary table exists
from django.db import migrations, connection
def converge_binary_table(apps, schema_editor):
"""
Drop machine_installedbinary if it exists (0.8.6rc0 path).
Create machine_binary if it doesn't exist (needed by Process model).
"""
cursor = connection.cursor()
# Check what tables exist
cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name IN ('machine_installedbinary', 'machine_binary')")
existing_tables = {row[0] for row in cursor.fetchall()}
print(f'DEBUG 0005: Existing tables: {existing_tables}')
# Drop old InstalledBinary table if it exists (0.8.6rc0 path)
if 'machine_installedbinary' in existing_tables:
print('✓ Dropping machine_installedbinary table (0.8.6rc0 divergence)')
cursor.execute("DROP TABLE IF EXISTS machine_installedbinary")
# Create Binary table if it doesn't exist
# This handles the case where 0.8.6rc0's 0001_initial didn't create it
if 'machine_binary' not in existing_tables:
print('✓ Creating machine_binary table with correct schema')
cursor.execute("""
CREATE TABLE machine_binary (
id TEXT PRIMARY KEY NOT NULL,
created_at DATETIME NOT NULL,
modified_at DATETIME NOT NULL,
num_uses_succeeded INTEGER NOT NULL DEFAULT 0,
num_uses_failed INTEGER NOT NULL DEFAULT 0,
machine_id TEXT NOT NULL REFERENCES machine_machine(id) ON DELETE CASCADE,
name VARCHAR(63) NOT NULL,
binproviders VARCHAR(255) NOT NULL DEFAULT 'env',
overrides TEXT NOT NULL DEFAULT '{}',
binprovider VARCHAR(63) NOT NULL DEFAULT 'env',
abspath VARCHAR(255) NOT NULL,
version VARCHAR(128) NOT NULL,
sha256 VARCHAR(64) NOT NULL DEFAULT '',
status VARCHAR(16) NOT NULL DEFAULT 'succeeded',
retry_at DATETIME NULL,
output_dir VARCHAR(255) NOT NULL DEFAULT ''
)
""")
# Create indexes
cursor.execute("CREATE INDEX machine_binary_machine_id_idx ON machine_binary(machine_id)")
cursor.execute("CREATE INDEX machine_binary_name_idx ON machine_binary(name)")
cursor.execute("CREATE INDEX machine_binary_abspath_idx ON machine_binary(abspath)")
print('✓ machine_binary table created')
else:
print('✓ machine_binary table already exists')
class Migration(migrations.Migration):
dependencies = [
('machine', '0001_initial'),
]
operations = [
migrations.RunPython(
converge_binary_table,
reverse_code=migrations.RunPython.noop,
),
]