A library for MySQL that implements a simpler framework for MySQL Connector++
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
marcelb e23e1f8cea Protects against time loop calls both externally and internally 2 months ago
.vscode Add on error callback 2 months ago
lib Protects against time loop calls both externally and internally 2 months ago
src Protects against time loop calls both externally and internally 2 months ago
test Protects against time loop calls both externally and internally 2 months ago
.gitignore Add protect if connection is not valid 12 months ago
LICENSE Separe sqlQA and mySQL lib, add namespace, commnets, license and readme file 11 months ago
README.md Protects against time loop calls both externally and internally 2 months ago
dependency Add dependency 1 year ago

README.md

A library for MySQL that implements a simpler framework for MySQL Connector++

A small framework for basic MySQL database operations via MySQL/Connector++

Features

  • Object oriented
  • Active connection pool
  • Retries to connect
  • Native C++ containers: vector, tuple
  • Response object
  • Thread safe
  • Exceptions and log error callback
  • Can use external time loop for connection management

Installation

First install dependency MySQL/Connector++

sudo apt install libmysqlcppconn-dev

Just download the latest release and unzip it into your project. You can turn it on with:

#include "mysql/lib/mysql.hpp"
using namespace marcelb;

Usage

Internal engine

It internally initializes a single thread that periodically checks the states of the connection pool, adds new ones as needed, and cleans up inactive ones.


#include "../lib/mysql.hpp"
using namespace marcelb::mysql;

/**
* Init
*/
MySQL mydb("tcp://192.168.2.10:3306", "user_nm", "passss", "my_db", 5);

/**
* Use                                 ------------------              
*/                                   |                  |    
                                 ------------------     |
try {                           |    |              |   |
    // execute                  |    |              |   |
    auto response = mydb.exec<int,string>("SELECT id,domain FROM records WHERE enabled = 0;");
    // response is MySQL_Res<int,string> type
    // check is execute
    cout << response.affected << " " << response.have_result << endl;
    cout << response.rows << " " << response.columns << endl;

    for (auto row : response) { // row is tuple<int,string> type
        cout << get<0>(row) << " " << get<1>(row) << endl;
    }

    // access columns name
    for (auto column_name : response.columns_name) {
        cout << column_name << endl;
    }

} catch (const string err) {
    cout << err << endl;
}

External engine

As I developed quite a few wrappers that have some internal thread, I realized that it was inefficient and made it possible to call the necessary functions periodically outside (one thread per whole application or timer (ASIO), or my asynco wrapper).

#include "../lib/mysql.hpp"
using namespace marcelb::mysql;

#include "../../asynco/lib/timers.hpp"
using namespace marcelb::asynco;
/**
* Init
*/
MySQL mydb("tcp://192.168.2.10:3306", "user_nm", "passss", "my_db", 5, time_loop_type::external);

periodic mysql_maintenance ( [&mydb] () {
    mydb.periodic_maintenance();
}, MYSQL_PERIODIC_INTERNAL_TIME);

mydb.set_on_error( [](const string& error) {
    cout << error << endl;  // print or log
});

/**
* You can call multiple queries asynchronously                                     
*/                              
                                
auto a1 = atask ( [&mydb] () {
    try {
        auto response =  mydb.exec<int,string>("SELECT id,domain FROM records WHERE enabled = 1;");
        for (auto row : response) {
            cout << get<0>(row) << " " << get<1>(row) << endl;
        }
    } catch (const string err) {
        cout << err << endl;
    }
});

auto a2 = atask ( [&mydb] () {
    try {
        auto response =  mydb.exec<string,string>("SELECT zonename,auth_key FROM zones;");
        for (auto row : response) {
            cout << get<0>(row) << " " << get<1>(row) << endl;
        }
    } catch (const string err) {
        cout << err << endl;
    }
});

auto a3 = atask ( [&mydb] () {
    try {
        auto response =  mydb.exec<string,string>("SELECT username,email FROM users WHERE enabled = 1;");
        for (auto row : response) {
            cout << get<0>(row) << " " << get<1>(row) << endl;
        }
    } catch (const string err) {
        cout << err << endl;
    }
});

wait(a1);
wait(a2);
wait(a3);

License

APACHE 2.0

Support & Feedback

For support and any feedback, contact the address: marcelb96@yahoo.com.

Contributing

Contributions are always welcome!

Feel free to fork and start working with or without a later pull request. Or contact for suggest and request an option.