Postgres: more information in EPQDatabaseError

This commit is contained in:
Ondrej Pokorny 2023-01-25 13:48:17 +01:00
parent 0907628b73
commit f9b1a5acfb
2 changed files with 52 additions and 6 deletions

View File

@ -85,6 +85,11 @@ type
MESSAGE_DETAIL:string;
MESSAGE_HINT:string;
STATEMENT_POSITION:string;
SCHEMA_NAME: string;
TABLE_NAME: string;
COLUMN_NAME: string;
DATATYPE_NAME: string;
CONSTRAINT_NAME: string;
end;
{ TPQTranConnection }
@ -691,6 +696,11 @@ var
MESSAGE_DETAIL: string;
MESSAGE_HINT: string;
STATEMENT_POSITION: string;
SCHEMA_NAME: string;
TABLE_NAME: string;
COLUMN_NAME: string;
DATATYPE_NAME: string;
CONSTRAINT_NAME: string;
P : Pchar;
haveError : Boolean;
@ -706,12 +716,18 @@ begin
else if (PQresultStatus(res) <> PGRES_COMMAND_OK) then
begin
HaveError:=True;
SEVERITY:=PQresultErrorField(res,ord('S'));
SQLSTATE:=PQresultErrorField(res,ord('C'));
MESSAGE_PRIMARY:=PQresultErrorField(res,ord('M'));
MESSAGE_DETAIL:=PQresultErrorField(res,ord('D'));
MESSAGE_HINT:=PQresultErrorField(res,ord('H'));
STATEMENT_POSITION:=PQresultErrorField(res,ord('P'));
SEVERITY:=PQresultErrorField(res,PG_DIAG_SEVERITY);
SQLSTATE:=PQresultErrorField(res,PG_DIAG_SQLSTATE);
MESSAGE_PRIMARY:=PQresultErrorField(res,PG_DIAG_MESSAGE_PRIMARY);
MESSAGE_DETAIL:=PQresultErrorField(res,PG_DIAG_MESSAGE_DETAIL);
MESSAGE_HINT:=PQresultErrorField(res,PG_DIAG_MESSAGE_HINT);
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);
if VerboseErrors then
begin
@ -721,6 +737,11 @@ begin
MaybeAdd(sErr,'Error Detail',MESSAGE_DETAIL);
MaybeAdd(sErr,'Hint',MESSAGE_HINT);
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;
if HaveError then
@ -733,6 +754,12 @@ begin
E.MESSAGE_DETAIL:=MESSAGE_DETAIL;
E.MESSAGE_HINT:=MESSAGE_HINT;
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);
res:=nil;
if assigned(conn) then

View File

@ -14,6 +14,25 @@ const
ERROR_MSG_LENGTH = 4096;
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
TSockAddr = Array [1..112] of byte;
TPGresAttDesc = record