123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- #pragma once
- #include <iostream>
- #include <rapidjson/document.h>
- #include <rapidjson/rapidjson.h>
- #include <rapidjson/stringbuffer.h>
- #include <rapidjson/writer.h>
- #include <map>
- #include <list>
- #include <vector>
- #include <mutex>
- #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<std::string, boost::variant<int,std::string,double>> parms;
- // 条件
- map<std::string, boost::variant<int,std::string,double>> conditions;
- private:
- // 返回的数据
- vector<vector<std::string>> 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<std::string, boost::variant<int,std::string,double>>::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<vector<std::string>>& 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<std::string, boost::variant<int,std::string,double>>::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<vector<std::string>>& 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<std::string, boost::variant<int,std::string,double>>::iterator iter;
- for(iter = conditions.begin(); iter != conditions.end(); iter++){
- DeleteSql << iter->first;
- DeleteSql << iter->second;
- }
- DeleteSql << sqlRet;
- }
-
- /**
- * @description: 增加数据
- * @param {vector<vector<std::string>>& 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<std::string, boost::variant<int,std::string,double>>::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<mutex> 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<int,std::string,double> 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<int,std::string,double> 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<rapidjson::StringBuffer>& writer}
- * @return {*}
- */
- void objectToJson(rapidjson::Writer<rapidjson::StringBuffer>& writer)
- {
- writer.StartObject();
- if(sqlRet.empty()){
- writer.EndObject();
- return;
- }
- writer.EndObject();
- }
- };
|