"""create dht_records and rdap_cache tables Revision ID: d3e5f7a9c0d1 Revises: c2d4e6f8a1b2 Create Date: 2025-10-22 00:00:00.000000 """ from typing import Sequence, Union from alembic import op import sqlalchemy as sa # revision identifiers, used by Alembic. revision: str = 'd3e5f7a9c0d1' down_revision: Union[str, None] = 'c2d4e6f8a1b2' branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: bind = op.get_bind() inspector = sa.inspect(bind) # dht_records if not inspector.has_table('dht_records'): op.create_table( 'dht_records', sa.Column('fingerprint', sa.String(length=128), primary_key=True), sa.Column('key', sa.String(length=512), nullable=False), sa.Column('schema_version', sa.String(length=16), nullable=False, server_default='v1'), sa.Column('logical_counter', sa.Integer(), nullable=False, server_default='0'), sa.Column('timestamp', sa.Float(), nullable=False, server_default='0'), sa.Column('node_id', sa.String(length=128), nullable=False), sa.Column('signature', sa.String(length=512), nullable=True), sa.Column('value', sa.JSON(), nullable=False, server_default=sa.text("'{}'::jsonb")), sa.Column('updated_at', sa.DateTime(), nullable=False, server_default=sa.text('CURRENT_TIMESTAMP')), ) # ensure index exists (but don't fail if it already exists) try: existing_indexes = {idx['name'] for idx in inspector.get_indexes('dht_records')} except Exception: existing_indexes = set() if 'ix_dht_records_key' not in existing_indexes: op.create_index('ix_dht_records_key', 'dht_records', ['key']) # rdap_cache if not inspector.has_table('rdap_cache'): op.create_table( 'rdap_cache', sa.Column('ip', sa.String(length=64), primary_key=True), sa.Column('asn', sa.Integer(), nullable=True), sa.Column('source', sa.String(length=64), nullable=True), sa.Column('updated_at', sa.DateTime(), nullable=False, server_default=sa.text('CURRENT_TIMESTAMP')), ) def downgrade() -> None: try: op.drop_table('rdap_cache') except Exception: pass try: op.drop_index('ix_dht_records_key', table_name='dht_records') except Exception: pass try: op.drop_table('dht_records') except Exception: pass