zhangmeng
2019-06-10 439a23896bda9c4e954092816354914e645579b6
QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.cpp
@@ -54,11 +54,15 @@
//#todo map 1->2 modify 2->1
bool FaceDBCompareServer::compare(thread::id key, AlarmData *alarmData, int topN) {
    m_dbRWLocks_Lock.wrlock();
    if (m_dbRWLocks.find(key) == m_dbRWLocks.end()) {
        m_dbRWLocks[key] = RWLock();
    }
    RWLock &t_rwl = m_dbRWLocks[key];
    DBG("m_dbRWLocks ok");
    m_dbRWLocks_Lock.unlock();
//    ClockTimer clockTimer("compare ");
    //保护 t_compareResults
    RWLock t_rwLock;
    m_rwLock.rdlock();
@@ -77,12 +81,15 @@
            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
            // 只保留最高的n个对比结果
            if (t_compareResults.size() > topN) {
                t_compareResults.erase((--t_compareResults.end()), t_compareResults.end());
            }
@@ -116,8 +123,11 @@
    int maxSearchFaces = alarmData->num;
    t_rwl.wrlock();
    DBG("topResult[key] before");
    auto &t_topResult = topResult[key];
    DBG("topResult[key] ok");
    t_topResult.clear();
    // 对比结果转换
    for (auto &item : t_compareResults) {
        auto &it = item.second;
        //#todo
@@ -194,22 +204,15 @@
            //            同步库/特征是base64
//            #todo sqlite search data from file
            auto str_tab = t_json["\"tableName\""].asString();
            DBG("str_tab is  " << str_tab);
            m_tableName = str_tab.substr(1, str_tab.length() - 2);//.append("_fea");
            DBG("m_tableName is  " << m_tableName);
//            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 mymap = m_erlangDbTool->loadFaceFeaData(m_tableName);
                DBG(m_tableName << "  db size is  " << mymap.size());
                for (auto &item : mymap) {
                    auto &it = item.second;
                    string str2;
@@ -225,28 +228,10 @@
                    test.enabled = it.enable;
                    test.monLevel = it.monLevel;
                }
//                //#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());
            appPref.setIntData(m_tableName, 1);
        } else {
            //#todo get sqlite3 data
            m_tableName = t_json["tableName"].asCString();