#include "DaoEntity.h" //#include "PvInstance.h" //#include "spdlogger.h" MysqlOption DaoEntity::option; DaoEntity::DaoEntity(string tb_name) { //MysqlOptions opts; //opts.host = "localhost"; //opts.user = "root"; //opts.password = "123456"; //opts.port = 3306; //opts.dbname = "pvb"; db_ = make_shared(DaoEntity::option); if (!db_->isConnected()) { //Global::data().status_msg = "数据库连接异常!"; //PvInstance::send_user_event(nullptr, EUserEvent::ALARM_DB, "数据库连接异常!"); } tableName_ = tb_name; } DaoEntity::~DaoEntity() { db_ = nullptr; } MysqlOption& DaoEntity::mysqlOption() { return DaoEntity::option; } void DaoEntity::setOption(std::string host, int port, std::string user, std::string pwd, std::string dbname) { option.host = host; option.port = port; option.user = user; option.password = pwd; option.dbname = dbname; } std::shared_ptr DaoEntity::create(string tb_name) { return std::make_shared(tb_name); } bool DaoEntity::execOnce(string sql) { auto db = make_shared(DaoEntity::option); return db->exec(sql); } bool DaoEntity::execOnce(string sql, vector& result) { auto db = make_shared(DaoEntity::option); return db->exec(sql, result); } void DaoEntity::setTableName(string tb_name) { tableName_ = tb_name; } bool DaoEntity::isConnected() { return db_->isConnected(); } bool DaoEntity::exec(string sql) { return db_->exec(sql); } bool DaoEntity::exec(string sql, vector& result) { return db_->exec(sql, result); } bool DaoEntity::insertFields(Fields& fields) { string sql = fields.toSqlInsert(tableName_); return this->db_->exec(sql); } bool DaoEntity::insertFields(vector& vec_fields) { //"insert into TABLE () values ()"; string sql = "insert into " + tableName_; bool first = true; string keys; string values; for (auto& field : vec_fields) { keys = ""; values = ""; for (auto& item : field.map()) { const string& k = item.first; const string& v = item.second; if (first) { if (!keys.empty()) { keys += ","; } keys += k; } if (!values.empty()) { values += ","; } values += ("'" + v + "'"); } if (first) { sql += (" (" + keys + ")"); sql += (" values (" + values + ")"); first = !first; } else { sql += (",(" + values + ")"); } } sql += ";"; return this->db_->exec(sql); } bool DaoEntity::duplicateUpdate(Fields& fields, const vector& keys) { //insert into device_attr(device_id, attr_id, attr_val) values('26', 'model', '型号1') on duplicate key update attr_val='型号1'; string key; string val; for (auto& item : fields.map()) { if (!key.empty()) { key += ","; val += ","; } key += (item.first); val += ("'" + item.second + "'"); } string str; for (auto& k : keys) { if (!str.empty()) { str += ","; } str += (k + "='" + fields.value(k) + "'"); } string sql = "INSERT INTO " + tableName_ + "(" + key + ") VALUES (" + val + ") ON duplicate KEY UPDATE " + str; return this->db_->exec(sql); } //void DaoEntity::queryFields(const string& condition, DaoPageinfo& pageinfo, vector>& result) //{ // this->query_by_page(condition, pageinfo, [&](map& row) mutable { // result.push_back(row); // }); //} bool DaoEntity::queryFields(string keys, const string& condition, vector& result) { ostringstream oss; oss << "SELECT " + keys + " FROM " << tableName_ << (" " + condition) << "; "; return this->db_->exec(oss.str(), result); } bool DaoEntity::queryFields(string keys, const string& condition, PageInfo& page, vector& result) { ostringstream oss; oss << "SELECT count(1) total FROM `" << tableName_ << "` " << condition << ";"; vector res_total; if (!this->db_->exec(oss.str().c_str(), res_total)) { return false; } if (res_total.size() <= 0) { page.total = 0; return true; } page.total = res_total[0].get("total"); if (page.total <= 0) { return true; } oss.str(""); if (page.index <= 0) { page.index = 1; } int start = (page.index - 1) * page.size; oss << "SELECT " << keys << " FROM `" << tableName_ << "` " << condition << " LIMIT " << start << "," << page.size << ";"; return this->db_->exec(oss.str().c_str(), result); } bool DaoEntity::updateFields(Fields& fields, const string& condition) { string sql = fields.toSqlUpdate(tableName_, condition); return this->db_->exec(sql); } bool DaoEntity::updateFields(Fields& fields, vector vecKeys, const string& condition) { string sql = fields.toSqlUpdate(tableName_, vecKeys, condition); return this->db_->exec(sql); }