#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ITD Transport Tracking - проверка за достъп до база данни. Ако липсват таблиците ITD_Cards и ITD_Cycles, изпълнява schema.sql. """ import os import sys from itd_db import load_connection_string try: import pyodbc except ImportError: pyodbc = None def check_tables(cursor): """Проверява дали съществуват таблиците ITD_Cards и ITD_Cycles.""" cursor.execute(""" SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME IN ('ITD_Cards', 'ITD_Cycles') """) found = {row[0] for row in cursor.fetchall()} return "ITD_Cards" in found, "ITD_Cycles" in found def run_schema(cursor, schema_path): """Изпълнява schema.sql (батчове разделени с GO).""" with open(schema_path, "r", encoding="utf-8") as f: content = f.read() content = content.replace("\r\n", "\n") # Разделяме по редове съдържащи само GO batches = [] current = [] for line in content.split("\n"): if line.strip().upper() == "GO": batch = "\n".join(current).strip() if batch and not all(l.strip().startswith("--") or not l.strip() for l in current): batches.append(batch) current = [] else: current.append(line) if current: batch = "\n".join(current).strip() if batch: batches.append(batch) for batch in batches: try: cursor.execute(batch) except pyodbc.Error as e: print(f"Грешка при изпълнение на батч: {e}", file=sys.stderr) raise def main(): script_dir = os.path.dirname(os.path.abspath(__file__)) os.chdir(script_dir) print("ITD: проверка за достъп до база данни...") try: conn_str = load_connection_string() except Exception as e: print(f"Грешка при зареждане на настройките: {e}", file=sys.stderr) return 1 if pyodbc is None: print("Грешка: инсталирайте pyodbc (pip install pyodbc)", file=sys.stderr) return 1 try: conn = pyodbc.connect(conn_str, autocommit=True) except Exception as e: print(f"Грешка при свързване към SQL Server: {e}", file=sys.stderr) return 1 try: cursor = conn.cursor() schema_path = os.path.join(script_dir, "schema.sql") if os.path.isfile(schema_path): run_schema(cursor, schema_path) has_cards, has_cycles = check_tables(cursor) if has_cards and has_cycles: print("Достъп до база данни: OK. Таблиците ITD_Cards и ITD_Cycles съществуват.") return 0 print("Внимание: след изпълнение на schema.sql липсват таблици.", file=sys.stderr) return 1 finally: conn.close() if __name__ == "__main__": sys.exit(main())