43 lines
1.4 KiB
Python
43 lines
1.4 KiB
Python
"""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."""
|