Skip to content

Commit 03de526

Browse files
committed
Detailed errors for queries
1 parent f0e39d4 commit 03de526

File tree

1 file changed

+36
-2
lines changed

1 file changed

+36
-2
lines changed

source/query.cpp

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,18 +61,52 @@ inline bool bad_result(PGresult* result) {
6161
status == PGRES_FATAL_ERROR;
6262
}
6363

64+
#define set_error_field(name, field) \
65+
{ \
66+
const char* field_value = PQresultErrorField(result, field); \
67+
if (field_value) { \
68+
lua->PushString(field_value); \
69+
lua->SetField(-2, name); \
70+
} \
71+
}
72+
73+
inline void create_result_error_table(GLua::ILuaInterface* lua,
74+
PGresult* result) {
75+
lua->CreateTable();
76+
77+
lua->PushString(PQresStatus(PQresultStatus(result)));
78+
lua->SetField(-2, "status");
79+
80+
set_error_field("severity", PG_DIAG_SEVERITY_NONLOCALIZED);
81+
set_error_field("sqlState", PG_DIAG_SQLSTATE);
82+
set_error_field("messagePrimary", PG_DIAG_MESSAGE_PRIMARY);
83+
set_error_field("messageDetail", PG_DIAG_MESSAGE_DETAIL);
84+
set_error_field("messageHint", PG_DIAG_MESSAGE_HINT);
85+
set_error_field("statementPosition", PG_DIAG_STATEMENT_POSITION);
86+
set_error_field("context", PG_DIAG_CONTEXT);
87+
set_error_field("schemaName", PG_DIAG_SCHEMA_NAME);
88+
set_error_field("tableName", PG_DIAG_TABLE_NAME);
89+
set_error_field("columnName", PG_DIAG_COLUMN_NAME);
90+
set_error_field("dataType", PG_DIAG_DATATYPE_NAME);
91+
set_error_field("constraintName", PG_DIAG_CONSTRAINT_NAME);
92+
set_error_field("sourceFile", PG_DIAG_SOURCE_FILE);
93+
set_error_field("sourceLine", PG_DIAG_SOURCE_LINE);
94+
set_error_field("sourceFunction", PG_DIAG_SOURCE_FUNCTION);
95+
}
96+
6497
void query_result(GLua::ILuaInterface* lua, pg::result&& result,
6598
GLua::AutoReference& callback) {
6699
if (callback.Push()) {
67100
if (!bad_result(result.get())) {
68101
lua->PushBool(true);
69102
create_result_table(lua, result.get());
103+
pcall(lua, 2, 0);
70104
} else {
71105
lua->PushBool(false);
72106
lua->PushString(PQresultErrorMessage(result.get()));
107+
create_result_error_table(lua, result.get());
108+
pcall(lua, 3, 0);
73109
}
74-
75-
pcall(lua, 2, 0);
76110
}
77111
}
78112

0 commit comments

Comments
 (0)