import os import re from alembic import op revision = "0022" down_revision = "0021" branch_labels = None depends_on = None _DOLLAR_TAG_RE = re.compile(r"\$\w+\$") def _split_statements(sql: str) -> list[str]: statements: list[str] = [] current: list[str] = [] dollar_tag: str | None = None for line in sql.splitlines(): stripped = line.strip() if stripped.startswith("--"): continue if dollar_tag is None: match = _DOLLAR_TAG_RE.search(stripped) if match: dollar_tag = match.group(0) elif stripped.startswith(dollar_tag): dollar_tag = None current.append(line) if dollar_tag is None and stripped.endswith(";"): statements.append("\n".join(current)) current = [] if remaining := "\n".join(current).strip(): statements.append(remaining) return statements def upgrade() -> None: ddl_path = os.path.join( os.path.dirname(__file__), "sql", "0022_summary2_contract_rows.sql" ) with open(ddl_path) as ddl_file: statements = _split_statements(ddl_file.read()) for statement in statements: op.execute(statement.rstrip(";").strip()) def downgrade() -> None: op.execute("DROP FUNCTION IF EXISTS v3.v_svod2_rf(integer, integer[], integer, integer, varchar, varchar)") op.execute("DROP FUNCTION IF EXISTS v3.v_svod2_go(integer, integer[], integer, integer, varchar, varchar)") op.execute("DROP FUNCTION IF EXISTS v3.v_svod2_rf(integer, integer[], integer, integer)") op.execute("DROP FUNCTION IF EXISTS v3.v_svod2_go(integer, integer[], integer, integer)") op.execute("DROP FUNCTION IF EXISTS v3.v_svod2_rf(integer, integer[])") op.execute("DROP FUNCTION IF EXISTS v3.v_svod2_go(integer, integer[])") op.execute("DROP INDEX IF EXISTS v3.ix_v3_budget_line_svod2") op.execute("DROP INDEX IF EXISTS v3.ix_v3_budget_form_svod2")