"""Schnittstelle, die jeder Datenbanktyp umsetzt.""" from contextlib import AbstractContextManager from dataclasses import dataclass from typing import Protocol from dbmcp.core.connection import Connection from dbmcp.core.result import Table @dataclass(frozen=True) class Check: version: str tables: int # Objekte, auf die der Nutzer schreiben darf; empfohlen ist 0 (Rolle nur mit SELECT) writable: int # Weitere Hinweise, z. B. systemweite Schreibrechte (Oracle: INSERT ANY TABLE) note: str = "" class Session(Protocol): def check(self) -> Check: ... def tables(self, limit: int) -> Table: """Spalten: schema, name, type (table|view), rows_estimate, comment.""" def describe(self, table: str, sample_rows: int) -> tuple[Table, Table]: """Spalten der Tabelle (name, type, nullable, comment) und die ersten Zeilen.""" def query(self, sql: str, max_rows: int) -> Table: ... class Driver(Protocol): name: str # Anzeigename, z. B. "PostgreSQL" key: str # Kurzname für Dienst und Image, z. B. "postgres" -> db-mcp-postgres default_port: int # Hinweise zum SQL-Dialekt für die Anleitung an das Modell dialect: str # Erlaubte erste Schlüsselwörter einer Abfrage starts: tuple[str, ...] def session(self, connection: Connection) -> AbstractContextManager[Session]: """Verbindung mit schreibgeschützter Transaktion, die am Ende zurückgerollt wird."""