
Eine Geschichte darüber, wie wir den Vertica JDBC-Treiber für DBeaver behoben haben
Beim Verbinden mit einer Vertica-Datenbank über eine DBeaver-Anwendung wurde ein Problem festgestellt (ce-4.2.2). Wenn Sie einen nicht standardisierten Port eingeben, beispielsweise 55555, versucht das Tool dennoch, sich mit dem Standardport 5433 zu verbinden.
Bildschirm 1
Diagnose der Probleme
Unter einer „Grund“-Zeile sehen Sie, dass die Verbindung mit dem Port 5433 fehlgeschlagen ist, und es gab auch einen Bericht, dass der Client eine Verbindung zum Port 55555 herstellen wollte.
Wenn jedoch eine kürzere Nummer (1234) eingegeben wird, tritt das Problem nicht auf.

Bildschirm 2
In diesem Fall schlug die Verbindung zum angegebenen Port 1234 fehl.
Nachbesprechung
Mit welchem Port wurde tatsächlich versucht, die Verbindung herzustellen? Es ist möglich, ein IDA Pro-Tool auszuführen und eine Verbindung zu einem DBeaver-Prozess herzustellen.
Zum Konvertieren von Endianness verwenden Anwendungen häufig eine Reihe von Funktionen „host to TCP/IP network“ aus einer NetWare API. Zum Konvertieren einer Zwei-Byte-Nummer (zum Beispiel eines TCP-Ports) ist es möglich, die Funktionen „htons“ zu verwenden.
Die „WinAPI“-Version der „htons“-Funktion befindet sich in „ws2_32.dll“. Sie müssen einen Import des Moduls „ws2_32.d“ finden und eine Liste der Funktionen öffnen.

Bildschirm 3
Dann müssen Sie einen Breakpoint beim Aufruf der „htons“-Funktion setzen.

Bildschirm 4
Wenn Sie den Port 1234 setzen und auf „Testverbindung“ klicken, stoppt das Debugging am Breakpoint.

Bildschirm 5
Zunächst können Sie feststellen, dass die Funktion den Wert über den Stack erhält.
00401A42 mov ebp, esp
00401A44 mov eax, [ebp + arg_0]
Diese Anweisungen setzen den Wert in ein EAX-Register vom oberen Stack durch einen Offset zu „arg_0“. „D2“ und „04“-Bytes im „Big Endian“-Format sind unsere Nummer 1234. Aber was ist, wenn wir die Nummer 55555 als Port angeben? Theoretisch sollten „03“ und „D9“-Bytes oben im Stack platziert werden.
Sie müssen erneut auf „Testverbindung“ klicken, aber mit dem Port 55555.

Bildschirm 6
Das ist seltsam, aber hier haben wir die Nummer 5433 im Stack (15 und 39 Bytes), was der Standardport von DBMS „Vertica“ ist. Es kann angenommen werden, dass das Programm sofort einen falschen Port setzt. Wir müssen herausfinden, wo das passiert. Um sich mit DBMS zu verbinden, verwendet Dbeaver JDBC und lädt standardmäßig Version 6.1.2 herunter.

Bildschirm 7
Es ist möglich, zu versuchen, einen Treiber (.jar) zu dekompilieren und zu untersuchen, was vor der Verbindung passiert. Eine Software namens „fernflower“ ist gut für diese Aufgabe geeignet. Es unterstützt viele Optionen zum Dekompilieren von Java-Anwendungen. Für eine einfache Analyse ist eine Standard-Dekompilierung ohne Flags geeignet.

Bildschirm 8
Nach Abschluss der Dekompilierung werden die Quellcodedateien dekompiliert vorliegen.
Sie müssen die Verwendung eines Standardports „HPE Vertica“ in einem Texteditor finden. Vielleicht können Sie die Substanz des Problems mit der Änderung des Ports 55555 in 5433 nachvollziehen.

Bildschirm 9
Es wird versucht, den Portwert zu einem Short-Typ in einer „loadPreonnectSettings“-Methode zu casten.
Falls dies nicht möglich ist, wird der Port 5433 verwendet. Ein Short-Typ in Java ist auf einen Bereich von -32.768 bis 32.767 begrenzt, daher wird der Wert 55555 eine Ausnahme werfen. Es stellt sich heraus, dass das Problem im JDBC-Treiber selbst liegt. Versuchen wir, seine Funktionsweise zu behoben.
Anwendungspatches
Zum Patchen von „class“-Dateien ist es möglich, DirtyJOE zu verwenden. Sie müssen „VConnection.class“ aus einem JAR-Archiv öffnen. Im „Methods“-Tab befindet sich eine Liste der Methoden dieses Objekts.

Bildschirm 10
Ein Doppelklick auf die Methode „loadPreConnectSettings“ öffnet den Codeeditor.

Bildschirm 11
Ein Aufruf der getShort-Methode tritt an Position 0000004E auf, das bedeutet, dass B6 ein Operationscode einer Anweisung ist und 003C ist eine Operandenmarke. Es ist notwendig, eine Anweisung für den getInt-Aufruf für ein Variant-Objekt zu ändern.

Bildschirm 12
Im Tab „Constant Pool“ befindet sich eine Liste der Klassenmethoden. Die Zahl 0060 ist genau die Nummer einer Methode in Dezimal.

Bildschirm 13
Eine Methode getInt wurde unten gefunden. Sie müssen zum Aufruf der getShort-Methode zurückkehren und den Befehl durch getInt ändern.

Bildschirm 14
Danach müssen Sie die Klasse speichern und die Originaldatei im JAR-Archiv ersetzen. Vor dem Patchen verband sich Dbeaver mit dem Port 55555 wie mit 5433.

Bildschirm 15
Jetzt wird der richtige Port für die Verbindung verwendet.
Fazit
Das Problem liegt, wie sich herausstellte, nicht im Dbeaver-Browser selbst, sondern im Treiber, den er für die Kommunikation mit einer Vertica-Datenbank herunterlädt.
Update 09.19
Dbeaver hat in der Version 4.3.0 das Herunterladen des JDBC für Vertica entfernt. Das bedeutet, dass die Anwendung die problematische Version dieses Treibers nicht mehr standardmäßig verwenden wird.