Files
energy_storage/src/database/DaoEntity.cpp
2025-08-31 14:38:53 +08:00

214 lines
5.2 KiB
C++

#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<MysqlClient>(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> DaoEntity::create(string tb_name)
{
return std::make_shared<DaoEntity>(tb_name);
}
bool DaoEntity::execOnce(string sql)
{
auto db = make_shared<MysqlClient>(DaoEntity::option);
return db->exec(sql);
}
bool DaoEntity::execOnce(string sql, vector<Fields>& result)
{
auto db = make_shared<MysqlClient>(DaoEntity::option);
return db->exec(sql, result);
}
void DaoEntity::setTableName(string tb_name)
{
tableName_ = tb_name;
}
bool DaoEntity::isConnected()
{
return db_->isConnected();
}
int DaoEntity::exec(string sql)
{
return db_->exec(sql);
}
int DaoEntity::exec(string sql, vector<Fields>& result)
{
return db_->exec(sql, result);
}
int DaoEntity::insertFields(Fields& fields)
{
string sql = fields.toSqlInsert(tableName_);
return this->db_->exec(sql);
}
int DaoEntity::insertFields(vector<Fields>& 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);
}
int DaoEntity::duplicateUpdate(Fields& fields, const vector<string>& 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<map<string, string>>& result)
//{
// this->query_by_page(condition, pageinfo, [&](map<string, string>& row) mutable {
// result.push_back(row);
// });
//}
int DaoEntity::queryFields(string keys, const string& condition, vector<Fields>& result)
{
ostringstream oss;
oss << "SELECT " + keys + " FROM " << tableName_ << (" " + condition) << "; ";
return this->db_->exec(oss.str(), result);
}
int DaoEntity::queryFields(string keys, const string& condition, PageInfo& page, vector<Fields>& result)
{
int err = 0;
ostringstream oss;
oss << "SELECT count(1) total FROM `" << tableName_ << "` " << condition << ";";
vector<Fields> res_total;
if (err = this->db_->exec(oss.str().c_str(), res_total))
{
return err;
}
if (res_total.size() <= 0)
{
page.total = 0;
return err;
}
page.total = res_total[0].get<int>("total");
if (page.total <= 0)
{
return err;
}
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);
}
int DaoEntity::updateFields(Fields& fields, const string& condition)
{
string sql = fields.toSqlUpdate(tableName_, condition);
return this->db_->exec(sql);
}
int DaoEntity::updateFields(Fields& fields, vector<string> vecKeys, const string& condition)
{
string sql = fields.toSqlUpdate(tableName_, vecKeys, condition);
return this->db_->exec(sql);
}