Prepare for internal asynco support

for_fork
mbandic 2 months ago
parent 33d25fb181
commit 4c50ba7416
  1. 40
      lib/mysql.hpp
  2. 62
      src/mysql.cpp
  3. 3
      test/compile.sh
  4. 81
      test/test.cpp

@ -8,8 +8,9 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include <tuple> #include <tuple>
#include "ctime" #include <ctime>
#include <chrono> #include <chrono>
using namespace std;
#include <mysql_driver.h> #include <mysql_driver.h>
#include <mysql_connection.h> #include <mysql_connection.h>
@ -18,14 +19,19 @@
#include <cppconn/statement.h> #include <cppconn/statement.h>
#include <cppconn/prepared_statement.h> #include <cppconn/prepared_statement.h>
#include <cppconn/resultset.h> #include <cppconn/resultset.h>
using namespace sql;
using namespace mysql;
#ifdef MYSQL_USE_ASYNCO
#include "../../asynco/lib/asynco.hpp"
#include "../../asynco/lib/timers.hpp"
using namespace marcelb::asynco;
#endif
#define unlimited 0 #define unlimited 0
#define reconnectSleep 1000 // in us #define reconnectSleep 1000 // in us
using namespace std;
using namespace sql;
using namespace mysql;
namespace marcelb { namespace marcelb {
namespace mysql { namespace mysql {
@ -34,17 +40,6 @@ namespace mysql {
*/ */
#define MYSQL_PERIODIC_INTERNAL_TIME 5000 #define MYSQL_PERIODIC_INTERNAL_TIME 5000
/**
* An enumeration of how periodic functions will be run
* internal - run periodic_maintenance() i new thread
* external - expects periodic_maintenance() to be run periodically outside the library
*
*/
enum class time_loop_type {
internal,
external
};
/** /**
* A class for creating sql responses * A class for creating sql responses
*/ */
@ -105,8 +100,11 @@ class MySQL {
string path, username, password, database; string path, username, password, database;
uint32_t pool_size; uint32_t pool_size;
bool run_tloop = true; bool run_tloop = true;
#ifdef MYSQL_USE_ASYNCO
periodic p_loop;
#else
future<void> tloop_future; future<void> tloop_future;
time_loop_type tloop_type; #endif
time_t last_loop_time; time_t last_loop_time;
/** /**
@ -167,7 +165,7 @@ public:
* username, password, database name, * username, password, database name,
* and number of active connections (optional) * and number of active connections (optional)
*/ */
MySQL(const string _path, const string _username, const string _password, const string _db, const uint32_t _available = 1, const time_loop_type _engine_type = time_loop_type::internal); MySQL(const string _path, const string _username, const string _password, const string _db, const uint32_t _available = 1);
/** /**
* Execute the SQL statement * Execute the SQL statement
@ -214,12 +212,6 @@ public:
return result; return result;
} }
/**
* If you are using an external periodic motor,
* please call this function in it for proper operation at a certain time interval.
* You can use the default MYSQL_PERIODIC_INTERNAL_TIME
*/
void tloop(uint32_t b, uint32_t e);
/** /**
* Destruktor * Destruktor

@ -1,25 +1,39 @@
#include "../lib/mysql.hpp" #include "../lib/mysql.hpp"
marcelb::mysql::MySQL::MySQL(const string _path, const string _username, const string _password, const string _db, const uint32_t _available, const time_loop_type _engine_type) { marcelb::mysql::MySQL::MySQL(const string _path, const string _username, const string _password, const string _db, const uint32_t _available):
path = _path; #ifdef MYSQL_USE_ASYNCO
username = _username; p_loop(periodic( [&] () {
password = _password; cout << "U asynco" << endl;
database = _db; try {
pool_size = _available > 0 ? _available : 1; auto start = rtime_ms();
tloop_type = _engine_type; _tloop(0, connection_pool.size());
cout << "loop--------------------------- nema error, trajalo: " << rtime_ms() - start << endl;
drv = get_mysql_driver_instance(); } catch (...) {
connect_pool(); // cout << "Bude neki error u loopu" << endl;
if(on_error) {
if (tloop_type == time_loop_type::internal) { on_error("Bude neki error u loopu");
tloop_future = async(launch::async, [&](){ }
}
}, MYSQL_PERIODIC_INTERNAL_TIME)),
#else
tloop_future (async(launch::async, [&](){
while (run_tloop) { while (run_tloop) {
cout << "U STD async" << endl;
usleep(MYSQL_PERIODIC_INTERNAL_TIME*1000); usleep(MYSQL_PERIODIC_INTERNAL_TIME*1000);
_tloop(0, connection_pool.size()); _tloop(0, connection_pool.size());
} }
return; return;
}); })),
} #endif
path(_path),
username(_username),
password(_password),
database(_db),
pool_size(_available > 0 ? _available : 1) {
drv = get_mysql_driver_instance();
connect_pool();
// set on initialization to avoid the error // set on initialization to avoid the error
last_loop_time = time(nullptr); last_loop_time = time(nullptr);
} }
@ -157,23 +171,9 @@ void marcelb::mysql::MySQL::release_connection(Connection* connection) {
} }
marcelb::mysql::MySQL::~MySQL() { marcelb::mysql::MySQL::~MySQL() {
if (tloop_type == time_loop_type::internal) {
run_tloop = false; run_tloop = false;
#ifndef MYSQL_USE_ASYNCO
tloop_future.get(); tloop_future.get();
} else { #endif
run_tloop = false;
}
disconnect_pool(); disconnect_pool();
} }
void marcelb::mysql::MySQL::tloop(uint32_t b, uint32_t e) {
if (tloop_type == time_loop_type::internal) {
if (on_error) {
on_error("Can't start external call tloop, internal is active!");
}
return;
}
_tloop(b,e);
}

@ -1 +1,2 @@
g++ test.cpp ../src/* -o test.o -lmysqlcppconn -lpthread # g++ -DMYSQL_USE_ASYNCO test.cpp ../src/* ../../asynco/src/* -o test.o -lmysqlcppconn -lpthread
g++ test.cpp ../src/* ../../asynco/src/* -o test.o -lmysqlcppconn -lpthread

@ -4,19 +4,20 @@
using namespace std; using namespace std;
using namespace chrono; using namespace chrono;
#include "../lib/mysql.hpp"
using namespace marcelb::mysql;
#include "../../asynco/lib/asynco.hpp" #include "../../asynco/lib/asynco.hpp"
#include "../../asynco/lib/timers.hpp" #include "../../asynco/lib/timers.hpp"
using namespace marcelb::asynco; using namespace marcelb::asynco;
#include "../lib/mysql.hpp"
using namespace marcelb::mysql;
int main() { int main() {
auto inis = rtime_ms(); auto inis = rtime_ms();
try { try {
const int n = 30; const int n = 5;
// MySQL mydb("tcp://192.168.2.10:3306", "dinio", "H€r5elfInd1aH@nds", "dinio", 5, time_loop_type::internal); // MySQL mydb("tcp://192.168.2.10:3306", "dinio", "H€r5elfInd1aH@nds", "dinio", 5, time_loop_type::internal);
MySQL mydb("tcp://bitelex.ddns.net:3306", "dinio", "H€r5elfInd1aH@nds", "dinio", n, time_loop_type::external); MySQL mydb("tcp://bitelex.ddns.net:3306", "dinio", "H€r5elfInd1aH@nds", "dinio", n);
// MySQL mydb("tcp://bitelex.ddns.net:3306", "dinio", "H€r5elfInd1aH@nds", "dinio", 5); // MySQL mydb("tcp://bitelex.ddns.net:3306", "dinio", "H€r5elfInd1aH@nds", "dinio", 5);
cout << "init: " << rtime_ms() - inis << endl; cout << "init: " << rtime_ms() - inis << endl;
@ -25,23 +26,23 @@ int main() {
cout << error << endl; cout << error << endl;
}; };
periodic mysql_tloop ( [&mydb] () { // periodic mysql_tloop ( [&mydb] () {
auto l_start = rtime_ms(); // auto l_start = rtime_ms();
vector<future<void>> to_wait; // vector<future<void>> to_wait;
for (int i=0, old_i=0; i<n; old_i=i) { // for (int i=0, old_i=0; i<n; old_i=i) {
i += 5; // i += 5;
to_wait.push_back( nonsync ([&, i, old_i](){ // to_wait.push_back( async_ ([&, i, old_i](){
try { // try {
auto start = rtime_ms(); // auto start = rtime_ms();
mydb.tloop(old_i, i); // mydb.tloop(old_i, i);
cout << "old " << old_i << " i " << i << endl; // cout << "old " << old_i << " i " << i << endl;
cout << "loop--------------------------- nema error, trajalo: " << rtime_ms() - start << endl; // cout << "loop--------------------------- nema error, trajalo: " << rtime_ms() - start << endl;
} catch (...) { // } catch (...) {
cout << "Bude neki error u loopu" << endl; // cout << "Bude neki error u loopu" << endl;
} // }
})); // }));
} // }
// nonsync ([&](){ // async_ ([&](){
// try { // try {
// auto start = rtime_ms(); // auto start = rtime_ms();
// mydb.tloop(4, 8); // mydb.tloop(4, 8);
@ -50,7 +51,7 @@ int main() {
// cout << "Bude neki error u loopu" << endl; // cout << "Bude neki error u loopu" << endl;
// } // }
// }); // });
// nonsync ([&](){ // async_ ([&](){
// try { // try {
// auto start = rtime_ms(); // auto start = rtime_ms();
// mydb.tloop(8, 12); // mydb.tloop(8, 12);
@ -59,18 +60,18 @@ int main() {
// cout << "Bude neki error u loopu" << endl; // cout << "Bude neki error u loopu" << endl;
// } // }
// }); // });
for (auto& tw : to_wait) { // for (auto& tw : to_wait) {
wait (tw); // wait (tw);
} // }
cout << "all loop !!!!!!!!!!!!!!1, trajalo: " << rtime_ms() - l_start << endl; // cout << "all loop !!!!!!!!!!!!!!1, trajalo: " << rtime_ms() - l_start << endl;
}, 5000); // }, 5000);
while (true) { while (true) {
sleep(60); sleep(60);
auto start = high_resolution_clock::now(); auto start = high_resolution_clock::now();
auto a1 = nonsync ( [&mydb] () { auto a1 = async_ ( [&mydb] () {
try { try {
auto response = mydb.exec<int,string>("SELECT id,domain FROM records WHERE enabled = 1;"); auto response = mydb.exec<int,string>("SELECT id,domain FROM records WHERE enabled = 1;");
cout << response.affected << " " << response.have_result << endl; cout << response.affected << " " << response.have_result << endl;
@ -89,7 +90,7 @@ while (true) {
} }
}); });
auto a2 = nonsync ( [&mydb] () { auto a2 = async_ ( [&mydb] () {
try { try {
auto response = mydb.exec<string,string>("SELECT zonename,auth_key FROM zones;"); auto response = mydb.exec<string,string>("SELECT zonename,auth_key FROM zones;");
cout << response.affected << " " << response.have_result << endl; cout << response.affected << " " << response.have_result << endl;
@ -108,7 +109,7 @@ while (true) {
} }
}); });
auto a3 = nonsync ( [&mydb] () { auto a3 = async_ ( [&mydb] () {
try { try {
auto response = mydb.exec<string,string>("SELECT username,email FROM users WHERE enabled = 1;"); auto response = mydb.exec<string,string>("SELECT username,email FROM users WHERE enabled = 1;");
cout << response.affected << " " << response.have_result << endl; cout << response.affected << " " << response.have_result << endl;
@ -127,7 +128,7 @@ while (true) {
} }
}); });
auto a4 = nonsync ( [&mydb] () { auto a4 = async_ ( [&mydb] () {
try { try {
auto response = mydb.exec<int,string>("SELECT id,domain FROM records WHERE enabled = 1;"); auto response = mydb.exec<int,string>("SELECT id,domain FROM records WHERE enabled = 1;");
cout << response.affected << " " << response.have_result << endl; cout << response.affected << " " << response.have_result << endl;
@ -146,7 +147,7 @@ while (true) {
} }
}); });
auto a5 = nonsync ( [&mydb] () { auto a5 = async_ ( [&mydb] () {
try { try {
auto response = mydb.exec<string,string>("SELECT zonename,auth_key FROM zones;"); auto response = mydb.exec<string,string>("SELECT zonename,auth_key FROM zones;");
cout << response.affected << " " << response.have_result << endl; cout << response.affected << " " << response.have_result << endl;
@ -165,7 +166,7 @@ while (true) {
} }
}); });
auto a6 = nonsync ( [&mydb] () { auto a6 = async_ ( [&mydb] () {
try { try {
auto response = mydb.exec<string,string>("SELECT username,email FROM users WHERE enabled = 1;"); auto response = mydb.exec<string,string>("SELECT username,email FROM users WHERE enabled = 1;");
cout << response.affected << " " << response.have_result << endl; cout << response.affected << " " << response.have_result << endl;
@ -184,12 +185,12 @@ while (true) {
} }
}); });
wait(a1); await_(a1);
wait(a2); await_(a2);
wait(a3); await_(a3);
wait(a4); await_(a4);
wait(a5); await_(a5);
wait(a6); await_(a6);
auto end = high_resolution_clock::now(); auto end = high_resolution_clock::now();

Loading…
Cancel
Save