QiaoJiaSystem/EncodeServer/CMakeLists.txt
@@ -56,12 +56,10 @@ ../../../BasicPlatForm/basic/pipe/ ../../../BasicPlatForm/libs/opencv/include ../../../BasicPlatForm/libs/ffmpeg/include ../../../BasicPlatForm/libs/jsoncpp/include /usr/include/x86_64-linux-gnu/qt5 @@ -77,22 +75,23 @@ ../../../BasicPlatForm/libs/openssl/lib ../../../BasicPlatForm/libs/opencv/lib ../../../BasicPlatForm/libs/ffmpeg/lib # ../../../BasicPlatForm/libs/jsoncpp/lib # ../../../BasicPlatForm/libs/jsoncpp/lib # ../../../BasicPlatForm/libs/libuuid/lib # ../../../BasicPlatForm/libs/libuuid/lib ../../BasicPlatForm/libs/hiredis-master/lib ) add_executable(${PROJECT_NAME} ../../../BasicPlatForm/basic/pipe_element/ffmpeg/VideoChangeScore.cpp ../../../BasicPlatForm/basic/pipe_element/ffmpeg/FfmpegElement.cpp ../StructureApp/NewRecordVideoElement.cpp EncodeVideoManager.cpp EncodeVideo.cpp ../StructureApp/HiredisTool.cpp main.cpp ../../../BasicPlatForm/basic/timer_counter/Clocktimer.cpp ../../../BasicPlatForm/basic/pipe_element/ffmpeg/VideoChangeScore.cpp ../../../BasicPlatForm/basic/pipe_element/ffmpeg/FfmpegElement.cpp ../StructureApp/NewRecordVideoElement.cpp EncodeVideoManager.cpp EncodeVideo.cpp ../StructureApp/HiredisTool.cpp main.cpp ) target_link_libraries(${PROJECT_NAME} ${LIBS} QiaoJiaSystem/FaceSearchServer/AlarmServer.hpp
@@ -27,6 +27,7 @@ std::vector<std::vector<unsigned char>> features; std::string faceUrl; std::string idcard; std::string enabled; }; static std::vector<std::string> AlarmServerPropertyAnalyseByComma(std::string str_list) { @@ -100,7 +101,7 @@ //m_dbReady is false return,true go on //use parallelFor virtual bool compare(std::thread::id key, AlarmData *, int topN) = 0; virtual bool compare(std::thread::id key, AlarmData *, int topN, float score) = 0; private: //init data,this is thread body QiaoJiaSystem/FaceSearchServer/CMakeLists.txt
@@ -89,7 +89,6 @@ add_executable(${PROJECT_NAME} main.cpp rpc/FaceSearchServer.cpp FaceSearchServerResources.cpp FaceFeatureSearchServerI.cpp FaceFeatureSearchServerI.h CasiaFaceWrapper/CasiaFaceWrapperN.cpp @@ -107,15 +106,13 @@ ../../../BasicPlatForm/basic/timer_counter/Clocktimer.cpp #todo file path error ../LocalDBTool/SqliteFaceEncap.cpp ../../../BasicPlatForm/basic/db/sqlite/sqliteEncapsulation.cpp ../../../BasicPlatForm/basic/db/sqlite/sqliteEncapsulation.h # ../../BasicPlatForm/basic/util/ShareMemory/SemTool.cpp ../../syncDBTool/ErlangDbTool.cpp # ../../../Erlang/syncDBTool/ShareMemoryTool.hpp # ../../../Erlang/syncDBTool/SyncDB.hpp ) target_link_libraries(${PROJECT_NAME} QiaoJiaSystem/FaceSearchServer/CasiaFaceWrapper/FaceData.hpp
@@ -32,6 +32,7 @@ std::string face_img_url; std::string idCard; std::string alarmRet; std::string enabled; }; struct DbAction { QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.cpp
@@ -45,7 +45,7 @@ m_dbRWLocks[key] = RWLock(); } RWLock &t_rwl = m_dbRWLocks[key]; t_rwl.wrlock(); // t_rwl.wrlock(); FaceResults t_result = topResult[key]; topResult.erase(key); t_rwl.unlock(); @@ -53,64 +53,41 @@ } //#todo map 1->2 modify 2->1 bool FaceDBCompareServer::compare(thread::id key, AlarmData *alarmData, int topN) { bool FaceDBCompareServer::compare(thread::id key, AlarmData *alarmData, int topN, float score) { if (m_dbRWLocks.find(key) == m_dbRWLocks.end()) { m_dbRWLocks[key] = RWLock(); } // 锁任务的对比结果 RWLock &t_rwl = m_dbRWLocks[key]; // ClockTimer clockTimer("compare "); RWLock t_rwLock; m_rwLock.rdlock(); mapFaceResults t_compareResults; if (topN > 1) { //topN parallelFor(ParallelForThreardSize::CPU_Number, [&](string &key, FeatureData &data) { //#todo double sc = 0; for (auto &t_fea : data.features) { double t_sc = m_casiaFaceWapper.compareFeature(alarmData->feature, t_fea); if (t_sc > sc) sc = t_sc; } parallelFor(ParallelForThreardSize::CPU_Number, [&](string &key, FeatureData &data) { //#todo double sc = 0; for (auto &t_fea : data.features) { double t_sc = m_casiaFaceWapper.compareFeature(alarmData->feature, t_fea); // 获取当前对比的最高分? sc = t_sc > sc ? t_sc : sc; } // FaceResult tface{data.face_id, data.uuid, alarmData->tableName, sc, false}; FaceResult tface{0, data.uuid, alarmData->tableName, sc, data.faceUrl, data.idcard, ""}; t_rwLock.wrlock(); //#todo if (sc < t_compareResults.end()->second.confidence) { t_rwLock.unlock(); return; } t_compareResults.insert(make_pair(tface.confidence, tface)); //#todo 10 if (t_compareResults.size() > topN) { t_compareResults.erase((--t_compareResults.end()), t_compareResults.end()); } FaceResult tface{0, data.uuid, alarmData->tableName, sc, data.faceUrl, data.idcard, "", data.enabled}; t_rwLock.wrlock(); // 如果当前记录的所有特征的最高分小于结果中的最低分则不保存 if (sc < score || sc < t_compareResults.end()->second.confidence) { t_rwLock.unlock(); }); } else { //Max float maxScore = 0; parallelFor(ParallelForThreardSize::CPU_Number, [&](string &key, FeatureData &data) { //#todo double sc = 0; for (auto &t_fea : data.features) { double t_sc = m_casiaFaceWapper.compareFeature(alarmData->feature, t_fea); if (t_sc > sc) sc = t_sc; } FaceResult tface{0, data.uuid, alarmData->tableName, sc, data.faceUrl, data.idcard, ""}; t_rwLock.wrlock(); if (sc < maxScore) { t_rwLock.unlock(); return; } else { t_compareResults.clear(); t_compareResults.insert(make_pair(tface.confidence, tface)); maxScore = t_compareResults.begin()->second.confidence; } t_rwLock.unlock(); }); } return; } t_compareResults.insert(make_pair(tface.confidence, tface)); if (topN != 0 && t_compareResults.size() > topN) { t_compareResults.erase((--t_compareResults.end()), t_compareResults.end()); } t_rwLock.unlock(); }); m_rwLock.unlock(); int maxSearchFaces = alarmData->num; @@ -124,58 +101,15 @@ // if (it.confidence <= 0.6) { // continue; // } FaceResult t_CR{it.id, it.uuid, it.tableName, it.confidence, it.face_img_url, it.idCard, it.alarmRet}; FaceResult t_CR{it.id, it.uuid, it.tableName, it.confidence, it.face_img_url, it.idCard, it.alarmRet, it.enabled}; //cout << __FUNCTION__ << " -> " << __LINE__ << " -> scroe" << it.confidence << endl; t_topResult.push_back(t_CR); } while (topResult.size() > maxSearchFaces) t_topResult.pop_back(); t_rwl.unlock(); return true; } bool FaceDBCompareServer::compare(std::thread::id key, AlarmData *alarmData) { if (m_dbRWLocks.find(key) == m_dbRWLocks.end()) { m_dbRWLocks[key] = RWLock(); } RWLock &t_rwl = m_dbRWLocks[key]; // ClockTimer clockTimer("compare "); t_rwl.wrlock(); RWLock t_rwLock; mapFaceResults t_compareResults; m_rwLock.rdlock(); parallelFor(ParallelForThreardSize::CPU_Number, [&](string &key, FeatureData &data) { double sc = 0; for (auto &t_fea : data.features) { double t_sc = m_casiaFaceWapper.compareFeature(alarmData->feature, t_fea); if (t_sc > sc)sc = t_sc; } FaceResult tface{data.face_id, data.uuid, alarmData->tableName, sc, data.faceUrl, data.idcard, ""}; // FaceResult tface{0, data.uuid, alarmData->tableName, sc, data.faceUrl,false}; t_rwLock.wrlock(); if (sc < alarmData->threshold) { t_rwLock.unlock(); DBG("return"); return; } if (t_compareResults.size() > alarmData->num) { t_compareResults.erase((--t_compareResults.end()), t_compareResults.end()); } t_compareResults.insert(make_pair(tface.confidence, tface)); t_rwLock.unlock(); }); m_rwLock.unlock(); int maxSearchFaces = alarmData->num; auto &t_topResult = topResult[key]; t_topResult.clear(); for (auto &item : t_compareResults) { auto &it = item.second; FaceResult t_CR{it.id, it.uuid, it.tableName, it.confidence, it.face_img_url, it.idCard, it.alarmRet}; // FaceResult t_CR{it.id, it.uuid, it.tableName, it.confidence, it.face_img_url, ""}; t_topResult.push_back(t_CR); } // while (t_topResult.size() > maxSearchFaces) // t_topResult.pop_back(); // 获取结果后释放 // t_rwl.unlock(); return true; } @@ -191,46 +125,62 @@ m_rwLock.wrlock(); if (t_json["\"syncTpye\""].type() == Json::nullValue) { // 同步库/特征是base64 // #todo sqlite search data from file auto str_tab = t_json["\"tableName\""].asString(); m_tableName = str_tab.substr(1, str_tab.length() - 2);//.append("_fea"); string tet = "./syncDBClient "; string str_json = writer.write(t_json); tet.append("\"" + str_json.substr(0, str_json.length() - 1) + "\" "); INFO(tet); system(tet.c_str()); // string tet = "./syncDBClient "; // string str_json = writer.write(t_json); // tet.append("\"" + str_json.substr(0, str_json.length() - 1) + "\" "); // INFO(tet); // system(tet.c_str()); dataMap.clear(); try { // init BISTL::BiMapFeaData biMapFeaData(m_tableName); auto mymap = biMapFeaData.getMap(); auto size = mymap->size(); //#todo for (auto it = mymap->begin(); it != mymap->end(); it++) { string str_uuid(it->second.m_id.data()); string ft(it->second.m_feature.data()); string imgUrl(it->second.m_imgUrl.data()); string strIdCard(it->second.m_idcard.data()); // BISTL::BiMapFeaData biMapFeaData(m_tableName); // auto mymap = biMapFeaData.getMap(); auto mymap = m_erlangDbTool->loadFaceFeaData(m_tableName); for (auto &item : mymap) { auto &it = item.second; string str2; str2 = base64.Decode(ft.data(), ft.length()); str2 = base64.Decode(it.feature.data(), it.feature.size()); std::vector<unsigned char> t_fea; t_fea.resize(str2.size()); memcpy(t_fea.data(), str2.data(), str2.size()); auto &test = dataMap[str_uuid]; test.uuid = str_uuid; auto &test = dataMap[it.id]; test.uuid = it.id; test.features.push_back(t_fea); test.faceUrl = imgUrl; test.idcard = strIdCard; test.faceUrl = it.img; test.idcard = it.idcard; } // //#todo // for (auto it = mymap->begin(); it != mymap->end(); it++) { // string str_uuid(it->second.m_id.data()); // string ft(it->second.m_feature.data()); // string imgUrl(it->second.m_imgUrl.data()); // string strIdCard(it->second.m_idcard.data()); // string str2; // str2 = base64.Decode(ft.data(), ft.length()); // std::vector<unsigned char> t_fea; // t_fea.resize(str2.size()); // memcpy(t_fea.data(), str2.data(), str2.size()); // auto &test = dataMap[str_uuid]; // test.uuid = str_uuid; // test.features.push_back(t_fea); // test.faceUrl = imgUrl; // test.idcard = strIdCard; // } } catch (const std::exception &e) { printf("Exception:%s\n", e.what()); BISTL::shared_memory_object::remove(m_tableName.c_str()); // BISTL::shared_memory_object::remove(m_tableName.c_str()); } BISTL::shared_memory_object::remove(m_tableName.c_str()); appPref.setIntData(m_tableName, 1); DBG(m_tableName << " size is " << dataMap.size()); // BISTL::shared_memory_object::remove(m_tableName.c_str()); } else { //#todo get sqlite3 data // 本地库/特征是blob m_tableName = t_json["tableName"].asCString(); auto t_res = m_sqliteFaceEncap->getFacesFromTable(m_tableName); auto t_faceInfoCache = m_sqliteFaceEncap->getFaceInfoFromTable(m_tableName); @@ -249,10 +199,12 @@ test.features.push_back(t_fea); test.faceUrl = t_sen.faceurl; test.idcard = t_faceInfoCache[t_sen.uuid].idCard; test.enabled = t_sen.enable; } appPref.setIntData(m_tableName, 1); DBG(m_tableName << " size is " << dataMap.size()); } // 告诉刷新函数,当前底库的数据准备完成 appPref.setIntData(m_tableName, 1); DBG(m_tableName << " size is " << dataMap.size()); m_rwLock.unlock(); } else { ERR("json format error :: " << str_config); QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.h
@@ -27,9 +27,7 @@ ~FaceDBCompareServer(); virtual bool compare(std::thread::id key, AlarmData *alarmData, int topN); bool compare(std::thread::id key, AlarmData *alarmData); virtual bool compare(std::thread::id key, AlarmData *alarmData, int topN, float score = 0.0); FaceResults getTopResult(std::thread::id key); @@ -41,6 +39,7 @@ std::string m_tableName; int fea_size; // 锁数据刷新 RWLock m_rwLock; std::mutex topResultMtx; std::map<std::thread::id, FaceResults> topResult; QiaoJiaSystem/FaceSearchServer/FaceFeatureSearchServerI.cpp
@@ -55,69 +55,13 @@ t_live_ret = false; } //#todo 优化 /*** * @dep */ ::FaceSearch::FaceResults FaceFeatureSearchServerI::faceSearchMax(const ::FaceSearch::Data &feature, const ::std::string &info_json, const ::Ice::Current &) { thread::id key = std::this_thread::get_id(); ClockTimer clockTimer("faceSearchMax"); ::FaceSearch::FaceResults results; FaceResults t_TableCompareResult; AlarmData featureData; featureData.num = 1; featureData.feature.resize(feature.size()); memcpy(featureData.feature.data(), feature.data(), feature.size()); for (auto &it : m_faceFCMAP) { auto &t_FaceFC = it.second; auto t_tableInfo = m_tableType[it.first]; bool ret = getRet(t_tableInfo.startTime, t_tableInfo.endTime); if (ret) { bool alarmRet = atoi(t_tableInfo.bwType.c_str()); //#todo 非同步库是否需要比较? t_FaceFC->compare(key, &featureData, 1); auto t_results = t_FaceFC->getTopResult(key); for (auto &t_item : t_results) { t_item.tableName = it.first; //#todo baojing zhuangtai ? t_item.alarmRet = ret; t_TableCompareResult.push_back(t_item); } } } // DBG("t_TableCompareResult size" << t_TableCompareResult.size()); for (auto itor = t_TableCompareResult.begin(); itor != t_TableCompareResult.end(); ++itor) { float new_confidence = itor->confidence; auto rtTR = results.rbegin(); if (!results.empty()) { auto temp = rtTR->confidence; while (new_confidence > temp) { ++rtTR; if (rtTR == (results.rend() + 1)) { rtTR--; break; } else { // DBG(" sc is "<< new_confidence << " > " << temp); } temp = rtTR->confidence; } } else { // INFO("topResult is null"); } auto itTR(rtTR.base()); ::FaceSearch::FaceResult t_faceCR; t_faceCR.id = itor->id; t_faceCR.uuid = itor->uuid; t_faceCR.tableName = itor->tableName; t_faceCR.confidence = itor->confidence; DBG("compare results tablename is " << t_faceCR.tableName << " id is " << t_faceCR.uuid << " sc is" << t_faceCR.confidence); results.insert(itTR, t_faceCR); } //#todo send message return results; return ::FaceSearch::FaceResults(); } //#todo 优化 @@ -126,9 +70,13 @@ ::Ice::Int topN, ::Ice::Float score, const ::Ice::Current &) { ClockTimer clockTimer("faceSearchTopN " + to_string(score) + " :"); INFO("faceSearchTopN start"); // #获取线程id去找资源句柄 thread::id key = std::this_thread::get_id(); // 返回结果 ::FaceSearch::FaceResults results; // 对比结果的临时缓存 FaceResults t_TableCompareResult; // 需要对比的数据 AlarmData featureData; featureData.num = topN; featureData.feature.resize(feature.size()); @@ -140,40 +88,49 @@ if (reader.parse(info_json, value)) { //#todo m_rwLock.rdlock(); std::string feature_base64; feature_base64 = base64.Encode(feature.data(), feature.size()); value["FaceFeature"] = feature_base64; // 开始对比 DBG("auto &it : m_faceFCMAP start " << m_faceFCMAP.size()); //#todo lock // 遍历不同的底库类#TODO是否要做一次大范围对比然后给出结果再筛选? for (auto &it : m_faceFCMAP) { auto &t_FaceFC = it.second; // 表的信息#TODO待移出和业务解耦 auto t_tableInfo = m_tableType[it.first]; bool ret = getRet(t_tableInfo.startTime, t_tableInfo.endTime); // 判断表的生效状态,决定是否进行对比/时间和启用状态 bool ret = (t_tableInfo.enabled == "1" && getRet(t_tableInfo.startTime, t_tableInfo.endTime)); if (ret) { // 需要对比 // 表的类型/黑白名单 string t_alarmRet = t_tableInfo.bwType; // bool alarmRet = atoi(t_tableInfo.bwType.c_str()); //#todo 非同步库是否需要比较? DBG("m_faceFCMAP compare start " << it.first); // 对比函数 t_FaceFC->compare(key, &featureData, topN); DBG("m_faceFCMAP compare end " << it.first); // 获取对比结果 auto t_results = t_FaceFC->getTopResult(key); // 遍历结果并添加补充字段 for (auto &t_item : t_results) { t_item.tableName = it.first; t_item.alarmRet = t_alarmRet; // 放入本次任务的对比缓存 t_TableCompareResult.push_back(t_item); // DBG("t_results item : uuid is " << t_item.uuid << " confidence " << t_item.confidence << it.first); } } else { // 不需要对比 INFO("m_faceFCMAP ret is false " << it.first); } } m_rwLock.unlock(); DBG("auto &it : m_faceFCMAP end"); // 本次任务的对比结果数量 DBG("t_TableCompareResult size" << t_TableCompareResult.size()); //sort_all_results // 所有表对比结束后,排序及结果格式转换 for (auto itor = t_TableCompareResult.begin(); itor != t_TableCompareResult.end(); ++itor) { float new_confidence = itor->confidence; auto rtTR = results.rbegin(); @@ -206,19 +163,27 @@ results.insert(itTR, t_faceCR); } bool retface = true; // cout << __FUNCTION__ << " -> " << __LINE__ << " -> " << results.size() << endl; //#todo send message // 拼接需要发送的消息 // 特征编码为base64用于上传,#todo 拆解到外面去做 std::string feature_base64; feature_base64 = base64.Encode(feature.data(), feature.size()); if (results.size() > 0) { // 找到相似人 可能对比分数不满足条件 // #TODO多条对比结果拼接成一个标签 for (auto &item : results) { //#todo 得分比较,应该在compare中进行 // 小于指定的阈值则认为没有找到是陌生人 if (item.confidence < score) { //#todo test auto str_uuid = value["Id"].asString(); value["personIsHub"] = "4"; value["likePer"] = 0.0; // DBG(value.toStyledString()); cout << __FUNCTION__ << " -> " << __LINE__ << " -> " << "value.toStyledString() " << value.toStyledString() << endl; DBG("value.toStyledString() " << value.toStyledString()); value["FaceFeature"] = feature_base64; retface = pManagerEsDB.insertData("videopersons", "perVideoPicture", value.toStyledString(), str_uuid); break; @@ -239,14 +204,16 @@ value["personPicUrl"] = item.imgUrl.size() > 0 ? item.imgUrl : "";//diku tupian value["idcard"] = item.idcard.size() > 0 ? item.idcard : "";//diku tupian //如果 alarmRet 不为空把 他的值 放入 personIsHub,否则为4 // #TODO 如果启用则正常判断,未布控则认为是未知? // if () { // // } value["personIsHub"] = item.alarmRet.size() > 0 ? item.alarmRet : "4"; auto str_uuid = value["Id"].asString(); // DBG(value.toStyledString()); DBG("value.toStyledString() " << value.toStyledString()); value["FaceFeature"] = feature_base64; cout << __FUNCTION__ << " -> " << __LINE__ << " -> " << "value.toStyledString() " << value.toStyledString() << "\n score " << score << endl; // DBG("score " << score); retface = pManagerEsDB.insertData("videopersons", "perVideoPicture", value.toStyledString(), str_uuid); break; @@ -256,6 +223,7 @@ value["personIsHub"] = "4"; value["likePer"] = 0.0; DBG(value.toStyledString()); value["FaceFeature"] = feature_base64; // cout << __FUNCTION__ << " -> " << __LINE__ << " -> " << "value.toStyledString() " // << value.toStyledString() << endl; retface = pManagerEsDB.insertData("videopersons", "perVideoPicture", value.toStyledString(), @@ -269,13 +237,6 @@ } else { ERR("json is error" << info_json); } // for (auto &item : t_tables) { // DBG(item); // } return results; } QiaoJiaSystem/LocalDBTool/SqliteFaceEncap.cpp
@@ -346,6 +346,7 @@ memcpy(t_feas.faceFeature.data(), t_fea.data(), t_fea.size()); // string create_time = query.value(2).toString().toStdString(); t_feas.faceurl = query.value(3).toString().toStdString(); t_feas.enable = query.value(5).toString().toStdString(); } } } @@ -380,7 +381,7 @@ tableInfo.cmpThreshold = query.value(7).toString().toStdString(); tableInfo.enabled = query.value(8).toString().toStdString(); tableInfo.createBy = query.value(9).toString().toStdString(); tableInfos.push_back(tableInfo); } } QiaoJiaSystem/LocalDBTool/SqliteToolkit.hpp
@@ -65,6 +65,7 @@ std::string uuid; std::string faceurl; FaceFeature faceFeature; std::string enable; }; typedef std::map<std::string, FaceFeatureWithUrl> FeatureDBWithUrlCache; @@ -86,7 +87,7 @@ // std::string getFacesFromTableSql(std::string tableName) { std::string sql = "select uuid,feature,create_time,faceUrl,del_flag from '" + tableName + "select uuid,feature,create_time,faceUrl,del_flag,enabled from '" + tableName + "_fea' where feature is not null "; return sql; } QiaoJiaSystem/build/DataWebServerBinary files differ
QiaoJiaSystem/build/EncodeServerBinary files differ
QiaoJiaSystem/build/FaceDetectResourcesTestBinary files differ
QiaoJiaSystem/build/FaceDetectServerBinary files differ
QiaoJiaSystem/build/FaceExtractServerBinary files differ
QiaoJiaSystem/build/FaceSearchServerBinary files differ
QiaoJiaSystem/build/RapidStructureAppBinary files differ
QiaoJiaSystem/build/RapidStructureAppRtspBinary files differ
QiaoJiaSystem/build/RecordVideoBinary files differ
QiaoJiaSystem/build/StructureAppBinary files differ
QiaoJiaSystem/build/VideoAnalysFromHCBinary files differ
QiaoJiaSystem/build/YoloDetectClientTestBinary files differ
QiaoJiaSystem/build/YoloServerBinary files differ
QiaoJiaSystem/build/syncDBClientBinary files differ
syncDBTool/ErlangDbTool.cpp
@@ -1592,7 +1592,7 @@ } if (str_tableUuid.size() > 0) { QString sql = QString::fromStdString( "Select a.uuid as id ,a.faceUrl as img,a.feature,b.idCard as idcard from '" + str_tableUuid + "Select a.uuid as id ,a.faceUrl as img,a.feature,b.idCard as idcard,a.enable from '" + str_tableUuid + "_fea' as a ,'" + str_tableUuid + "' as b where a.uuid = b.uuid and ( a.del_flag=0 AND b.del_flag=0);"); QSqlQuery query(g_syncDbFile); query.prepare(sql); @@ -1605,6 +1605,7 @@ t_feature_info.img = query.value(1).toString().toStdString(); t_feature_info.feature = query.value(2).toString().toStdString(); t_feature_info.idcard = query.value(3).toString().toStdString(); t_feature_info.enable = query.value(4).toString().toStdString(); dataCache.insert(std::make_pair(t_feature_info.id, t_feature_info)); } @@ -1630,7 +1631,7 @@ } if (str_tableUuid.size() > 0) { QString sql = QString::fromStdString( "Select b.uuid as id,b.faceUrl as img,a.idCard as idcard from '" + str_tableUuid + "' as a, '" + "Select b.uuid as id,b.faceUrl as img,a.idCard as idcard,a.enable from '" + str_tableUuid + "' as a, '" + str_tableUuid + "_fea' As b where a.uuid = b.uuid and ( a.del_flag=0 AND b.del_flag=0);"); QSqlQuery query(g_syncDbFile); query.prepare(sql); @@ -1642,6 +1643,7 @@ t_feature_info.id = query.value(0).toString().toStdString(); t_feature_info.img = query.value(1).toString().toStdString(); t_feature_info.idcard = query.value(2).toString().toStdString(); t_feature_info.enable = query.value(4).toString().toStdString(); dataCache.insert(std::make_pair(t_feature_info.id, t_feature_info)); } syncDBTool/SyncDB.hpp
@@ -21,6 +21,7 @@ update_time, img, idcard, enable, evEnd }; @@ -36,6 +37,7 @@ map_Fea_InfoString2Values["update_time"] = Feature_InfoStringValue::update_time; map_Fea_InfoString2Values["img"] = Feature_InfoStringValue::img; map_Fea_InfoString2Values["idcard"] = Feature_InfoStringValue::idcard; map_Fea_InfoString2Values["enable"] = Feature_InfoStringValue::enable; map_Fea_InfoString2Values["end"] = evEnd; } @@ -81,6 +83,9 @@ case Feature_InfoStringValue::idcard: idcard = value; break; case Feature_InfoStringValue::enable: enable = value; break; default: ERR(key << " is an invalid string. s_mapStringValues now contains " << map_Fea_InfoString2Values.size() << " entries."); @@ -102,6 +107,8 @@ std::string update_time; std::string img; std::string idcard; std::string enable; // value is a atom: atomSize:19, atomValue:test@192.168.50.216 // value is a list:2018-08-08 20:17:11