From c348921cf8ca38dfbe21d39331e70ea38756c22b Mon Sep 17 00:00:00 2001 From: marcelb Date: Wed, 26 Jul 2023 23:25:24 +0200 Subject: [PATCH] Tested.. --- .vscode/settings.json | 7 ++ .vscode/tasks.json | 30 +++++++ README.md | 1 + lib/mysql.hpp | 43 +++++++++ src/mysql.cpp | 196 ++++++++++++++++++++++++++++++++++++++++++ test/compile.sh | 1 + test/test.cpp | 35 ++++++++ test/test.o | Bin 0 -> 92496 bytes 8 files changed, 313 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 README.md create mode 100644 lib/mysql.hpp create mode 100644 src/mysql.cpp create mode 100644 test/compile.sh create mode 100644 test/test.cpp create mode 100755 test/test.o diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..8044b1c --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "files.associations": { + "string": "cpp", + "vector": "cpp", + "deque": "cpp" + } +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..5cbbcc5 --- /dev/null +++ b/.vscode/tasks.json @@ -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" +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..36d5eed --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +A library for MySQL that implements a simpler framework for MySQL Connector++ \ No newline at end of file diff --git a/lib/mysql.hpp b/lib/mysql.hpp new file mode 100644 index 0000000..26b2674 --- /dev/null +++ b/lib/mysql.hpp @@ -0,0 +1,43 @@ +#ifndef _MYSQL_ +#define _MYSQL_ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#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> query(const string sql_command); + bool change(const string sql_command); + string getTable(const string req); + ~mySQL(); + +}; + + +#endif \ No newline at end of file diff --git a/src/mysql.cpp b/src/mysql.cpp new file mode 100644 index 0000000..01b1243 --- /dev/null +++ b/src/mysql.cpp @@ -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> 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> 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 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; igetString(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 "); + } +} diff --git a/test/compile.sh b/test/compile.sh new file mode 100644 index 0000000..42fa51e --- /dev/null +++ b/test/compile.sh @@ -0,0 +1 @@ +g++ test.cpp ../src/* -o test.o -lmysqlcppconn \ No newline at end of file diff --git a/test/test.cpp b/test/test.cpp new file mode 100644 index 0000000..77c162d --- /dev/null +++ b/test/test.cpp @@ -0,0 +1,35 @@ +#include + +#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; +} \ No newline at end of file diff --git a/test/test.o b/test/test.o new file mode 100755 index 0000000000000000000000000000000000000000..6958657d17432110fa8ec41a841848d0a51bd0ed GIT binary patch literal 92496 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 literal 0 HcmV?d00001