// // Created by mwo on 16/12/16. // #ifndef RESTBED_XMR_MYSQLACCOUNTS_H #define RESTBED_XMR_MYSQLACCOUNTS_H #include "tools.h" #include "ssqlses.h" #include "MySqlConnector.h" #include #include #include #include namespace xmreg { using namespace mysqlpp; using namespace std; using namespace nlohmann; class MysqlTransactions { shared_ptr conn; public: MysqlTransactions(shared_ptr _conn): conn {_conn} {} bool select(const uint64_t& address_id, vector& txs) { // // static shared_ptr query; // // if (!query) // { // Query q = MySqlConnector::getInstance().query( // XmrTransaction::SELECT_STMT); // q.parse(); // query = shared_ptr(new Query(q)); // } Query query = conn->query(XmrTransaction::SELECT_STMT); query.parse(); try { query.storein(txs, address_id); if (!txs.empty()) { return true; } } catch (mysqlpp::Exception& e) { MYSQL_EXCEPTION_MSG(e); } catch (std::exception& e) { MYSQL_EXCEPTION_MSG(e); } return false; } uint64_t insert(const XmrTransaction& tx_data) { // static shared_ptr query; // // if (!query) // { // Query q = MySqlConnector::getInstance().query(XmrTransaction::INSERT_STMT); // q.parse(); // query = shared_ptr(new Query(q)); // } Query query = conn->query(XmrTransaction::INSERT_STMT); query.parse(); // cout << query << endl; try { SimpleResult sr = query.execute(tx_data.hash, tx_data.account_id, tx_data.total_received, tx_data.total_sent, tx_data.unlock_time, tx_data.height, tx_data.coinbase, tx_data.payment_id, tx_data.mixin, tx_data.timestamp); if (sr.rows() == 1) return sr.insert_id(); } catch (mysqlpp::Exception& e) { MYSQL_EXCEPTION_MSG(e); return 0; } return 0; } }; class MySqlAccounts { shared_ptr conn; shared_ptr mysql_tx; public: MySqlAccounts() { cout << "MySqlAccounts() makes new connection" << endl; conn = make_shared(); mysql_tx = make_shared(conn); } bool select(const string& address, XmrAccount& account) { // static shared_ptr query; // // if (!query) // { // Query q = MySqlConnector::getInstance().query(XmrAccount::SELECT_STMT); // q.parse(); // query = shared_ptr(new Query(q)); // } Query query = conn->query(XmrAccount::SELECT_STMT); query.parse(); try { vector res; query.storein(res, address); if (!res.empty()) { account = res.at(0); return true; } } catch (mysqlpp::Exception& e) { MYSQL_EXCEPTION_MSG(e); } catch (std::exception& e) { MYSQL_EXCEPTION_MSG(e); } return false; } bool select(const int64_t& acc_id, XmrAccount& account) { //static shared_ptr query; // if (!query) // { // Query q = MySqlConnector::getInstance().query(XmrAccount::SELECT_STMT2); // q.parse(); // query = shared_ptr(new Query(q)); // } Query query = conn->query(XmrAccount::SELECT_STMT2); query.parse(); try { vector res; query.storein(res, acc_id); if (!res.empty()) { account = res.at(0); return true; } } catch (mysqlpp::Exception& e) { MYSQL_EXCEPTION_MSG(e); } return false; } uint64_t insert(const string& address, const uint64_t& scanned_block_height = 0) { // static shared_ptr query; // if (!query) // { // Query q = MySqlConnector::getInstance().query(XmrAccount::INSERT_STMT); // q.parse(); // query = shared_ptr(new Query(q)); // } Query query = conn->query(XmrAccount::INSERT_STMT); query.parse(); // cout << query << endl; try { SimpleResult sr = query.execute(address, scanned_block_height); if (sr.rows() == 1) return sr.insert_id(); } catch (mysqlpp::Exception& e) { MYSQL_EXCEPTION_MSG(e); return 0; } return 0; } uint64_t insert_tx(const XmrTransaction& tx_data) { return mysql_tx->insert(tx_data); } bool select_txs(const string& xmr_address, vector& txs) { // having address first get its address_id // a placeholder for exciting or new account data xmreg::XmrAccount acc; // select this account if its existing one if (!select(xmr_address, acc)) { cerr << "Address" << xmr_address << "does not exist in database" << endl; return false; } return mysql_tx->select(acc.id, txs); } bool select_txs(const uint64_t& account_id, vector& txs) { return mysql_tx->select(account_id, txs); } bool update(XmrAccount& acc_orginal, XmrAccount& acc_new) { Query query = conn->query(); try { query.update(acc_orginal, acc_new); SimpleResult sr = query.execute(); if (sr.rows() == 1) return true; } catch (mysqlpp::Exception& e) { MYSQL_EXCEPTION_MSG(e); return false; } return false; } }; } #endif //RESTBED_XMR_MYSQLACCOUNTS_H