From eddff2d353cd541bee6ce306b128447ccb3a7a5b Mon Sep 17 00:00:00 2001 From: pansen <pansen626@sina.com> Date: 星期六, 15 十二月 2018 14:49:14 +0800 Subject: [PATCH] --- syncDBTool/Client.cpp | 51 syncDBTool/ErlangDbTool.hpp | 1555 ++++++++++++++++ syncDBTool/ErlangDbTool.h | 312 +++ syncDBTool/cnode.cpp | 210 ++ syncDBTool/CMakeLists.txt | 98 + syncDBTool/SyncDB.hpp | 718 +++++++ syncDBTool/ErlangDbTool.cpp | 2054 +++++++++++++++++++++ syncDBTool/ShareMemoryTool.hpp | 259 ++ syncDBTool/main.cpp | 265 ++ syncDBTool/main2.cpp | 145 + 10 files changed, 5,667 insertions(+), 0 deletions(-) diff --git a/syncDBTool/CMakeLists.txt b/syncDBTool/CMakeLists.txt new file mode 100755 index 0000000..5199a6f --- /dev/null +++ b/syncDBTool/CMakeLists.txt @@ -0,0 +1,98 @@ +cmake_minimum_required(VERSION 3.5) +project(syncDBTool) + +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build) +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_BUILD_TYPE debug) +#add_compile_options(-fPIC -fpermissive) +add_definitions(-DGLOG) +add_definitions(-DDEBUG_INFO -DDEBUG_ERR) + + +include_directories( + /home/ps/boost_1_68_0 + /usr/include/ + ../../Qt/BasicPlatForm/ + ../../Qt/BasicPlatForm/libs/libuuid/include + ../../Qt/BasicPlatForm/libs/jsoncpp/include + ../../Qt/BasicPlatForm/libs/glog/include +) + +link_directories( + /usr/lib/erlang/lib/erl_interface-3.8.2/lib/ + ../../Qt/BasicPlatForm/libs/libuuid/lib + ../../Qt/BasicPlatForm/libs/jsoncpp/lib + ../../Qt/BasicPlatForm/libs/glog/lib +) + + +add_executable(syncDBTool + main2.cpp +# main.cpp + ShareMemoryTool.hpp + ErlangDbTool.cpp + ) + +target_link_libraries( + syncDBTool + ei + erl_interface_st + ei_st + erl_interface + uuid + rt + glog + jsoncpp + pthread +) + + +add_executable(syncDBClient main2.cpp ShareMemoryTool.hpp + ErlangDbTool.cpp testCallBack.cpp testCallBack.h) + +target_link_libraries( + syncDBClient + glog + ei + erl_interface_st + ei_st + erl_interface + rt + jsoncpp + pthread +) + +add_executable(TestCilent + Client.cpp ShareMemoryTool.hpp + ErlangDbTool.cpp) + +target_link_libraries(TestCilent + pthread + glog + rt + ) +add_executable(cNodeTest + cnode.cpp ShareMemoryTool.hpp cnode.cpp) + +target_link_libraries(cNodeTest + ei + erl_interface_st + ei_st + glog + erl_interface + pthread + rt + ) + +add_executable(callbacktest + testCallBack.cpp) + +target_link_libraries(callbacktest + ei + erl_interface_st + ei_st + glog + erl_interface + pthread + rt + ) \ No newline at end of file diff --git a/syncDBTool/Client.cpp b/syncDBTool/Client.cpp new file mode 100755 index 0000000..ca83cb9 --- /dev/null +++ b/syncDBTool/Client.cpp @@ -0,0 +1,51 @@ +// +// Created by ps on 8/9/18. +// + + +#include "ShareMemoryTool.hpp" + +int main() { + +// char cc = '1'; +// for (int i = 0; i < 100; i++) { +// cc++; +// printf("%c \n", cc); +// } + + + try { +// BISTL::shared_memory_object + // init +// BISTL::managed_shared_memory segment(BISTL::open_only, "aaa8" ); + BISTL::BiMapFeaData biMapFeaData("test"); + +// const BISTL::void_allocator alloc_inst (segment.get_segment_manager()); + +// BISTL::bi_map_Feature_Info * mymap = +// segment.construct<BISTL::bi_map_Feature_Info>("MyMap")(std::less<BISTL::char_string>(),alloc_inst); +// BISTL::bi_map_Feature_Info *mymap = +// segment.find_or_construct<BISTL::bi_map_Feature_Info>("aaa8")(std::less<BISTL::char_string>(), alloc_inst); + + auto mymap = biMapFeaData.getMap(); + auto size = mymap->size(); + for (auto it = mymap->begin(); it != mymap->end(); it++) { +// printf("%s \n", it->second.id.c_str()); +// printf("%d \n", it->second.id); + std::cout << "id " << it->second.m_id << std::endl; + std::cout << "feature " << it->second.m_feature << std::endl; +// it->second.id; + } + printf("\n"); + +// BISTL::shared_memory_object::remove("SharedMemory"); + } + catch (const std::exception &e) { + printf("Exception:%s\n", e.what()); + BISTL::shared_memory_object::remove("test"); + } + getchar(); + BISTL::shared_memory_object::remove("test"); + + return 0; +} \ No newline at end of file diff --git a/syncDBTool/ErlangDbTool.cpp b/syncDBTool/ErlangDbTool.cpp new file mode 100755 index 0000000..a96f15d --- /dev/null +++ b/syncDBTool/ErlangDbTool.cpp @@ -0,0 +1,2054 @@ +// +// Created by ps on 18-11-29. +// + +#include "ErlangDbTool.h" + +#include <QtSql/QSql> +#include <QtSql/QSqlDatabase> +#include <QtSql/QSqlError> +#include <QtSql/QSqlQuery> +#include <QtCore/QString> +#include <QtCore/QDebug> +#include <QtCore/QVariantList> + +using ErlangTool::map_DevDataCache; +using ErlangTool::map_TabDataCache; +using ErlangTool::map_BwDataCache; +using ErlangTool::map_FaceDataCache; + + +static QSqlDatabase g_syncDbFile = QSqlDatabase::addDatabase("QSQLITE", "SyncDBSqliteFile"); + + +static bool ErlangTool::dir_file_exists(std::string dir, bool mkdir_flag) { + int state = access(dir.c_str(), R_OK | W_OK); // 澶存枃浠� #include <unistd.h> + if (state == 0) { + //#todo + INFO("file exist"); + return true; + } else if (mkdir_flag) { + dir = "mkdir -p " + dir; + system(dir.c_str()); // 璋冪敤linux绯荤粺鍛戒护鍒涘缓鏂囦欢 + //#todo + return true; + } else { + return false; + } +} + +static bool ErlangTool::pingNode(const std::string &nodeName, const std::string &cookie) { + int fd = -1; + int ret = -1; +// erl_init(NULL, 0); +// struct in_addr addr; +// addr.s_addr = inet_addr("127.0.0.1"); + +// std::string str_node("cnode"); +// str_node.append(to_string((int) getpid())); + +// std::string t_nodeName(str_node); +// t_nodeName.append("@127.0.0.1"); + +// INFO("str_node << " << str_node << " ;t_nodeName " << t_nodeName); + +// if (erl_connect_xinit(str_node.c_str(), str_node.c_str(), t_nodeName.c_str(), &addr, cookie.c_str(), 0) == -1) { +// ERR("erl_connect_xinit error"); +// erl_err_quit("erl_connect_xinit"); +// return false; +// } + + fd = erl_connect(const_cast<char *>(nodeName.c_str())); + if (0 > fd) { + erl_close_connection(fd); + ERR("erl_connect error " << nodeName); +// erl_err_quit("erl_connect"); + return false; + } + erl_close_connection(fd); + return true; +} + +static int ErlangTool::checkETERMType(ETERM *elemen) { + if (elemen == NULL) { + return -1; + } + switch (ERL_TYPE(elemen)) { + case ERL_UNDEF: + return ERL_UNDEF; + case ERL_INTEGER: + INFO("value is a int: " << ERL_INT_VALUE(elemen)); + return ERL_INTEGER; + case ERL_U_INTEGER: + break; + case ERL_ATOM: { +// int atomSize = ERL_ATOM_SIZE(elemen); +// char *atomValue = ERL_ATOM_PTR(elemen); +// printf("value is a atom: atomSize:%d, atomValue:%s \n\r", atomSize, atomValue); + return ERL_ATOM; + } + case ERL_PID: + break; + case ERL_PORT: + break; + case ERL_REF: + break; + case ERL_LIST: +// printf("value is a list:%s\n", erl_iolist_to_string(elemen)); + return ERL_LIST; + case ERL_NIL: + return ERL_EMPTY_LIST; + case ERL_TUPLE: + INFO("value is a tupe: " << ERL_ATOM_PTR(erl_element(1, elemen))); + return ERL_TUPLE; + case ERL_BINARY: + break; + case ERL_FLOAT: + break; + case ERL_VARIABLE: + break; + case ERL_SMALL_BIG: + break; + case ERL_U_SMALL_BIG: + break; + case ERL_FUNCTION: + break; + case ERL_BIG: + break; + case ERL_LONGLONG: + break; + case ERL_U_LONGLONG: + break; + default: + ERR("[Client] got a value but now checked\n\r"); + //#todo morechuli + } + return -1; +} + +static void ErlangTool::erlangFreeEterm(int count, ...) { + va_list args; + va_start(args, count); + for (int i = 0; i < count; ++i) { + auto test = va_arg(args, ETERM*); + erl_free_compound(test); +// if (test != NULL) +// erl_free_compound(test); +// else{ +// +// } + } +} + + +ErlangTool::ErlangDbTool::ErlangDbTool() : m_fd(-1) { + +} + +ErlangTool::ErlangDbTool::ErlangDbTool(const std::string &nodeName, const std::string &cookie, const std::string &pName) + : m_fd(-1), m_path(""), m_nodeName(nodeName), m_cookie(cookie), m_pName(pName) { + initCNode(); +} + +ErlangTool::ErlangDbTool::ErlangDbTool(const std::string &path, const std::string &nodeName, const std::string &cookie, + const std::string &pName) + : m_fd(-1), m_path(path), m_nodeName(nodeName), m_cookie(cookie), m_pName(pName) { + initCNode(); +} + + +ErlangTool::ErlangDbTool::ErlangDbTool(const std::string &path, const std::string &nodeName, const std::string &cookie, + const std::string &clusterID, const std::string &clusterName) : + m_fd(-1), m_path(path), m_nodeName(nodeName), m_cookie(cookie), m_clusterID(clusterID), m_clusterName(clusterName) { + +} + + +ErlangTool::ErlangDbTool::ErlangDbTool(const std::string &path, const std::string &nodeName, const std::string &cookie, + const std::string &clusterID, const std::string &clusterName, + const std::string &pName) : + m_fd(-1), m_path(path), m_nodeName(nodeName), m_cookie(cookie), m_clusterID(clusterID), m_clusterName(clusterName), + m_pName(pName) { + initCNode(); +} + +ErlangTool::ErlangDbTool::~ErlangDbTool() { + g_syncDbFile.close(); + erl_close_connection(m_fd); +} + + +void ErlangTool::ErlangDbTool::initCNode() { + //--------------init db------------------- + std::string str_SyncDbFile = "/opt/erlang/"; + str_SyncDbFile.append(m_nodeName.substr(0, m_nodeName.find("@"))).append(".db"); + g_syncDbFile.setDatabaseName(str_SyncDbFile.c_str()); + g_syncDbFile.open(); + + erl_init(NULL, 0); + struct in_addr addr; + //#todo + addr.s_addr = inet_addr("127.0.0.1"); + + m_pName.append(to_string((int) getpid())); + + std::string t_cNodeName(m_pName); + t_cNodeName.append("@127.0.0.1"); + m_cNodeName.swap(t_cNodeName); + //m_pName + if (erl_connect_xinit(const_cast<char *>(m_pName.c_str()), const_cast<char *>(m_pName.c_str()), + const_cast<char *>(m_cNodeName.c_str()), &addr, + const_cast<char *>(m_cookie.c_str()), 0) == -1) { + ERR("erl_connect_xinit error" << m_pName << " " << m_cNodeName << " " << m_cookie); + erl_err_quit("erl_connect_xinit"); + } else { + INFO("erl_connect_xinit ok " << m_pName << " " << m_cNodeName << " " << m_cookie); + } +} + + +int ErlangTool::ErlangDbTool::initErlang() { + if (m_nodeName == "") { + ERR("m_nodeName is null "); + return 3; + } + m_ret = pingNode(m_nodeName, m_cookie); + if (!m_ret) { + if (dir_file_exists(m_path, true)) { + std::string cmd = std::string("cd " + m_path + " && erl -name " + m_nodeName + " -setcookie " + + m_cookie + " -mnesia dir '\"" + m_path + + "\"' -detached -noshell");// >>log + std::cout << cmd << std::endl; + system(cmd.c_str()); + std::cout << m_ret << std::endl; + m_ret = waitNode(); + resetConn(); + return m_ret; + } else { + ERR("create file faile "); + return 0; + } + } else { + INFO("node is running"); + return 2; + } +} + +std::string ErlangTool::ErlangDbTool::getConfigJsonString() { + Json::Value t_json; + Json::FastWriter writer; + + t_json["\"path\""] = "\"" + m_path + "\""; + t_json["\"nodeName\""] = "\"" + m_nodeName + "\""; + t_json["\"cookie\""] = "\"" + m_cookie + "\""; + t_json["\"clusterID\""] = "\"" + m_clusterID + "\""; + t_json["\"clusterName\""] = "\"" + m_clusterName + "\""; + + std::string str_json = writer.write(t_json); + + return str_json.substr(0, str_json.length() - 1); +} + +bool ErlangTool::ErlangDbTool::startNodeDb(std::string FatherNodeName, std::string DeviceId, std::string DevAdd) { + LockG lock(m_mutex); +// m_mutex.lock(); + m_ret = resetConn(); + if (m_ret) { +// DeviceName = DeviceName.empty() ? m_nodeName : DeviceName; + } else { + //#todo error message + ERR(" error " << m_ret << " " << m_fd); + return false; + } + + ErlMessage emsg; /* Incoming message */ + //hanshu canshu + ETERM *arrlist[5]; + arrlist[0] = erl_mk_atom(m_nodeName.c_str()); + arrlist[1] = erl_mk_atom(FatherNodeName.c_str()); + arrlist[2] = erl_mk_atom(DeviceId.c_str()); + arrlist[3] = erl_mk_atom(m_clusterID.c_str()); + arrlist[4] = erl_mk_string(m_clusterName.c_str()); + ETERM *list = erl_mk_list(arrlist, 5); + +// std::cout << __FILE__ << __FUNCTION__ <<__LINE__ << " " << m_fd << std::endl; +// erl_rpc(m_fd, "syncDB", "startNode", list); + int ret = -1; + ret = erl_rpc_to(m_fd, "syncDB", "startNode", list); + if (ret == ERL_TICK) { + ret = erl_rpc_from(m_fd, 9000000000, &emsg); + //erl_close_connection(m_fd); +// m_mutex.unlock(); + if (ret == ERL_MSG) { + std::map<std::string, std::string> t_results; + ETERM *key, *value; + ETERM *tuplep[6]; + + tuplep[0] = erl_element(2, emsg.msg); + key = erl_element(1, tuplep[0]); + value = erl_element(2, tuplep[0]); +// printf("key:%s\n", ERL_ATOM_PTR(key)); + switch (checkETERMType(value)) { + case ERL_ATOM: { + int atomSize = ERL_ATOM_SIZE(value); + char *atomValue = ERL_ATOM_PTR(value); + t_results.insert(std::make_pair(ERL_ATOM_PTR(key), atomValue)); +// printf("value is a atom: atomSize:%d, atomValue:%s \n\r", atomSize, atomValue); + break; + } + default: + ERR("error add case todo \n\r"); + } + auto it = t_results.find("atomic"); + if (t_results.size() > 0 && t_results.end() != it && it->second == "ok") { +// erlangFreeEterm(7, emsg.to, emsg.msg, emsg.from, list, key, value, tuplep[0]); +// erl_eterm_release(); + return true; + } //if end + else { + INFO(" t_results size is " << t_results.size()); + for (auto &item : t_results) { + INFO("item is " << item.first << " " << item.second); + } + } + }//ret == ERL_MSG end + else { + ERR(" ret is " << ret); + + } + } //ret == ERL_TICK + +// erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list); + return false; +} + +bool ErlangTool::ErlangDbTool::removeNode() { + LockG lock(m_mutex); +// m_mutex.lock(); + m_ret = resetConn(); + if (!m_ret) { + //#todo error message + std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << m_ret << " " << m_fd << std::endl; + return false; + } + int ret = -1; + ErlMessage emsg; /* Incoming message */ + //hanshu canshu +// ETERM *arrlist[1]; +// arrlist[0] = erl_mk_atom(m_nodeName.c_str()); + ETERM *list = erl_mk_empty_list();// (arrlist, 0); + +// std::cout << __FILE__ << __FUNCTION__ <<__LINE__ << " " << m_fd << std::endl; + ret = erl_rpc_to(m_fd, "syncDB", "removeNode", list); + if (ret == ERL_TICK) { + ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); + //erl_close_connection(m_fd); +// m_mutex.unlock(); + if (ret == ERL_MSG) { + std::map<std::string, std::string> t_results; + ETERM *key, *value; + ETERM *tuplep[6]; + + tuplep[0] = erl_element(2, emsg.msg); + key = erl_element(1, tuplep[0]); + value = erl_element(2, tuplep[0]); +// printf("key:%s\n", ERL_ATOM_PTR(key)); + switch (checkETERMType(value)) { + case ERL_ATOM: { + int atomSize = ERL_ATOM_SIZE(value); + char *atomValue = ERL_ATOM_PTR(value); + t_results.insert(std::make_pair(ERL_ATOM_PTR(key), atomValue)); +// printf("value is a atom: atomSize:%d, atomValue:%s \n\r", atomSize, atomValue); + break; + } + default: + printf("error add case todo \n\r"); + } + auto it = t_results.find("atomic"); + if (t_results.size() > 0 && t_results.end() != it && it->second == "ok") { + //鍒犻櫎鏈湴鏂囦欢 + if (!m_path.empty()) { + std::string cmd = std::string("rm -rf ").append(m_path); + //#todo + system(cmd.c_str()); + } + erlangFreeEterm(7, emsg.to, emsg.msg, emsg.from, list, key, value, tuplep[0]); + erl_eterm_release(); + return true; + } //if end + } //ret == ERL_MSG end + } //ret == ERL_TICK + + erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list); + return false; +} + +bool ErlangTool::ErlangDbTool::modifyCluName(std::string CluId, std::string CluName) { + LockG lock(m_mutex); +// m_mutex.lock(); + m_ret = resetConn(); + if (!m_ret) { + //#todo error message + std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << m_ret << " " << m_fd << std::endl; + return false; + } + ErlMessage emsg; /* Incoming message */ + int ret = -1; + ETERM *arrlist[2]; + arrlist[0] = erl_mk_atom(CluId.c_str()); + arrlist[1] = erl_mk_string(CluName.c_str()); + ETERM *list = erl_mk_list(arrlist, 2); + + ret = erl_rpc_to(m_fd, "syncDB", "modifyCluName", list); + if (ret == ERL_TICK) { + ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); + //erl_close_connection(m_fd); +// m_mutex.unlock(); + if (ret == ERL_MSG) { + std::map<std::string, std::string> t_results; + + ETERM *tail_list; + ETERM *list_ret[1000], *arr_ret[2]; + ETERM *key, *value; + ETERM *tuplep[6]; + + arr_ret[0] = erl_element(2, emsg.msg); + int erlLength = erl_length(arr_ret[0]); + printf("arr_ret[0]:%d\n", erlLength); + list_ret[0] = erl_hd(arr_ret[0]); + tail_list = erl_tl(arr_ret[0]); + for (int i = 0; i < erlLength; i++) { + if (i > 0) { + list_ret[i] = erl_hd(tail_list); + tail_list = erl_tl(tail_list); + } +// printf("list_ret[%d]:%d\n", i, erl_length(list_ret[i])); + tuplep[0] = erl_hd(list_ret[i]); + key = erl_element(1, list_ret[i]); + value = erl_element(2, list_ret[i]); +// printf("key:%s\n", ERL_ATOM_PTR(key)); + + switch (checkETERMType(value)) { + case ERL_ATOM: { + int atomSize = ERL_ATOM_SIZE(value); + char *atomValue = ERL_ATOM_PTR(value); + printf("value is a atom: atomSize:%d, atomValue:%s \n\r", atomSize, atomValue); + t_results.insert(std::make_pair(ERL_ATOM_PTR(key), atomValue)); + break; + } + default: + printf("error add case todo \n\r"); + } + erlangFreeEterm(4, key, value, tuplep[0], list_ret[i]); + + } + erlangFreeEterm(2, tail_list, arr_ret[0]); + erl_eterm_release(); + auto it = t_results.find("atomic"); + if (t_results.size() > 0 && t_results.end() != it && it->second == "ok") { + return true; + } + } + } + erl_free_array(arrlist, 2); +// erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list); + erl_eterm_release(); + return false; +} + + +ErlangTool::map_DevDataCache ErlangTool::ErlangDbTool::findAllNode() { + LockG lock(m_mutex); +// m_mutex.lock(); + m_ret = resetConn(); + if (!m_ret) { + //#todo error message + ERR(" error " << m_ret << " " << m_fd); + return map_DevDataCache(); + } + map_DevDataCache devDataCache; + int ret = -1; + ErlMessage emsg; /* Incoming message */ + //hanshu canshu +// ETERM *arrlist[0]; +// arrlist[0] = erl_mk_atom(m_nodeName.c_str()); + ETERM *list = erl_mk_empty_list();//erl_mk_list(arrlist, 0); + + ret = erl_rpc_to(m_fd, "syncDB", "findAllNode", list); + if (ret == ERL_TICK) { + ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); + //erl_close_connection(m_fd); +// m_mutex.unlock(); + if (ret == ERL_MSG) { + ETERM *key, *value; + ETERM *tuplep[20]; + ETERM *arr_ret[2], *list_ret[1000]; + ETERM *tail_list, *tail_tuple; + arr_ret[0] = erl_element(2, emsg.msg); + if (checkETERMType(arr_ret[0]) == ERL_LIST) { + int erlLength = erl_length(arr_ret[0]); +// printf("arr_ret[0]:%d\n", erlLength); + list_ret[0] = erl_hd(arr_ret[0]); + tail_list = erl_tl(arr_ret[0]); + for (int i = 0; i < erlLength; i++) { + if (i > 0) { + list_ret[i] = erl_hd(tail_list); + tail_list = erl_tl(tail_list); + } + if (checkETERMType(list_ret[i]) == ERL_LIST) { + SyncDB::Device_Info device_info; + int erlLength1 = erl_length(list_ret[i]); +// printf("list_ret[%d]:%d\n", i, erlLength1); + tuplep[0] = erl_hd(list_ret[i]); + tail_tuple = erl_tl(list_ret[i]); + + for (int j = 0; j < erlLength1; j++) { + if (j > 0) { + tuplep[j] = erl_hd(tail_tuple); + tail_tuple = erl_tl(tail_tuple); + } + key = erl_element(1, tuplep[j]); + value = erl_element(2, tuplep[j]); +// printf("key:%s\n", erl_iolist_to_string(key)); + switch (checkETERMType(value)) { + case ERL_ATOM: { + device_info.setValue(erl_iolist_to_string(key), ERL_ATOM_PTR(value)); + break; + } + case ERL_INTEGER: { + device_info.setValue(erl_iolist_to_string(key), + std::to_string(ERL_INT_VALUE(value))); + break; + } + case ERL_LIST: { + device_info.setValue(erl_iolist_to_string(key), + erl_iolist_to_string(value)); + break; + } + default: + ERR("error add case todo" << checkETERMType(value) << " key is " + << checkETERMType(key)); + } + erlangFreeEterm(3, key, value, tuplep[j]); + } +// printf("\none list end\n\n\n\n"); + // #todo this is have a bug +// device_info.create_by = ""; + devDataCache.insert(std::make_pair(device_info.uuid, device_info)); + erlangFreeEterm(1, tail_tuple); + } else { + ERR("type error " << checkETERMType(list_ret[i])); + } + erlangFreeEterm(1, list_ret[i]); + } + + erlangFreeEterm(5, emsg.to, emsg.msg, emsg.from, tail_list, arr_ret[0]); + erl_eterm_release(); + return devDataCache; + } else { + ERR(" error " << checkETERMType(arr_ret[0])); + } + } + } else { + ERR("ret != ERL_TICK"); + } //ret == ERL_TICK end + erlangFreeEterm(3, emsg.to, emsg.msg, emsg.from); + erl_eterm_release(); + return map_DevDataCache(); +} + +bool ErlangTool::ErlangDbTool::createDatabase(std::string TableType, std::string TableName, bool SyncType, + std::string BwType, std::string StartTime, std::string EndTime) { + LockG lock(m_mutex); +// m_mutex.lock(); + m_ret = resetConn(); + if (!m_ret) { + //#todo error message + std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << m_ret << " " << m_fd << std::endl; + return false; + } + std::string NewTableName = ((!SyncType) && TableName.find("lt_")) ? std::string("lt_").append(TableName) + : TableName; + + ErlMessage emsg; /* Incoming message */ + int ret = -1; + ETERM *arrlist[6]; + arrlist[0] = erl_mk_atom(TableType.c_str()); + arrlist[1] = erl_mk_string(NewTableName.c_str()); + auto str = std::to_string(SyncType); + arrlist[2] = erl_mk_atom(str.c_str()); + arrlist[3] = erl_mk_atom(BwType.c_str()); + arrlist[4] = erl_mk_atom(StartTime.c_str()); + arrlist[5] = erl_mk_atom(EndTime.c_str()); + ETERM *list = erl_mk_list(arrlist, 6); + + ret = erl_rpc_to(m_fd, "syncDB", "createDatabase", list); + if (ret == ERL_TICK) { + ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); + //erl_close_connection(m_fd); +// m_mutex.unlock(); + if (ret == ERL_MSG) { + std::map<std::string, std::string> t_results; + + ETERM *tail_list; + ETERM *list_ret[1000], *arr_ret[2]; + ETERM *key, *value; + ETERM *tuplep[6]; + + arr_ret[0] = erl_element(2, emsg.msg); + int erlLength = erl_length(arr_ret[0]); + printf("arr_ret[0]:%d\n", erlLength); + list_ret[0] = erl_hd(arr_ret[0]); + tail_list = erl_tl(arr_ret[0]); + for (int i = 0; i < erlLength; i++) { + if (i > 0) { + list_ret[i] = erl_hd(tail_list); + tail_list = erl_tl(tail_list); + } +// printf("list_ret[%d]:%d\n", i, erl_length(list_ret[i])); + tuplep[0] = erl_hd(list_ret[i]); + key = erl_element(1, list_ret[i]); + value = erl_element(2, list_ret[i]); +// printf("key:%s\n", ERL_ATOM_PTR(key)); + + switch (checkETERMType(value)) { + case ERL_ATOM: { +// int atomSize = ERL_ATOM_SIZE(value); + char *atomValue = ERL_ATOM_PTR(value); +// printf("value is a atom: atomSize:%d, atomValue:%s \n\r", atomSize, atomValue); + t_results.insert(std::make_pair(ERL_ATOM_PTR(key), atomValue)); + break; + } + default: + printf("error add case todo \n\r"); + } + erlangFreeEterm(4, key, value, tuplep[0], list_ret[i]); + + } + erlangFreeEterm(2, tail_list, arr_ret[0]); + erl_eterm_release(); + auto it = t_results.find("atomic"); + if (t_results.size() > 0 && t_results.end() != it && it->second == "ok") { + return true; + } + } + } + erl_free_array(arrlist, 6); +// erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list); + erl_eterm_release(); + return false; +} + +bool ErlangTool::ErlangDbTool::updateDatabase(std::string UUID, std::string TableType, std::string TableName, + bool SyncType, std::string BwType, std::string StartTime, + std::string EndTime) { + LockG lock(m_mutex); +// m_mutex.lock(); + m_ret = resetConn(); + if (!m_ret) { + //#todo error message + std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << m_ret << " " << m_fd << std::endl; + return false; + } + std::string NewTableName = ((!SyncType) && TableName.find("lt_")) ? std::string("lt_").append(TableName) + : TableName; + + ErlMessage emsg; /* Incoming message */ + int ret = -1; + ETERM *arrlist[7]; + arrlist[0] = erl_mk_atom(UUID.c_str()); + arrlist[1] = erl_mk_atom(TableType.c_str()); + arrlist[2] = erl_mk_string(NewTableName.c_str()); + auto str = std::to_string(SyncType); + arrlist[3] = erl_mk_atom(str.c_str()); + arrlist[4] = erl_mk_atom(BwType.c_str()); + arrlist[5] = erl_mk_atom(StartTime.c_str()); + arrlist[6] = erl_mk_atom(EndTime.c_str()); + ETERM *list = erl_mk_list(arrlist, 7); + + ret = erl_rpc_to(m_fd, "syncDB", "updateDatabase", list); + if (ret == ERL_TICK) { + ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); + //erl_close_connection(m_fd); +// m_mutex.unlock(); + if (ret == ERL_MSG) { + std::map<std::string, std::string> t_results; + + ETERM *tail_list; + ETERM *list_ret[1000], *arr_ret[2]; + ETERM *key, *value; + ETERM *tuplep[6]; + + arr_ret[0] = erl_element(2, emsg.msg); + int erlLength = erl_length(arr_ret[0]); + printf("arr_ret[0]:%d\n", erlLength); + list_ret[0] = erl_hd(arr_ret[0]); + tail_list = erl_tl(arr_ret[0]); + for (int i = 0; i < erlLength; i++) { + if (i > 0) { + list_ret[i] = erl_hd(tail_list); + tail_list = erl_tl(tail_list); + } +// printf("list_ret[%d]:%d\n", i, erl_length(list_ret[i])); + tuplep[0] = erl_hd(list_ret[i]); + key = erl_element(1, list_ret[i]); + value = erl_element(2, list_ret[i]); +// printf("key:%s\n", ERL_ATOM_PTR(key)); + + switch (checkETERMType(value)) { + case ERL_ATOM: { +// int atomSize = ERL_ATOM_SIZE(value); + char *atomValue = ERL_ATOM_PTR(value); +// printf("value is a atom: atomSize:%d, atomValue:%s \n\r", atomSize, atomValue); + t_results.insert(std::make_pair(ERL_ATOM_PTR(key), atomValue)); + break; + } + default: + printf("error add case todo \n\r"); + } + erlangFreeEterm(4, key, value, tuplep[0], list_ret[i]); + } + erlangFreeEterm(2, tail_list, arr_ret[0]); + erl_eterm_release(); + auto it = t_results.find("atomic"); + if (t_results.size() > 0 && t_results.end() != it && it->second == "ok") { + return true; + } + } + } + erl_free_array(arrlist, 7); +// erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list); + erl_eterm_release(); + return false; +} + +bool ErlangTool::ErlangDbTool::deleteDatabase(std::string TableType, std::string TableName, bool SyncType) { + LockG lock(m_mutex); +// m_mutex.lock(); + m_ret = resetConn(); + if (!m_ret) { + //#todo error message + ERR(" error " << m_ret << " " << m_fd); + return false; + } + std::string NewTableName = ((!SyncType) && TableName.find("lt_")) ? std::string("lt_").append(TableName) + : TableName; + + ErlMessage emsg; /* Incoming message */ + int ret = -1; + + ETERM *arrlist[2]; + arrlist[0] = erl_mk_atom(TableType.c_str()); + arrlist[1] = erl_mk_string(NewTableName.c_str()); + ETERM *list = erl_mk_list(arrlist, 2); + + ret = erl_rpc_to(m_fd, "syncDB", "deleteDatabase", list); + if (ret == ERL_TICK) { + ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); + //erl_close_connection(m_fd); +// m_mutex.unlock(); + if (ret == ERL_MSG) { + std::map<std::string, std::string> t_results; + ETERM *tail_list; + ETERM *list_ret[10], *arr_ret[2]; + ETERM *key, *value; + ETERM *tuplep[6]; + arr_ret[0] = erl_element(2, emsg.msg); + int erlLength = erl_length(arr_ret[0]); + printf("arr_ret[0]:%d\n", erlLength); + list_ret[0] = erl_hd(arr_ret[0]); + tail_list = erl_tl(arr_ret[0]); + for (int i = 0; i < erlLength; i++) { + if (i > 0) { + list_ret[i] = erl_hd(tail_list); + tail_list = erl_tl(tail_list); + } +// printf("list_ret[%d]:%d\n", i, erl_length(list_ret[i])); + tuplep[0] = erl_hd(list_ret[i]); + key = erl_element(1, list_ret[i]); + value = erl_element(2, list_ret[i]); +// printf("key:%s\n", ERL_ATOM_PTR(key)); + switch (checkETERMType(value)) { + case ERL_ATOM: { + int atomSize = ERL_ATOM_SIZE(value); + char *atomValue = ERL_ATOM_PTR(value); + t_results.insert(std::make_pair(ERL_ATOM_PTR(key), atomValue)); + printf("value is a atom: atomSize:%d, atomValue:%s \n\r", atomSize, atomValue); + break; + } + default: + printf("error add case todo \n\r"); + } + erlangFreeEterm(4, key, value, tuplep[0], list_ret[i]); + } + erlangFreeEterm(2, tail_list, arr_ret[0]); + auto it = t_results.find("atomic"); + if (t_results.size() > 0 && t_results.end() != it && it->second == "ok") { + return true; + } + } + } + erl_free_array(arrlist, 2); + erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list); + return false; +} + +// 鍜宔rlang浜や簰 +//ErlangTool::map_TabDataCache ErlangTool::ErlangDbTool::findAllDatabase() { +// LockG lock(m_mutex); +//// m_mutex.lock(); +// m_ret = resetConn(); +// map_TabDataCache tabDataCache; +// if (!m_ret) { +// //#todo error message +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << m_ret << " " << m_fd << std::endl; +// return tabDataCache; +// } +// int ret = -1; +// ErlMessage emsg; /* Incoming message */ +// //hanshu canshu +//// ETERM *arrlist[0]; +//// arrlist[0] = erl_mk_atom(m_nodeName.c_str()); +// ETERM *list = erl_mk_empty_list();//erl_mk_list(arrlist, 0); +// +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " " << m_fd << std::endl; +// ret = erl_rpc_to(m_fd, "syncDB", "findAllDatabase", list); +// if (ret == ERL_TICK) { +// ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); +// //erl_close_connection(m_fd); +//// m_mutex.unlock(); +// if (ret == ERL_MSG) { +// ETERM *key, *value; +// ETERM *tuplep[20]; +// ETERM *arr_ret[2], *list_ret[1000]; +// ETERM *tail_list, *tail_tuple; +// arr_ret[0] = erl_element(2, emsg.msg); +// if (checkETERMType(arr_ret[0]) == ERL_LIST) { +// int erlLength = erl_length(arr_ret[0]); +// list_ret[0] = erl_hd(arr_ret[0]); +// tail_list = erl_tl(arr_ret[0]); +// for (int i = 0; i < erlLength; i++) { +// if (i > 0) { +// list_ret[i] = erl_hd(tail_list); +// tail_list = erl_tl(tail_list); +// } +// if (checkETERMType(list_ret[i]) == ERL_LIST) { +// SyncDB::Table_Info table_info; +// int erlLength1 = erl_length(list_ret[i]); +// tuplep[0] = erl_hd(list_ret[i]); +// tail_tuple = erl_tl(list_ret[i]); +// +// for (int j = 0; j < erlLength1; j++) { +// if (j > 0) { +// tuplep[j] = erl_hd(tail_tuple); +// tail_tuple = erl_tl(tail_tuple); +// } +// key = erl_element(1, tuplep[j]); +// value = erl_element(2, tuplep[j]); +// switch (checkETERMType(value)) { +// case ERL_ATOM: { +// table_info.setValue(erl_iolist_to_string(key), ERL_ATOM_PTR(value)); +// break; +// } +// case ERL_INTEGER: { +// table_info.setValue(erl_iolist_to_string(key), +// std::to_string(ERL_INT_VALUE(value))); +// break; +// } +// case ERL_LIST: { +// table_info.setValue(erl_iolist_to_string(key), +// erl_iolist_to_string(value)); +// break; +// } +// default: +// printf("error add case todo %d\n\r", checkETERMType(value)); +// } +//// erlangFreeEterm(3, key, value, tuplep[j]); +// } +//// erlangFreeEterm(2, tail_tuple, list_ret[i]); +// +// // #todo this is have a bug +//// table_info.create_by = ""; +// tabDataCache.insert(std::make_pair(table_info.tableName, table_info)); +// } else { +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " type error " +// << checkETERMType(arr_ret[0]) +// << " " +// << std::endl; +// } +// } +//// erlangFreeEterm(2, tail_list, arr_ret[0]); +// return tabDataCache; //ok +// } else { +// ERR(" error " << checkETERMType(arr_ret[0])); +// } +// } +// } +//// erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list); +// return tabDataCache; //not ok +//} + +//#todo +//鐩存帴鍜宻qlite3 浜や簰 +ErlangTool::map_TabDataCache ErlangTool::ErlangDbTool::findAllDatabase() { + map_TabDataCache tabDataCache; + + QString sql = QString::fromStdString( + "SELECT uuid,tableName,tableType,bwType,startTime,endTime FROM sys_o_tables where del_flag=0;"); + QSqlQuery query(g_syncDbFile); + query.prepare(sql); + if (!query.exec()) { + qDebug() << "getTableNameList" << __FILE__ << __LINE__ << query.lastError(); + } else { + while (query.next()) { + SyncDB::Table_Info t_table_info; + t_table_info.uuid = query.value(0).toString().toStdString(); + t_table_info.tableName = query.value(1).toString().toStdString(); + t_table_info.tableType = query.value(2).toString().toStdString(); + t_table_info.bwType = query.value(3).toString().toStdString(); + t_table_info.startTime = query.value(4).toString().toStdString(); + t_table_info.endTime = query.value(5).toString().toStdString(); + + tabDataCache.insert(std::make_pair(t_table_info.uuid, t_table_info)); + } + } + return tabDataCache; //not ok +} + +/*** + * @deprecated + * @return + */ +ErlangTool::map_BwDataCache ErlangTool::ErlangDbTool::findAllTypeInfo() { + return map_BwDataCache(); + LockG lock(m_mutex); +// m_mutex.lock(); + m_ret = resetConn(); + if (!m_ret) { + //#todo error message + std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << m_ret << " " << m_fd << std::endl; + return map_BwDataCache(); + } + map_BwDataCache bwDataCache; + int ret = -1; + ErlMessage emsg; /* Incoming message */ + ETERM *list = erl_mk_empty_list();//erl_mk_list(arrlist, 0); + +// std::cout << __FILE__ << __FUNCTION__ <<__LINE__ << " " << m_fd << std::endl; + ret = erl_rpc_to(m_fd, "syncDB", "findAllTypeInfo", list); + if (ret == ERL_TICK) { + ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); + //erl_close_connection(m_fd); +// m_mutex.unlock(); + if (ret == ERL_MSG) { + ETERM *key, *value; + ETERM *tuplep[20]; + ETERM *arr_ret[2], *list_ret[1000]; + ETERM *tail_list, *tail_tuple; + arr_ret[0] = erl_element(2, emsg.msg); + if (checkETERMType(arr_ret[0]) == ERL_LIST) { + int erlLength = erl_length(arr_ret[0]); +// printf("arr_ret[0]:%d\n", erlLength); + list_ret[0] = erl_hd(arr_ret[0]); + tail_list = erl_tl(arr_ret[0]); + for (int i = 0; i < erlLength; i++) { + if (i > 0) { + list_ret[i] = erl_hd(tail_list); + tail_list = erl_tl(tail_list); + } + if (checkETERMType(list_ret[i]) == ERL_LIST) { + SyncDB::Bw_Info bw_info; + int erlLength1 = erl_length(list_ret[i]); +// printf("list_ret[%d]:%d\n", i, erlLength1); + tuplep[0] = erl_hd(list_ret[i]); + tail_tuple = erl_tl(list_ret[i]); + + for (int j = 0; j < erlLength1; j++) { + if (j > 0) { + tuplep[j] = erl_hd(tail_tuple); + tail_tuple = erl_tl(tail_tuple); + } + key = erl_element(1, tuplep[j]); + value = erl_element(2, tuplep[j]); +// printf("key:%s\n", erl_iolist_to_string(key)); + switch (checkETERMType(value)) { + case ERL_ATOM: { + bw_info.setValue(erl_iolist_to_string(key), ERL_ATOM_PTR(value)); + break; + } + case ERL_INTEGER: { + bw_info.setValue(erl_iolist_to_string(key), + std::to_string(ERL_INT_VALUE(value))); + break; + } + case ERL_LIST: { + bw_info.setValue(erl_iolist_to_string(key), + erl_iolist_to_string(value)); + break; + } + default: + printf("error add case todo %d\n\r", checkETERMType(value)); + } +// erlangFreeEterm(3, key, value, tuplep[j]); + } +// erlangFreeEterm(2, tail_tuple, list_ret[i]); +// printf("\none list end\n\n\n\n"); + // #todo this is have a bug +// bw_info.create_by = ""; + bwDataCache.insert(std::make_pair(bw_info.tableName, bw_info)); + } else { + std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " type error " + << checkETERMType(arr_ret[0]) + << " " + << std::endl; + } + } +// erlangFreeEterm(2, tail_list, arr_ret[0]); + return bwDataCache;//ok + } else { + ERR(" error " << checkETERMType(arr_ret[0])); + } + } + } +// erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list); + return map_BwDataCache(); +} + +bool ErlangTool::ErlangDbTool::addPerson(std::string &UUID, std::string TableName, std::string Feature, + std::string ImgUrl, std::string IdCard, std::string PersonName, + std::string Age, std::string Sex, std::string PhoneNum) { + LockG lock(m_mutex); +// m_mutex.lock(); + m_ret = resetConn(); + if (!m_ret) { + //#todo error message + ERR(" error " << m_ret << " " << m_fd << " "); + return false; + } + int ret; + ErlMessage emsg; /* Incoming message */ + //hanshu canshu + ETERM *arrlist[9]; + arrlist[0] = erl_mk_string(TableName.c_str()); + arrlist[1] = erl_mk_string(PersonName.c_str()); + arrlist[2] = erl_mk_string(Age.c_str()); + arrlist[3] = erl_mk_string(Sex.c_str()); + arrlist[4] = erl_mk_string(IdCard.c_str()); + arrlist[5] = erl_mk_string(PhoneNum.c_str()); + arrlist[6] = erl_mk_string(ImgUrl.c_str()); + arrlist[7] = erl_mk_string(UUID.c_str()); + arrlist[8] = erl_mk_string(Feature.c_str()); + std::string TmpUUid; + + ETERM *list = erl_mk_list(arrlist, 9); + ret = erl_rpc_to(m_fd, "syncDB", "addPersonData", list); + if (ret == ERL_TICK) { + + ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); +// UUID.clear(); + //erl_close_connection(m_fd); +// m_mutex.unlock(); + if (ret == ERL_MSG) { + ETERM *value; + value = erl_element(2, emsg.msg); + switch (checkETERMType(value)) { + case ERL_LIST: { + TmpUUid = std::string(erl_iolist_to_string(value)); + break; + } + case ERL_ATOM: { + TmpUUid = std::string(ERL_ATOM_PTR(value)); + break; + } + default: + printf("error add case todo \n\r"); + } + erl_free_term(value); + if (TmpUUid.size() > 0) { + UUID = TmpUUid; + erlangFreeEterm(5, emsg.msg, emsg.from, emsg.to, list, arrlist[8]); + erl_free_array(arrlist, 8); + erl_eterm_release(); + return true; + } + } + } + erlangFreeEterm(5, emsg.msg, emsg.from, emsg.to, list, arrlist[8]); + erl_free_array(arrlist, 8); + erl_eterm_release(); + UUID = ""; + return false; +} + + +ErlangTool::vec_AddDataCache +ErlangTool::ErlangDbTool::addPersons(std::string TableUuid, std::vector<SyncDB::AddPersonInfo> &tmpPer) { + LockG lock(m_mutex); +// m_mutex.lock(); + m_ret = resetConn(); + ErlangTool::vec_AddDataCache t_vec_addDataCache; + if (!m_ret) { + //#todo error message + ERR(" error " << m_ret << " " << m_fd << " "); + return t_vec_addDataCache; + } + int ret; + ErlMessage emsg; /* Incoming message */ + ETERM *person_list[10]; + int loop = 0; + for (auto &item :tmpPer) { + ETERM *arrlist[4]; + arrlist[0] = erl_mk_atom(item.personid.c_str()); + arrlist[1] = erl_mk_atom(item.idcard.c_str()); + arrlist[2] = erl_mk_atom(item.personPic.c_str()); + arrlist[3] = erl_mk_string(item.feature.c_str()); + person_list[loop++] = erl_mk_tuple(arrlist, 4); + } + + //hanshu canshu + ETERM *arrvaluelist[2]; + arrvaluelist[0] = erl_mk_string(TableUuid.c_str()); + arrvaluelist[1] = erl_mk_list(person_list, loop); + + ETERM *list = erl_mk_list(arrvaluelist, 2); + ret = erl_rpc_to(m_fd, "syncDB", "addPersonDatas", list); + if (ret == ERL_TICK) { + ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); + //erl_close_connection(m_fd); +// m_mutex.unlock(); + if (ret == ERL_MSG) { + ETERM *key, *value; + ETERM *tuplep[20]; + ETERM *arr_ret[2], *list_ret[5000]; + ETERM *tail_list, *tail_tuple; + arr_ret[0] = erl_element(2, emsg.msg); + if (checkETERMType(arr_ret[0]) == ERL_LIST) { + int erlLength = erl_length(arr_ret[0]); +// printf("arr_ret[0]:%d\n", erlLength); + list_ret[0] = erl_hd(arr_ret[0]); + tail_list = erl_tl(arr_ret[0]); + for (int i = 0; i < erlLength; i++) { +// DBG(i); + if (i > 0) { + list_ret[i] = erl_hd(tail_list); + tail_list = erl_tl(tail_list); + } + if (tail_list == NULL) + break; + if (checkETERMType(list_ret[i]) == ERL_LIST) { + SyncDB::AddPersRet addPersRet; + int erlLength1 = erl_length(list_ret[i]); +// printf("list_ret[%d]:%d\n", i, erlLength1); + tuplep[0] = erl_hd(list_ret[i]); + tail_tuple = erl_tl(list_ret[i]); + + for (int j = 0; j < erlLength1; j++) { + if (j > 0) { + tuplep[j] = erl_hd(tail_tuple); + tail_tuple = erl_tl(tail_tuple); + } + key = erl_element(1, tuplep[j]); + value = erl_element(2, tuplep[j]); +// printf("key:%s\n", erl_iolist_to_string(key)); + + switch (checkETERMType(value)) { + case ERL_ATOM: { + addPersRet.setValue(erl_iolist_to_string(key), ERL_ATOM_PTR(value)); + break; + } + case ERL_LIST: { + addPersRet.setValue(erl_iolist_to_string(key), + erl_iolist_to_string(value)); + break; + } + default: + printf("error add case todo %d\n\r", checkETERMType(value)); + } + +// erlangFreeEterm(2, key, value); + } +// printf("\none list end\n\n\n\n"); + t_vec_addDataCache.push_back(addPersRet); + } else { + ERR(" type error " << checkETERMType(list_ret[i])); + } + } + erlangFreeEterm(4, emsg.msg, emsg.from, emsg.to, list); + erl_eterm_release(); +// sleep() + return t_vec_addDataCache; + } else { + ERR(" error " << checkETERMType(arr_ret[0])); + } + } else { + ERR("send Message is error"); + } + } + erlangFreeEterm(4, emsg.msg, emsg.from, emsg.to, list); + erl_free_array(arrvaluelist, 2); + erl_eterm_release(); + return t_vec_addDataCache; +} + +bool ErlangTool::ErlangDbTool::delPerson(std::string UUID, std::string TableName) { + LockG lock(m_mutex); +// m_mutex.lock(); + m_ret = resetConn(); + if (!m_ret) { + //#todo error message + ERR(" error " << m_ret << " " << m_fd << " "); + return false; + } + int ret; + ErlMessage emsg; /* Incoming message */ + //hanshu canshu + ETERM *arrlist[2]; +// arrlist[0] = erl_mk_atom(TableName.c_str()); +// arrlist[1] = erl_mk_atom(UUID.c_str()); + arrlist[0] = erl_mk_string(TableName.c_str()); + arrlist[1] = erl_mk_string(UUID.c_str()); + + ETERM *list = erl_mk_list(arrlist, 2); + ret = erl_rpc_to(m_fd, "syncDB", "deletePersonData", list); + if (ret == ERL_TICK) { + ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); + //erl_close_connection(m_fd); +// m_mutex.unlock(); + if (ret == ERL_MSG) { + std::map<std::string, std::string> t_results; + ETERM *tail_list; + ETERM *list_ret[10], *arr_ret[2]; + ETERM *key, *value; + ETERM *tuplep[6]; + arr_ret[0] = erl_element(2, emsg.msg); + int erlLength = erl_length(arr_ret[0]); + printf("arr_ret[0]:%d\n", erlLength); + list_ret[0] = erl_hd(arr_ret[0]); + tail_list = erl_tl(arr_ret[0]); + for (int i = 0; i < erlLength; i++) { + if (i > 0) { + list_ret[i] = erl_hd(tail_list); + tail_list = erl_tl(tail_list); + } +// printf("list_ret[%d]:%d\n", i, erl_length(list_ret[i])); + tuplep[0] = erl_hd(list_ret[i]); + key = erl_element(1, list_ret[i]); + value = erl_element(2, list_ret[i]); +// printf("key:%s\n", ERL_ATOM_PTR(key)); + switch (checkETERMType(value)) { + case ERL_ATOM: { + int atomSize = ERL_ATOM_SIZE(value); + char *atomValue = ERL_ATOM_PTR(value); + t_results.insert(std::make_pair(ERL_ATOM_PTR(key), atomValue)); +// printf("value is a atom: atomSize:%d, atomValue:%s \n\r", atomSize, atomValue); + break; + } + default: + printf("error add case todo \n\r"); + } + erlangFreeEterm(4, key, value, tuplep[0], list_ret[i]); + } + erlangFreeEterm(2, tail_list, arr_ret[0]); + auto it = t_results.find("atomic"); + if (t_results.size() > 0 && t_results.end() != it && it->second == "ok") { + return true; + } + } + } + erlangFreeEterm(4, emsg.msg, emsg.from, emsg.to, list); + erl_free_array(arrlist, 2); + erl_eterm_release(); + return false; +} + +//ErlangTool::map_FaceDataCache ErlangTool::ErlangDbTool::loadFaceFeaData(std::string TableName) { +// std::lock_guard<std::mutex> lock(m_mutex); +//// m_mutex.lock(); +// m_ret = resetConn(); +// if (!m_ret) { +// //#todo error message +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << m_ret << " " << m_fd << std::endl; +// return map_FaceDataCache(); +// } +// map_FaceDataCache dataCache; +// int ret; +// ErlMessage emsg; /* Incoming message */ +// //hanshu canshu +// ETERM *arrlist[1]; +// arrlist[0] = erl_mk_string(TableName.c_str()); +// +// ETERM *list = erl_mk_list(arrlist, 1); +// ret = erl_rpc_to(m_fd, "syncDB", "loadFaceFeaData", list); +// +// if (ret == ERL_TICK) { +// ret = erl_rpc_from(m_fd, TIMEOUT * 100000, &emsg); +// //erl_close_connection(m_fd); +//// m_mutex.unlock(); +// if (ret == ERL_MSG) { +// ETERM *key, *value; +// ETERM *tuplep[20]; +// ETERM *arr_ret[2], *list_ret[5000]; +// ETERM *tail_list, *tail_tuple; +// arr_ret[0] = erl_element(2, emsg.msg); +// if (checkETERMType(arr_ret[0]) == ERL_LIST) { +// int erlLength = erl_length(arr_ret[0]); +//// printf("arr_ret[0]:%d\n", erlLength); +// list_ret[0] = erl_hd(arr_ret[0]); +// tail_list = erl_tl(arr_ret[0]); +// for (int i = 0; i < erlLength; i++) { +//// DBG(i); +// if (i > 0) { +// list_ret[i] = erl_hd(tail_list); +// tail_list = erl_tl(tail_list); +// } +// if (tail_list == NULL) +// break; +// if (checkETERMType(list_ret[i]) == ERL_LIST) { +// SyncDB::Feature_Info feature_info; +// int erlLength1 = erl_length(list_ret[i]); +//// printf("list_ret[%d]:%d\n", i, erlLength1); +// tuplep[0] = erl_hd(list_ret[i]); +// tail_tuple = erl_tl(list_ret[i]); +// for (int j = 0; j < erlLength1; j++) { +// if (j > 0) { +// tuplep[j] = erl_hd(tail_tuple); +// tail_tuple = erl_tl(tail_tuple); +// } +// key = erl_element(1, tuplep[j]); +// value = erl_element(2, tuplep[j]); +//// printf("key:%s\n", erl_iolist_to_string(key)); +// +// switch (checkETERMType(value)) { +// case ERL_ATOM: { +// feature_info.setValue(erl_iolist_to_string(key), ERL_ATOM_PTR(value)); +// break; +// } +// case ERL_LIST: { +// feature_info.setValue(erl_iolist_to_string(key), +// erl_iolist_to_string(value)); +// break; +// } +// default: +// printf("error add case todo %d\n\r", checkETERMType(value)); +// } +// +//// erlangFreeEterm(2, key, value); +// } +//// printf("\none list end\n\n\n\n"); +// dataCache.insert(std::move(std::make_pair(feature_info.id, feature_info))); +//// break; +//// erlangFreeEterm(1, list_ret[i]); +// } else { +// ERR(" type error " << checkETERMType(list_ret[i])); +// } +// } +// erlangFreeEterm(5, emsg.msg, emsg.from, emsg.to, list, arrlist[0]); +// erl_eterm_release(); +//// sleep() +// return dataCache; +// } else { +// ERR(" error " << checkETERMType(arr_ret[0])); +// } +// } else { +// ERR(" error " << ret << " "); +// } +// +// } +// erlangFreeEterm(5, emsg.msg, emsg.from, emsg.to, list, arrlist[0]); +// erl_eterm_release(); +// return map_FaceDataCache(); +//}; + +//ErlangTool::map_FaceDataCache ErlangTool::ErlangDbTool::loadFaceFeaData2(std::string TableName) { +// std::lock_guard<std::mutex> lock(m_mutex); +//// m_mutex.lock(); +// m_ret = resetConn(); +// if (!m_ret) { +// //#todo error message +// ERR(" error " << m_ret << " " << m_fd); +// return map_FaceDataCache(); +// } +// map_FaceDataCache dataCache; +// int ret; +// ErlMessage emsg; /* Incoming message */ +// //hanshu canshu +// ETERM *arrlist[1]; +//// arrlist[0] = erl_mk_atom(TableName.c_str()); +// arrlist[0] = erl_mk_string(TableName.c_str()); +// +// ETERM *list = erl_mk_list(arrlist, 1); +// ret = erl_rpc_to(m_fd, "syncDB", "loadFaceFeaData2", list); +// +// if (ret == ERL_TICK) { +// ret = erl_rpc_from(m_fd, TIMEOUT * 100000, &emsg); +// //erl_close_connection(m_fd); +//// m_mutex.unlock(); +// if (ret == ERL_MSG) { +// ETERM *key, *value; +// ETERM *tuplep[20]; +// ETERM *arr_ret[2], *list_ret[5000]; +// ETERM *tail_list, *tail_tuple; +// arr_ret[0] = erl_element(2, emsg.msg); +// if (checkETERMType(arr_ret[0]) == ERL_LIST) { +// int erlLength = erl_length(arr_ret[0]); +//// printf("arr_ret[0]:%d\n", erlLength); +// list_ret[0] = erl_hd(arr_ret[0]); +// tail_list = erl_tl(arr_ret[0]); +// for (int i = 0; i < erlLength; i++) { +//// DBG(i); +// if (i > 0) { +// list_ret[i] = erl_hd(tail_list); +// tail_list = erl_tl(tail_list); +// } +// if (tail_list == NULL) +// break; +// if (checkETERMType(list_ret[i]) == ERL_LIST) { +// SyncDB::Feature_Info feature_info; +//// feature_info.id = "test"; +//// feature_info.create_by = ""; +//// feature_info.feature =""; +//// feature_info.update_time = ""; +//// feature_info.create_time = ""; +// +// int erlLength1 = erl_length(list_ret[i]); +//// printf("list_ret[%d]:%d\n", i, erlLength1); +// tuplep[0] = erl_hd(list_ret[i]); +// tail_tuple = erl_tl(list_ret[i]); +// +// for (int j = 0; j < erlLength1; j++) { +// if (j > 0) { +// tuplep[j] = erl_hd(tail_tuple); +// tail_tuple = erl_tl(tail_tuple); +// } +// key = erl_element(1, tuplep[j]); +// value = erl_element(2, tuplep[j]); +//// printf("key:%s\n", erl_iolist_to_string(key)); +// +// switch (checkETERMType(value)) { +// case ERL_ATOM: { +// feature_info.setValue(erl_iolist_to_string(key), ERL_ATOM_PTR(value)); +// break; +// } +// case ERL_LIST: { +// feature_info.setValue(erl_iolist_to_string(key), +// erl_iolist_to_string(value)); +// break; +// } +// default: +// printf("error add case todo %d\n\r", checkETERMType(value)); +// } +// +//// erlangFreeEterm(2, key, value); +// } +//// printf("\none list end\n\n\n\n"); +// dataCache.insert(std::move(std::make_pair(feature_info.id, feature_info))); +//// break; +//// erlangFreeEterm(1, list_ret[i]); +// } else { +// ERR(" type error " << checkETERMType(list_ret[i])); +// } +// } +//// erlangFreeEterm(5, emsg.msg, emsg.from, emsg.to, list, arrlist[0]); +//// erl_eterm_release(); +//// sleep() +// return dataCache; +// } else { +// ERR(" error " << checkETERMType(arr_ret[0])); +// } +// } else { +// ERR(" error " << ret << " "); +// } +// +// } +// erlangFreeEterm(5, emsg.msg, emsg.from, emsg.to, list, arrlist[0]); +// erl_eterm_release(); +// return map_FaceDataCache(); +//}; + +ErlangTool::map_FaceDataCache ErlangTool::ErlangDbTool::loadFaceFeaData(std::string TableName) { + map_FaceDataCache dataCache; + + std::string str_tableUuid; + + auto tableInfoMap = findAllDatabase(); + + for (auto &item : tableInfoMap) { + if (item.second.tableName == TableName) { + str_tableUuid = item.second.uuid; + break; + } + } + 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 + + "_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); + if (!query.exec()) { + qDebug() << "getTableNameList" << __FILE__ << __LINE__ << query.lastError(); + } else { + while (query.next()) { + SyncDB::Feature_Info t_feature_info; + t_feature_info.id = query.value(0).toString().toStdString(); + 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(); + + dataCache.insert(std::make_pair(t_feature_info.id, t_feature_info)); + } + return dataCache; + } + } + return map_FaceDataCache(); +}; + +ErlangTool::map_FaceDataCache ErlangTool::ErlangDbTool::loadFaceFeaData2(std::string TableName) { + + map_FaceDataCache dataCache; + + std::string str_tableUuid; + + auto tableInfoMap = findAllDatabase(); + + for (auto &item : tableInfoMap) { + if (item.second.tableName == TableName) { + str_tableUuid = item.second.uuid; + break; + } + } + 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, '" + + 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); + if (!query.exec()) { + qDebug() << "getTableNameList" << __FILE__ << __LINE__ << query.lastError(); + } else { + while (query.next()) { + SyncDB::Feature_Info t_feature_info; + 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(); + + dataCache.insert(std::make_pair(t_feature_info.id, t_feature_info)); + } + return dataCache; + } + } + return map_FaceDataCache(); +}; + +bool ErlangTool::ErlangDbTool::resetConn() { + //#todo + if (m_pName.size() <= 0) { + srand(time(0)); + m_loop = rand() % 1000; + + int ret = -1; + erl_init(NULL, 0); +// m_loop %= 10; +// m_loop++; + ret = erl_connect_init(m_loop, const_cast<char *>(m_cookie.c_str()), 0); + DBG("node name is " << m_loop); + if (-1 == ret) { +// erl_err_quit("erl_connect_init"); + return false; + } + +// std::cout << __FILE__ << __FUNCTION__ <<__LINE__ << " " << m_fd << std::endl; + erl_close_connection(m_fd); +// std::cout << __FILE__ << __FUNCTION__ <<__LINE__ << " " << m_fd << std::endl; + m_fd = erl_connect(const_cast<char *>(m_nodeName.c_str())); +// std::cout << __FILE__ << __FUNCTION__ <<__LINE__ << " " << m_fd << std::endl; + if (0 > m_fd) { +// erl_err_quit("erl_connect"); + return false; + } + return true; + } else { + erl_close_connection(m_fd); + m_fd = erl_connect(const_cast<char *>(m_nodeName.c_str())); + if (0 > m_fd) { +// erl_err_quit("erl_connect"); +// std::cout << __FILE__ << __FUNCTION__ <<__LINE__ << " error " << fd << std::endl; + ERR("m_fd is " << m_fd << " m_nodeName is" << m_nodeName); + return false; + } +// std::cout << __FILE__ << __FUNCTION__ <<__LINE__ << " " << fd << std::endl; + INFO("m_fd is " << m_fd << " m_nodeName is" << m_nodeName); + return true; + } +} + +bool ErlangTool::ErlangDbTool::waitNode() { + std::cout << "start waitNode" << std::endl; + int loop = 0; + while (!m_ret && loop <= 4000) { + m_ret = ErlangTool::pingNode(m_nodeName, m_cookie); + if (m_ret) { +// std::cout << "startNodeDb" << std::endl; + } else { +// std::cout << "init failer" << std::endl; + usleep(100000); + loop++; + } + } + std::cout << "start waitNode" << std::endl; + return m_ret; +} + +void ErlangTool::ErlangDbTool::test(pthread_cond_t *t_pthcon, pthread_mutex_t *t_pthmut) { + bool ret = setCNodeName(); + { + std::thread th1([&] { + int res; + pthread_cond_t *t_pthCon = t_pthcon; + pthread_mutex_t *t_pthMut = t_pthmut; + + int listen; /* Listen socket */ + int fd; /* fd to Erlang node */ + ErlConnect conn; /* Connection data */ + + int loop = 1; /* Loop flag */ + int got; /* Result of receive */ + unsigned char buf[BUFSIZE]; /* Buffer for incoming message */ + ErlMessage emsg; /* Incoming message */ + + ETERM *fromp, *tuplep, *fnp, *argp, *resp; + + int port; /* Listen port number */ + port = PORT; + /* Make a listen socket */ + if ((listen = my_listen(port)) <= 0) { + ERR("my_listen is error"); + erl_err_quit("my_listen"); + } + if (erl_publish(port) == -1) { + ERR("erl_publish is error"); + erl_err_quit("erl_publish"); + } + if ((fd = erl_accept(listen, &conn)) == ERL_ERROR) { + ERR("erl_accept is error"); + erl_err_quit("erl_accept"); + } + INFO("Connected to " << conn.nodename); + + while (loop) { +// std::cout << "hello world" << std::endl; + got = erl_receive_msg(fd, buf, BUFSIZE, &emsg); + if (got == ERL_TICK) { + /* ignore */ + } else if (got == ERL_ERROR) { + if ((fd = erl_accept(listen, &conn)) == ERL_ERROR) + erl_err_quit("erl_accept"); + INFO("Connected to " << conn.nodename); + } else { + + if (emsg.type == ERL_REG_SEND) { + fromp = erl_element(2, emsg.msg); + tuplep = erl_element(3, emsg.msg); + fnp = erl_element(1, tuplep); + argp = erl_element(2, tuplep); + + if (strncmp(ERL_ATOM_PTR(fnp), "update", 6) == 0) { + INFO("message is " << ERL_ATOM_PTR(fnp)); + std::string str1(ERL_ATOM_PTR(fnp)); +// CBF(str1); + DBG("erlangCallBackFunc"); + pthread_cond_signal(t_pthCon); + pthread_mutex_unlock(t_pthMut); + //call back func + } else { + ERR("message not is update"); + } +// resp = erl_format("{c1, {res,~i}}", res); +// erl_send(fd, fromp, resp); + + erl_free_term(emsg.from); + erl_free_term(emsg.msg); + erl_free_term(fromp); + erl_free_term(tuplep); + erl_free_term(fnp); + erl_free_term(argp); + erl_free_term(resp); + erl_close_connection(fd); + if ((fd = erl_accept(listen, &conn)) == ERL_ERROR) + erl_err_quit("erl_accept"); + INFO("Connected to " << conn.nodename); + } + } + + } + }); + th1.detach(); + } + +} + +bool ErlangTool::ErlangDbTool::setCNodeName() { + LockG lock(m_mutex); +// m_mutex.lock(); + m_ret = resetConn(); + if (!m_ret) { + //#todo error message + ERR(" error " << m_ret << " " << m_fd); + return false; + } + ErlMessage emsg; /* Incoming message */ + int ret = -1; + ETERM *arrlist[1]; + arrlist[0] = erl_mk_atom(m_cNodeName.c_str()); +// arrlist[0] = erl_mk_atom("c1@127.0.0.1"); + ETERM *list = erl_mk_list(arrlist, 1); + ret = erl_rpc_to(m_fd, "syncDB", "setCNode", list); + if (ret == ERL_TICK) { + ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); + //erl_close_connection(m_fd); +// m_mutex.unlock(); + if (ret == ERL_MSG) { + std::map<std::string, std::string> t_results; + + ETERM *tail_list; + ETERM *list_ret[1000], *arr_ret[2]; + ETERM *key, *value; + ETERM *tuplep[6]; + + arr_ret[0] = erl_element(2, emsg.msg); + int erlLength = erl_length(arr_ret[0]); + INFO("arr_ret[0]: " << erlLength); + list_ret[0] = erl_hd(arr_ret[0]); + tail_list = erl_tl(arr_ret[0]); + for (int i = 0; i < erlLength; i++) { + if (i > 0) { + list_ret[i] = erl_hd(tail_list); + tail_list = erl_tl(tail_list); + } +// printf("list_ret[%d]:%d\n", i, erl_length(list_ret[i])); + tuplep[0] = erl_hd(list_ret[i]); + key = erl_element(1, list_ret[i]); + value = erl_element(2, list_ret[i]); +// printf("key:%s\n", ERL_ATOM_PTR(key)); + switch (checkETERMType(value)) { + case ERL_ATOM: { + int atomSize = ERL_ATOM_SIZE(value); + char *atomValue = ERL_ATOM_PTR(value); + INFO("value is a atom: atomSize: " << atomSize << " , atomValue:" << atomValue << " \n\r"); + t_results.insert(std::make_pair(ERL_ATOM_PTR(key), atomValue)); + break; + } + default: + ERR("error add case todo \n\r"); + } + erlangFreeEterm(4, key, value, tuplep[0], list_ret[i]); + } + erlangFreeEterm(2, tail_list, arr_ret[0]); + erl_eterm_release(); + auto it = t_results.find("atomic"); + if (t_results.size() > 0 && t_results.end() != it && it->second == "ok") { + return true; + } else { + ERR("res is err "); + } + } else { + ERR("recv mess error : ret != ERL_MSG"); + } + } else { + ERR("send mess error : ret != ERL_TICK"); + } + erl_free_array(arrlist, 1); +// erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list); + erl_eterm_release(); + return false; +} + +bool ErlangTool::ErlangDbTool::sendMessage() { + LockG lock(m_mutex); +// m_mutex.lock(); + m_ret = resetConn(); + if (!m_ret) { + //#todo error message + ERR(" error " << m_ret << " " << m_fd); + return false; + } + ErlMessage emsg; /* Incoming message */ + int ret = -1; + ETERM *list = erl_mk_empty_list(); + ret = erl_rpc_to(m_fd, "syncDB", "sendMessage", list); + if (ret == ERL_TICK) { + ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); + //erl_close_connection(m_fd); +// m_mutex.unlock(); + if (ret == ERL_MSG) { + std::map<std::string, std::string> t_results; + + ETERM *tail_list; + ETERM *list_ret[1000], *arr_ret[2]; + ETERM *key, *value; + ETERM *tuplep[6]; + + arr_ret[0] = erl_element(2, emsg.msg); + int erlLength = erl_length(arr_ret[0]); + INFO("arr_ret[0]: " << erlLength); + list_ret[0] = erl_hd(arr_ret[0]); + tail_list = erl_tl(arr_ret[0]); + for (int i = 0; i < erlLength; i++) { + if (i > 0) { + list_ret[i] = erl_hd(tail_list); + tail_list = erl_tl(tail_list); + } +// printf("list_ret[%d]:%d\n", i, erl_length(list_ret[i])); + tuplep[0] = erl_hd(list_ret[i]); + key = erl_element(1, list_ret[i]); + value = erl_element(2, list_ret[i]); +// printf("key:%s\n", ERL_ATOM_PTR(key)); + switch (checkETERMType(value)) { + case ERL_ATOM: { + int atomSize = ERL_ATOM_SIZE(value); + char *atomValue = ERL_ATOM_PTR(value); + INFO("value is a atom: atomSize: " << atomSize << " , atomValue:" << atomValue << " \n\r"); + t_results.insert(std::make_pair(ERL_ATOM_PTR(key), atomValue)); + break; + } + default: + ERR("error add case todo \n\r"); + } + erlangFreeEterm(4, key, value, tuplep[0], list_ret[i]); + } + erlangFreeEterm(2, tail_list, arr_ret[0]); + erl_eterm_release(); + auto it = t_results.find("atomic"); + if (t_results.size() > 0 && t_results.end() != it && it->second == "ok") { + return true; + } else { + ERR("res is err "); + } + } else { + ERR("recv mess error : ret != ERL_MSG"); + } + } else { + ERR("send mess error : ret != ERL_TICK"); + } +// erl_free_array(arrlist, 1); +// erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list); + erl_eterm_release(); + return false; +} + +ErlangTool::vec_PerExistRet ErlangTool::ErlangDbTool::personIsExistOnClu(std::string personUid) { + ErlangTool::vec_PerExistRet t_vec_perExistRet; + + std::lock_guard<std::mutex> lock(m_mutex); +// m_mutex.lock(); + m_ret = resetConn(); + if (!m_ret) { + //#todo error message + ERR(" error " << m_ret << " " << m_fd); + return t_vec_perExistRet; + } + + int ret; + ErlMessage emsg; /* Incoming message */ + //hanshu canshu + ETERM *arrlist[1]; + arrlist[0] = erl_mk_string(personUid.c_str()); + + ETERM *list = erl_mk_list(arrlist, 1); + ret = erl_rpc_to(m_fd, "syncDB", "singlePersonIsExists", list); + + if (ret == ERL_TICK) { + ret = erl_rpc_from(m_fd, TIMEOUT * 100000, &emsg); + //erl_close_connection(m_fd); +// m_mutex.unlock(); + if (ret == ERL_MSG) { + ETERM *key, *value; + ETERM *tuplep[20]; + ETERM *arr_ret[2], *list_ret[5000]; + ETERM *tail_list, *tail_tuple; + arr_ret[0] = erl_element(2, emsg.msg); + if (checkETERMType(arr_ret[0]) == ERL_LIST) { + int erlLength = erl_length(arr_ret[0]); +// printf("arr_ret[0]:%d\n", erlLength); + list_ret[0] = erl_hd(arr_ret[0]); + tail_list = erl_tl(arr_ret[0]); + for (int i = 0; i < erlLength; i++) { +// DBG(i); + if (i > 0) { + list_ret[i] = erl_hd(tail_list); + tail_list = erl_tl(tail_list); + } + if (tail_list == NULL) + break; + if (checkETERMType(list_ret[i]) == ERL_LIST) { + SyncDB::PerExistRet perExistRet; + + int erlLength1 = erl_length(list_ret[i]); +// printf("list_ret[%d]:%d\n", i, erlLength1); + tuplep[0] = erl_hd(list_ret[i]); + tail_tuple = erl_tl(list_ret[i]); + + for (int j = 0; j < erlLength1; j++) { + if (j > 0) { + tuplep[j] = erl_hd(tail_tuple); + tail_tuple = erl_tl(tail_tuple); + } + key = erl_element(1, tuplep[j]); + value = erl_element(2, tuplep[j]); +// printf("key:%s\n", erl_iolist_to_string(key)); + + switch (checkETERMType(value)) { + case ERL_ATOM: { + perExistRet.setValue(erl_iolist_to_string(key), ERL_ATOM_PTR(value)); + break; + } + case ERL_LIST: { + perExistRet.setValue(erl_iolist_to_string(key), + erl_iolist_to_string(value)); + break; + } + default: + printf("error add case todo %d\n\r", checkETERMType(value)); + } + } + t_vec_perExistRet.push_back(perExistRet); + } else { + ERR(" type error " << checkETERMType(list_ret[i])); + } + } + erlangFreeEterm(5, emsg.msg, emsg.from, emsg.to, list, arrlist[0]); + erl_eterm_release(); + return t_vec_perExistRet; + } else { + ERR(" error " << checkETERMType(arr_ret[0])); + } + } else { + ERR(" error " << ret << " "); + } + } + erlangFreeEterm(5, emsg.msg, emsg.from, emsg.to, list, arrlist[0]); + erl_eterm_release(); + return t_vec_perExistRet; +} + +ErlangTool::vec_UpdPersRet +ErlangTool::ErlangDbTool::singlePersonUpdate(std::string NewPerId, std::string OldId, std::string Idcard, + std::string PerPicUrl, std::string PerFea) { + ErlangTool::vec_UpdPersRet t_vec_UpdPersRet; + + std::lock_guard<std::mutex> lock(m_mutex); +// m_mutex.lock(); + m_ret = resetConn(); + if (!m_ret) { + //#todo error message + ERR(" error " << m_ret << " " << m_fd); + return t_vec_UpdPersRet; + } + + int ret; + ErlMessage emsg; /* Incoming message */ + //hanshu canshu + ETERM *arrlist[5]; + arrlist[0] = erl_mk_atom(NewPerId.c_str()); + arrlist[1] = erl_mk_atom(OldId.c_str()); + arrlist[2] = erl_mk_atom(Idcard.c_str()); + arrlist[3] = erl_mk_atom(PerPicUrl.c_str()); + arrlist[4] = erl_mk_string(PerFea.c_str()); + + ETERM *list = erl_mk_list(arrlist, 5); + ret = erl_rpc_to(m_fd, "syncDB", "singlePersonUpdate", list); + + if (ret == ERL_TICK) { + ret = erl_rpc_from(m_fd, TIMEOUT * 100000, &emsg); + //erl_close_connection(m_fd); +// m_mutex.unlock(); + if (ret == ERL_MSG) { + ETERM *key, *value; + ETERM *tuplep[20]; + ETERM *arr_ret[2], *list_ret[5000]; + ETERM *tail_list, *tail_tuple; + arr_ret[0] = erl_element(2, emsg.msg); + if (checkETERMType(arr_ret[0]) == ERL_LIST) { + int erlLength = erl_length(arr_ret[0]); +// printf("arr_ret[0]:%d\n", erlLength); + list_ret[0] = erl_hd(arr_ret[0]); + tail_list = erl_tl(arr_ret[0]); + for (int i = 0; i < erlLength; i++) { +// DBG(i); + if (i > 0) { + list_ret[i] = erl_hd(tail_list); + tail_list = erl_tl(tail_list); + } + if (tail_list == NULL) + break; + if (checkETERMType(list_ret[i]) == ERL_LIST) { + SyncDB::UpdPersRet updPersRet; + + int erlLength1 = erl_length(list_ret[i]); +// printf("list_ret[%d]:%d\n", i, erlLength1); + tuplep[0] = erl_hd(list_ret[i]); + tail_tuple = erl_tl(list_ret[i]); + + for (int j = 0; j < erlLength1; j++) { + if (j > 0) { + tuplep[j] = erl_hd(tail_tuple); + tail_tuple = erl_tl(tail_tuple); + } + key = erl_element(1, tuplep[j]); + value = erl_element(2, tuplep[j]); +// printf("key:%s\n", erl_iolist_to_string(key)); + + switch (checkETERMType(value)) { + case ERL_ATOM: { + updPersRet.setValue(erl_iolist_to_string(key), ERL_ATOM_PTR(value)); + break; + } + case ERL_LIST: { + updPersRet.setValue(erl_iolist_to_string(key), + erl_iolist_to_string(value)); + break; + } + default: + printf("error add case todo %d\n\r", checkETERMType(value)); + } + } + t_vec_UpdPersRet.push_back(updPersRet); + } else { + ERR(" type error " << checkETERMType(list_ret[i])); + } + } + erlangFreeEterm(5, emsg.msg, emsg.from, emsg.to, list, arrlist[0]); + erl_eterm_release(); + return t_vec_UpdPersRet; + } else { + ERR(" error " << checkETERMType(arr_ret[0])); + } + } else { + ERR(" error " << ret << " "); + } + } + erlangFreeEterm(5, emsg.msg, emsg.from, emsg.to, list, arrlist[0]); + erl_eterm_release(); + return t_vec_UpdPersRet; +} + +static int ErlangTool::my_listen(int port) { + int listen_fd; + struct sockaddr_in addr; + int on = 1; + + if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) + return (-1); + + setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); + + memset((void *) &addr, 0, (size_t) sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + addr.sin_addr.s_addr = htonl(INADDR_ANY); + + if (bind(listen_fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) + return (-1); + + listen(listen_fd, 5); + return listen_fd; +} \ No newline at end of file diff --git a/syncDBTool/ErlangDbTool.h b/syncDBTool/ErlangDbTool.h new file mode 100755 index 0000000..76ce646 --- /dev/null +++ b/syncDBTool/ErlangDbTool.h @@ -0,0 +1,312 @@ +// +// Created by ps on 18-11-29. +// + +#ifndef SYNCDBTOOL_ERLANGDBTOOL_H +#define SYNCDBTOOL_ERLANGDBTOOL_H + +#include <iostream> +#include <cstring> +#include <unistd.h> + +#include <sys/types.h> +#include <zconf.h> +#include <thread> + +#include <map> +#include <vector> +#include <mutex> + +#include <stdio.h> +#include <stdarg.h> +#include <jsoncpp/json/json.h> +#include <arpa/inet.h> + +#include "erl_interface.h" +#include "ei.h" + +#include "SyncDB.hpp" + +#define TIMEOUT (5000) +#define BUFSIZE 1000 +#define PORT 13001 + + +//typedef void (*CBF)(std::string); + +extern void erlangCallBackFunc(std::string); + +//#TODO 澶氱嚎绋嬩紭鍖� +namespace ErlangTool { + + static int m_loop = 0; + //map<uuid锛屼汉鑴哥壒寰佷俊鎭�> + typedef std::map<std::string, SyncDB::Feature_Info> map_FaceDataCache; + //map<uuid锛岃澶囦俊鎭�> + typedef std::map<std::string, SyncDB::Device_Info> map_DevDataCache; + //map<琛ㄥ悕锛屽簳搴撹〃淇℃伅> + typedef std::map<std::string, SyncDB::Table_Info> map_TabDataCache; + //map<琛ㄥ悕锛岄粦鐧藉悕鍗曠被鍨�> + typedef std::map<std::string, SyncDB::Bw_Info> map_BwDataCache; + + typedef std::vector<SyncDB::AddPersRet> vec_AddDataCache; + typedef std::vector<SyncDB::PerExistRet> vec_PerExistRet; + typedef std::vector<SyncDB::UpdPersRet> vec_UpdPersRet; + //c++11 浜掓枼閿� + // LockG(Parma); + typedef std::lock_guard<std::mutex> LockG; + + /*** + * 鍒ゆ柇鏂囦欢澶硅矾寰勬槸鍚﹀瓨鍦紝涓嶅瓨鍦ㄥ垯鍒涘缓 + * @param dir 鏂囦欢璺緞 + * @param mkdir_flag 鏄惁鍒涘缓鍒涘缓鏂囦欢澶� + * @return 鏄惁鎴愬姛 + */ + static bool dir_file_exists(std::string dir, bool mkdir_flag = true); + + /*** + * 娴嬭瘯鑺傜偣鏄惁鍚姩 + * @param nodeName 鑺傜偣鍚嶇О + * @param cookie 鑺傜偣cookie + * @return 鍚姩鐘舵�� + */ + static bool pingNode(const std::string &nodeName, const std::string &cookie); + + /*** + * 妫�鏌TERM鐨勬暟鎹被鍨� + * @param elemen + * @return 杩斿洖鏁版嵁绫诲瀷 + */ + static int checkETERMType(ETERM *elemen); + + static void erlangFreeEterm(int count, ...); + + /*** + * Erlang浜や簰宸ュ叿 + * #todo map淇濆瓨鍒板唴瀛橈紵 + */ + class ErlangDbTool { + public: + explicit ErlangDbTool(); + + /*** + * 鍒濆鍖栬妭鐐�(zhizuo chaxun shiyong) + * @param nodeName 鑺傜偣鍚嶇О + * @param cookie 闆嗙兢cookie + */ + ErlangDbTool(const std::string &nodeName, const std::string &cookie, const std::string &pName); + + /*** + * 鍒濆鍖栬妭鐐� + * @param path 鑺傜偣鏁版嵁搴撲繚瀛樿矾寰� + * @param nodeName 鑺傜偣鍚嶇О + * @param cookie 闆嗙兢cookie + */ + ErlangDbTool(const std::string &path, const std::string &nodeName, const std::string &cookie, + const std::string &pName); + + //clusterID clusterName + /*** + * 鍒濆鍖栬妭鐐� + * @param path 鑺傜偣鏁版嵁搴撲繚瀛樿矾寰� + * @param nodeName 鑺傜偣鍚嶇О + * @param cookie 闆嗙兢cookie + * @param clusterID 闆嗙兢id + * @param clusterName 闆嗙兢鍚嶇О + */ + ErlangDbTool(const std::string &path, const std::string &nodeName, const std::string &cookie, + const std::string &clusterID, const std::string &clusterName); + + //clusterID clusterName + /*** + * 鍒濆鍖栬妭鐐� + * @param path 鑺傜偣鏁版嵁搴撲繚瀛樿矾寰� + * @param nodeName 鑺傜偣鍚嶇О + * @param cookie 闆嗙兢cookie + * @param clusterID 闆嗙兢id + * @param clusterName 闆嗙兢鍚嶇О + * @param pName c鑺傜偣鏍囪瘑鍚� + */ + ErlangDbTool(const std::string &path, const std::string &nodeName, const std::string &cookie, + const std::string &clusterID, const std::string &clusterName, const std::string &pName); + + virtual ~ErlangDbTool(); + + private: + void initCNode(); + + public: + //#todo setCNodeName + + bool setCNodeName(); + + bool sendMessage(); + + //#todo sendMessage + + void test(pthread_cond_t *, pthread_mutex_t *); + + /*** + * 鍚姩erlang鑺傜偣 + * @return 鍚姩鐘舵�� + */ + int initErlang(); + + std::string getConfigJsonString(); + + /*** + * 鍚姩鑺傜偣鏁版嵁搴� + * 鏂拌妭鐐硅嚜鍔ㄥ垱寤烘暟鎹簱 + * @param FatherNodeName 绗竴涓妭鐐规棤闇�浼犲叆姝ゅ弬鏁帮紝鍏朵粬鑺傜偣闇�瑕佷紶鍏ュ紩瀵艰妭鐐圭殑鍚嶇О + * @param DeviceName 璁惧鍚嶇О + * @param DevAdd 璁惧鍦板潃 + * @return + */ + bool startNodeDb(std::string FatherNodeName, std::string DeviceId = "", std::string DevAdd = "DevAddress"); + + + /*** + * 鍒犻櫎鑺傜偣鏁版嵁搴擄紝鍚屾椂鍒犻櫎鏈湴鏂囦欢 + * @return 杩斿洖鐘舵�� + */ + bool removeNode(); + + + bool modifyCluName(std::string CluId, std::string CluName); + + + /*** + * 鏌ユ壘鍦ㄧ嚎鑺傜偣淇℃伅 + * #TODO 鏈変竴涓皬bug + * device_info.create_by浼氳閲嶇疆 + * @return 鑺傜偣闆嗗悎淇℃伅 + */ + map_DevDataCache findAllNode(); + + /*** + * 鍒涘缓搴曞簱琛� + * @param TableType car||person + * @param TableName + * @param SyncType true 1||false 0 + * @param BwType "Black"1||"White"0 + * @return 鍒涘缓鐘舵�� + */ + bool createDatabase(std::string TableType, std::string TableName, bool SyncType, std::string BwType, + std::string StartTime = "", std::string EndTime = ""); + + /*** + * 鏇存柊搴曞簱琛� + * @param TableType car||person + * @param TableName + * @param SyncType true 1||false 0 + * @param BwType "white"0||"black"1 + * @return 鍒涘缓鐘舵�� + */ + bool updateDatabase(std::string UUID, std::string TableType, std::string TableName, bool SyncType, + std::string BwType, std::string StartTime = "", std::string EndTime = ""); + + /*** + * 鍒犻櫎鏁版嵁琛� + * @param TableType car||person + * @param TableName biaoming + * @param SyncType true 1||false 0 + * @return + */ + bool deleteDatabase(std::string TableType, std::string TableName, bool SyncType); + + /*** + * 鏌ヨ鎵�鏈夋暟鎹〃 + * @return + */ + map_TabDataCache findAllDatabase(); + + /*** + * 鏌ヨ鎵�鏈夎〃鐨勯粦鐧藉悕鍗曠被鍨� + * @return + */ + map_BwDataCache findAllTypeInfo(); + + /*** + * 澧炲姞浜哄憳 + * @param UUID out + * @param TableName + * @param Feature + * @param PersonName + * @param Age + * @param Sex + * @param IdCard + * @param PhoneNum + * @return + */ + bool addPerson(std::string &UUID, std::string TableName, std::string Feature, std::string ImgUrl = " ", + std::string IdCard = " ", std::string PersonName = " ", std::string Age = " ", + std::string Sex = " ", std::string PhoneNum = " "); + + vec_AddDataCache addPersons(std::string TableUuid, std::vector<SyncDB::AddPersonInfo> &tmpPer); + + /*** + * 鍒犻櫎浜哄憳 + * @param UUID + * @param TableName + * @return + */ + bool delPerson(std::string UUID, std::string TableName); + + + /*** + * 鏍规嵁琛ㄥ悕鍔犺浇浜鸿劯鐗瑰緛 + * @param TableName + * @return + */ + map_FaceDataCache loadFaceFeaData(std::string TableName); + + + /*** + * 鏍规嵁琛ㄥ悕鍔犺浇浜鸿劯鐗瑰緛2 + * @param TableName + * @return + */ + map_FaceDataCache loadFaceFeaData2(std::string TableName); + + vec_PerExistRet personIsExistOnClu(std::string personUid); + + vec_UpdPersRet singlePersonUpdate(std::string NewPerId, std::string OldId, std::string Idcard, + std::string PerPicUrl, std::string PerFea); +// private: + /*** + * 閲嶆柊杩炴帴鑺傜偣 + * @return 杩炴帴鐘舵�� + */ + bool resetConn(); + + /*** + * 绛夊緟鑺傜偣鍚姩锛岄樆濉� + * @return + */ + bool waitNode(); + + public: + + private: + //瀛樺偍璺緞 + std::string m_path; + std::string m_nodeName; + std::string m_cNodeName; + std::string m_pName; + std::string m_cookie; + + std::string m_clusterID; + std::string m_clusterName; + + bool m_ret; + int m_fd; + + std::mutex m_mutex; + }; + + static int my_listen(int port); + +} + + +#endif //SYNCDBTOOL_ERLANGDBTOOL_H diff --git a/syncDBTool/ErlangDbTool.hpp b/syncDBTool/ErlangDbTool.hpp new file mode 100755 index 0000000..66310fd --- /dev/null +++ b/syncDBTool/ErlangDbTool.hpp @@ -0,0 +1,1555 @@ +//// +//// Created by ps on 8/6/18. +//// +// +//#ifndef UNTITLED_ERLANGTOOL_HPP +//#define UNTITLED_ERLANGTOOL_HPP +// +//#include <iostream> +//#include <cstring> +//#include <unistd.h> +// +//#include <map> +//#include <vector> +//#include <mutex> +// +//#include <stdio.h> +//#include <stdarg.h> +//#include <jsoncpp/json/json.h> +//#include <arpa/inet.h> +// +//#include "erl_interface.h" +//#include "ei.h" +// +//#include "SyncDB.hpp" +// +//#define TIMEOUT (5000) +// +////#TODO 澶氱嚎绋嬩紭鍖� +//namespace ErlangTool { +// +// static int m_loop = 0; +// //map<uuid锛屼汉鑴哥壒寰佷俊鎭�> +// typedef std::map<std::string, SyncDB::Feature_Info> map_FaceDataCache; +// //map<uuid锛岃澶囦俊鎭�> +// typedef std::map<std::string, SyncDB::Device_Info> map_DevDataCache; +// //map<琛ㄥ悕锛屽簳搴撹〃淇℃伅> +// typedef std::map<std::string, SyncDB::Table_Info> map_TabDataCache; +// //map<琛ㄥ悕锛岄粦鐧藉悕鍗曠被鍨�> +// typedef std::map<std::string, SyncDB::Bw_Info> map_BwDataCache; +// +// //c++11 浜掓枼閿� +// // LockG(Parma); +// typedef std::lock_guard<std::mutex> LockG; +// +// /*** +// * 鍒ゆ柇鏂囦欢澶硅矾寰勬槸鍚﹀瓨鍦紝涓嶅瓨鍦ㄥ垯鍒涘缓 +// * @param dir 鏂囦欢璺緞 +// * @param mkdir_flag 鏄惁鍒涘缓鍒涘缓鏂囦欢澶� +// * @return 鏄惁鎴愬姛 +// */ +// static bool dir_file_exists(std::string dir, bool mkdir_flag = true) { +// int state = access(dir.c_str(), R_OK | W_OK); // 澶存枃浠� #include <unistd.h> +// if (state == 0) { +// //#todo +// INFO("file exist"); +// return true; +// } else if (mkdir_flag) { +// dir = "mkdir -p " + dir; +// system(dir.c_str()); // 璋冪敤linux绯荤粺鍛戒护鍒涘缓鏂囦欢 +// //#todo +// return true; +// } else { +// return false; +// } +// } +// +// /*** +// * 娴嬭瘯鑺傜偣鏄惁鍚姩 +// * @param nodeName 鑺傜偣鍚嶇О +// * @param cookie 鑺傜偣cookie +// * @return 鍚姩鐘舵�� +// */ +// static bool pingNode(const std::string &nodeName, const std::string &cookie) { +// int fd = -1; +// int ret = -1; +// erl_init(NULL, 0); +// struct in_addr addr; +// addr.s_addr = inet_addr("127.0.0.1"); +// if (erl_connect_xinit("idril", "cnode", "cnode@127.0.0.1", &addr, cookie.c_str(), 0) == -1) { +// ERR(""); +// erl_err_quit("erl_connect_xinit"); +// return false; +// } +// +// fd = erl_connect(const_cast<char *>(nodeName.c_str())); +// if (0 > fd) { +//// erl_err_quit("erl_connect"); +//// std::cout << __FILE__ << __FUNCTION__ <<__LINE__ << " error " << fd << std::endl; +// return false; +// } +//// std::cout << __FILE__ << __FUNCTION__ <<__LINE__ << " " << fd << std::endl; +// erl_close_connection(fd); +// return true; +// } +// +// /*** +// * 妫�鏌TERM鐨勬暟鎹被鍨� +// * @param elemen +// * @return 杩斿洖鏁版嵁绫诲瀷 +// */ +// static int checkETERMType(ETERM *elemen) { +// if (elemen == NULL) { +// return -1; +// } +// switch (ERL_TYPE(elemen)) { +// case ERL_UNDEF: +// return ERL_UNDEF; +// case ERL_INTEGER: +// INFO("value is a int: " << ERL_INT_VALUE(elemen)); +// return ERL_INTEGER; +// case ERL_U_INTEGER: +// break; +// case ERL_ATOM: { +//// int atomSize = ERL_ATOM_SIZE(elemen); +//// char *atomValue = ERL_ATOM_PTR(elemen); +//// printf("value is a atom: atomSize:%d, atomValue:%s \n\r", atomSize, atomValue); +// return ERL_ATOM; +// } +// case ERL_PID: +// break; +// case ERL_PORT: +// break; +// case ERL_REF: +// break; +// case ERL_LIST: +//// printf("value is a list:%s\n", erl_iolist_to_string(elemen)); +// return ERL_LIST; +// case ERL_NIL: +// return ERL_EMPTY_LIST; +// case ERL_TUPLE: +// INFO("value is a tupe: " << ERL_ATOM_PTR(erl_element(1, elemen))); +// return ERL_TUPLE; +// case ERL_BINARY: +// break; +// case ERL_FLOAT: +// break; +// case ERL_VARIABLE: +// break; +// case ERL_SMALL_BIG: +// break; +// case ERL_U_SMALL_BIG: +// break; +// case ERL_FUNCTION: +// break; +// case ERL_BIG: +// break; +// case ERL_LONGLONG: +// break; +// case ERL_U_LONGLONG: +// break; +// default: +// ERR("[Client] got a value but now checked\n\r"); +// //#todo morechuli +// } +// return -1; +// } +// +// static void erlangFreeEterm(int count, ...) { +// va_list args; +// va_start(args, count); +// for (int i = 0; i < count; ++i) { +// auto test = va_arg(args, ETERM*); +// erl_free_compound(test); +//// if (test != NULL) +//// erl_free_compound(test); +//// else{ +//// +//// } +// } +// } +// +// +// /*** +// * Erlang浜や簰宸ュ叿 +// * #todo map淇濆瓨鍒板唴瀛橈紵 +// */ +// class ErlangDbTool { +// public: +// ErlangDbTool() : m_fd(-1) { +// +// } +// +// /*** +// * 鍒濆鍖栬妭鐐�(zhizuo chaxun shiyong) +// * @param nodeName 鑺傜偣鍚嶇О +// * @param cookie 闆嗙兢cookie +// */ +// ErlangDbTool(const std::string &nodeName, const std::string &cookie, const std::string &pName) : +// m_fd(-1), m_path(""), m_nodeName(nodeName), m_cookie(cookie), m_pName(pName) { +// initCNode(); +// } +// +// /*** +// * 鍒濆鍖栬妭鐐� +// * @param path 鑺傜偣鏁版嵁搴撲繚瀛樿矾寰� +// * @param nodeName 鑺傜偣鍚嶇О +// * @param cookie 闆嗙兢cookie +// */ +// ErlangDbTool(const std::string &path, const std::string &nodeName, const std::string &cookie, +// const std::string &pName) : m_fd(-1), m_path(path), m_nodeName(nodeName), m_cookie(cookie), +// m_pName(pName) { +// initCNode(); +// } +// +// //clusterID clusterName +// /*** +// * 鍒濆鍖栬妭鐐� +// * @param path 鑺傜偣鏁版嵁搴撲繚瀛樿矾寰� +// * @param nodeName 鑺傜偣鍚嶇О +// * @param cookie 闆嗙兢cookie +// * @param clusterID 闆嗙兢id +// * @param clusterName 闆嗙兢鍚嶇О +// */ +// ErlangDbTool(const std::string &path, const std::string &nodeName, const std::string &cookie, +// const std::string &clusterID, const std::string &clusterName) : +// m_fd(-1), m_path(path), m_nodeName(nodeName), m_cookie(cookie), m_clusterID(clusterID), +// m_clusterName(clusterName) { +// +// } +// +// //clusterID clusterName +// /*** +// * 鍒濆鍖栬妭鐐� +// * @param path 鑺傜偣鏁版嵁搴撲繚瀛樿矾寰� +// * @param nodeName 鑺傜偣鍚嶇О +// * @param cookie 闆嗙兢cookie +// * @param clusterID 闆嗙兢id +// * @param clusterName 闆嗙兢鍚嶇О +// * @param pName c鑺傜偣鏍囪瘑鍚� +// */ +// ErlangDbTool(const std::string &path, const std::string &nodeName, const std::string &cookie, +// const std::string &clusterID, const std::string &clusterName, const std::string &pName) : +// m_fd(-1), m_path(path), m_nodeName(nodeName), m_cookie(cookie), m_clusterID(clusterID), +// m_clusterName(clusterName), m_pName(pName) { +// initCNode(); +// } +// +// private: +// +// void initCNode() { +// erl_init(NULL, 0); +// struct in_addr addr; +// //#todo +// addr.s_addr = inet_addr("127.0.0.1"); +// std::string t_cNodeName(m_pName); +// t_cNodeName.append("@127.0.0.1"); +// //m_pName +// if (erl_connect_xinit("idril", const_cast<char *>(m_pName.c_str()), const_cast<char *>(t_cNodeName.c_str()), +// &addr, const_cast<char *>(m_cookie.c_str()), 0) == -1) { +// ERR("erl_connect_xinit error" << m_pName << " " << t_cNodeName << " " << m_cookie); +// erl_err_quit("erl_connect_xinit"); +// } else { +// ERR("erl_connect_xinit ok" << m_pName << " " << t_cNodeName << " " << m_cookie); +// } +// } +// +// public: +// +// virtual ~ErlangDbTool() { +// erl_close_connection(m_fd); +// } +// +// //#todo setCNodeName +// +// //#todo sendMessage +// +// /*** +// * 鍚姩erlang鑺傜偣 +// * @return 鍚姩鐘舵�� +// */ +// int initErlang() { +// if (m_nodeName == "") { +// ERR("m_nodeName is null "); +// return 3; +// } +// m_ret = pingNode(m_nodeName, m_cookie); +// if (!m_ret) { +// if (dir_file_exists(m_path, true)) { +// std::string cmd = std::string("cd " + m_path + " && erl -name " + m_nodeName + " -setcookie " +// + m_cookie + " -mnesia dir '\"" + m_path + +// "\"' -detached -noshell");// >>log +// std::cout << cmd << std::endl; +// system(cmd.c_str()); +// std::cout << m_ret << std::endl; +// m_ret = waitNode(); +// return m_ret; +// } else { +// ERR("create file faile "); +// return 0; +// } +// } else { +// INFO("node is running"); +// return 2; +// } +// } +// +// std::string getConfigJsonString() { +// Json::Value t_json; +// Json::FastWriter writer; +// +// t_json["\"path\""] = "\"" + m_path + "\""; +// t_json["\"nodeName\""] = "\"" + m_nodeName + "\""; +// t_json["\"cookie\""] = "\"" + m_cookie + "\""; +// t_json["\"clusterID\""] = "\"" + m_clusterID + "\""; +// t_json["\"clusterName\""] = "\"" + m_clusterName + "\""; +// +// std::string str_json = writer.write(t_json); +// +// return str_json.substr(0, str_json.length() - 1); +// } +// +// /*** +// * 鍚姩鑺傜偣鏁版嵁搴� +// * 鏂拌妭鐐硅嚜鍔ㄥ垱寤烘暟鎹簱 +// * @param FatherNodeName 绗竴涓妭鐐规棤闇�浼犲叆姝ゅ弬鏁帮紝鍏朵粬鑺傜偣闇�瑕佷紶鍏ュ紩瀵艰妭鐐圭殑鍚嶇О +// * @param DeviceName 璁惧鍚嶇О +// * @param DevAdd 璁惧鍦板潃 +// * @return +// */ +// bool startNodeDb(std::string FatherNodeName, std::string DeviceId = "", std::string DevAdd = "DevAddress") { +// LockG lock(m_mutex); +//// m_mutex.lock(); +// m_ret = resetConn(); +// if (m_ret) { +//// DeviceName = DeviceName.empty() ? m_nodeName : DeviceName; +// } else { +// //#todo error message +// ERR(" error " << m_ret << " " << m_fd); +// return false; +// } +// +// ErlMessage emsg; /* Incoming message */ +// //hanshu canshu +// ETERM *arrlist[5]; +// arrlist[0] = erl_mk_atom(m_nodeName.c_str()); +// arrlist[1] = erl_mk_atom(FatherNodeName.c_str()); +// arrlist[2] = erl_mk_atom(DeviceId.c_str()); +// arrlist[3] = erl_mk_atom(m_clusterID.c_str()); +// arrlist[4] = erl_mk_atom(m_clusterName.c_str()); +// ETERM *list = erl_mk_list(arrlist, 5); +// +//// std::cout << __FILE__ << __FUNCTION__ <<__LINE__ << " " << m_fd << std::endl; +//// erl_rpc(m_fd, "syncDB", "startNode", list); +// int ret = -1; +// ret = erl_rpc_to(m_fd, "syncDB", "startNode", list); +// if (ret == ERL_TICK) { +// ret = erl_rpc_from(m_fd, 9000000000, &emsg); +//// m_mutex.unlock(); +// if (ret == ERL_MSG) { +// std::map<std::string, std::string> t_results; +// ETERM *key, *value; +// ETERM *tuplep[6]; +// +// tuplep[0] = erl_element(2, emsg.msg); +// key = erl_element(1, tuplep[0]); +// value = erl_element(2, tuplep[0]); +//// printf("key:%s\n", ERL_ATOM_PTR(key)); +// switch (checkETERMType(value)) { +// case ERL_ATOM: { +// int atomSize = ERL_ATOM_SIZE(value); +// char *atomValue = ERL_ATOM_PTR(value); +// t_results.insert(std::make_pair(ERL_ATOM_PTR(key), atomValue)); +//// printf("value is a atom: atomSize:%d, atomValue:%s \n\r", atomSize, atomValue); +// break; +// } +// default: +// ERR("error add case todo \n\r"); +// } +// auto it = t_results.find("atomic"); +// if (t_results.size() > 0 && t_results.end() != it && it->second == "ok") { +//// erlangFreeEterm(7, emsg.to, emsg.msg, emsg.from, list, key, value, tuplep[0]); +//// erl_eterm_release(); +// return true; +// } //if end +// else { +// INFO(" t_results size is " << t_results.size()); +// for (auto &item : t_results) { +// INFO("item is " << item.first << " " << item.second); +// } +// } +// }//ret == ERL_MSG end +// else { +// ERR(" ret is " << ret); +// +// } +// } //ret == ERL_TICK +// +//// erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list); +// return false; +// } +// +// /*** +// * 鍒犻櫎鑺傜偣鏁版嵁搴擄紝鍚屾椂鍒犻櫎鏈湴鏂囦欢 +// * @return 杩斿洖鐘舵�� +// */ +// bool removeNode() { +// LockG lock(m_mutex); +//// m_mutex.lock(); +// m_ret = resetConn(); +// if (!m_ret) { +// //#todo error message +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << m_ret << " " << m_fd << std::endl; +// return false; +// } +// int ret = -1; +// ErlMessage emsg; /* Incoming message */ +// //hanshu canshu +//// ETERM *arrlist[1]; +//// arrlist[0] = erl_mk_atom(m_nodeName.c_str()); +// ETERM *list = erl_mk_empty_list();// (arrlist, 0); +// +//// std::cout << __FILE__ << __FUNCTION__ <<__LINE__ << " " << m_fd << std::endl; +// ret = erl_rpc_to(m_fd, "syncDB", "removeNode", list); +// if (ret == ERL_TICK) { +// ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); +//// m_mutex.unlock(); +// if (ret == ERL_MSG) { +// std::map<std::string, std::string> t_results; +// ETERM *key, *value; +// ETERM *tuplep[6]; +// +// tuplep[0] = erl_element(2, emsg.msg); +// key = erl_element(1, tuplep[0]); +// value = erl_element(2, tuplep[0]); +//// printf("key:%s\n", ERL_ATOM_PTR(key)); +// switch (checkETERMType(value)) { +// case ERL_ATOM: { +// int atomSize = ERL_ATOM_SIZE(value); +// char *atomValue = ERL_ATOM_PTR(value); +// t_results.insert(std::make_pair(ERL_ATOM_PTR(key), atomValue)); +//// printf("value is a atom: atomSize:%d, atomValue:%s \n\r", atomSize, atomValue); +// break; +// } +// default: +// printf("error add case todo \n\r"); +// } +// auto it = t_results.find("atomic"); +// if (t_results.size() > 0 && t_results.end() != it && it->second == "ok") { +// //鍒犻櫎鏈湴鏂囦欢 +// std::string cmd = std::string("rm -rf ").append(m_path); +// //#todo +// system(cmd.c_str()); +// erlangFreeEterm(7, emsg.to, emsg.msg, emsg.from, list, key, value, tuplep[0]); +// erl_eterm_release(); +// return true; +// } //if end +// } //ret == ERL_MSG end +// } //ret == ERL_TICK +// +// erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list); +// return false; +// } +// +// +// bool modifyCluName(std::string CluId, std::string CluName) { +// LockG lock(m_mutex); +//// m_mutex.lock(); +// m_ret = resetConn(); +// if (!m_ret) { +// //#todo error message +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << m_ret << " " << m_fd << std::endl; +// return false; +// } +// ErlMessage emsg; /* Incoming message */ +// int ret = -1; +// ETERM *arrlist[2]; +// arrlist[0] = erl_mk_atom(CluId.c_str()); +// arrlist[1] = erl_mk_atom(CluName.c_str()); +// ETERM *list = erl_mk_list(arrlist, 2); +// +// ret = erl_rpc_to(m_fd, "syncDB", "modifyCluName", list); +// if (ret == ERL_TICK) { +// ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); +//// m_mutex.unlock(); +// if (ret == ERL_MSG) { +// std::map<std::string, std::string> t_results; +// +// ETERM *tail_list; +// ETERM *list_ret[1000], *arr_ret[2]; +// ETERM *key, *value; +// ETERM *tuplep[6]; +// +// arr_ret[0] = erl_element(2, emsg.msg); +// int erlLength = erl_length(arr_ret[0]); +// printf("arr_ret[0]:%d\n", erlLength); +// list_ret[0] = erl_hd(arr_ret[0]); +// tail_list = erl_tl(arr_ret[0]); +// for (int i = 0; i < erlLength; i++) { +// if (i > 0) { +// list_ret[i] = erl_hd(tail_list); +// tail_list = erl_tl(tail_list); +// } +//// printf("list_ret[%d]:%d\n", i, erl_length(list_ret[i])); +// tuplep[0] = erl_hd(list_ret[i]); +// key = erl_element(1, list_ret[i]); +// value = erl_element(2, list_ret[i]); +//// printf("key:%s\n", ERL_ATOM_PTR(key)); +// +// switch (checkETERMType(value)) { +// case ERL_ATOM: { +// int atomSize = ERL_ATOM_SIZE(value); +// char *atomValue = ERL_ATOM_PTR(value); +// printf("value is a atom: atomSize:%d, atomValue:%s \n\r", atomSize, atomValue); +// t_results.insert(std::make_pair(ERL_ATOM_PTR(key), atomValue)); +// break; +// } +// default: +// printf("error add case todo \n\r"); +// } +// erlangFreeEterm(4, key, value, tuplep[0], list_ret[i]); +// +// } +// erlangFreeEterm(2, tail_list, arr_ret[0]); +// erl_eterm_release(); +// auto it = t_results.find("atomic"); +// if (t_results.size() > 0 && t_results.end() != it && it->second == "ok") { +// return true; +// } +// } +// } +// erl_free_array(arrlist, 2); +//// erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list); +// erl_eterm_release(); +// return false; +// } +// +// +// /*** +// * 鏌ユ壘鍦ㄧ嚎鑺傜偣淇℃伅 +// * #TODO 鏈変竴涓皬bug +// * device_info.create_by浼氳閲嶇疆 +// * @return 鑺傜偣闆嗗悎淇℃伅 +// */ +// map_DevDataCache findAllNode() { +// LockG lock(m_mutex); +//// m_mutex.lock(); +// m_ret = resetConn(); +// if (!m_ret) { +// //#todo error message +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << m_ret << " " << m_fd << std::endl; +// +// return map_DevDataCache(); +// } +// map_DevDataCache devDataCache; +// int ret = -1; +// ErlMessage emsg; /* Incoming message */ +// //hanshu canshu +//// ETERM *arrlist[0]; +//// arrlist[0] = erl_mk_atom(m_nodeName.c_str()); +// ETERM *list = erl_mk_empty_list();//erl_mk_list(arrlist, 0); +// +// ret = erl_rpc_to(m_fd, "syncDB", "findAllNode", list); +// if (ret == ERL_TICK) { +// ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); +//// m_mutex.unlock(); +// if (ret == ERL_MSG) { +// ETERM *key, *value; +// ETERM *tuplep[20]; +// ETERM *arr_ret[2], *list_ret[1000]; +// ETERM *tail_list, *tail_tuple; +// arr_ret[0] = erl_element(2, emsg.msg); +// if (checkETERMType(arr_ret[0]) == ERL_LIST) { +// int erlLength = erl_length(arr_ret[0]); +//// printf("arr_ret[0]:%d\n", erlLength); +// list_ret[0] = erl_hd(arr_ret[0]); +// tail_list = erl_tl(arr_ret[0]); +// for (int i = 0; i < erlLength; i++) { +// if (i > 0) { +// list_ret[i] = erl_hd(tail_list); +// tail_list = erl_tl(tail_list); +// } +// if (checkETERMType(list_ret[i]) == ERL_LIST) { +// SyncDB::Device_Info device_info; +// int erlLength1 = erl_length(list_ret[i]); +//// printf("list_ret[%d]:%d\n", i, erlLength1); +// tuplep[0] = erl_hd(list_ret[i]); +// tail_tuple = erl_tl(list_ret[i]); +// +// for (int j = 0; j < erlLength1; j++) { +// if (j > 0) { +// tuplep[j] = erl_hd(tail_tuple); +// tail_tuple = erl_tl(tail_tuple); +// } +// key = erl_element(1, tuplep[j]); +// value = erl_element(2, tuplep[j]); +//// printf("key:%s\n", erl_iolist_to_string(key)); +// switch (checkETERMType(value)) { +// case ERL_ATOM: { +// device_info.setValue(erl_iolist_to_string(key), ERL_ATOM_PTR(value)); +// break; +// } +// case ERL_INTEGER: { +// device_info.setValue(erl_iolist_to_string(key), +// std::to_string(ERL_INT_VALUE(value))); +// break; +// } +// case ERL_LIST: { +// device_info.setValue(erl_iolist_to_string(key), +// erl_iolist_to_string(value)); +// break; +// } +// default: +// printf("error add case todo %d\n\r", checkETERMType(value)); +// } +// erlangFreeEterm(3, key, value, tuplep[j]); +// } +//// printf("\none list end\n\n\n\n"); +// // #todo this is have a bug +//// device_info.create_by = ""; +// devDataCache.insert(std::make_pair(device_info.uuid, device_info)); +// erlangFreeEterm(1, tail_tuple); +// } else { +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " type error " +// << checkETERMType(arr_ret[0]) +// << " " +// << std::endl; +// } +// erlangFreeEterm(1, list_ret[i]); +// } +// +// erlangFreeEterm(6, emsg.to, emsg.msg, emsg.from, list, tail_list, arr_ret[0]); +// erl_eterm_release(); +// return devDataCache; +// } else { +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << checkETERMType(arr_ret[0]) +// << " " +// << std::endl; +// } +// } +// } //ret == ERL_TICK end +// erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list); +// erl_eterm_release(); +// return map_DevDataCache(); +// } +// +// /*** +// * 鍒涘缓搴曞簱琛� +// * @param TableType car||person +// * @param TableName +// * @param SyncType true 1||false 0 +// * @param BwType "Black"1||"White"0 +// * @return 鍒涘缓鐘舵�� +// */ +// bool createDatabase(std::string TableType, std::string TableName, bool SyncType, std::string BwType, +// std::string StartTime = "", std::string EndTime = "") { +// LockG lock(m_mutex); +//// m_mutex.lock(); +// m_ret = resetConn(); +// if (!m_ret) { +// //#todo error message +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << m_ret << " " << m_fd << std::endl; +// return false; +// } +// std::string NewTableName = ((!SyncType) && TableName.find("lt_")) ? std::string("lt_").append(TableName) +// : TableName; +// +// ErlMessage emsg; /* Incoming message */ +// int ret = -1; +// ETERM *arrlist[6]; +// arrlist[0] = erl_mk_atom(TableType.c_str()); +// arrlist[1] = erl_mk_atom(NewTableName.c_str()); +// auto str = std::to_string(SyncType); +// arrlist[2] = erl_mk_atom(str.c_str()); +// arrlist[3] = erl_mk_atom(BwType.c_str()); +// arrlist[4] = erl_mk_atom(StartTime.c_str()); +// arrlist[5] = erl_mk_atom(EndTime.c_str()); +// ETERM *list = erl_mk_list(arrlist, 6); +// +// ret = erl_rpc_to(m_fd, "syncDB", "createDatabase", list); +// if (ret == ERL_TICK) { +// ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); +//// m_mutex.unlock(); +// if (ret == ERL_MSG) { +// std::map<std::string, std::string> t_results; +// +// ETERM *tail_list; +// ETERM *list_ret[1000], *arr_ret[2]; +// ETERM *key, *value; +// ETERM *tuplep[6]; +// +// arr_ret[0] = erl_element(2, emsg.msg); +// int erlLength = erl_length(arr_ret[0]); +// printf("arr_ret[0]:%d\n", erlLength); +// list_ret[0] = erl_hd(arr_ret[0]); +// tail_list = erl_tl(arr_ret[0]); +// for (int i = 0; i < erlLength; i++) { +// if (i > 0) { +// list_ret[i] = erl_hd(tail_list); +// tail_list = erl_tl(tail_list); +// } +//// printf("list_ret[%d]:%d\n", i, erl_length(list_ret[i])); +// tuplep[0] = erl_hd(list_ret[i]); +// key = erl_element(1, list_ret[i]); +// value = erl_element(2, list_ret[i]); +//// printf("key:%s\n", ERL_ATOM_PTR(key)); +// +// switch (checkETERMType(value)) { +// case ERL_ATOM: { +//// int atomSize = ERL_ATOM_SIZE(value); +// char *atomValue = ERL_ATOM_PTR(value); +//// printf("value is a atom: atomSize:%d, atomValue:%s \n\r", atomSize, atomValue); +// t_results.insert(std::make_pair(ERL_ATOM_PTR(key), atomValue)); +// break; +// } +// default: +// printf("error add case todo \n\r"); +// } +// erlangFreeEterm(4, key, value, tuplep[0], list_ret[i]); +// +// } +// erlangFreeEterm(2, tail_list, arr_ret[0]); +// erl_eterm_release(); +// auto it = t_results.find("atomic"); +// if (t_results.size() > 0 && t_results.end() != it && it->second == "ok") { +// return true; +// } +// } +// } +// erl_free_array(arrlist, 6); +//// erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list); +// erl_eterm_release(); +// return false; +// } +// +// /*** +// * 鏇存柊搴曞簱琛� +// * @param TableType car||person +// * @param TableName +// * @param SyncType true 1||false 0 +// * @param BwType "white"0||"black"1 +// * @return 鍒涘缓鐘舵�� +// */ +// bool updateDatabase(std::string UUID, std::string TableType, std::string TableName, bool SyncType, +// std::string BwType, std::string StartTime = "", std::string EndTime = "") { +// LockG lock(m_mutex); +//// m_mutex.lock(); +// m_ret = resetConn(); +// if (!m_ret) { +// //#todo error message +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << m_ret << " " << m_fd << std::endl; +// return false; +// } +// std::string NewTableName = ((!SyncType) && TableName.find("lt_")) ? std::string("lt_").append(TableName) +// : TableName; +// +// ErlMessage emsg; /* Incoming message */ +// int ret = -1; +// ETERM *arrlist[7]; +// arrlist[0] = erl_mk_atom(UUID.c_str()); +// arrlist[1] = erl_mk_atom(TableType.c_str()); +// arrlist[2] = erl_mk_atom(NewTableName.c_str()); +// auto str = std::to_string(SyncType); +// arrlist[3] = erl_mk_atom(str.c_str()); +// arrlist[4] = erl_mk_atom(BwType.c_str()); +// arrlist[5] = erl_mk_atom(StartTime.c_str()); +// arrlist[6] = erl_mk_atom(EndTime.c_str()); +// ETERM *list = erl_mk_list(arrlist, 7); +// +// ret = erl_rpc_to(m_fd, "syncDB", "updateDatabase", list); +// if (ret == ERL_TICK) { +// ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); +//// m_mutex.unlock(); +// if (ret == ERL_MSG) { +// std::map<std::string, std::string> t_results; +// +// ETERM *tail_list; +// ETERM *list_ret[1000], *arr_ret[2]; +// ETERM *key, *value; +// ETERM *tuplep[6]; +// +// arr_ret[0] = erl_element(2, emsg.msg); +// int erlLength = erl_length(arr_ret[0]); +// printf("arr_ret[0]:%d\n", erlLength); +// list_ret[0] = erl_hd(arr_ret[0]); +// tail_list = erl_tl(arr_ret[0]); +// for (int i = 0; i < erlLength; i++) { +// if (i > 0) { +// list_ret[i] = erl_hd(tail_list); +// tail_list = erl_tl(tail_list); +// } +//// printf("list_ret[%d]:%d\n", i, erl_length(list_ret[i])); +// tuplep[0] = erl_hd(list_ret[i]); +// key = erl_element(1, list_ret[i]); +// value = erl_element(2, list_ret[i]); +//// printf("key:%s\n", ERL_ATOM_PTR(key)); +// +// switch (checkETERMType(value)) { +// case ERL_ATOM: { +//// int atomSize = ERL_ATOM_SIZE(value); +// char *atomValue = ERL_ATOM_PTR(value); +//// printf("value is a atom: atomSize:%d, atomValue:%s \n\r", atomSize, atomValue); +// t_results.insert(std::make_pair(ERL_ATOM_PTR(key), atomValue)); +// break; +// } +// default: +// printf("error add case todo \n\r"); +// } +// erlangFreeEterm(4, key, value, tuplep[0], list_ret[i]); +// } +// erlangFreeEterm(2, tail_list, arr_ret[0]); +// erl_eterm_release(); +// auto it = t_results.find("atomic"); +// if (t_results.size() > 0 && t_results.end() != it && it->second == "ok") { +// return true; +// } +// } +// } +// erl_free_array(arrlist, 7); +//// erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list); +// erl_eterm_release(); +// return false; +// } +// +// /*** +// * 鍒犻櫎鏁版嵁琛� +// * @param TableType car||person +// * @param TableName biaoming +// * @param SyncType true 1||false 0 +// * @return +// */ +// bool deleteDatabase(std::string TableType, std::string TableName, bool SyncType) { +// LockG lock(m_mutex); +//// m_mutex.lock(); +// m_ret = resetConn(); +// if (!m_ret) { +// //#todo error message +// ERR(" error " << m_ret << " " << m_fd); +// return false; +// } +// std::string NewTableName = ((!SyncType) && TableName.find("lt_")) ? std::string("lt_").append(TableName) +// : TableName; +// +// ErlMessage emsg; /* Incoming message */ +// int ret = -1; +// +// ETERM *arrlist[2]; +// arrlist[0] = erl_mk_atom(TableType.c_str()); +// arrlist[1] = erl_mk_atom(NewTableName.c_str()); +// ETERM *list = erl_mk_list(arrlist, 2); +// +// ret = erl_rpc_to(m_fd, "syncDB", "deleteDatabase", list); +// if (ret == ERL_TICK) { +// ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); +//// m_mutex.unlock(); +// if (ret == ERL_MSG) { +// std::map<std::string, std::string> t_results; +// ETERM *tail_list; +// ETERM *list_ret[10], *arr_ret[2]; +// ETERM *key, *value; +// ETERM *tuplep[6]; +// arr_ret[0] = erl_element(2, emsg.msg); +// int erlLength = erl_length(arr_ret[0]); +// printf("arr_ret[0]:%d\n", erlLength); +// list_ret[0] = erl_hd(arr_ret[0]); +// tail_list = erl_tl(arr_ret[0]); +// for (int i = 0; i < erlLength; i++) { +// if (i > 0) { +// list_ret[i] = erl_hd(tail_list); +// tail_list = erl_tl(tail_list); +// } +//// printf("list_ret[%d]:%d\n", i, erl_length(list_ret[i])); +// tuplep[0] = erl_hd(list_ret[i]); +// key = erl_element(1, list_ret[i]); +// value = erl_element(2, list_ret[i]); +//// printf("key:%s\n", ERL_ATOM_PTR(key)); +// switch (checkETERMType(value)) { +// case ERL_ATOM: { +// int atomSize = ERL_ATOM_SIZE(value); +// char *atomValue = ERL_ATOM_PTR(value); +// t_results.insert(std::make_pair(ERL_ATOM_PTR(key), atomValue)); +// printf("value is a atom: atomSize:%d, atomValue:%s \n\r", atomSize, atomValue); +// break; +// } +// default: +// printf("error add case todo \n\r"); +// } +// erlangFreeEterm(4, key, value, tuplep[0], list_ret[i]); +// } +// erlangFreeEterm(2, tail_list, arr_ret[0]); +// auto it = t_results.find("atomic"); +// if (t_results.size() > 0 && t_results.end() != it && it->second == "ok") { +// return true; +// } +// } +// } +// erl_free_array(arrlist, 2); +// erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list); +// return false; +// } +// +// /*** +// * 鏌ヨ鎵�鏈夋暟鎹〃 +// * @return +// */ +// map_TabDataCache findAllDatabase() { +// LockG lock(m_mutex); +//// m_mutex.lock(); +// m_ret = resetConn(); +// map_TabDataCache tabDataCache; +// if (!m_ret) { +// //#todo error message +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << m_ret << " " << m_fd << std::endl; +// return tabDataCache; +// } +// int ret = -1; +// ErlMessage emsg; /* Incoming message */ +// //hanshu canshu +//// ETERM *arrlist[0]; +//// arrlist[0] = erl_mk_atom(m_nodeName.c_str()); +// ETERM *list = erl_mk_empty_list();//erl_mk_list(arrlist, 0); +// +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " " << m_fd << std::endl; +// ret = erl_rpc_to(m_fd, "syncDB", "findAllDatabase", list); +// if (ret == ERL_TICK) { +// ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); +//// m_mutex.unlock(); +// if (ret == ERL_MSG) { +// ETERM *key, *value; +// ETERM *tuplep[20]; +// ETERM *arr_ret[2], *list_ret[1000]; +// ETERM *tail_list, *tail_tuple; +// arr_ret[0] = erl_element(2, emsg.msg); +// if (checkETERMType(arr_ret[0]) == ERL_LIST) { +// int erlLength = erl_length(arr_ret[0]); +// list_ret[0] = erl_hd(arr_ret[0]); +// tail_list = erl_tl(arr_ret[0]); +// for (int i = 0; i < erlLength; i++) { +// if (i > 0) { +// list_ret[i] = erl_hd(tail_list); +// tail_list = erl_tl(tail_list); +// } +// if (checkETERMType(list_ret[i]) == ERL_LIST) { +// SyncDB::Table_Info table_info; +// int erlLength1 = erl_length(list_ret[i]); +// tuplep[0] = erl_hd(list_ret[i]); +// tail_tuple = erl_tl(list_ret[i]); +// +// for (int j = 0; j < erlLength1; j++) { +// if (j > 0) { +// tuplep[j] = erl_hd(tail_tuple); +// tail_tuple = erl_tl(tail_tuple); +// } +// key = erl_element(1, tuplep[j]); +// value = erl_element(2, tuplep[j]); +// switch (checkETERMType(value)) { +// case ERL_ATOM: { +// table_info.setValue(erl_iolist_to_string(key), ERL_ATOM_PTR(value)); +// break; +// } +// case ERL_INTEGER: { +// table_info.setValue(erl_iolist_to_string(key), +// std::to_string(ERL_INT_VALUE(value))); +// break; +// } +// case ERL_LIST: { +// table_info.setValue(erl_iolist_to_string(key), +// erl_iolist_to_string(value)); +// break; +// } +// default: +// printf("error add case todo %d\n\r", checkETERMType(value)); +// } +//// erlangFreeEterm(3, key, value, tuplep[j]); +// } +//// erlangFreeEterm(2, tail_tuple, list_ret[i]); +// +// // #todo this is have a bug +//// table_info.create_by = ""; +// tabDataCache.insert(std::make_pair(table_info.tableName, table_info)); +// } else { +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " type error " +// << checkETERMType(arr_ret[0]) +// << " " +// << std::endl; +// } +// } +//// erlangFreeEterm(2, tail_list, arr_ret[0]); +// return tabDataCache; //ok +// } else { +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << checkETERMType(arr_ret[0]) +// << " " +// << std::endl; +// } +// } +// } +//// erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list); +// return tabDataCache; //not ok +// } +// +// /*** +// * 鏌ヨ鎵�鏈夎〃鐨勯粦鐧藉悕鍗曠被鍨� +// * @return +// */ +// map_BwDataCache findAllTypeInfo() { +// LockG lock(m_mutex); +//// m_mutex.lock(); +// m_ret = resetConn(); +// if (!m_ret) { +// //#todo error message +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << m_ret << " " << m_fd << std::endl; +// return map_BwDataCache(); +// } +// map_BwDataCache bwDataCache; +// int ret = -1; +// ErlMessage emsg; /* Incoming message */ +// ETERM *list = erl_mk_empty_list();//erl_mk_list(arrlist, 0); +// +//// std::cout << __FILE__ << __FUNCTION__ <<__LINE__ << " " << m_fd << std::endl; +// ret = erl_rpc_to(m_fd, "syncDB", "findAllTypeInfo", list); +// if (ret == ERL_TICK) { +// ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); +//// m_mutex.unlock(); +// if (ret == ERL_MSG) { +// ETERM *key, *value; +// ETERM *tuplep[20]; +// ETERM *arr_ret[2], *list_ret[1000]; +// ETERM *tail_list, *tail_tuple; +// arr_ret[0] = erl_element(2, emsg.msg); +// if (checkETERMType(arr_ret[0]) == ERL_LIST) { +// int erlLength = erl_length(arr_ret[0]); +//// printf("arr_ret[0]:%d\n", erlLength); +// list_ret[0] = erl_hd(arr_ret[0]); +// tail_list = erl_tl(arr_ret[0]); +// for (int i = 0; i < erlLength; i++) { +// if (i > 0) { +// list_ret[i] = erl_hd(tail_list); +// tail_list = erl_tl(tail_list); +// } +// if (checkETERMType(list_ret[i]) == ERL_LIST) { +// SyncDB::Bw_Info bw_info; +// int erlLength1 = erl_length(list_ret[i]); +//// printf("list_ret[%d]:%d\n", i, erlLength1); +// tuplep[0] = erl_hd(list_ret[i]); +// tail_tuple = erl_tl(list_ret[i]); +// +// for (int j = 0; j < erlLength1; j++) { +// if (j > 0) { +// tuplep[j] = erl_hd(tail_tuple); +// tail_tuple = erl_tl(tail_tuple); +// } +// key = erl_element(1, tuplep[j]); +// value = erl_element(2, tuplep[j]); +//// printf("key:%s\n", erl_iolist_to_string(key)); +// switch (checkETERMType(value)) { +// case ERL_ATOM: { +// bw_info.setValue(erl_iolist_to_string(key), ERL_ATOM_PTR(value)); +// break; +// } +// case ERL_INTEGER: { +// bw_info.setValue(erl_iolist_to_string(key), +// std::to_string(ERL_INT_VALUE(value))); +// break; +// } +// case ERL_LIST: { +// bw_info.setValue(erl_iolist_to_string(key), +// erl_iolist_to_string(value)); +// break; +// } +// default: +// printf("error add case todo %d\n\r", checkETERMType(value)); +// } +//// erlangFreeEterm(3, key, value, tuplep[j]); +// } +//// erlangFreeEterm(2, tail_tuple, list_ret[i]); +//// printf("\none list end\n\n\n\n"); +// // #todo this is have a bug +//// bw_info.create_by = ""; +// bwDataCache.insert(std::make_pair(bw_info.tableName, bw_info)); +// } else { +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " type error " +// << checkETERMType(arr_ret[0]) +// << " " +// << std::endl; +// } +// } +//// erlangFreeEterm(2, tail_list, arr_ret[0]); +// return bwDataCache;//ok +// } else { +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << checkETERMType(arr_ret[0]) +// << " " +// << std::endl; +// } +// } +// } +//// erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list); +// return map_BwDataCache(); +// } +// +// /*** +// * 澧炲姞浜哄憳 +// * @param UUID out +// * @param TableName +// * @param Feature +// * @param PersonName +// * @param Age +// * @param Sex +// * @param IdCard +// * @param PhoneNum +// * @return +// */ +// bool addPerson(std::string &UUID, std::string TableName, std::string Feature, std::string ImgUrl = " ", +// std::string IdCard = " ", std::string PersonName = " ", std::string Age = " ", +// std::string Sex = " ", std::string PhoneNum = " ") { +// LockG lock(m_mutex); +//// m_mutex.lock(); +// m_ret = resetConn(); +// if (!m_ret) { +// //#todo error message +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << m_ret << " " << m_fd << " " +// << Feature << std::endl; +// return false; +// } +// int ret; +// ErlMessage emsg; /* Incoming message */ +// //hanshu canshu +// ETERM *arrlist[9]; +// arrlist[0] = erl_mk_atom(TableName.c_str()); +// arrlist[1] = erl_mk_atom(PersonName.c_str()); +// arrlist[2] = erl_mk_atom(Age.c_str()); +// arrlist[3] = erl_mk_atom(Sex.c_str()); +// arrlist[4] = erl_mk_atom(IdCard.c_str()); +// arrlist[5] = erl_mk_atom(PhoneNum.c_str()); +// arrlist[6] = erl_mk_atom(ImgUrl.c_str()); +// arrlist[7] = erl_mk_atom(UUID.c_str()); +// arrlist[8] = erl_mk_string(Feature.c_str()); +// +// ETERM *list = erl_mk_list(arrlist, 9); +// ret = erl_rpc_to(m_fd, "syncDB", "addPersonData", list); +// if (ret == ERL_TICK) { +// +// ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); +//// m_mutex.unlock(); +// if (ret == ERL_MSG) { +// ETERM *value; +// value = erl_element(2, emsg.msg); +// switch (checkETERMType(value)) { +// case ERL_LIST: { +// UUID = std::string(erl_iolist_to_string(value)); +// break; +// } +// case ERL_ATOM: { +// UUID = std::string(ERL_ATOM_PTR(value)); +// break; +// } +// default: +// printf("error add case todo \n\r"); +// } +// erl_free_term(value); +// if (UUID.size() > 0) { +// erlangFreeEterm(5, emsg.msg, emsg.from, emsg.to, list, arrlist[8]); +// erl_free_array(arrlist, 8); +// erl_eterm_release(); +// return true; +// } +// } +// } +// erlangFreeEterm(5, emsg.msg, emsg.from, emsg.to, list, arrlist[8]); +// erl_free_array(arrlist, 8); +// erl_eterm_release(); +// return false; +// } +// +// /*** +// * 鍒犻櫎浜哄憳 +// * @param UUID +// * @param TableName +// * @return +// */ +// bool delPerson(std::string UUID, std::string TableName) { +// LockG lock(m_mutex); +//// m_mutex.lock(); +// m_ret = resetConn(); +// if (!m_ret) { +// //#todo error message +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << m_ret << " " << m_fd << " " +// << std::endl; +// return false; +// } +// int ret; +// ErlMessage emsg; /* Incoming message */ +// //hanshu canshu +// ETERM *arrlist[2]; +// arrlist[0] = erl_mk_atom(TableName.c_str()); +// arrlist[1] = erl_mk_atom(UUID.c_str()); +// +// ETERM *list = erl_mk_list(arrlist, 2); +// ret = erl_rpc_to(m_fd, "syncDB", "deletePersonData", list); +// if (ret == ERL_TICK) { +// ret = erl_rpc_from(m_fd, TIMEOUT, &emsg); +//// m_mutex.unlock(); +// if (ret == ERL_MSG) { +// std::map<std::string, std::string> t_results; +// ETERM *tail_list; +// ETERM *list_ret[10], *arr_ret[2]; +// ETERM *key, *value; +// ETERM *tuplep[6]; +// arr_ret[0] = erl_element(2, emsg.msg); +// int erlLength = erl_length(arr_ret[0]); +// printf("arr_ret[0]:%d\n", erlLength); +// list_ret[0] = erl_hd(arr_ret[0]); +// tail_list = erl_tl(arr_ret[0]); +// for (int i = 0; i < erlLength; i++) { +// if (i > 0) { +// list_ret[i] = erl_hd(tail_list); +// tail_list = erl_tl(tail_list); +// } +//// printf("list_ret[%d]:%d\n", i, erl_length(list_ret[i])); +// tuplep[0] = erl_hd(list_ret[i]); +// key = erl_element(1, list_ret[i]); +// value = erl_element(2, list_ret[i]); +//// printf("key:%s\n", ERL_ATOM_PTR(key)); +// switch (checkETERMType(value)) { +// case ERL_ATOM: { +// int atomSize = ERL_ATOM_SIZE(value); +// char *atomValue = ERL_ATOM_PTR(value); +// t_results.insert(std::make_pair(ERL_ATOM_PTR(key), atomValue)); +//// printf("value is a atom: atomSize:%d, atomValue:%s \n\r", atomSize, atomValue); +// break; +// } +// default: +// printf("error add case todo \n\r"); +// } +// erlangFreeEterm(4, key, value, tuplep[0], list_ret[i]); +// } +// erlangFreeEterm(2, tail_list, arr_ret[0]); +// auto it = t_results.find("atomic"); +// if (t_results.size() > 0 && t_results.end() != it && it->second == "ok") { +// return true; +// } +// } +// } +// erlangFreeEterm(4, emsg.msg, emsg.from, emsg.to, list); +// erl_free_array(arrlist, 2); +// erl_eterm_release(); +// return false; +// } +// +// +// /*** +// * 鏍规嵁琛ㄥ悕鍔犺浇浜鸿劯鐗瑰緛 +// * @param TableName +// * @return +// */ +// map_FaceDataCache loadFaceFeaData(std::string TableName) { +// std::lock_guard<std::mutex> lock(m_mutex); +//// m_mutex.lock(); +// m_ret = resetConn(); +// if (!m_ret) { +// //#todo error message +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << m_ret << " " << m_fd << std::endl; +// return map_FaceDataCache(); +// } +// map_FaceDataCache dataCache; +// int ret; +// ErlMessage emsg; /* Incoming message */ +// //hanshu canshu +// ETERM *arrlist[1]; +// arrlist[0] = erl_mk_atom(TableName.c_str()); +// +// ETERM *list = erl_mk_list(arrlist, 1); +// ret = erl_rpc_to(m_fd, "syncDB", "loadFaceFeaData", list); +// +// if (ret == ERL_TICK) { +// ret = erl_rpc_from(m_fd, TIMEOUT * 100000, &emsg); +//// m_mutex.unlock(); +// if (ret == ERL_MSG) { +// ETERM *key, *value; +// ETERM *tuplep[20]; +// ETERM *arr_ret[2], *list_ret[5000]; +// ETERM *tail_list, *tail_tuple; +// arr_ret[0] = erl_element(2, emsg.msg); +// if (checkETERMType(arr_ret[0]) == ERL_LIST) { +// int erlLength = erl_length(arr_ret[0]); +//// printf("arr_ret[0]:%d\n", erlLength); +// list_ret[0] = erl_hd(arr_ret[0]); +// tail_list = erl_tl(arr_ret[0]); +// for (int i = 0; i < erlLength; i++) { +//// DBG(i); +// if (i > 0) { +// list_ret[i] = erl_hd(tail_list); +// tail_list = erl_tl(tail_list); +// } +// if (tail_list == NULL) +// break; +// if (checkETERMType(list_ret[i]) == ERL_LIST) { +// SyncDB::Feature_Info feature_info; +//// feature_info.id = "test"; +//// feature_info.create_by = ""; +//// feature_info.feature =""; +//// feature_info.update_time = ""; +//// feature_info.create_time = ""; +// +// int erlLength1 = erl_length(list_ret[i]); +//// printf("list_ret[%d]:%d\n", i, erlLength1); +// tuplep[0] = erl_hd(list_ret[i]); +// tail_tuple = erl_tl(list_ret[i]); +// +// for (int j = 0; j < erlLength1; j++) { +// if (j > 0) { +// tuplep[j] = erl_hd(tail_tuple); +// tail_tuple = erl_tl(tail_tuple); +// } +// key = erl_element(1, tuplep[j]); +// value = erl_element(2, tuplep[j]); +//// printf("key:%s\n", erl_iolist_to_string(key)); +// +// switch (checkETERMType(value)) { +// case ERL_ATOM: { +// feature_info.setValue(erl_iolist_to_string(key), ERL_ATOM_PTR(value)); +// break; +// } +// case ERL_LIST: { +// feature_info.setValue(erl_iolist_to_string(key), +// erl_iolist_to_string(value)); +// break; +// } +// default: +// printf("error add case todo %d\n\r", checkETERMType(value)); +// } +// +//// erlangFreeEterm(2, key, value); +// } +//// printf("\none list end\n\n\n\n"); +// dataCache.insert(std::move(std::make_pair(feature_info.id, feature_info))); +//// break; +//// erlangFreeEterm(1, list_ret[i]); +// } else { +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " type error " +// << checkETERMType(list_ret[i]) +// << " " +// << std::endl; +// } +// } +// erlangFreeEterm(5, emsg.msg, emsg.from, emsg.to, list, arrlist[0]); +// erl_eterm_release(); +//// sleep() +// return dataCache; +// } else { +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << checkETERMType(arr_ret[0]) +// << " " +// << std::endl; +// } +// } else { +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << ret << " " << std::endl; +// } +// +// } +// erlangFreeEterm(5, emsg.msg, emsg.from, emsg.to, list, arrlist[0]); +// erl_eterm_release(); +// return map_FaceDataCache(); +// }; +// +// +// /*** +// * 鏍规嵁琛ㄥ悕鍔犺浇浜鸿劯鐗瑰緛2 +// * @param TableName +// * @return +// */ +// map_FaceDataCache loadFaceFeaData2(std::string TableName) { +// std::lock_guard<std::mutex> lock(m_mutex); +//// m_mutex.lock(); +// m_ret = resetConn(); +// if (!m_ret) { +// //#todo error message +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << m_ret << " " << m_fd << std::endl; +// return map_FaceDataCache(); +// } +// map_FaceDataCache dataCache; +// int ret; +// ErlMessage emsg; /* Incoming message */ +// //hanshu canshu +// ETERM *arrlist[1]; +// arrlist[0] = erl_mk_atom(TableName.c_str()); +// +// ETERM *list = erl_mk_list(arrlist, 1); +// ret = erl_rpc_to(m_fd, "syncDB", "loadFaceFeaData2", list); +// +// if (ret == ERL_TICK) { +// ret = erl_rpc_from(m_fd, TIMEOUT * 100000, &emsg); +//// m_mutex.unlock(); +// if (ret == ERL_MSG) { +// ETERM *key, *value; +// ETERM *tuplep[20]; +// ETERM *arr_ret[2], *list_ret[5000]; +// ETERM *tail_list, *tail_tuple; +// arr_ret[0] = erl_element(2, emsg.msg); +// if (checkETERMType(arr_ret[0]) == ERL_LIST) { +// int erlLength = erl_length(arr_ret[0]); +//// printf("arr_ret[0]:%d\n", erlLength); +// list_ret[0] = erl_hd(arr_ret[0]); +// tail_list = erl_tl(arr_ret[0]); +// for (int i = 0; i < erlLength; i++) { +//// DBG(i); +// if (i > 0) { +// list_ret[i] = erl_hd(tail_list); +// tail_list = erl_tl(tail_list); +// } +// if (tail_list == NULL) +// break; +// if (checkETERMType(list_ret[i]) == ERL_LIST) { +// SyncDB::Feature_Info feature_info; +//// feature_info.id = "test"; +//// feature_info.create_by = ""; +//// feature_info.feature =""; +//// feature_info.update_time = ""; +//// feature_info.create_time = ""; +// +// int erlLength1 = erl_length(list_ret[i]); +//// printf("list_ret[%d]:%d\n", i, erlLength1); +// tuplep[0] = erl_hd(list_ret[i]); +// tail_tuple = erl_tl(list_ret[i]); +// +// for (int j = 0; j < erlLength1; j++) { +// if (j > 0) { +// tuplep[j] = erl_hd(tail_tuple); +// tail_tuple = erl_tl(tail_tuple); +// } +// key = erl_element(1, tuplep[j]); +// value = erl_element(2, tuplep[j]); +//// printf("key:%s\n", erl_iolist_to_string(key)); +// +// switch (checkETERMType(value)) { +// case ERL_ATOM: { +// feature_info.setValue(erl_iolist_to_string(key), ERL_ATOM_PTR(value)); +// break; +// } +// case ERL_LIST: { +// feature_info.setValue(erl_iolist_to_string(key), +// erl_iolist_to_string(value)); +// break; +// } +// default: +// printf("error add case todo %d\n\r", checkETERMType(value)); +// } +// +//// erlangFreeEterm(2, key, value); +// } +//// printf("\none list end\n\n\n\n"); +// dataCache.insert(std::move(std::make_pair(feature_info.id, feature_info))); +//// break; +//// erlangFreeEterm(1, list_ret[i]); +// } else { +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " type error " +// << checkETERMType(list_ret[i]) +// << " " +// << std::endl; +// } +// } +// erlangFreeEterm(5, emsg.msg, emsg.from, emsg.to, list, arrlist[0]); +// erl_eterm_release(); +//// sleep() +// return dataCache; +// } else { +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << checkETERMType(arr_ret[0]) +// << " " +// << std::endl; +// } +// } else { +// std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << ret << " " << std::endl; +// } +// +// } +// erlangFreeEterm(5, emsg.msg, emsg.from, emsg.to, list, arrlist[0]); +// erl_eterm_release(); +// return map_FaceDataCache(); +// }; +// +//// private: +// /*** +// * 閲嶆柊杩炴帴鑺傜偣 +// * @return 杩炴帴鐘舵�� +// */ +// bool resetConn() { +// //#todo +// if (m_pName.size() <= 0) { +// srand(time(0)); +// m_loop = rand() % 1000; +// +// int ret = -1; +// erl_init(NULL, 0); +//// m_loop %= 10; +//// m_loop++; +// ret = erl_connect_init(m_loop, const_cast<char *>(m_cookie.c_str()), 0); +// DBG("node name is " << m_loop); +// if (-1 == ret) { +//// erl_err_quit("erl_connect_init"); +// return false; +// } +// +//// std::cout << __FILE__ << __FUNCTION__ <<__LINE__ << " " << m_fd << std::endl; +// erl_close_connection(m_fd); +//// std::cout << __FILE__ << __FUNCTION__ <<__LINE__ << " " << m_fd << std::endl; +// m_fd = erl_connect(const_cast<char *>(m_nodeName.c_str())); +//// std::cout << __FILE__ << __FUNCTION__ <<__LINE__ << " " << m_fd << std::endl; +// if (0 > m_fd) { +//// erl_err_quit("erl_connect"); +// return false; +// } +// return true; +// } else { +// erl_close_connection(m_fd); +// m_fd = erl_connect(const_cast<char *>(m_nodeName.c_str())); +// if (0 > m_fd) { +//// erl_err_quit("erl_connect"); +//// std::cout << __FILE__ << __FUNCTION__ <<__LINE__ << " error " << fd << std::endl; +//// ERR("node name is " << m_loop); +// return false; +// } +//// std::cout << __FILE__ << __FUNCTION__ <<__LINE__ << " " << fd << std::endl; +// return true; +// } +// } +// +// /*** +// * 绛夊緟鑺傜偣鍚姩锛岄樆濉� +// * @return +// */ +// bool waitNode() { +// std::cout << "start waitNode" << std::endl; +// int loop = 0; +// while (!m_ret && loop <= 4000) { +// m_ret = ErlangTool::pingNode(m_nodeName, m_cookie); +// if (m_ret) { +//// std::cout << "startNodeDb" << std::endl; +// } else { +//// std::cout << "init failer" << std::endl; +// usleep(1000); +// loop++; +// } +// } +// std::cout << "start waitNode" << std::endl; +// return m_ret; +// } +// +// public: +// +// private: +// //瀛樺偍璺緞 +// std::string m_path; +// std::string m_nodeName; +// std::string m_pName; +// std::string m_cookie; +// +// std::string m_clusterID; +// std::string m_clusterName; +// +// bool m_ret; +// int m_fd; +// +// std::mutex m_mutex; +// }; +// +//} +// +//#endif //UNTITLED_ERLANGTOOL_HPP diff --git a/syncDBTool/ShareMemoryTool.hpp b/syncDBTool/ShareMemoryTool.hpp new file mode 100755 index 0000000..4e7d884 --- /dev/null +++ b/syncDBTool/ShareMemoryTool.hpp @@ -0,0 +1,259 @@ +// +// Created by ps on 8/9/18. +// + +#ifndef SYNCDBTOOL_SHAREMEMORYTOOL_HPP +#define SYNCDBTOOL_SHAREMEMORYTOOL_HPP + + +#include <boost/interprocess/managed_shared_memory.hpp> +#include <boost/interprocess/allocators/allocator.hpp> +#include <boost/interprocess/containers/string.hpp> +#include <boost/interprocess/containers/vector.hpp> +#include <boost/interprocess/containers/map.hpp> +#include <mutex> +#include <iostream> + +//#include "SyncDB.hpp" + +namespace BISTL { + + using boost::interprocess::managed_shared_memory; + using boost::interprocess::shared_memory_object; + using boost::interprocess::create_only; + using boost::interprocess::open_only; + using boost::interprocess::open_read_only; + using boost::interprocess::open_or_create; + using boost::interprocess::open_copy_on_write; + + using boost::interprocess::allocator; + //DataType + using boost::interprocess::basic_string; + using boost::interprocess::vector; + using boost::interprocess::map; + + typedef managed_shared_memory::segment_manager segment_manager_t; + + typedef allocator<void, segment_manager_t> void_allocator; + + //vector<int> + typedef allocator<int, segment_manager_t> int_allocator; + typedef vector<int, int_allocator> int_vector; + + //vector<vector<int>> + typedef allocator<int_vector, segment_manager_t> int_vector_allocator; + typedef vector<int_vector, int_vector_allocator> int_vector_vector; + + //std::string + typedef allocator<char, segment_manager_t> char_allocator; + typedef basic_string<char, std::char_traits<char>, char_allocator> char_string; + + typedef std::lock_guard<std::mutex> LockG; + + /*** + * 鍒涘缓鍏变韩鍐呭瓨 + * @param shm_Name 鍚嶇О + * @param size 澶у皬 + * @param type 绫诲瀷 + * @return managed_shared_memory + */ + static managed_shared_memory + createSHM(std::string &message, std::string shm_Name, std::size_t size = 4096, int type = 1) { + try { + switch (type) { + case 1: + return managed_shared_memory(create_only, shm_Name.c_str(), size * 1024); + case 2: + return managed_shared_memory(open_only, shm_Name.c_str()); + case 3: + return managed_shared_memory(open_read_only, shm_Name.c_str()); + case 4: + return managed_shared_memory(open_or_create, shm_Name.c_str(), size * 1024); + case 5: + return managed_shared_memory(open_copy_on_write, shm_Name.c_str()); + default: + //ERR + message = "type is error "; +// return managed_shared_memory(create_only, shm_Name.c_str(), size); + } + } catch (std::exception ex) { + message = ex.what(); + } +// return ; + } + + //shanchu shm + /*** + * 鍒犻櫎鍏变韩鍐呭瓨 + * @param shm_Name 鍚嶇О + * @return 鐘舵�� + */ + static bool removeSHM(std::string shm_Name) { + return shared_memory_object::remove(shm_Name.c_str()); + } + + struct Feature_Info { + public: + Feature_Info(const char *id, const char *feature, const char *create_by, + const char *create_time, const char *update_time, + const void_allocator &void_alloc) : + m_id(id, void_alloc), m_feature(feature, void_alloc), m_create_by(create_by, void_alloc), + m_create_time(create_time, void_alloc), m_update_time(update_time, void_alloc) {} + + ~Feature_Info() {} + + char_string m_id; + char_string m_feature; + char_string m_create_by; + char_string m_create_time; + char_string m_update_time; + }; + + //vector<Feature_Info> + typedef allocator<Feature_Info, segment_manager_t> Feature_Info_allocator; + typedef vector<Feature_Info, Feature_Info_allocator> Feature_Info_vector; + + //map<string,Feature_Info> + typedef char_string KeyType; + typedef Feature_Info MappedType; + typedef std::pair<const KeyType, MappedType> ValueType; + typedef allocator<ValueType, segment_manager_t> ShmemAllocator; + typedef map<KeyType, MappedType, std::less<char_string>, ShmemAllocator> bi_map_Feature_Info; + + //鏃犵敤 + template<class T> + class BiMapData { + public: + BiMapData(std::string shm_Name, std::size_t size) + : m_shm_Name(shm_Name), m_size(size * 1024), m_segment(open_or_create, m_shm_Name.c_str(), m_size), + m_alloc_inst(m_segment.get_segment_manager()), mymap(nullptr) { + createMap(); + } + + BiMapData(std::string shm_Name) + : m_shm_Name(shm_Name), m_size(10 * 1024), m_segment(open_only, m_shm_Name.c_str()), + m_alloc_inst(m_segment.get_segment_manager()), mymap(nullptr) { + } + + virtual ~BiMapData() { + + } + + const BISTL::void_allocator *getVoid_allocator() { + return &m_alloc_inst; + } + + const T *getMap() { + return mymap; + } + + private: + void createMap() { + mymap = m_segment.find_or_construct<T>(m_shm_Name.c_str())( + std::less<char_string>(), m_alloc_inst); + } + + private: + std::string m_shm_Name; + std::size_t m_size; + managed_shared_memory m_segment; + + void_allocator m_alloc_inst; + + T *mymap; + std::mutex m_mutex; + }; + + + class BiMapFeaData { + public: + /*** + * 鎵撳紑鎴栧垱寤哄叡浜唴瀛� + * @param shm_Name 鍚嶇О + * @param size 澶у皬 + */ + BiMapFeaData(std::string shm_Name, std::size_t size) + : m_shm_Name(shm_Name), m_size(size * 1024), m_segment(open_or_create, m_shm_Name.c_str(), m_size), + m_alloc_inst(m_segment.get_segment_manager()), mymap(nullptr) { + createMap_Feature_Info(); + std::cout << m_segment.get_free_memory() << std::endl; + std::cout << m_shm_Name.c_str() << std::endl; + } + + /*** + * 鎵撳紑鍏变韩鍐呭瓨 + * @param shm_Name 鍚嶇О + */ + BiMapFeaData(std::string shm_Name) + : m_shm_Name(shm_Name), m_size(10 * 1024), m_segment(open_only, m_shm_Name.c_str()), + m_alloc_inst(m_segment.get_segment_manager()), mymap(nullptr) { + createMap_Feature_Info(); + std::cout << m_segment.get_free_memory() << std::endl; + std::cout << m_shm_Name.c_str() << std::endl; + } + + virtual ~BiMapFeaData() { + + } + + /*** + * 鑾峰彇涓�涓兘澶熻浆鎹负浠讳綍allocator<T, segment_manager_t>绫诲瀷鐨刟llocator + * @return + */ + const BISTL::void_allocator *getVoid_allocator() { + return &m_alloc_inst; + } + + /*** + * 杩斿洖map鍦板潃 + * @return + */ + const BISTL::bi_map_Feature_Info *getMap() { + return mymap; + } + + /*** + * 灏佽value鐨勫垵濮嬪寲鎿嶄綔 + * @param id + * @param feature + * @param create_by + * @param create_time + * @param update_time + * @return + */ + bool saveKeyOrValue(std::string id, std::string feature, std::string create_by, std::string create_time, + std::string update_time) { + Feature_Info v(id.c_str(), feature.c_str(), create_by.c_str(), + create_time.c_str(), update_time.c_str(), m_alloc_inst); + char_string key_object(id.c_str(), m_alloc_inst); + LockG lock(m_mutex); + auto item = mymap->insert(ValueType(key_object, v)); + return item.second; + } + + + private: + /*** + * 鍒涘缓鐩稿簲绫诲瀷鐨刴ap + */ + void createMap_Feature_Info() { + mymap = m_segment.find_or_construct<bi_map_Feature_Info>(m_shm_Name.c_str())( + std::less<char_string>(), m_alloc_inst); + } + + + private: + std::string m_shm_Name; + std::size_t m_size; + managed_shared_memory m_segment; + + void_allocator m_alloc_inst; + + bi_map_Feature_Info *mymap; + std::mutex m_mutex; + }; + + +} + +#endif //SYNCDBTOOL_SHAREMEMORYTOOL_HPP diff --git a/syncDBTool/SyncDB.hpp b/syncDBTool/SyncDB.hpp new file mode 100755 index 0000000..82919ca --- /dev/null +++ b/syncDBTool/SyncDB.hpp @@ -0,0 +1,718 @@ +// +// Created by ps on 8/9/18. +// + +#ifndef UNTITLED_SYNCDB_HPP +#define UNTITLED_SYNCDB_HPP + +#include <iostream> +#include <map> +#include <basic/debug/Debug.h> + +namespace SyncDB { + + // Value-Defintions of the different String values + enum Feature_InfoStringValue { + evNotDefined, + id, + feature, + create_by, + create_time, + update_time, + img, + idcard, + evEnd + }; + + // Map to associate the strings with the enum values + typedef std::map<std::string, Feature_InfoStringValue> Map_Fea_InfoString2Values; + static Map_Fea_InfoString2Values map_Fea_InfoString2Values; + + static void Initialize() { + map_Fea_InfoString2Values["id"] = Feature_InfoStringValue::id; + map_Fea_InfoString2Values["feature"] = Feature_InfoStringValue::feature; + map_Fea_InfoString2Values["create_by"] = Feature_InfoStringValue::create_by; + map_Fea_InfoString2Values["create_time"] = Feature_InfoStringValue::create_time; + 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["end"] = evEnd; + } + + // Intialization + static bool ret = (Initialize(), true); + + struct Feature_Info { + public: + Feature_Info() { +// Initialize(); + } + +// ~Feature_Info() { +// for (auto &item:map_Fea_InfoString2Values) { +// map_Fea_InfoString2Values.erase(item.first); +// } +// } + + bool setValue(std::string key, std::string value) { + try { + switch (map_Fea_InfoString2Values[key]) { + case Feature_InfoStringValue::evNotDefined: + //#todo error info + return false; + case Feature_InfoStringValue::id: + id = value; + break; + case Feature_InfoStringValue::feature: + feature = value; + break; + case Feature_InfoStringValue::create_by: + create_by = value; + break; + case Feature_InfoStringValue::create_time: + create_time = value; + break; + case Feature_InfoStringValue::update_time: + update_time = value; + break; + case Feature_InfoStringValue::img: + img = value; + break; + case Feature_InfoStringValue::idcard: + idcard = value; + break; + default: + ERR(key << " is an invalid string. s_mapStringValues now contains " + << map_Fea_InfoString2Values.size() << " entries."); + return false; + } + return true; + } catch (std::exception ex) { + return false; + } + } + + public: + + public: + std::string id; + std::string feature; + std::string create_by; + std::string create_time; + std::string update_time; + std::string img; + std::string idcard; + +// value is a atom: atomSize:19, atomValue:test@192.168.50.216 +// value is a list:2018-08-08 20:17:11 +// value is a atom: atomSize:36, atomValue:ce386825-76f4-42bc-a0e1-cd9484cb7a8c +// value is a list:6eda59e2-d884-5ffb-89d9-84dcffda2ad6 +// value is a list:2018-08-08 20:17:11 + + private: + }; + +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +//---------------------------DEVICE_INFO-------------------------------------- +//---------------------------------------------------------------------------- + +// key:create_by string :za@192.168.50.216 +// key:create_time string :2018-08-12 16:56:08 +// key:del_flag bool :0 +// key:dev_address string :DevAddress +// key:device_name string : +// key:father_node string : +// key:node_id string :za@192.168.50.216 +// key:node_online bool: 1 +// key:update_time string :2018-08-12 16:56:08 +// key:uuid string :19633f6f-acd9-5482-a0c8-74a44a576edf +// Value-Defintions of the different String values + enum Device_InfoStringValue { + dev_evNotDefined, + dev_create_by, + dev_create_time, + dev_del_flag, + dev_cluster_id, + dev_cluster_name, + dev_device_id, + dev_node_id, + dev_node_online, + dev_update_time, + dev_uuid, + dev_evEnd + }; + + // Map to associate the strings with the enum values + typedef std::map<std::string, Device_InfoStringValue> Map_Dev_InfoString2Values; + + static Map_Dev_InfoString2Values map_Dev_InfoString2Values; + + static void DevInitialize() { + //#todo + map_Dev_InfoString2Values["create_by"] = Device_InfoStringValue::dev_create_by; + map_Dev_InfoString2Values["create_time"] = Device_InfoStringValue::dev_create_time; + map_Dev_InfoString2Values["del_flag"] = Device_InfoStringValue::dev_del_flag; + map_Dev_InfoString2Values["cluster_id"] = Device_InfoStringValue::dev_cluster_id; + map_Dev_InfoString2Values["cluster_name"] = Device_InfoStringValue::dev_cluster_name; + map_Dev_InfoString2Values["device_id"] = Device_InfoStringValue::dev_device_id; + map_Dev_InfoString2Values["node_id"] = Device_InfoStringValue::dev_node_id; + map_Dev_InfoString2Values["update_time"] = Device_InfoStringValue::dev_update_time; + map_Dev_InfoString2Values["uuid"] = Device_InfoStringValue::dev_uuid; + map_Dev_InfoString2Values["end"] = Device_InfoStringValue::dev_evEnd; + } + + // Intialization + static bool devRet = (DevInitialize(), true); + + struct Device_Info { + public: + Device_Info() : + create_by(""), create_time(""), del_flag(""), device_id(""), cluster_id(""), cluster_name(""), node_id(""), + update_time(""), + uuid("") { +// Initialize(); + } + + ~Device_Info() { +// for (auto &item:map_Fea_InfoString2Values) { +// map_Fea_InfoString2Values.erase(item.first); +// } + } + + bool setValue(std::string key, std::string value) { + try { + //#todo + int type = map_Dev_InfoString2Values[key]; + switch (type) { + case Device_InfoStringValue::dev_evNotDefined: + //#todo error info + return false; + case Device_InfoStringValue::dev_create_by: + create_by = value; + break; + case Device_InfoStringValue::dev_create_time: + create_time = value; + break; + case Device_InfoStringValue::dev_del_flag: + del_flag = value; + break; + case Device_InfoStringValue::dev_cluster_id: + cluster_id = value; + break; + case Device_InfoStringValue::dev_cluster_name: + cluster_name = value; + break; + case Device_InfoStringValue::dev_device_id: + device_id = value; + break; + case Device_InfoStringValue::dev_node_id: + node_id = value; + break; + case Device_InfoStringValue::dev_update_time: + update_time = value; + break; + case Device_InfoStringValue::dev_uuid: + uuid = value; + break; + default: + ERR(key << " is an invalid string. s_mapStringValues now contains " + << map_Fea_InfoString2Values.size() << " entries."); + return false; + } + return true; + } catch (std::exception ex) { + return false; + } + } + + public: + + public: + std::string create_by; + std::string create_time; + std::string del_flag; + std::string device_id; + std::string cluster_id; + std::string cluster_name; + std::string node_id; + std::string update_time; + std::string uuid; + + private: + }; + + +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +//---------------------------Table_INFO-------------------------------------- +//---------------------------------------------------------------------------- + + +//{"create_by",'za@192.168.50.216'}, +//{"create_time","2018-08-13 10:14:39"}, +//{"del_flag","0"}, +//{"tableDesc",test}, +//{"tableName",aaa1}, +//{"tableType",person}, +//{"update_time","2018-08-13 10:14:39"}, +//{"uuid","b1c19f77-623b-5294-9b65-9a766af1f77d"} +// Value-Defintions of the different String values + enum Table_InfoStringValue { + tab_evNotDefined, + tab_create_by, + tab_create_time, + tab_del_flag, + tab_tableDesc, + tab_tableName, + tab_tableType, + tab_bwType, + tab_update_time, + tab_uuid, + tab_startTime, + tab_endTime, + tab_evEnd + }; + + // Map to associate the strings with the enum values + typedef std::map<std::string, Table_InfoStringValue> Map_Tab_InfoString2Values; + static Map_Tab_InfoString2Values map_Tab_InfoString2Values; + + static void TabInitialize() { + map_Tab_InfoString2Values["create_by"] = Table_InfoStringValue::tab_create_by; + map_Tab_InfoString2Values["create_time"] = Table_InfoStringValue::tab_create_time; + map_Tab_InfoString2Values["del_flag"] = Table_InfoStringValue::tab_del_flag; + map_Tab_InfoString2Values["tableDesc"] = Table_InfoStringValue::tab_tableDesc; + map_Tab_InfoString2Values["tableName"] = Table_InfoStringValue::tab_tableName; + map_Tab_InfoString2Values["tableType"] = Table_InfoStringValue::tab_tableType; + map_Tab_InfoString2Values["bwType"] = Table_InfoStringValue::tab_bwType; + map_Tab_InfoString2Values["update_time"] = Table_InfoStringValue::tab_update_time; + map_Tab_InfoString2Values["uuid"] = Table_InfoStringValue::tab_uuid; + map_Tab_InfoString2Values["startTime"] = Table_InfoStringValue::tab_startTime; + map_Tab_InfoString2Values["endTime"] = Table_InfoStringValue::tab_endTime; + map_Tab_InfoString2Values["end"] = Table_InfoStringValue::tab_evEnd; + } + + // Intialization + static bool tabRet = (TabInitialize(), true); + + struct Table_Info { + public: + Table_Info() : + create_by(""), create_time(""), del_flag(""), tableDesc(""), tableName(""), tableType(""), + update_time(""), uuid(""), bwType(""), startTime(""), endTime("") { +// Initialize(); + } + + ~Table_Info() { +// for (auto &item:map_Fea_InfoString2Values) { +// map_Fea_InfoString2Values.erase(item.first); +// } + } + + bool setValue(std::string key, std::string value) { + try { + //#todo + int type = map_Tab_InfoString2Values[key]; + switch (type) { + case Table_InfoStringValue::tab_evNotDefined: + //#todo error info + return false; + case Table_InfoStringValue::tab_create_by: + create_by = value; + break; + case Table_InfoStringValue::tab_create_time: + create_time = value; + break; + case Table_InfoStringValue::tab_del_flag: + del_flag = value; + break; + case Table_InfoStringValue::tab_tableDesc: + tableDesc = value; + break; + case Table_InfoStringValue::tab_tableName: + tableName = value; + break; + case Table_InfoStringValue::tab_tableType: + tableType = value; + break; + case Table_InfoStringValue::tab_bwType: + bwType = value; + break; + case Table_InfoStringValue::tab_uuid: + uuid = value; + break; + case Table_InfoStringValue::tab_update_time: + update_time = value; + break; + case Table_InfoStringValue::tab_startTime: + startTime = value; + break; + case Table_InfoStringValue::tab_endTime: + endTime = value; + break; + default: + ERR(key << " is an invalid string. s_mapStringValues now contains " + << map_Fea_InfoString2Values.size() << " entries."); + return false; + } + return true; + } catch (std::exception ex) { + return false; + } + } + + public: + + public: + std::string create_by; + std::string create_time; + std::string del_flag; + std::string tableDesc; + std::string tableName; + std::string tableType; + std::string update_time; + std::string uuid; + std::string bwType; + std::string startTime; + std::string endTime; + + private: + }; + + +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +//---------------------------Bw_INFO-------------------------------------- +//---------------------------------------------------------------------------- + + +//{"bwType",'0'}, +//{"create_by",'za@192.168.50.216'}, +//{"create_time","2018-08-13 10:14:39"}, +//{"tableName",aaa1}, +//{"update_time","2018-08-13 10:14:39"}, +//{"uuid","e0eb30e9-f595-5651-8895-6f07f3851fcf"} +// Value-Defintions of the different String values + enum Bw_InfoStringValue { + bw_evNotDefined, + bw_bwType, + bw_create_by, + bw_create_time, + bw_tableName, + bw_update_time, + bw_uuid, + bw_evEnd + }; + + // Map to associate the strings with the enum values + typedef std::map<std::string, Bw_InfoStringValue> Map_Bw_InfoString2Values; + static Map_Bw_InfoString2Values map_Bw_InfoString2Values; + + static void BwInitialize() { + map_Bw_InfoString2Values["bwType"] = bw_bwType; + map_Bw_InfoString2Values["create_by"] = bw_create_by; + map_Bw_InfoString2Values["create_time"] = bw_create_time; + map_Bw_InfoString2Values["tableName"] = bw_tableName; + map_Bw_InfoString2Values["update_time"] = bw_update_time; + map_Bw_InfoString2Values["uuid"] = bw_uuid; + map_Bw_InfoString2Values["end"] = bw_evEnd; + } + + // Intialization + static bool bwRet = (BwInitialize(), true); + + struct Bw_Info { + public: + Bw_Info() : + bwType(""), create_by(""), create_time(""), tableName(""), update_time(""), + uuid("") { +// Initialize(); + } + + ~Bw_Info() { +// for (auto &item:map_Fea_InfoString2Values) { +// map_Fea_InfoString2Values.erase(item.first); +// } + } + + bool setValue(std::string key, std::string value) { + try { + //#todo + int type = map_Bw_InfoString2Values[key]; + switch (type) { + case bw_evNotDefined: + //#todo error info + return false; + case bw_bwType: + bwType = value; + break; + case bw_create_by: + create_by = value; + break; + case bw_create_time: + create_time = value; + break; + case bw_tableName: + tableName = value; + break; + case bw_uuid: + uuid = value; + break; + case bw_update_time: + update_time = value; + break; + default: + ERR(key << " is an invalid string. s_mapStringValues now contains " + << map_Fea_InfoString2Values.size() << " entries."); + return false; + } + return true; + } catch (std::exception ex) { + return false; + } + } + + public: + + public: + std::string create_by; + std::string create_time; + std::string bwType; + std::string tableName; + std::string update_time; + std::string uuid; + + private: + }; + + + struct AddPersonInfo { + std::string personid; + std::string idcard; + std::string personPic; + std::string feature; + }; + + enum AddPersRetStringValue { + ap_evNotDefined, + ap_PersonId, + ap_Result, + ap_msg, + ap_evEnd + }; + + // Map to associate the strings with the enum values + typedef std::map<std::string, AddPersRetStringValue> Map_AddPersRetString2Values; + static Map_AddPersRetString2Values map_AddPersRetString2Values; + + static void AddRetInitialize() { + map_AddPersRetString2Values["PersonId"] = ap_PersonId; + map_AddPersRetString2Values["Result"] = ap_Result; + map_AddPersRetString2Values["msg"] = ap_msg; + map_AddPersRetString2Values["end"] = ap_evEnd; + } + + // Intialization + static bool addPerRet = (AddRetInitialize(), true); + + struct AddPersRet { + public: + AddPersRet() : + PersonId(""), Result(""), msg("") { +// Initialize(); + } + + ~AddPersRet() { + } + + bool setValue(std::string key, std::string value) { + try { + //#todo + int type = map_AddPersRetString2Values[key]; + switch (type) { + case ap_evNotDefined: + //#todo error info + return false; + case ap_PersonId: + PersonId = value; + break; + case ap_Result: + Result = value; + break; + case ap_msg: + msg = value; + break; + default: + ERR(key << " is an invalid string. s_mapStringValues now contains " + << map_AddPersRetString2Values.size() << " entries."); + return false; + } + return true; + } catch (std::exception ex) { + return false; + } + } + + public: + + public: + std::string PersonId; + std::string Result; + std::string msg; + + private: + }; + + + enum PerExistRetStringValue { + pe_evNotDefined, + pe_tableName, + pe_tableUuid, + pe_uuid, + pe_evEnd + }; + + // Map to associate the strings with the enum values + typedef std::map<std::string, PerExistRetStringValue> Map_PerExistRetString2Values; + static Map_PerExistRetString2Values map_PerExistRetString2Values; + + static void PerExistRetInitialize() { + map_PerExistRetString2Values["tableName"] = pe_tableName; + map_PerExistRetString2Values["tableUuid"] = pe_tableUuid; + map_PerExistRetString2Values["uuid"] = pe_uuid; + map_PerExistRetString2Values["end"] = pe_evEnd; + } + + // Intialization + static bool perExistsRet = (PerExistRetInitialize(), true); + + struct PerExistRet { + public: + PerExistRet() : + tableName(""), uuid(""), tableUuid("") { +// Initialize(); + } + + ~PerExistRet() { + } + + bool setValue(std::string key, std::string value) { + try { + //#todo + int type = map_PerExistRetString2Values[key]; + switch (type) { + case pe_evNotDefined: + //#todo error info + return false; + case pe_tableName: + tableName = value; + break; + case pe_tableUuid: + tableUuid = value; + break; + case pe_uuid: + uuid = value; + break; + default: + ERR(key << " is an invalid string. s_mapStringValues now contains " + << map_PerExistRetString2Values.size() << " entries."); + return false; + } + return true; + } catch (std::exception ex) { + return false; + } + } + + public: + + public: + std::string tableName; + std::string tableUuid; + std::string uuid; + + private: + }; + + + enum UpdPersRetStringValue { + up_evNotDefined, + up_tableName, + up_tableUuid, + up_result, + up_oldId, + up_evEnd + }; + + // Map to associate the strings with the enum values + typedef std::map<std::string, UpdPersRetStringValue> Map_UpdPersRetStringValue; + static Map_UpdPersRetStringValue map_UpdPersRetStringValue; + + static void UpdPersRetInitialize() { + map_UpdPersRetStringValue["tableName"] = up_tableName; + map_UpdPersRetStringValue["tableUuid"] = up_tableUuid; + map_UpdPersRetStringValue["result"] = up_result; + map_UpdPersRetStringValue["oldId"] = up_oldId; + map_UpdPersRetStringValue["end"] = up_evEnd; + } + + // Intialization + static bool updPerRet = (UpdPersRetInitialize(), true); + + struct UpdPersRet { + public: + UpdPersRet() : + tableName(""), result(""), oldId(""), tableUuid("") { +// Initialize(); + } + + ~UpdPersRet() { + } + + bool setValue(std::string key, std::string value) { + try { + //#todo + int type = map_UpdPersRetStringValue[key]; + switch (type) { + case up_evNotDefined: + //#todo error info + return false; + case up_tableName: + tableName = value; + break; + case up_tableUuid: + tableUuid = value; + break; + case up_result: + result = value; + break; + case up_oldId: + oldId = value; + break; + default: + ERR(key << " is an invalid string. s_mapStringValues now contains " + << map_UpdPersRetStringValue.size() << " entries."); + return false; + } + return true; + } catch (std::exception ex) { + return false; + } + } + + public: + + public: + std::string tableName; + std::string tableUuid; + std::string result; + std::string oldId; + + private: + }; + + +} + +#endif //UNTITLED_SYNCDB_HPP diff --git a/syncDBTool/cnode.cpp b/syncDBTool/cnode.cpp new file mode 100755 index 0000000..fdf007f --- /dev/null +++ b/syncDBTool/cnode.cpp @@ -0,0 +1,210 @@ +// +// Created by ps on 18-11-27. +// + +#include <stdio.h> +#include <sys/types.h> +#include <cstring> +#include <arpa/inet.h> +#include <iostream> +#include <zconf.h> +#include <thread> + +#ifdef _WIN32 +# define __WIN32__ +# include <WinSock2.h> +# pragma comment(lib, "ws2_32.lib") +# pragma comment(lib, "ei_md.lib") +# pragma comment(lib, "erl_interface_md.lib") +# pragma comment(linker, "/NODEFAULTLIB:MSVCRTD.LIB") +#endif + +#include "erl_interface.h" +#include "ei.h" + +#define BUFSIZE 1000 +#define PORT 13001 + +int foo(int x) { + return x + 1; +} + +int bar(int y) { + return y * 2; +} + +int my_listen(int port); + +int main(int argc, char **argv) { + struct in_addr addr; /* 32-bit IP number of host */ + int port; /* Listen port number */ + int listen; /* Listen socket */ + int fd; /* fd to Erlang node */ + ErlConnect conn; /* Connection data */ + + int loop = 1; /* Loop flag */ + int got; /* Result of receive */ + unsigned char buf[BUFSIZE]; /* Buffer for incoming message */ + ErlMessage emsg; /* Incoming message */ + + ETERM *fromp, *tuplep, *fnp, *argp, *resp; + int res; + +#ifdef _WIN32 + //鍒濆鍖杦insock鏈嶅姟 + WSADATA wsaData; + WSAStartup(MAKEWORD(2,2), &wsaData); +#endif + + port = PORT; + + erl_init(NULL, 0); + + addr.s_addr = inet_addr("127.0.0.1"); + if (erl_connect_xinit("test", "c1", "c1@127.0.0.1", + &addr, "1234", 0) == -1) + erl_err_quit("erl_connect_xinit"); + + if (erl_connect_xinit("test2", "c2", "c2@127.0.0.1", + &addr, "1234", 0) == -1) + erl_err_quit("erl_connect_xinit2"); + + std::thread th1([&] { + + /* Make a listen socket */ + if ((listen = my_listen(port)) <= 0) + erl_err_quit("my_listen"); + + if (erl_publish(port) == -1) + erl_err_quit("erl_publish"); + + if ((fd = erl_accept(listen, &conn)) == ERL_ERROR) + erl_err_quit("erl_accept"); + fprintf(stderr, "Connected to %s,,,%d\n\r", conn.nodename, fd); + + while (loop) { +// std::cout << "hello world" << std::endl; + got = erl_receive_msg(fd, buf, BUFSIZE, &emsg); + if (got == ERL_TICK) { + /* ignore */ + } else if (got == ERL_ERROR) { + if ((fd = erl_accept(listen, &conn)) == ERL_ERROR) + erl_err_quit("erl_accept"); + fprintf(stderr, "Connected to %s,,,%d\n\r", conn.nodename, fd); + } else { + + if (emsg.type == ERL_REG_SEND) { + fromp = erl_element(2, emsg.msg); + tuplep = erl_element(3, emsg.msg); + fnp = erl_element(1, tuplep); + argp = erl_element(2, tuplep); + + if (strncmp(ERL_ATOM_PTR(fnp), "foo", 3) == 0) { + res = foo(ERL_INT_VALUE(argp)); + std::cout << "foo is " << res << std::endl; + } else if (strncmp(ERL_ATOM_PTR(fnp), "bar", 3) == 0) { + res = bar(ERL_INT_VALUE(argp)); + std::cout << "bar is " << res << std::endl; + } + + std::cout << "message is " << ERL_ATOM_PTR(fnp) << std::endl; + + resp = erl_format("{c1, {res,~i}}", res); + erl_send(fd, fromp, resp); + + erl_free_term(emsg.from); + erl_free_term(emsg.msg); + erl_free_term(fromp); + erl_free_term(tuplep); + erl_free_term(fnp); + erl_free_term(argp); + erl_free_term(resp); + } + } + + } + }); + +// std::thread th2([&] { +// +// /* Make a listen socket */ +// if ((listen = my_listen(8011)) <= 0) +// erl_err_quit("my_listen 2"); +// +// if (erl_publish(8011) == -1) +// erl_err_quit("erl_publish 2"); +// +// if ((fd = erl_accept(listen, &conn)) == ERL_ERROR) +// erl_err_quit("erl_accept 2"); +// fprintf(stderr, "Connected to %s\n\r", conn.nodename); +// +// while (loop) { +//// std::cout << "hello world" << std::endl; +// got = erl_receive_msg(fd, buf, BUFSIZE, &emsg); +// if (got == ERL_TICK) { +// /* ignore */ +// } else if (got == ERL_ERROR) { +// usleep(100); +//// loop = 0; +// } else { +// +// if (emsg.type == ERL_REG_SEND) { +// fromp = erl_element(2, emsg.msg); +// tuplep = erl_element(3, emsg.msg); +// fnp = erl_element(1, tuplep); +// argp = erl_element(2, tuplep); +// +// if (strncmp(ERL_ATOM_PTR(fnp), "foo", 3) == 0) { +// res = foo(ERL_INT_VALUE(argp)); +// std::cout << "foo is " << res << std::endl; +// } else if (strncmp(ERL_ATOM_PTR(fnp), "bar", 3) == 0) { +// res = bar(ERL_INT_VALUE(argp)); +// std::cout << "bar is " << res << std::endl; +// } +// +// std::cout << "message is " << ERL_ATOM_PTR(fnp) << std::endl; +// +// resp = erl_format("{c1, {res,~i}}", res); +// erl_send(fd, fromp, resp); +// +// erl_free_term(emsg.from); +// erl_free_term(emsg.msg); +// erl_free_term(fromp); +// erl_free_term(tuplep); +// erl_free_term(fnp); +// erl_free_term(argp); +// erl_free_term(resp); +// } +// } +// +// } +// }); + + th1.detach(); +// th2.detach(); + + getchar(); +} + + +int my_listen(int port) { + int listen_fd; + struct sockaddr_in addr; + int on = 1; + + if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) + return (-1); + + setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); + + memset((void *) &addr, 0, (size_t) sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + addr.sin_addr.s_addr = htonl(INADDR_ANY); + + if (bind(listen_fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) + return (-1); + + listen(listen_fd, 5); + return listen_fd; +} \ No newline at end of file diff --git a/syncDBTool/main.cpp b/syncDBTool/main.cpp new file mode 100755 index 0000000..8821f25 --- /dev/null +++ b/syncDBTool/main.cpp @@ -0,0 +1,265 @@ +#include <iostream> +#include <unistd.h> +#include <sys/time.h> +#include <uuid/uuid.h> +#include <vector> +#include <boost/interprocess/shared_memory_object.hpp> +#include <boost/interprocess/mapped_region.hpp> + +#include "ErlangDbTool.h" +#include "ShareMemoryTool.hpp" + +using namespace std; + +//#erl -name b@192.168.1.164 -setcookie abc -mnesia dir '"/home/firefly/erlang"' -detached -noshell +int main(int argc, char **argv) { + ENABLEGLOG(GET_STR_CONFIG("logPath").c_str()); + std::cout << "Hello, World!" << std::endl; + + std::string path = "/opt/erlang/main/"; + std::string nodeName = "main@192.168.1.124"; + std::string cookie = "abc"; + ErlangTool::ErlangDbTool *erlangDbTool; + auto erlNode = appConfig.getStringProperty("erlNode"); + auto erlCookie = appConfig.getStringProperty("erlCookie"); + auto erlPath = appConfig.getStringProperty("erlPath"); + auto erlFatherNode = appConfig.getStringProperty("erlFatherNode"); + if (erlNode.size() > 0 && erlCookie.size() > 0) { + string str_tmp = "DataWebserver"; + erlangDbTool = new ErlangTool::ErlangDbTool(erlPath, erlNode, erlCookie, str_tmp); + if (erlangDbTool->initErlang() == 1) { + erlangDbTool->startNodeDb(erlFatherNode); + } else { + DBG("not is startNodeDb"); + } + } + + +// ErlangTool::ErlangDbTool erlangDbTool(path, nodeName, cookie); +// +// +// +// bool ret = erlangDbTool->initErlang(); + + /** + * chushihua jiedian jiaru jiqun + */ +// erlangDbTool->startNodeDb(" ", " "); +// erlangDbTool->startNodeDb("za@192.168.50.216", " "); +//---------end-------------- + + + +// erlangDbTool->removeNode(); +// auto devCache = erlangDbTool->findAllNode(); +// INFO(devCache.size()); +// for (auto &item:devCache) { +// DBG(item.first); +// } + +//erlangDbTool->test(); + /*** + * chuanjian shuju ku + */ +// ret = erlangDbTool->createDatabase("person", "aaa1", true, "0"); +// ret = erlangDbTool->createDatabase("person", "aaa2", true, "1"); +// ret = erlangDbTool->createDatabase("car", "bbb1", false, "0"); +// ret = erlangDbTool->createDatabase("car", "aaa4", true, "0"); +// erlangDbTool->createDatabase("car","sycarYa32",false,"0"); +// erlangDbTool->createDatabase("car","syperYa1",true,"1"); +// erlangDbTool->createDatabase("person","syperYa2",false,"0"); +//---------end-------------- + +// auto dbCache = erlangDbTool->findAllDatabase(); +// auto bwCache = erlangDbTool->findAllTypeInfo(); +// +// for (auto &item : dbCache) { +// INFO(item.first << " " << item.second.uuid); +// } + +// return 0; + /*** + * add Feature + */ +// for (int i = 0; i < 100; i++) { +// +// uuid_t uu; +// char str[36]; +// uuid_generate(uu); +// uuid_unparse(uu, str); +// +// string uuid; +// string str2(str); +//// str2.append(str); +// str2.append(str2).append(str2).append(str2).append(str2).append(str2); +// auto size = str2.size(); +// +// +// +//// struct timeval t1, t2; +//// gettimeofday(&t1, NULL); +// +// ret = erlangDbTool->addPerson(uuid, "aaa1", move(str2)); +//// cout << i << " ret " << ret << " size " << size << " uuid " << uuid << endl; +// +//// gettimeofday(&t2, NULL); +////// 閭d箞鍑芥暟f杩愯鎵�鑺辩殑鏃堕棿涓� +//// auto deltaT = (t2.tv_sec - t1.tv_sec) * 1000000 + t2.tv_usec - t1.tv_usec; +//// std::cout << __FILE__ << __LINE__ << " deltaT " << deltaT << std::endl; +// +// } +//---------end-------------- + +// return 0; + + + + std::vector<SyncDB::AddPersonInfo> tmpPer; + SyncDB::AddPersonInfo addPersonInfo; + addPersonInfo.feature = "testFea22"; + addPersonInfo.personPic = "testPic33"; + addPersonInfo.idcard = "testidcard44"; + for (int i = 0; i < 3; ++i) { + addPersonInfo.personid = std::to_string(i * 2); + tmpPer.push_back(addPersonInfo); + } +// auto resaddPersons = erlangDbTool->addPersons("077b251e-8698-5852-be8c-8c2d8334a162", tmpPer); + + auto resUpdPersRet = erlangDbTool->singlePersonUpdate("12", "11", "testUpCardid", "testUpPic", "testUpFea"); + +// auto resPerEit = erlangDbTool->personIsExistOnClu("1"); + + + /*** + * jiazai renlian + */ + struct timeval t1, t2; + gettimeofday(&t1, NULL); + + /*** + * load fea + */ + auto cache = erlangDbTool->loadFaceFeaData2("娴嬭瘯涓枃12553"); + + for (auto &item : cache) { + DBG(item.first); + } + + gettimeofday(&t2, NULL); + //閭d箞鍑芥暟f杩愯鎵�鑺辩殑鏃堕棿涓� + auto deltaT = (t2.tv_sec - t1.tv_sec) * 1000000 + t2.tv_usec - t1.tv_usec; + std::cout << __FILE__ << __LINE__ << " deltaT " << deltaT << "us size is " << cache.size() << std::endl; + + + + + +// auto size = sizeof(cache[0]) * cache.size(); +// +// try { +// +// BISTL::shared_memory_object::remove("aaa8"); +// +// BISTL::BiMapFeaData biMapFeaData("aaa8", size); +// +// for (auto &item :cache) { +// biMapFeaData.saveKeyOrValue(item.second.id.c_str(), item.second.feature.c_str(), +// item.second.create_by.c_str(), +// item.second.create_time.c_str(), item.second.update_time.c_str()); +// } +// +// auto mymap = biMapFeaData.getMap(); +// for (auto it = mymap->begin(); it != mymap->end(); it++) { +// std::cout << "feature " << it->second.m_feature << std::endl; +// } +// printf("\n"); +// +// } +// catch (const std::exception &e) { +// printf("Exception:%s\n", e.what()); +// BISTL::shared_memory_object::remove("aaa8"); +// } +// printf("getchar\n"); + getchar(); +//--------end----------- + +// erlangDbTool->deleteDatabase("person","aaa9", true); + + +// struct timeval t1, t2; +// gettimeofday(&t1, NULL); + +// gettimeofday(&t2, NULL); +// //閭d箞鍑芥暟f杩愯鎵�鑺辩殑鏃堕棿涓� +// auto deltaT = (t2.tv_sec-t1.tv_sec) * 1000000 + t2.tv_usec-t1.tv_usec; +// std::cout << __FILE__ << __LINE__ << " deltaT " << deltaT << std::endl; + + + + + return 0; +} + + +int main3() { + +// char cc = '1'; +// for (int i = 0; i < 100; i++) { +// cc++; +// printf("%c \n", cc); +// } + + + uuid_t uu; + char str[36]; + uuid_generate(uu); + uuid_unparse(uu, str); + + string uuid; + string str2(str); +// str2.append(str); + str2.append(str2).append(str2).append(str2).append(str2).append(str2).append(str2).append(str2).append(str2).append( + str2).append(str2).append(str2).append(str2).append(str2).append(str2); + auto size = str2.size(); + + try { + + BISTL::shared_memory_object::remove("SharedMemory"); + // init + BISTL::managed_shared_memory segment(BISTL::create_only, "SharedMemory", 65536); + + const BISTL::void_allocator alloc_inst(segment.get_segment_manager()); + + BISTL::bi_map_Feature_Info *mymap = + segment.construct<BISTL::bi_map_Feature_Info>("MyMap")(std::less<BISTL::char_string>(), alloc_inst); + + + for (int i = 0; i < 100; ++i) { + char tmp[16] = ""; + sprintf(tmp, "test%d", i); + BISTL::char_string key_object(tmp, alloc_inst); + BISTL::Feature_Info v(tmp, "feature", "create_by", "create_time", "update_time", alloc_inst); +// v.id = key_object; +// v.feature = key_object; + BISTL::ValueType value(key_object, v); + mymap->insert(value); + } + + for (BISTL::bi_map_Feature_Info::iterator it = mymap->begin(); it != mymap->end(); it++) { + + std::cout << it->second.m_id << std::endl; + std::cout << it->second.m_feature << std::endl; +// it->second.id; + } + printf("\n"); + +// BISTL::shared_memory_object::remove("SharedMemory"); + } + catch (const std::exception &e) { + printf("Exception:%s\n", e.what()); + BISTL::shared_memory_object::remove("SharedMemory"); + } + printf("getchar\n"); + getchar(); + return 0; +} \ No newline at end of file diff --git a/syncDBTool/main2.cpp b/syncDBTool/main2.cpp new file mode 100755 index 0000000..89b29d5 --- /dev/null +++ b/syncDBTool/main2.cpp @@ -0,0 +1,145 @@ +#include <iostream> +#include <unistd.h> +#include <sys/time.h> +#include <vector> +#include <boost/interprocess/shared_memory_object.hpp> +#include <boost/interprocess/mapped_region.hpp> + +#include <jsoncpp/json/json.h> +#include <thread> + +#include "ErlangDbTool.h" +#include "ShareMemoryTool.hpp" + +using namespace std; + +//#erl -name b@192.168.1.164 -setcookie abc -mnesia dir '"/home/firefly/erlang"' -detached -noshell +int main(int argc, char **argv) { + ENABLEGLOG(GET_STR_CONFIG("logPath").c_str()); + std::cout << "Hello, World!" << std::endl; + + + + + + +// string str_json(argv[1]); +//0096ee77-1f50-48e2-a08a-42536a754970@192.168.1.124 +// string str_json = "{\"path\":\"/opt/erlang/0096ee77-1f50-48e2-a08a-42536a754970/\"," +// "\"nodeName\":\"0096ee77-1f50-48e2-a08a-42536a754970@192.168.1.124\",\"cookie\":\"1234\"," +// "\"tableName\":\"test\"}"; + + string str_json = "{\"personList\":[{\"idcard\":\"www\",\"name\":\"www\",\"personId\":\"1532\",\"feature\":\"13dasd\"}," + "{\"idcard\":\"133310998877665544\",\"name\":\"娴嬭瘯鏁欏笀-涓夌彮鐝富浠籠",\"personId\":\"1533\"," + "\"feature\":\"13dasd\"}],\"uuid\":\"16011ab6-c966-5114-afa5-569c91f866c3\"}"; + + Json::Value t_json; + Json::Reader reader; + + if (!reader.parse(str_json, t_json)) { + return -1; + } + string TableUuid = t_json["uuid"].asString(); + auto perlists = t_json["personList"]; + + int lsize = perlists.size(); + for (int i = 0; i < lsize; ++i) { +// perlists[0] + } + for (auto &item : perlists) { + item["idcard"].asString(); + item["personId"].asString(); + item["feature"].asString(); + int i = 0; + } + + + return 0; + + + std::string path = t_json["path"].asString();//"/opt/erlang/za/"; + std::string nodeName = t_json["nodeName"].asString();//"za@192.168.188.128"; + std::string cookie = t_json["cookie"].asString();//"abc"; + std::string tableName = t_json["tableName"].asString(); + + + ErlangTool::ErlangDbTool erlangDbTool(nodeName, cookie, "test"); + + +// bool ret = erlangDbTool.initErlang(); + ErlangTool::map_FaceDataCache cache; + + std::thread thread1([&] { + while (1) { + /*** + * jiazai renlian + */ + struct timeval t1, t2; + gettimeofday(&t1, NULL); + + /*** + * load fea + */ + cache = erlangDbTool.loadFaceFeaData(tableName); + + gettimeofday(&t2, NULL); + //閭d箞鍑芥暟f杩愯鎵�鑺辩殑鏃堕棿涓� + auto deltaT = (t2.tv_sec - t1.tv_sec) * 1000000 + t2.tv_usec - t1.tv_usec; + std::cout << __FILE__ << __LINE__ << " deltaT " << deltaT << "us size is " << cache.size() << std::endl; + + } + }); + + std::thread thread2([&] { + while (1) { + /*** + * jiazai renlian + */ + struct timeval t1, t2; + gettimeofday(&t1, NULL); + + /*** + * load fea + */ + auto cache2 = erlangDbTool.findAllNode(); + + gettimeofday(&t2, NULL); + //閭d箞鍑芥暟f杩愯鎵�鑺辩殑鏃堕棿涓� + auto deltaT = (t2.tv_sec - t1.tv_sec) * 1000000 + t2.tv_usec - t1.tv_usec; + std::cout << __FILE__ << __LINE__ << " deltaT " << deltaT << "us size is " << cache2.size() << std::endl; + + } + }); + + + auto size = sizeof(cache[0]) * cache.size(); + + try { + + BISTL::shared_memory_object::remove(tableName.c_str()); + + BISTL::BiMapFeaData biMapFeaData(tableName, size); + + for (auto &item :cache) { + biMapFeaData.saveKeyOrValue(item.second.id.c_str(), item.second.feature.c_str(), + item.second.create_by.c_str(), + item.second.create_time.c_str(), item.second.update_time.c_str()); + } + +// auto mymap = biMapFeaData.getMap(); +// for (auto it = mymap->begin(); it != mymap->end(); it++) { +// std::cout << "feature " << it->second.m_feature << std::endl; +// } + printf("\n"); + + } + catch (const std::exception &e) { + printf("Exception:%s\n", e.what()); + BISTL::shared_memory_object::remove(tableName.c_str()); + } + printf("getchar\n"); + getchar(); + + + return 0; +} -- Gitblit v1.8.0