chenshijun
2019-04-22 291dbcd9331cd0df41addef74defa4654ee034fb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
//
// Created by pans on 4/27/18.
//
 
#ifndef FACESEARCHSERVER_FACEFEATURESEARCHSERVERI_H
#define FACESEARCHSERVER_FACEFEATURESEARCHSERVERI_H
 
#include <FaceSearchServer.h>
#include <Ice/Ice.h>
#include <basic/rpc/IceRpc.hpp>
#include <basic/db/Elasticsearch/EsDBTool.h>
#include <basic/util/app/AppConfig.h>
 
#include <ErlangDbTool.h>
#include <SqliteFaceEncap.h>
#include "FaceDBCompareServer.h"
 
//struct TableInfo {
//    std::string tab_name;
//    std::string startTime;
//    std::string endTime;
//    std::string bwType;
//    std::string create_by;
//};
 
static bool t_live_ret = true;
 
//全局的信号量,如果数据刷新延迟过高可以改为使用nsq消息队列。
static pthread_cond_t func_cond(PTHREAD_COND_INITIALIZER);
static pthread_mutex_t func_cond_mutex(PTHREAD_MUTEX_INITIALIZER);
 
 
void erlangCallBackFunc(std::string);
 
class FaceFeatureSearchServerI : public FaceSearch::FaceFeatureSearchServer {
public:
    FaceFeatureSearchServerI();
 
    FaceFeatureSearchServerI(Ice::CommunicatorPtr &ich, std::string nodeName, std::string cookie);
 
    virtual ~FaceFeatureSearchServerI();
 
public:
    /**
     * @deprecated
     * @return
     */
    virtual ::FaceSearch::FaceResults faceSearchMax(const ::FaceSearch::Data &, const ::std::string &,
                                                    const ::Ice::Current & = ::Ice::emptyCurrent);
 
    /***
     * 对比获取第n大的人员
     * @return
     */
    virtual ::FaceSearch::FaceResults
    faceSearchTopN(const ::FaceSearch::Data &, const ::std::string &, ::Ice::Int, ::Ice::Float,
                   const ::Ice::Current & = ::Ice::emptyCurrent);
 
private:
    /**
     * @deprecated
     * @param nodeName
     * @param cookie
     * @return
     */
    bool initErlang(std::string nodeName, std::string cookie);
 
 
    //#todo loadData
    /**
     * 加载人脸属性
     * @param faceFea
     * @return
     */
    static bool loadFeatureData(FaceFeatureSearchServerI *faceFea);
 
    /**
     * 数据更新线程,有信号触发才会更新
     * @param faceFea
     */
    static void dataUpdate(FaceFeatureSearchServerI *faceFea);
 
    /***
     * 等待底库表加载成功
     * @param faceFea
     * @param loop
     */
    static void waitTables(FaceFeatureSearchServerI *faceFea, int loop = -1);
 
private:
    long m_inTime;
    // 特征对比类
    std::map<std::string, FaceDBCompareServer *> m_faceFCMAP;
    // 底库类型,生效时间等
    std::map<std::string, TableInfo> m_tableType;
 
    // 对 m_faceFCMAP 加读写锁
    // 当对比时,数据刷新会等待
    RWLock m_rwLock;
 
    ErlangTool::ErlangDbTool m_erlangDbTool;
 
    SqliteFaceEncap m_sqliteFaceEncap;
 
    std::mutex m_mutex;
    bool m_retUpdatePthread;
 
    Base64 base64;
 
    EsDBTool pManagerEsDB;//(appPref.getStringData("ipAdd"), appPref.getIntData("ipPort"));
};
 
 
#endif //FACESEARCHSERVER_FACEFEATURESEARCHSERVERI_H