Postgres: more information in EPQDatabaseError

(cherry picked from commit f9b1a5acfb)
This commit is contained in:
Ondrej Pokorny 2023-01-25 13:48:17 +01:00 committed by marcoonthegit
parent 69ffa43ccf
commit 143062c064
2 changed files with 52 additions and 6 deletions

View File

@ -85,6 +85,11 @@ type
MESSAGE_DETAIL:string; MESSAGE_DETAIL:string;
MESSAGE_HINT:string; MESSAGE_HINT:string;
STATEMENT_POSITION:string; STATEMENT_POSITION:string;
SCHEMA_NAME: string;
TABLE_NAME: string;
COLUMN_NAME: string;
DATATYPE_NAME: string;
CONSTRAINT_NAME: string;
end; end;
{ TPQTranConnection } { TPQTranConnection }
@ -691,6 +696,11 @@ var
MESSAGE_DETAIL: string; MESSAGE_DETAIL: string;
MESSAGE_HINT: string; MESSAGE_HINT: string;
STATEMENT_POSITION: string; STATEMENT_POSITION: string;
SCHEMA_NAME: string;
TABLE_NAME: string;
COLUMN_NAME: string;
DATATYPE_NAME: string;
CONSTRAINT_NAME: string;
P : Pchar; P : Pchar;
haveError : Boolean; haveError : Boolean;
@ -706,12 +716,18 @@ begin
else if (PQresultStatus(res) <> PGRES_COMMAND_OK) then else if (PQresultStatus(res) <> PGRES_COMMAND_OK) then
begin begin
HaveError:=True; HaveError:=True;
SEVERITY:=PQresultErrorField(res,ord('S')); SEVERITY:=PQresultErrorField(res,PG_DIAG_SEVERITY);
SQLSTATE:=PQresultErrorField(res,ord('C')); SQLSTATE:=PQresultErrorField(res,PG_DIAG_SQLSTATE);
MESSAGE_PRIMARY:=PQresultErrorField(res,ord('M')); MESSAGE_PRIMARY:=PQresultErrorField(res,PG_DIAG_MESSAGE_PRIMARY);
MESSAGE_DETAIL:=PQresultErrorField(res,ord('D')); MESSAGE_DETAIL:=PQresultErrorField(res,PG_DIAG_MESSAGE_DETAIL);
MESSAGE_HINT:=PQresultErrorField(res,ord('H')); MESSAGE_HINT:=PQresultErrorField(res,PG_DIAG_MESSAGE_HINT);
STATEMENT_POSITION:=PQresultErrorField(res,ord('P')); STATEMENT_POSITION:=PQresultErrorField(res,PG_DIAG_STATEMENT_POSITION);
SCHEMA_NAME:=PQresultErrorField(res,PG_DIAG_SCHEMA_NAME);
TABLE_NAME:=PQresultErrorField(res,PG_DIAG_TABLE_NAME);
COLUMN_NAME:=PQresultErrorField(res,PG_DIAG_COLUMN_NAME);
DATATYPE_NAME:=PQresultErrorField(res,PG_DIAG_DATATYPE_NAME);
CONSTRAINT_NAME:=PQresultErrorField(res,PG_DIAG_CONSTRAINT_NAME);
sErr:=PQresultErrorMessage(res); sErr:=PQresultErrorMessage(res);
if VerboseErrors then if VerboseErrors then
begin begin
@ -721,6 +737,11 @@ begin
MaybeAdd(sErr,'Error Detail',MESSAGE_DETAIL); MaybeAdd(sErr,'Error Detail',MESSAGE_DETAIL);
MaybeAdd(sErr,'Hint',MESSAGE_HINT); MaybeAdd(sErr,'Hint',MESSAGE_HINT);
MaybeAdd(sErr,'Character',STATEMENT_POSITION); MaybeAdd(sErr,'Character',STATEMENT_POSITION);
MaybeAdd(sErr,'Schema',SCHEMA_NAME);
MaybeAdd(sErr,'Table',TABLE_NAME);
MaybeAdd(sErr,'Column',COLUMN_NAME);
MaybeAdd(sErr,'Data Type',DATATYPE_NAME);
MaybeAdd(sErr,'Constraint',CONSTRAINT_NAME);
end; end;
end; end;
if HaveError then if HaveError then
@ -733,6 +754,12 @@ begin
E.MESSAGE_DETAIL:=MESSAGE_DETAIL; E.MESSAGE_DETAIL:=MESSAGE_DETAIL;
E.MESSAGE_HINT:=MESSAGE_HINT; E.MESSAGE_HINT:=MESSAGE_HINT;
E.STATEMENT_POSITION:=STATEMENT_POSITION; E.STATEMENT_POSITION:=STATEMENT_POSITION;
E.SCHEMA_NAME:=SCHEMA_NAME;
E.TABLE_NAME:=TABLE_NAME;
E.COLUMN_NAME:=COLUMN_NAME;
E.DATATYPE_NAME:=DATATYPE_NAME;
E.CONSTRAINT_NAME:=CONSTRAINT_NAME;
PQclear(res); PQclear(res);
res:=nil; res:=nil;
if assigned(conn) then if assigned(conn) then

View File

@ -14,6 +14,25 @@ const
ERROR_MSG_LENGTH = 4096; ERROR_MSG_LENGTH = 4096;
CMDSTATUS_LEN = 40; CMDSTATUS_LEN = 40;
PG_DIAG_SEVERITY = Ord('S');
PG_DIAG_SEVERITY_NONLOCALIZED = Ord('V');
PG_DIAG_SQLSTATE = Ord('C');
PG_DIAG_MESSAGE_PRIMARY = Ord('M');
PG_DIAG_MESSAGE_DETAIL = Ord('D');
PG_DIAG_MESSAGE_HINT = Ord('H');
PG_DIAG_STATEMENT_POSITION = Ord('P');
PG_DIAG_INTERNAL_POSITION = Ord('p');
PG_DIAG_INTERNAL_QUERY = Ord('q');
PG_DIAG_CONTEXT = Ord('W');
PG_DIAG_SCHEMA_NAME = Ord('s');
PG_DIAG_TABLE_NAME = Ord('t');
PG_DIAG_COLUMN_NAME = Ord('c');
PG_DIAG_DATATYPE_NAME = Ord('d');
PG_DIAG_CONSTRAINT_NAME = Ord('n');
PG_DIAG_SOURCE_FILE = Ord('F');
PG_DIAG_SOURCE_LINE = Ord('L');
PG_DIAG_SOURCE_FUNCTION = Ord('R');
Type Type
TSockAddr = Array [1..112] of byte; TSockAddr = Array [1..112] of byte;
TPGresAttDesc = record TPGresAttDesc = record