#pragma once #include #include #include #include #include #include #include #include #include #include "Util/logger.h" #include "Util/NoticeCenter.h" #include "Poller/EventPoller.h" #include "Player/PlayerProxy.h" #include "Rtmp/RtmpPusher.h" #include "Common/config.h" #include "Pusher/MediaPusher.h" #include "Extension/Frame.h" #include "Util/SqlPool.h" #include "Network/TcpClient.h" #include "Poller/Timer.h" #include "TCPClient.h" #include "Notices.h" #include "boost/variant.hpp" using namespace std; // Api定义 class ApiDefine { public: // 表 std::string TableName; // 参数 map> parms; // 条件 map> conditions; private: // 返回的数据 vector> sqlRet; // std::mutex m_mutex; /** * @description: 查询数据 * @param {*} * @return {*} */ void SelectData() { string sql = "SELECT "; for(size_t i = 0; i < parms.size(); i++){ if(i != 0 && i != parms.size() - 1){ sql += ","; } sql += "'?'"; } sql += " FROM '?'"; for(size_t i = 0; i < parms.size(); i++){ if(i == 0){ sql += " WHERE "; }else if(i != parms.size() - 1){ sql += " and "; } sql += " '?'='?' "; } SqlWriter selectSql(sql.c_str()); map>::iterator iter; for(iter = parms.begin(); iter != parms.end(); iter++){ selectSql << iter->first; selectSql << iter->second; } selectSql << TableName; for(iter = conditions.begin(); iter != conditions.end(); iter++){ selectSql << iter->first; selectSql << iter->second; } selectSql << sqlRet; } /** * @description: 更新数据 * @param {vector>& sqlRet} 获取结果 * @return {*} */ void UpdateData() { std::string sql = "UPDATE '?' SET "; for(size_t i = 0; i < parms.size(); i++){ if(i != 0 && i != parms.size() - 1){ sql += ","; } sql += "'?' = '?'"; } for(size_t i = 0; i < parms.size(); i++){ if(i == 0){ sql += " WHERE "; }else if(i != parms.size() - 1){ sql += " and "; } sql += " '?'='?' "; } SqlWriter UpdateSql(sql.c_str()); UpdateSql << TableName; map>::iterator iter; for(iter = parms.begin(); iter != parms.end(); iter++){ UpdateSql << iter->first; UpdateSql << iter->second; } for(iter = conditions.begin(); iter != conditions.end(); iter++){ UpdateSql << iter->first; UpdateSql << iter->second; } UpdateSql << sqlRet; } /** * @description: 删除数据 * @param {vector>& sqlRet} 获取结果 * @return {*} */ void DeleteData() { std::string sql = " DELETE FROM '?' WHERE "; // 不允许删除整个表 if(conditions.size() == 0) return; for(size_t i = 0; i < conditions.size(); i++){ if(i != 0 && i != (conditions.size() - 1)){ sql += " and "; } sql += " '?'='?' "; } SqlWriter DeleteSql(sql.c_str()); DeleteSql << TableName; map>::iterator iter; for(iter = conditions.begin(); iter != conditions.end(); iter++){ DeleteSql << iter->first; DeleteSql << iter->second; } DeleteSql << sqlRet; } /** * @description: 增加数据 * @param {vector>& sqlRet} * @return {*} */ void InsertData() { std::string sql = "INSERT INTO '?' "; // 没有数据无法添加 if(parms.size() == 0) return; for(size_t i = 0; i < parms.size(); i++){ if(i != 0 && i != parms.size() - 1){ sql += ","; }else if(i == 0) sql += "("; sql += "'?'='?'"; if(i == parms.size() - 1) sql += ")"; } SqlWriter InsertSql(sql.c_str()); InsertSql << TableName; map>::iterator iter; for(iter = parms.begin(); iter != parms.end(); iter++){ InsertSql << iter->first; InsertSql << iter->second; } InsertSql << sqlRet; } public: ApiDefine(){} ~ApiDefine(){} /** * @description: 执行sql * @param {std::string dataType} 数据类型 * @return {int32_t} 返回是否执行成功 */ int32_t ExecuteSql(std::string dataType) { // 上锁 // std::lock_guard gurad(m_mutex); if(dataType == NettyServerCommandEnum().query_data){ this->SelectData(); }else if(dataType == NettyServerCommandEnum().update_data){ this->UpdateData(); }else if(dataType == NettyServerCommandEnum().add_data){ this->InsertData(); }else if(dataType == NettyServerCommandEnum().delete_data){ this->DeleteData(); } return OK; } /** * @description: Json反序列为对象 * @param {const rapidjson::Value& object} * @return {*} */ bool jsonToObject(const rapidjson::Value& object){ const auto end = object.MemberEnd(); if(end == object.FindMember("TableName") || !object["TableName"].IsString()){ return false; } else{ TableName = object["TableName"].GetString(); } if(object["parms"].IsNull() || object["conditions"].IsNull()){ return true; } if(end == object.FindMember("parms") || !object["parms"].IsArray()){ return false; }else{ const rapidjson::Value& objs = object["parms"]; for (size_t i = 0; i < objs.Size(); ++i) { const rapidjson::Value& obj = objs[i]; boost::variant var; if(obj[1].IsString()){ string str = obj[1].GetString(); str = "'" + str + "'"; var = str; }else if(obj[1].IsInt()){ var = obj[1].GetInt(); }else if(obj[1].IsDouble()){ var = obj[1].GetDouble(); } string key = obj[0].GetString(); key = "'" + key + "'"; parms[key] = var; } } if(end == object.FindMember("conditions") || !object["conditions"].IsArray()){ return false; }else{ const rapidjson::Value& objs = object["conditions"]; for (size_t i = 0; i < objs.Size(); ++i) { const rapidjson::Value& obj = objs[i]; boost::variant var; if(obj[1].IsString()){ string str = obj[1].GetString(); str = "'" + str + "'"; var = str; }else if(obj[1].IsInt()){ var = obj[1].GetInt(); }else if(obj[1].IsDouble()){ var = obj[1].GetDouble(); } string key = obj[0].GetString(); key = "'" + key + "'"; conditions[key] = var; } } return true; } /** * @description: 对象序列化为json * @param {rapidjson::Writer& writer} * @return {*} */ void objectToJson(rapidjson::Writer& writer) { writer.StartObject(); if(sqlRet.empty()){ writer.EndObject(); return; } writer.EndObject(); } };