Symbol der App Calíope

Die Treiber, die ich schreibe

Neun Clients, jeder nach dem geschrieben, was seine Hersteller veröffentlichen.

Calíope spricht mit acht Arten von Servern über Clients, die ich selbst geschrieben habe. Jeder stammt aus dem, was seine Hersteller veröffentlichen: ihrer Spezifikation und Dokumentation oder, wo sie keine Spezifikation veröffentlichen, wie bei Oracle, dem Treiber, den sie selbst als Referenz nennen; nie aus dem Client eines anderen. Und jeder implementiert, was Calíope braucht, und nichts mehr. Diese Seite fasst jeden in drei Teilen zusammen: wonach er geschrieben ist, was er spricht und was er bewusst weglässt, mit dem Grund.

Hinter jeder Zusammenfassung steht eine vollständige Spezifikation: jede Nachricht, jede Anmeldemethode, wie der Client gebaut ist und wie er gegen echte Server getestet wird. Sie liegt im Quellcode-Repository, auf Spanisch, und wird bei jedem Commit gegen den Code geprüft, den sie beschreibt: Ändert sich ein Treiber, muss sein Dokument neu gelesen werden, bevor die Änderung hineinkommt.

MySQL und MariaDB

Geschrieben nach

Was er spricht

  • Die Verbindungsphase mit der Aushandlung der Fähigkeiten, und TLS, das mittendrin beginnt.
  • Die Anmeldung mit mysql_native_password, caching_sha2_password, client_ed25519, parsec und mysql_clear_password, Letzteres nur über TLS.
  • Textabfragen (COM_QUERY) mit mehreren Ergebnissen pro Antwort, sodass ein CALL seine Zeilen liefert.
  • Prepared Statements (COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_CLOSE) mit binären Zeilen: Die Werte reisen getrennt vom SQL.
  • LOCAL INFILE, das nur die Datei sendet, die du auswählst.
  • Betroffene Zeilen, die letzte eingefügte ID, Warnungen und den Transaktionsstatus, so wie der Server sie in seiner eigenen Antwort meldet.
  • Das Anhalten einer laufenden Abfrage mit KILL QUERY über eine zweite Verbindung.

Was er nicht spricht

  • CLIENT_MULTI_STATEMENTS: wird nie deklariert. Der Editor sendet eine Anweisung nach der anderen, und ohne diese Fähigkeit kann eingeschleuster Text keine zweite Anweisung anhängen.
  • Kompression und das X-Protokoll (Port 33060): Kein Werkzeug braucht sie.
  • Serverseitige Cursor: Große Ergebnisse kommen stattdessen Zeile für Zeile.
  • Replikation, COM_CHANGE_USER und die Binlog-Befehle: Kein Werkzeug nutzt sie.
  • Andere Anmeldemethoden (sha256_password, Kerberos, LDAP SASL, GSSAPI): werden mit dem Namen der Methode abgelehnt, sodass der Fehler sagt, was fehlt.
  • Ein Klartext-Passwort über eine unverschlüsselte Verbindung: niemals.
  • Server vor MySQL 4.1.

Auch TiDB

  • TiDB spricht dasselbe Protokoll und geht deshalb über denselben Client, gemessen gegen TiDB 8.5. Seine Begrüßung trägt 8.0.11-TiDB-v8.5.8, und diese Versionszeichenkette sagt Calíope, dass es mit TiDB spricht, egal was im Profil steht.
  • Die Verbindungs-ID von TiDB kann 64 Bit breit sein, die Begrüßung trägt aber nur die unteren 32, und ein KILL QUERY damit hält nichts an: Bei TiDB frage ich CONNECTION_ID() einmal pro Verbindung ab und breche mit der ganzen ID ab.
  • Die eigenen Anmeldemethoden von TiDB (tidb_sm3_password, tidb_auth_token): nicht gesprochen und mit dem Namen der Methode abgelehnt, wie jede andere.
  • Sein Status-Port (10080) und seine Prometheus-Metriken: ein zweiter Port, den du öffnen und durch den Tunnel führen müsstest. Gezeigt wird, was die SQL-Verbindung liefert, der Rest sagt n/a.

PostgreSQL

Geschrieben nach

Was er spricht

  • TLS wird vor allem anderen angefragt; lehnt der Server ab, geht nichts im Klartext hinaus.
  • Die Anmeldung mit SCRAM-SHA-256, md5 oder Klartext-Passwort, Letzteres nur über TLS.
  • Die einfache und die erweiterte Abfrage (Parse, Bind, Execute), mit den Parametern getrennt vom SQL.
  • Jeder Wert als Text, derselbe, den psql zeigt, Zeile für Zeile geliefert, sobald er ankommt.
  • Betroffene Zeilen, Fehler und Hinweise mit allen ihren Feldern, und der Transaktionsstatus mit jeder Antwort.
  • Das Abbrechen mit CancelRequest und dem Schlüssel, den der Server bei der Anmeldung übergibt, und DISCARD ALL, bevor eine Verbindung in den Pool zurückgeht.

Was er nicht spricht

  • COPY: Calíope sendet es nie; ein im Editor getipptes schließt die Verbindung, weil der Server auf Daten warten würde, die nie kommen.
  • LISTEN/NOTIFY: Benachrichtigungen werden gelesen und verworfen.
  • Kerberos (GSSAPI) und SSPI: Sie brauchen System-Tickets, die die Sandbox nicht gibt.
  • SCRAM mit Kanalbindung (SCRAM-SHA-256-PLUS): Der Server kann sie nicht verlangen, also ändert sie nichts daran, wer hineinkommt.
  • Binäre Ergebnisse, benannte Cursor, benannte Prepared Statements und Pipelining: eine Anfrage unterwegs pro Verbindung.
  • Das Replikationsprotokoll und Funktionsaufrufe.
  • Ein Klartext-Passwort über eine unverschlüsselte Verbindung: niemals.

MongoDB

Geschrieben nach

Was er spricht

  • BSON, Typ für Typ, einschließlich Decimal128.
  • OP_MSG und der hello-Handshake, mit MongoDB 4.0 oder neuer.
  • Die Anmeldung mit SCRAM-SHA-256 und SCRAM-SHA-1.
  • TLS mit derselben Richtlinie wie bei allen anderen Engines.
  • Connection Strings, mongodb:// und mongodb+srv://, mit den SRV- und TXT-Einträgen über das DNS des Systems.
  • Der Primary eines Replica Sets, aus der Antwort auf hello gelesen, und ein Verbindungspool.

Was er nicht spricht

  • Jede Nachricht außer OP_MSG: Ein Server, der nur die alten spricht, ist älter als 4.0 und wird abgelehnt.
  • Kompression und Exhaust-Cursor: Jeder Befehl wartet auf seine Antwort.
  • Sessions, Transaktionen, Change Streams, wiederholbare Schreibvorgänge und das Lesen von Secondaries: Die Werkzeuge nutzen sie nicht, und alles geht an den Primary.
  • Anmeldemethoden, die nicht SCRAM sind (x.509, Kerberos, LDAP, AWS, OIDC): Der Fehler nennt, was der Server anbietet.
  • Veraltete BSON-Typen: werden gelesen und als nicht unterstützt angezeigt, nie geschrieben.
  • Dateioptionen im Connection String (tlsCAFile): Die Sandbox lässt die App keinen Pfad lesen, also gehören die Zertifikate ins Profil.
  • Ein mongodb+srv://-Name durch einen SSH-Tunnel: Das andere Ende würde ihn auflösen, nicht dein Gerät.

Redis

Geschrieben nach

Was er spricht

  • RESP2 und RESP3, alle Typen, jede Antwort ihrem Befehl über die Position zugeordnet.
  • Die Anmeldung mit HELLO oder AUTH, mit einem ACL-Benutzer und seinem Passwort.
  • SELECT, auf jede Verbindung angewendet, wenn sie verliehen wird, und TLS mit derselben Richtlinie wie bei allen anderen Engines.
  • Der Cluster-Modus: die 16.384 Slots, eine neu gelesene Karte nach MOVED, ein einmaliges ASK.
  • Eine Konsole, die jeden Befehl, den du tippst, gegen eine Liste prüft, bevor er den Server erreicht.
  • Ein Sentinel, geöffnet über sein eigenes Profil: Topologie zeigt die Primaries, die er überwacht, ihre Replicas und die anderen Sentinels, so wie er sie meldet (SENTINEL MASTERS, REPLICAS, SENTINELS).

Was er nicht spricht

  • Die Inline-Form der Befehle: Sie kann keine beliebigen Bytes tragen.
  • Pub/Sub und MONITOR: Nichts im Client abonniert.
  • Transaktionen (MULTI, WATCH), blockierende Befehle ohne Zeitlimit, CLIENT REPLY OFF, RESET und Replikationsbefehle: Eine Verbindung aus dem Pool teilen sich alle Werkzeuge, und sie würden Zustand darauf hinterlassen.
  • Clientseitiges Caching und das Nachverfolgen über Sentinel, welcher Knoten gerade Primary ist: Der Client verbindet sich mit der Adresse im Profil.
  • Ein Cluster durch einen SSH-Tunnel: Die Knoten melden Adressen, die der Tunnel nicht erreicht, also wird er vor dem Verbinden abgelehnt.

Auch Valkey

  • Valkey spricht RESP2 und RESP3 wie Redis und geht deshalb über denselben Client, gemessen gegen Valkey 8.0 und 9.1, einzeln und im Cluster mit wandernden Slots. HELLO antwortet server valkey, und das sagt Calíope, mit welchem der beiden es spricht.
  • Valkey veröffentlicht kein redis_mode:: Ohne HELLO wird der Modus aus server_mode: in INFO server gelesen.
  • Was Valkey obendrauf bringt (COMMANDLOG, nummerierte Datenbanken im Cluster): nicht gesprochen. SLOWLOG gibt es weiterhin, und das liest Langsame Befehle.

SQL Server (TDS)

Geschrieben nach

Was er spricht

  • Immer verschlüsselt: zuerst der strenge Modus von TDS 8.0, TLS ab dem ersten Byte mit TLS 1.2 oder neuer, und der Handshake von TDS 7.x im PRELOGIN, wenn der Server den strengen Modus nicht anbietet.
  • PRELOGIN und LOGIN7 (TDS 7.4) mit einer SQL-Server-Anmeldung.
  • Batches (SQL_BATCH) und parametrisierte Abfragen über RPC an sp_executesql, mit typisierten Werten getrennt vom SQL.
  • Der Token-Strom: Spalten, Zeilen, Zeilenzahlen, Fehler, Meldungen und Umgebungsänderungen, und die Typen von SQL Server, räumliche eingeschlossen.
  • Das Abbrechen mit ATTENTION, und RESETCONNECTION, bevor eine Verbindung in den Pool zurückgeht.
  • GO als Batch-Trenner, vom Client behandelt wie von den Werkzeugen von SQL Server.

Was er nicht spricht

  • MARS: eine Anfrage pro Verbindung, und eine Verbindung pro Nutzer des Pools.
  • Die integrierte Windows-Authentifizierung (SSPI, Kerberos, NTLM): Sie braucht eine Domäne und einen Kerberos-Client, die die Sandbox nicht hat.
  • Microsoft Entra ID: ein OAuth-Ablauf gegen Microsoft, ein eigenes Produkt.
  • Unverschlüsselte Verbindungen, oder solche, die nur die Anmeldung verschlüsseln würden: werden abgelehnt.
  • Massenladen, Anfragen an den Transaktionsmanager und das Routing von Always On: Transaktionen reisen als T-SQL, Ladevorgänge als INSERT.
  • text, ntext, image, hierarchyid und benutzerdefinierte CLR-Typen: werden als nicht unterstützt angezeigt.

ClickHouse (HTTP)

Geschrieben nach

  • Die ClickHouse-Dokumentation zu ihrer HTTP-Schnittstelle, ihren Formaten und Einstellungen, der Syntax der Abfrageparameter und ihren Systemtabellen.
  • RFC 3986 für die Kodierung des Query-Strings.
  • Und der Server selbst, der seine Einstellungen, Funktionen und Typen in seinen eigenen system-Tabellen beschreibt.

Was er spricht

  • HTTP oder HTTPS auf Apples URLSession, ohne zusätzliche Abhängigkeit: eine Anweisung pro Anfrage, die Datenbank in jeder Anfrage.
  • Typisierte Abfrageparameter ({name:Typ}): Die Werte reisen getrennt vom SQL.
  • Ergebnisse werden Zeile für Zeile gelesen, sobald die Abfrage fertig ist, sodass ein Fehler am Ende eines 200 OK erkannt wird.
  • Eine Obergrenze für zurückgegebene Zeilen, neben der Zahl angegeben, die sie begrenzt.
  • Eine Session nur für einen Batch, der eine braucht, der Fortschritt aus system.processes und das Anhalten mit KILL QUERY.
  • TLS mit denselben drei Optionen wie bei den anderen Engines; durch einen SSH-Tunnel wird das Zertifikat weiterhin gegen den Host des Profils geprüft.

Was er nicht spricht

  • Das native TCP-Protokoll (Port 9000) und sein Format: Die HTTP-Schnittstelle liefert, was Calíope braucht, ohne binäres Protokoll und ohne Abhängigkeit.
  • gRPC und die Schnittstellen, die MySQL oder PostgreSQL nachahmen.
  • Mehrere Anweisungen pro Anfrage, oder eine Session pro Tab: Der Server lehnt zwei gleichzeitige Anfragen auf einer Session ab.
  • Daten im Body der Anfrage und externe Tabellen: Die Inserts der App reisen als SQL.
  • Client-Zertifikate: Ein Profil, das sie mitbringt, wird abgelehnt.
  • Transaktionen: Der Server hat keine.

Oracle Database (TNS)

Geschrieben nach

  • Oracle veröffentlicht keine Spezifikation seines Netzwerkprotokolls. Was Oracle veröffentlicht und als öffentliche Referenz nennt, ist der Code des Thin-Modus seines eigenen Python-Treibers, python-oracledb, unter der Universal Permissive License 1.0 oder der Apache License 2.0. Ich schreibe danach, wie er am 6. Oktober 2026 stand, in einer festen Revision; jede Datei, die davon abgeleitet ist, sagt es, und seine Lizenz reist mit den übrigen Drittanbieter-Hinweisen von Calíope.
  • Die Dokumentation von Oracle: die SQL Language Reference, die Database Reference für die Sichten des Data Dictionary, die Referenz der PL/SQL-Pakete und die Net Services Reference.
  • Die übrigen Oracle-Clients, in jeder Sprache, blieben ungeöffnet.

Was er spricht

  • TNS über TCP oder über TLS (TCPS), geprüft gegen die Zertifikate des Systems oder das, das das Profil mitbringt, mit dem Namen weiterhin gegen den Host des Profils geprüft, auch durch einen SSH-Tunnel, und die Weiterleitungen des Listeners.
  • Die Anmeldung mit dem Datenbankpasswort (O5LOGON).
  • Anweisungen mit typisierten Werten getrennt vom SQL und die Zeilen in Stapeln; CLOB und BLOB werden bis zu einer Obergrenze vollständig gelesen, darüber nennt die Zelle ihre Größe.
  • Das Abbrechen einer laufenden Anweisung.

Was er nicht spricht

  • Die Unterbrechung außerhalb des Bands: SwiftNIO kann sie nicht senden, deshalb läuft das Abbrechen immer im Band.
  • Wallet und Client-Zertifikate, Zugriffstoken, Kerberos und die Anmeldung über das Betriebssystem: Angemeldet wird mit dem Passwort, mit TLS in einer Richtung, und ein Profil mit Client-Zertifikat wird abgelehnt.
  • Objekttypen, Collections, XMLTYPE, binäres JSON, VECTOR und BFILE zu dekodieren: Die Zelle nennt stattdessen den Typ.
  • DRCP, der eigene Sitzungspool des Treibers, Pipelining und die schnelle Authentifizierung.
  • Advanced Queuing, das Zwei-Phasen-Commit, das Laden über den direkten Pfad und Änderungsbenachrichtigungen.
  • tnsnames.ora und sqlnet.ora: Das Profil bringt Host, Port und Dienst mit.

Apache Cassandra und ScyllaDB (CQL)

Geschrieben nach

  • Der Spezifikation des nativen Protokolls v4, die das Apache-Cassandra-Projekt veröffentlicht, in einer festen Revision vom 3. April 2025.
  • Was ScyllaDB dem Protokoll hinzufügt und Calíope liest, die Schlüssel SCYLLA_* von SUPPORTED, gemessen am Server.
  • Andere Cassandra-Clients, in welcher Sprache auch immer, wurden nicht geöffnet.

Was er spricht

  • Version 4 des nativen Protokolls, die Cassandra ab 4.1 und ScyllaDB ab 2025.1 sprechen, wobei jede Antwort über ihren Stream ihrer Anfrage zugeordnet wird.
  • Anmeldung mit Passwort (SASL PLAIN gegen PasswordAuthenticator), TLS mit optionalem Client-Zertifikat und SSH-Tunnel.
  • Abfragen mit Konsistenzstufe, Paging über paging_state, vorbereitete Anweisungen für gebundene Werte, Batches logged und unlogged und Tracing auf Wunsch.
  • Alle CQL-Typen, so geschrieben, wie cqlsh sie schreibt.
  • Ein Treiber für beide Server: OPTIONS wird vor der Anmeldung beantwortet, und die Schlüssel SCYLLA_* in dieser Antwort sagen Calíope, mit welchem der beiden es spricht.

Was er nicht spricht

  • Protokollversion 5 und neuer: Version 4 sprechen beide Server in jeder Version, die Calíope unterstützt.
  • Komprimierung und REGISTER mit seinen Ereignissen: Ein Desktop-Client braucht keins von beiden.
  • Token-basiertes Routing: Der Client spricht mit dem Kontaktpunkt des Profils oder mit dessen Alternative.
  • Anmeldung über Kerberos und LDAP.

Elasticsearch und OpenSearch (REST)

Geschrieben nach

  • Der Spezifikation der REST-API, die Elastic veröffentlicht, und der, die das OpenSearch-Projekt veröffentlicht, beide in einer festen Revision: die von Elastic vom 20. Oktober 2026 und die Version v0.2.0 von OpenSearch vom 25. Mai 2025.
  • Ihrer öffentlichen API-Dokumentation und, wo keine genug sagt, den Servern selbst, gemessen an Elasticsearch 9.5 und OpenSearch 3.9.
  • Kibana, OpenSearch Dashboards und die offiziellen Clients, in welcher Sprache auch immer, wurden nicht geöffnet.

Was er spricht

  • Die REST-API über HTTP oder HTTPS auf Apples URLSession, ohne zusätzliche Abhängigkeit, für Elasticsearch ab 8.18 und OpenSearch ab 2.19.
  • Anmeldung mit Benutzer und Passwort oder, in Elasticsearch, mit API-Schlüssel; und GET / beim Verbinden, dessen Antwort Calíope sagt, mit welchem der beiden es spricht.
  • TLS mit eigener Zertifizierungsstelle und optionalem Client-Zertifikat; die Prüfung abzuschalten nur als ausdrückliche Wahl von dir, mit sichtbarer Warnung; und SSH-Tunnel.
  • Query DSL und die Tabellensprachen jedes Produkts: SQL in beiden, ES|QL in Elasticsearch, PPL in OpenSearch.
  • Einen Snapshot wiederherstellen, unter Snapshots mit Wiederherstellen: die Indizes, die du auswählst, auf Wunsch unter einem anderen Namen (rename_pattern), und den globalen Zustand des Clusters nur, wenn du ihn anforderst.

Was er nicht spricht

  • Was zu Kibana oder OpenSearch Dashboards gehört: Dashboards, Visualisierungen, Discover und Alerting.
  • Neu indexieren, Lebenszyklus-Richtlinien, Vorlagen oder Pipelines bearbeiten und die Replikation zwischen Clustern: Calíope zeigt sie und überlässt das Ändern dem Server.
  • Maschinelles Lernen und Vektorsuche nach Ähnlichkeit: Vektorfelder werden angezeigt, nicht abgefragt.
  • Funktionen, die eine kostenpflichtige Lizenz verlangen.