commit
c348921cf8
@ -0,0 +1,7 @@ |
||||
{ |
||||
"files.associations": { |
||||
"string": "cpp", |
||||
"vector": "cpp", |
||||
"deque": "cpp" |
||||
} |
||||
} |
@ -0,0 +1,30 @@ |
||||
{ |
||||
"tasks": [ |
||||
{ |
||||
"type": "cppbuild", |
||||
"label": "C/C++: g++ build active file", |
||||
"command": "/usr/bin/g++", |
||||
"args": [ |
||||
"-g", |
||||
"${fileDirname}/test.cpp", |
||||
"${fileDirname}/../src/*.cpp", |
||||
// "${fileDirname}../include/*/src/*.cpp", |
||||
"-o", |
||||
"${fileDirname}/test.o", |
||||
"-lmysqlcppconn" |
||||
], |
||||
"options": { |
||||
"cwd": "${fileDirname}" |
||||
}, |
||||
"problemMatcher": [ |
||||
"$gcc" |
||||
], |
||||
"group": { |
||||
"kind": "build", |
||||
"isDefault": true |
||||
}, |
||||
"detail": "Task generated by Debugger." |
||||
} |
||||
], |
||||
"version": "2.0.0" |
||||
} |
@ -0,0 +1 @@ |
||||
A library for MySQL that implements a simpler framework for MySQL Connector++ |
@ -0,0 +1,43 @@ |
||||
#ifndef _MYSQL_ |
||||
#define _MYSQL_ |
||||
|
||||
#include <string> |
||||
#include <vector> |
||||
#include <map> |
||||
#include <iostream> |
||||
|
||||
#include <mysql_driver.h> |
||||
#include <mysql_connection.h> |
||||
#include <cppconn/driver.h> |
||||
#include <cppconn/connection.h> |
||||
#include <cppconn/statement.h> |
||||
#include <cppconn/prepared_statement.h> |
||||
#include <cppconn/resultset.h> |
||||
|
||||
#define CONNECT_TRY_LIMIT 3 |
||||
|
||||
using namespace std; |
||||
using namespace sql; |
||||
using namespace mysql; |
||||
|
||||
class mySQL { |
||||
public: |
||||
|
||||
MySQL_Driver *drv; |
||||
Connection *con; |
||||
string path, username, password, db; |
||||
bool isPersistent; |
||||
|
||||
mySQL(const string _path, const string _username, const string _password, const string _db, bool _isPersistent = false); |
||||
bool open(const string _db = ""); |
||||
bool connect(); |
||||
bool close(); |
||||
map<string, vector<string>> query(const string sql_command); |
||||
bool change(const string sql_command); |
||||
string getTable(const string req); |
||||
~mySQL(); |
||||
|
||||
}; |
||||
|
||||
|
||||
#endif |
@ -0,0 +1,196 @@ |
||||
#include "../lib/mysql.hpp" |
||||
|
||||
mySQL::mySQL(const string _path, const string _username, const string _password, const string _db, bool _isPersistent) { |
||||
path = _path; |
||||
username = _username; |
||||
password = _password; |
||||
db = _db; |
||||
isPersistent = _isPersistent; |
||||
|
||||
if (isPersistent) { |
||||
if (connect()) { |
||||
throw string("[ERROR] Unable to connect database "); |
||||
} |
||||
|
||||
if (!db.empty()) { |
||||
if (open()) { |
||||
throw string("[ERROR] Unable to open database " + db); |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
bool mySQL::open(const string _db) { |
||||
db = _db.empty() ? db : _db; |
||||
bool status = true; |
||||
|
||||
try { |
||||
con->setSchema(db); |
||||
status = false; |
||||
} |
||||
catch (const SQLException &error) { |
||||
cout << error.what() << endl; |
||||
}
|
||||
|
||||
return status; |
||||
} |
||||
|
||||
bool mySQL::connect() { |
||||
uint trys = 0; |
||||
bool status = true; |
||||
|
||||
while (trys < CONNECT_TRY_LIMIT && status) { |
||||
try { |
||||
drv = get_mysql_driver_instance(); |
||||
con = drv->connect(path, username, password); |
||||
status = false; |
||||
} |
||||
catch (const SQLException &error) { |
||||
cout << error.what() << endl; |
||||
usleep(10000*trys++); |
||||
} |
||||
} |
||||
|
||||
return status; |
||||
} |
||||
|
||||
bool mySQL::close() { |
||||
bool status = true; |
||||
|
||||
if (con->isValid() && !con->isClosed()) { |
||||
try { |
||||
con->close(); |
||||
status = false; |
||||
}
|
||||
catch (const SQLException &error) { |
||||
cout << error.what() << endl; |
||||
} |
||||
} |
||||
|
||||
return status; |
||||
} |
||||
|
||||
map<string, vector<string>> mySQL::query(const string sql_command) { |
||||
|
||||
if (!isPersistent || !con->isValid() || con->isClosed()) { |
||||
if (connect()) { |
||||
throw string("[ERROR] Unable to connect database "); |
||||
} |
||||
|
||||
if (open()) { |
||||
throw string("[ERROR] Unable to open database " + db); |
||||
} |
||||
} |
||||
|
||||
/**/ |
||||
map<string, vector<string>> maped; |
||||
|
||||
try { |
||||
Statement *stmt; |
||||
stmt = con->createStatement(); |
||||
|
||||
const string table = getTable(sql_command); |
||||
if (table.empty()) { |
||||
throw string ("[ERROR] SQL command not have table "); |
||||
} |
||||
|
||||
ResultSet *columnsRes = stmt->executeQuery("SHOW COLUMNS from " + table); |
||||
vector<string> tableFields; |
||||
|
||||
while (columnsRes->next()) { |
||||
tableFields.push_back(columnsRes->getString("Field")); |
||||
} |
||||
|
||||
delete columnsRes; |
||||
|
||||
ResultSet *res = stmt->executeQuery(sql_command); |
||||
|
||||
while (res->next()) { |
||||
for (uint i=0; i<tableFields.size(); i++) { |
||||
maped[tableFields[i]].push_back(res->getString(tableFields[i])); |
||||
} |
||||
} |
||||
|
||||
delete res; |
||||
delete stmt; |
||||
|
||||
} |
||||
catch (const SQLException &error) { |
||||
cout << error.what() << endl; |
||||
} |
||||
catch (const string error) { |
||||
throw error; |
||||
} |
||||
|
||||
/**/ |
||||
|
||||
if (!isPersistent) { |
||||
if(close()) { |
||||
throw string("[ERROR] Unable to close database "); |
||||
} |
||||
} |
||||
|
||||
return maped; |
||||
} |
||||
|
||||
bool mySQL::change(const string sql_command) { |
||||
|
||||
if (!isPersistent || !con->isValid() || con->isClosed()) { |
||||
if (connect()) { |
||||
throw string("[ERROR] Unable to connect database "); |
||||
} |
||||
|
||||
if (open()) { |
||||
throw string("[ERROR] Unable to open database " + db); |
||||
} |
||||
} |
||||
|
||||
/**/ |
||||
bool status = false; |
||||
|
||||
try { |
||||
Statement *stmt; |
||||
stmt = con->createStatement(); |
||||
|
||||
uint changeCatch = stmt->executeUpdate(sql_command); |
||||
status = (bool)changeCatch; |
||||
|
||||
delete stmt; |
||||
|
||||
} |
||||
catch (const SQLException &error) { |
||||
cout << error.what() << endl; |
||||
} |
||||
catch (const string error) { |
||||
throw error; |
||||
} |
||||
|
||||
/**/ |
||||
|
||||
if (!isPersistent) { |
||||
if(close()) { |
||||
throw string("[ERROR] Unable to close database "); |
||||
} |
||||
} |
||||
|
||||
return status; |
||||
} |
||||
|
||||
|
||||
string mySQL::getTable(const string req) { |
||||
size_t from = req.find("FROM") < req.find("from") ? req.find("FROM") : req.find("from"); |
||||
if (from > req.length()) { |
||||
return ""; |
||||
} |
||||
string table = req.substr(from+5, req.find(" ", from+5)); |
||||
return table; |
||||
} |
||||
|
||||
|
||||
|
||||
mySQL::~mySQL() { |
||||
if(close()) { |
||||
throw string("[ERROR] Unable to close database "); |
||||
} |
||||
} |
@ -0,0 +1 @@ |
||||
g++ test.cpp ../src/* -o test.o -lmysqlcppconn |
@ -0,0 +1,35 @@ |
||||
#include <iostream> |
||||
|
||||
#include "../lib/mysql.hpp" |
||||
|
||||
using namespace std; |
||||
|
||||
int main() { |
||||
|
||||
mySQL mydb("tcp://192.168.2.10:3306", "dinio", "H€r5elfInd1aH@nds", "dinio", true); |
||||
|
||||
try { |
||||
|
||||
auto res = mydb.query("SELECT * FROM users"); |
||||
|
||||
for (auto i : res) { |
||||
for (auto j: i.second) { |
||||
cout << i.first << " : " << j << endl; |
||||
} |
||||
} |
||||
|
||||
if (mydb.change("UPDATE records SET enabled = 0 WHERE domain = 'bitelex.ml'")) { |
||||
cout << "Update sucessfuly" << endl; |
||||
} |
||||
|
||||
} |
||||
catch (const SQLException error) { |
||||
cout << error.what() << endl; |
||||
} |
||||
catch (const string error) { |
||||
cout << error << endl; |
||||
} |
||||
|
||||
|
||||
return 0; |
||||
} |
Binary file not shown.
Loading…
Reference in new issue