62 lines
1.9 KiB
Python
62 lines
1.9 KiB
Python
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")
|