22#include < mariadb++/connection.hpp>
33#include " query.h"
44#include " res.h"
5+ #include " mariadb++/exceptions.hpp"
6+ #include < winsock2.h>
57
68using namespace intercept ::client;
79extern auto_array<ref<GameDataDBAsyncResult>> asyncWork;
@@ -72,6 +74,18 @@ game_value Connection::cmd_createConnectionArray(uintptr_t, game_value_parameter
7274
7375 newCon->session = mariadb::connection::create (acc);
7476
77+ return newCon;
78+ }
79+
80+ game_value Connection::cmd_createConnectionConfig (uintptr_t , game_value_parameter right) {
81+
82+ auto acc = Config::get ().getAccount (right);
83+ if (!acc) return {};
84+
85+
86+ auto newCon = new GameDataDBConnection ();
87+
88+ newCon->session = mariadb::connection::create (acc);
7589
7690 return newCon;
7791}
@@ -119,7 +133,7 @@ class callstack_item_WaitForQueryResult : public vm_context::callstack_item {
119133
120134};
121135
122- game_value Connection::cmd_query (uintptr_t g , game_value_parameter con, game_value_parameter qu) {
136+ game_value Connection::cmd_execute (uintptr_t g , game_value_parameter con, game_value_parameter qu) {
123137
124138 auto gs = reinterpret_cast <game_state*>(g);
125139
@@ -129,7 +143,7 @@ game_value Connection::cmd_query(uintptr_t g , game_value_parameter con, game_va
129143 auto session = con.get_as <GameDataDBConnection>()->session ;
130144 auto query = qu.get_as <GameDataDBQuery>();
131145
132- auto statement = session->create_statement (query->queryString );
146+ auto statement = session->create_statement (query->getQueryString () );
133147
134148 uint32_t idx = 0 ;
135149 for (auto & it : query->boundValues ) {
@@ -172,28 +186,38 @@ game_value Connection::cmd_query(uintptr_t g , game_value_parameter con, game_va
172186 return 123 ;
173187}
174188
175- game_value Connection::cmd_queryAsync (uintptr_t , game_value_parameter con, game_value_parameter qu) {
189+ game_value Connection::cmd_executeAsync (uintptr_t , game_value_parameter con, game_value_parameter qu) {
176190
177191 auto session = con.get_as <GameDataDBConnection>()->session ;
178192 auto query = qu.get_as <GameDataDBQuery>();
179193
180194 auto gd_res = new GameDataDBAsyncResult ();
181195 gd_res->data = std::make_shared<GameDataDBAsyncResult::dataT>();
182196 gd_res->data ->res =
183- std::async (std::launch::async,[session, stmt = query->queryString , boundV = query->boundValues ]() -> mariadb::result_set_ref
197+ std::async (std::launch::async,[session, stmt = query->getQueryString () , boundV = query->boundValues ]() -> mariadb::result_set_ref
184198 {
185- auto statement = session->create_statement (stmt);
186199
187- uint32_t idx = 0 ;
188- for (auto & it : boundV) {
200+ try {
201+ auto statement = session->create_statement (stmt);
202+ uint32_t idx = 0 ;
203+ for (auto & it : boundV) {
189204
190- switch (it.type_enum ()) {
205+ switch (it.type_enum ()) {
191206 case game_data_type::SCALAR: statement->set_float (idx++, static_cast <float >(it)); break ;
192207 case game_data_type::BOOL: statement->set_boolean (idx++, static_cast <bool >(it)); break ;
193208 case game_data_type::STRING: statement->set_string (idx++, static_cast <r_string>(it)); break ;
209+ }
194210 }
211+ return statement->query ();
212+ } catch (mariadb::exception::connection& x) {
213+ __debugbreak ();
214+
215+
216+ return {};
195217 }
196- return statement->query ();
218+
219+
220+
197221 });
198222 asyncWork.emplace_back (gd_res);
199223 return gd_res;
@@ -206,7 +230,8 @@ void Connection::initCommands() {
206230 GameDataDBConnection_type = dbType.second ;
207231
208232
209- handle_cmd_createConnection = host::register_sqf_command (" db_createConnection" , " TODO" , Connection::cmd_createConnectionArray, GameDataDBConnection_typeE, game_data_type::ARRAY);
210- handle_cmd_query = host::register_sqf_command (" db_query" , " TODO" , Connection::cmd_query, Result::GameDataDBResult_typeE, GameDataDBConnection_typeE, Query::GameDataDBQuery_typeE);
211- handle_cmd_queryAsync = host::register_sqf_command (" db_queryAsync" , " TODO" , Connection::cmd_queryAsync, Result::GameDataDBAsyncResult_typeE, GameDataDBConnection_typeE, Query::GameDataDBQuery_typeE);
233+ handle_cmd_createConnection = host::register_sqf_command (" dbCreateConnection" , " TODO" , Connection::cmd_createConnectionArray, GameDataDBConnection_typeE, game_data_type::ARRAY);
234+ handle_cmd_createConnectionConfig = host::register_sqf_command (" dbCreateConnection" , " TODO" , Connection::cmd_createConnectionConfig, GameDataDBConnection_typeE, game_data_type::STRING);
235+ handle_cmd_execute = host::register_sqf_command (" dbExecute" , " TODO" , Connection::cmd_execute, Result::GameDataDBResult_typeE, GameDataDBConnection_typeE, Query::GameDataDBQuery_typeE);
236+ handle_cmd_executeAsync = host::register_sqf_command (" dbExecuteAsync" , " TODO" , Connection::cmd_executeAsync, Result::GameDataDBAsyncResult_typeE, GameDataDBConnection_typeE, Query::GameDataDBQuery_typeE);
212237}
0 commit comments