Skip to content

Commit 181c450

Browse files
committed
Added dbAddErrorHandler
1 parent 54711b6 commit 181c450

4 files changed

Lines changed: 45 additions & 13 deletions

File tree

src/connection.cpp

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ game_value Connection::cmd_execute(game_state& gs, game_value_parameter con, gam
157157
}
158158

159159
auto res = statement->query();
160-
160+
//#TODO handle error in create_statement and in query()
161161
auto gd_res = new GameDataDBResult();
162162
gd_res->res = res;
163163

@@ -190,9 +190,18 @@ game_value Connection::cmd_execute(game_state& gs, game_value_parameter con, gam
190190
return true;
191191
}
192192
catch (mariadb::exception::connection& x) {
193-
auto exText = r_string("Intercept-DB exception ") + x.what() + "\nat\n" + stmt;
194-
invoker_lock l();
195-
sqf::diag_log(exText);
193+
invoker_lock l;
194+
if (con->account()->hasErrorHandler()) {
195+
for (auto& it : con->account()->getErrorHandlers()) {
196+
197+
auto res = sqf::call(it, { static_cast<r_string>(x.what()), static_cast<size_t>(x.error_id()), stmt });
198+
199+
if (res.type_enum() == game_data_type::BOOL && static_cast<bool>(res)) break; //If returned true then error was handled.
200+
}
201+
} else {
202+
auto exText = r_string("Intercept-DB exception ") + x.what() + "\nat\n" + stmt;
203+
sqf::diag_log(exText);
204+
}
196205

197206
return false;
198207
}
@@ -236,9 +245,20 @@ game_value Connection::cmd_executeAsync(game_state&, game_value_parameter con, g
236245
__itt_task_end(domainConnection);
237246
return true;
238247
} catch (mariadb::exception::connection& x) {
239-
auto exText = r_string("Intercept-DB exception ") + x.what() + "\nat\n" + stmt;
240-
invoker_lock l();
241-
sqf::diag_log(exText);
248+
invoker_lock l;
249+
if (con->account()->hasErrorHandler()) {
250+
for (auto& it : con->account()->getErrorHandlers()) {
251+
252+
auto res = sqf::call(it, { static_cast<r_string>(x.what()), static_cast<size_t>(x.error_id()), stmt });
253+
254+
if (res.type_enum() == game_data_type::BOOL && static_cast<bool>(res)) break; //If returned true then error was handled.
255+
}
256+
} else {
257+
auto exText = r_string("Intercept-DB exception ") + x.what() + "\nat\n" + stmt;
258+
sqf::diag_log(exText);
259+
}
260+
261+
242262

243263
__itt_task_end(domainConnection);
244264
return false;
@@ -265,6 +285,14 @@ game_value Connection::cmd_isConnected(game_state&, game_value_parameter con) {
265285
return session && (session->connected() || Threading::get().isConnected(session->account()));
266286
}
267287

288+
game_value Connection::cmd_addErrorHandler(game_state&, game_value_parameter con, game_value_parameter handler) {
289+
auto session = con.get_as<GameDataDBConnection>()->session;
290+
if (!session) return {};
291+
292+
session->account()->addErrorHandler(handler);
293+
return {};
294+
}
295+
268296
void Connection::initCommands() {
269297

270298
auto dbType = host::register_sqf_type("DBCON"sv, "databaseConnection"sv, "TODO"sv, "databaseConnection"sv, createGameDataDBConnection);
@@ -276,6 +304,10 @@ void Connection::initCommands() {
276304
handle_cmd_createConnectionConfig = host::register_sqf_command("dbCreateConnection", "TODO", Connection::cmd_createConnectionConfig, GameDataDBConnection_typeE, game_data_type::STRING);
277305
handle_cmd_execute = host::register_sqf_command("dbExecute", "TODO", Connection::cmd_execute, Result::GameDataDBResult_typeE, GameDataDBConnection_typeE, Query::GameDataDBQuery_typeE);
278306
handle_cmd_executeAsync = host::register_sqf_command("dbExecuteAsync", "TODO", Connection::cmd_executeAsync, Result::GameDataDBAsyncResult_typeE, GameDataDBConnection_typeE, Query::GameDataDBQuery_typeE);
279-
handle_cmd_ping = host::register_sqf_command("dbPing", "TODO", Connection::cmd_ping, game_data_type::ARRAY, GameDataDBConnection_typeE);
280-
handle_cmd_isConnected = host::register_sqf_command("dbIsConnected", "TODO", Connection::cmd_isConnected, game_data_type::ARRAY, GameDataDBConnection_typeE);
307+
handle_cmd_ping = host::register_sqf_command("dbPing", "TODO", Connection::cmd_ping, game_data_type::BOOL, GameDataDBConnection_typeE);
308+
handle_cmd_isConnected = host::register_sqf_command("dbIsConnected", "TODO", Connection::cmd_isConnected, game_data_type::BOOL, GameDataDBConnection_typeE);
309+
handle_cmd_addErrorHandler = host::register_sqf_command("dbIsConnected", "TODO", Connection::cmd_addErrorHandler, game_data_type::ARRAY, GameDataDBConnection_typeE, game_data_type::CODE);
310+
311+
312+
281313
}

src/connection.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class Connection {
1414
static game_value cmd_executeAsync(game_state&, game_value_parameter con, game_value_parameter qu);
1515
static game_value cmd_ping(game_state&, game_value_parameter con);
1616
static game_value cmd_isConnected(game_state&, game_value_parameter con);
17-
17+
static game_value cmd_addErrorHandler(game_state&, game_value_parameter con, game_value_parameter handler);
1818

1919

2020

@@ -29,4 +29,5 @@ class Connection {
2929
static inline types::registered_sqf_function handle_cmd_executeAsync;
3030
static inline types::registered_sqf_function handle_cmd_ping;
3131
static inline types::registered_sqf_function handle_cmd_isConnected;
32+
static inline types::registered_sqf_function handle_cmd_addErrorHandler;
3233
};

src/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ void intercept::on_frame() {
5858
for (auto& it : Threading::get().completedAsyncTasks) {
5959
__itt_task_begin(domainMain, __itt_null, __itt_null, main_on_frame_callback);
6060

61-
if (!it->data->callback.is_nil()) {
61+
if (!it->data->callback.is_nil() && it->data->res) {
6262
logMessageWithTime("task callback");
6363
auto gd_res = new GameDataDBResult();
6464
gd_res->res = it->data->res;

src/res.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ game_value Result::cmd_toArray(game_state&, game_value_parameter right) {
3939
auto_array<game_value> row;
4040

4141
for (size_t i = 0u; i < res->column_count(); ++i) {
42-
4342
switch (res->column_type(i)) {
4443
case mariadb::value::null: row.emplace_back(game_value{}); break;
4544
case mariadb::value::date: row.emplace_back(res->get_date(i).str()); break;
@@ -60,7 +59,7 @@ game_value Result::cmd_toArray(game_state&, game_value_parameter right) {
6059
case mariadb::value::double64: row.emplace_back(static_cast<float>(res->get_double(i))); break;
6160
case mariadb::value::enumeration: row.emplace_back(res->get_string(i)); break;
6261
default: ;
63-
}
62+
}
6463
}
6564
result.emplace_back(std::move(row));
6665
}

0 commit comments

Comments
 (0)