ich bräuchte mal einen Denkanstoß.
In der Software läuft ein TCP/SSL Server, der mit den Synapse-Komponenten gebaut ist.
Wenn in einer solchen Verbindung (ein Thread pro aktiver Verbindung) eine Authentifizierung laufen
soll, holt der Server den Benutzer aus der Datenbank (MySQL - mit TMysql55Connection) und soll die
Daten überprüfen.
Wenn ich aber die Abfrage aus diesem TCP Worker-Thread mache, legt sich der Thread mit einem SigSegv
auf die klappe.
Code: Alles auswählen
0046768C 83e801 sub $0x1,%eax
0046768F 761e jbe 0x4676af <DB$_$TPARAMS_$__$$_PARSESQL$crcB6516233+1263>
00467691 e9b1000000 jmp 0x467747 <DB$_$TPARAMS_$__$$_PARSESQL$crcB6516233+1415>
00467696 8d45ec lea -0x14(%ebp),%eax
00467699 e852bdf9ff call 0x4033f0 <fpc_ansistr_unique>
0046769E 8b55b4 mov -0x4c(%ebp),%edx
004676A1 c64410ff3f movb $0x3f,-0x1(%eax,%edx,1) <-----------------
004676A6 8345b401 addl $0x1,-0x4c(%ebp)
004676AA e998000000 jmp 0x467747 <DB$_$TPARAMS_$__$$_PARSESQL$crcB6516233+1415>
Wenn der Code (zum Testen) im Main-Thread ausgeführt wird funktioniert es tadellos.
Der gesamte Ablauf sieht ungefähr so aus:
1. SSL TCP Listener-Thread erzeugen
2. Auf Verbindung warten
3. Für die eingehende Verbindung einen Thread starten
4. Auf Datenpaket warten
5. Datenpaket mit Benutzername und Kennwort erhalten
6. Aus dem Datenbankpool eine freie Verbindung rausholen
7. Query absetzen (Hier knallts dann)
8. Verbindung wieder in den Pool werfen
Code, der die Query enthält:
Code: Alles auswählen
function TDBConnection.exec(q: string; p: TDBParams): TSQLQuery;
var op: string;
begin
Finuse := true;
Global.logger.trace('Exec SQL: ' + q);
query.SQL.Text := q;
if assigned(p) then
p.exec(query);
try
op := uppercase(copy(q, 1, 3));
if op = 'SEL' then
query.Open
else if op = 'INS' then
begin
query.ExecSQL;
query.SQL.Text := 'SELECT LAST_INSERT_ID() as id;';
query.Open;
insertid := query.Fields[0].AsInteger;
query.Close;
end else
begin
query.ExecSQL;
end;
except
on e:exception do
Global.logger.error(e.message);
end;
result := query;
Finuse := false;
end;
Hoffe, jemand hat eine Idee, oder stellt mir die passende Frage