📄 mng_server.cpp.svn-base
字号:
BEGIN_DB() std::ostringstream keyholder_type; keyholder_type << "SELECT KHTypeID FROM KeyHolderTypeZone WHERE KHTypeID="<< HT <<" AND RoomID=" << RoomNo; mysqlpp::StoreQueryResult res = qr.store(keyholder_type.str().c_str()); TRANSACTION_BEGIN(*conn); { std::ostringstream key_req; key_req << "INSERT INTO KeycardReq (ReqType, KCID, ReqText, ReqDate, EmpID, ParentReqID) VALUES (1, " << KC_ID <<", '"<< req << "', '" << get_date_time <<"', "<< empID <<", 0);"; qr.execute(key_req.str().c_str()); } mysqlpp::StoreQueryResult res_maxID = qr.store("SELECT MAX(ReqID) FROM KeycardReq WHERE ReqType=1"); int reqID = 0; if(res_maxID.num_rows() > 0) { reqID = res_maxID[0][0]; } if(res.num_rows() > 0) { { std::ostringstream query; query << "UPDATE KeyHolderTypeZone SET IsUnlock='"<< FU <<"', IsPower='" << FP << "' WHERE KHTypeID=" << HT << " AND RoomID=" << RoomNo; qr.execute(query.str().c_str()); } { std::ostringstream query; query << "UPDATE Keycard INNER JOIN KeycardRoom ON Keycard.KeyID = KeycardRoom.KeyID SET KeycardRoom.IsUnlock='"<< FU <<"', KeycardRoom.IsPower='" << FP <<"' WHERE (Keycard.KHTypeID=" << HT <<") AND (KeycardRoom.RoomID="<< RoomNo<< ") AND (Keycard.KHRoomID<>" << RoomNo << ")"; qr.execute(query.str().c_str()); } { std::ostringstream query; query << "UPDATE Keycard INNER JOIN KeycardRoomLog ON Keycard.KeyID = KeycardRoomLog.KeyID SET KeycardRoomLog.EndReqID=" << reqID <<", KeycardRoomLog.End='"<< get_date_time <<"' WHERE (Keycard.KHTypeID="<< HT << ") AND (KeycardRoomLog.RoomID=" << RoomNo << ") AND (Keycard.KHRoomID<>"<< RoomNo <<") AND (KeycardRoomLog.EndReqID=0)"; qr.execute(query.str().c_str()); } { std::ostringstream query; query << "INSERT INTO KeycardRoomLog (KeyID, RoomID, Begin, BeginReqID, IsUnlock, IsPower) SELECT Keycard.KeyID, "<< RoomNo <<", '"<< get_date_time <<"', "<< reqID <<", '" << FU << "', '" << FP << "' FROM Keycard WHERE (Keycard.KHTypeID=" << HT <<") AND (Keycard.KHRoomID<>" << RoomNo << ")"; qr.execute(query.str().c_str()); } } else { { std::ostringstream query; query << "INSERT INTO KeyHolderTypeZone (KHTypeID, RoomID, IsUnlock, IsPower) VALUES (" << HT <<", " << RoomNo <<", '" << FU <<"', '" << FP << "')"; qr.execute(query.str().c_str()); } { std::ostringstream query; query << "INSERT INTO KeycardRoom (KeyID, RoomID, Begin, BeginReqID, IsUnlock, IsPower) SELECT Keycard.KeyID, "<<RoomNo<<", '"<<get_date_time<<"', "<<reqID<<", '"<<FU<<"', '"<<FP<<"' FROM Keycard WHERE (Keycard.KHTypeID="<<HT<<") AND (Keycard.KHRoomID<>"<<RoomNo<<")"; qr.execute(query.str().c_str()); } { std::ostringstream query; query << "INSERT INTO KeycardRoomLog (KeyID, RoomID, Begin, BeginReqID, IsUnlock, IsPower) SELECT Keycard.KeyID, "<<RoomNo<<", '"<<get_date_time<<"', "<<reqID<<", '"<<FU<<"', '"<<FP<<"' FROM Keycard WHERE (Keycard.KHTypeID="<<HT<<") AND (Keycard.KHRoomID<>"<<RoomNo<<")"; qr.execute(query.str().c_str()); } } TRANSACTION_END(); END_DB()}void delete_rc(std::string &req, int KC_ID){ int empID = 0; int HT = 0; int RoomNo = 0; DECODE_BEGIN(req) EXTRACT("HT(\\d+)", HT) EXTRACT("RN(\\d+)", RoomNo) EXTRACT("EI(\\d+)", empID) DECODE_END() std::string FU; std::string FP; BEGIN_DB() TRANSACTION_BEGIN(*conn); { std::ostringstream key_req; key_req << "INSERT INTO KeycardReq (ReqType, KCID, ReqText, ReqDate, EmpID, ParentReqID) VALUES (1, " << KC_ID <<", '"<< req << "', '" << get_date_time <<"', "<< empID <<", 0);"; qr.execute(key_req.str().c_str()); } mysqlpp::StoreQueryResult res_maxID = qr.store("SELECT MAX(ReqID) FROM KeycardReq WHERE ReqType=1"); int reqID = 0; if(res_maxID.num_rows() > 0) { reqID = res_maxID[0][0]; } { std::ostringstream query; query << "UPDATE Keycard INNER JOIN KeycardRoomLog ON Keycard.KeyID = KeycardRoomLog.KeyID SET KeycardRoomLog.EndReqID="<<reqID<<", KeycardRoomLog.End='"<<get_date_time<<"' WHERE (Keycard.KHTypeID="<<HT<<") AND (KeycardRoomLog.RoomID="<<RoomNo<<") AND (Keycard.KHRoomID<>"<<RoomNo<<") AND (KeycardRoomLog.EndReqID=0)"; qr.execute(query.str().c_str()); } { std::ostringstream query; query << "DELETE KeycardRoom.* FROM KeycardRoom INNER JOIN Keycard ON KeycardRoom.KeyID = Keycard.KeyID WHERE (KeycardRoom.RoomID="<<RoomNo<<") AND (Keycard.KHTypeID="<<HT<<") AND (Keycard.KHRoomID<>"<<RoomNo<<")"; qr.execute(query.str().c_str()); } { std::ostringstream query; query << "DELETE FROM KeyHolderTypeZone WHERE KHTypeID="<<HT<<" AND RoomID="<<RoomNo; qr.execute(query.str().c_str()); } TRANSACTION_END(); END_DB()}void new_profile(std::string &req, int KC_ID){ int empID = 0; int HT = 0; std::string PName; DECODE_BEGIN(req) EXTRACT("HT(\\d+)", HT) EXTRACT("HN([\\x20-\\x7B\\x7D-\\xFF]+)", PName) EXTRACT("EI(\\d+)", empID) DECODE_END() BEGIN_DB() if(HT == 0) { mysqlpp::StoreQueryResult res = qr.store("SELECT MAX(KHTypeID) FROM KeyHolderType;"); if(res.num_rows() > 0) { HT = (int) res[0][0]; HT ++; } else HT = 1; } TRANSACTION_BEGIN(*conn); std::ostringstream khtype; khtype << "SELECT KHTypeID FROM KeyHolderType WHERE KHTypeID="<<HT; mysqlpp::StoreQueryResult res_maxID = qr.store(khtype.str().c_str()); req = normalize_string(req); PName = normalize_string(PName); { std::ostringstream key_req; key_req << "INSERT INTO KeycardReq (ReqType, KCID, ReqText, ReqDate, EmpID, ParentReqID) VALUES (1, " << KC_ID <<", '"<< req << "', '" << get_date_time <<"', "<< empID <<", 0);"; qr.execute(key_req.str().c_str()); } if(res_maxID.num_rows() > 0) { std::ostringstream query; query << "UPDATE KeyHolderType SET KHTypeName='"<<PName<<"' WHERE KHTypeID="<<HT; qr.execute(query.str().c_str()); } else { std::ostringstream query; query << "INSERT INTO KeyHolderType (KHTypeID, KHTypeName) VALUES ("<<HT<<", '"<<PName<<"')"; qr.execute(query.str().c_str()); } TRANSACTION_END(); END_DB()}void delete_profile(std::string &req, int KC_ID){ int empID = 0; int HT = 0; DECODE_BEGIN(req) EXTRACT("HT(\\d+)", HT) EXTRACT("EI(\\d+)", empID) DECODE_END() req = normalize_string(req); BEGIN_DB() TRANSACTION_BEGIN(*conn); { std::ostringstream key_req; key_req << "INSERT INTO KeycardReq (ReqType, KCID, ReqText, ReqDate, EmpID, ParentReqID) VALUES (1, " << KC_ID <<", '"<< req << "', '" << get_date_time <<"', "<< empID <<", 0);"; qr.execute(key_req.str().c_str()); } { std::ostringstream query; query << "DELETE FROM KeyHolderType WHERE KHTypeID="<<HT; qr.execute(query.str().c_str()); } TRANSACTION_END(); END_DB()}void climate(std::string &req){ int RoomNo = 0; int TZone = 0; int TFDef = 20; int TGDef = 20; int TNoGDef = 20; int Season = 0; //-->0-Summer; 1-Winter int Regime = 0; //-->0-Without heater; 1-automatic; 2-With heater DECODE_BEGIN(req) EXTRACT("RN(\\d+)", RoomNo) EXTRACT("TZ(\\d+)", TZone) EXTRACT("TF(\\d+)", TFDef) EXTRACT("TG(\\d+)", TGDef) EXTRACT("TE(\\d+)", TNoGDef) EXTRACT("RG(\\d+)", Regime) DECODE_END() BEGIN_DB() std::ostringstream guest_no; guest_no << "SELECT GuestNo FROM Room WHERE RoomID=" << RoomNo; mysqlpp::StoreQueryResult res = qr.store(guest_no.str().c_str()); std::ostringstream clmt; Season = get_season(qr); clmt.fill('0'); if((int)res[0][0] == 0) { std::ostringstream key_req; key_req << "UPDATE RoomTZone SET DefaultFreeT="<<TFDef<<", DefaultGuestT="<<TGDef<<", TargetT="<<TFDef<<", DefaultGuestT_EmptyRoom="<<TNoGDef<<", Mode="<<Regime<<" WHERE RoomID="<<RoomNo<<" AND TZoneID="<<TZone; qr.execute(key_req.str().c_str()); clmt << "CLMT:" << std::setw(2) <<(TZone - 1) << Season << std::setw(2) << TFDef << std::setw(2) << TFDef << Regime <<"*"; } else { std::ostringstream key_req; key_req << "UPDATE RoomTZone SET DefaultFreeT="<<TFDef<<", DefaultGuestT="<<TGDef<<", DefaultGuestT_EmptyRoom="<<TNoGDef<<" ,Mode="<<Regime<<" WHERE RoomID="<<RoomNo<<" AND TZoneID="<<TZone; qr.execute(key_req.str().c_str()); std::ostringstream target; target << "SELECT TargetT FROM RoomTZone WHERE RoomID="<<RoomNo<<" AND TZoneID=" << TZone; mysqlpp::StoreQueryResult res_temp = qr.store(target.str().c_str()); int TargetT = 0; if(res_temp.num_rows() > 0) { TargetT = (int) res_temp[0][0]; } if(TargetT == 0) TargetT = TGDef; clmt << "CLMT:" << std::setw(2) <<(TZone - 1) << Season << std::setw(2) << TargetT << std::setw(2) << TNoGDef << Regime <<"*"; } std::string ip =get_rc_ip(qr, RoomNo); send_to_rc(ip, clmt); END_DB()}inline int get_KCWS(std::string& ip){ std::map<string, int>::iterator i = ctxt.ks.find(ip); if(i == ctxt.ks.end()) return 0; return i->second;}void mng_msg_handler(void* msg){ msg_t* _msg = static_cast<msg_t*> (msg); mysqlpp::Connection::thread_start(); pcrecpp::RE("(\\s{2})").Replace("", &_msg->command); std::vector<std::string> msg_decomposed; pcrecpp::StringPiece input(_msg->command); std::string command; int KC_ID = get_KCWS(_msg->ip); while(pcrecpp::RE("([\\x20-\\x7B\\x7D-\\xFF]+)\\|").Consume(&input, &command)) { msg_decomposed.push_back(command); } if(msg_decomposed[0] == "TR") { climate(_msg->command); } else if(msg_decomposed[0] == "KN") { new_card(_msg->command, KC_ID); } else if(msg_decomposed[0] == "KD") { delete_card(_msg->command, KC_ID); } else if(msg_decomposed[0] == "HA") { new_profile(_msg->command, KC_ID); }else if(msg_decomposed[0] == "HR") { delete_profile(_msg->command, KC_ID); } else if(msg_decomposed[0] == "ZA") { new_rc(_msg->command, KC_ID); } else if(msg_decomposed[0] == "ZR") { delete_rc(_msg->command, KC_ID); } else if(msg_decomposed[0] == "PR") { panic(_msg->command); } if(_msg) { delete _msg; _msg = NULL; } mysqlpp::Connection::thread_end();}void mng_server_accept(void* msg){ msg_t* _msg = static_cast<msg_t*> (msg); time_t lastcheck; int cfd = _msg->sd; string ip = _msg->ip; void (*message_loop)(void*) = _msg->message_loop; void (context_t::*save_handle)(std::string&, int) = _msg->save_handle; void (context_t::*del_handle)(std::string&) = _msg->del_handle; if(save_handle) { (ctxt.*save_handle)(ip, cfd); } if(_msg) { delete _msg; _msg = NULL; } if(is_KCWS(ip)) { if(ctxt.pmsbuffer != "") { send(cfd, ctxt.pmsbuffer.c_str(), ctxt.pmsbuffer.length(), 0); } } lastcheck = time(NULL); do{ pollfd pfd; pfd.fd = cfd; pfd.events = POLLIN; time_t now = time(NULL); if(difftime(now,lastcheck) > 3600) break; int ready = poll(&pfd, 1, 2000); if(ready != -1) { if((pfd.revents & POLLHUP) == POLLHUP) { logger(INFO, "Connection from %s closed\n", ip.c_str()); break; } if((pfd.revents & POLLIN) == POLLIN) { char buffer[TCP_MSG_LENGTH]; ssize_t received = recv(cfd, buffer, TCP_MSG_LENGTH, 0); if(received > 0) { lastcheck = time(NULL); buffer[received] = '\0'; msg_t* new_msg = new msg_t(buffer); new_msg->ip = ip; logger(RECV, "msg %s from ip: %s length: %d\n", buffer, ip.c_str(), received); ctxt.pool_tcp->tpool_add_work(message_loop, new_msg); } else { logger(INFO, "Connection from %s closed\n", ip.c_str()); break; } } } else { break; } } while (ctxt.shutdown != 1); if(del_handle) { (ctxt.*del_handle)(ip); } if(_msg) { delete _msg; _msg = NULL; } shutdown(cfd, SHUT_RDWR); close(cfd);}void*mng_server(void* ){ return server(ctxt.mngsock, ctxt.conf->mng_port, ctxt.conf->mng_host, mng_msg_handler, mng_server_accept, &context_t::add_mng, &context_t::del_mng);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -