@@ -61,18 +61,52 @@ inline bool bad_result(PGresult* result) {
61
61
status == PGRES_FATAL_ERROR;
62
62
}
63
63
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
+
64
97
void query_result (GLua::ILuaInterface* lua, pg::result&& result,
65
98
GLua::AutoReference& callback) {
66
99
if (callback.Push ()) {
67
100
if (!bad_result (result.get ())) {
68
101
lua->PushBool (true );
69
102
create_result_table (lua, result.get ());
103
+ pcall (lua, 2 , 0 );
70
104
} else {
71
105
lua->PushBool (false );
72
106
lua->PushString (PQresultErrorMessage (result.get ()));
107
+ create_result_error_table (lua, result.get ());
108
+ pcall (lua, 3 , 0 );
73
109
}
74
-
75
- pcall (lua, 2 , 0 );
76
110
}
77
111
}
78
112
0 commit comments