📄 common.h.svn-base
字号:
str.fill('0'); return str << 1900 + local.tm_year << "-"<< std::setw(2) << local.tm_mon + 1 << "-" << std::setw(2) << local.tm_mday << " " << std::setw(2) << local.tm_hour << ":" << std::setw(2) << local.tm_min << ":" << std::setw(2) << local.tm_sec; //str << str1.str();}inline void write_event(int type, std::ostringstream& reason){ BEGIN_DB() std::ostringstream str; str << "INSERT INTO ServerEventLog (TypeID, EventText, Date) VALUES("<<type<<", '"<<reason.str()<<"', '"<< get_date_time <<"')"; qr.execute(str.str().c_str()); END_DB()}inline string bool_to_str(int n){ return n == 0 ? string("FALSE") : string("TRUE");}inline int str_to_int(const char* str){ if(strcmp(str, "TRUE")) return 0; else return 1;}inline void send_to_rc(std::string& ip, std::ostringstream& udp_send){ struct sockaddr_in isa; logger(SEND, "rc %s: %s room %d\n", ip.c_str(), udp_send.str().c_str(), ctxt.rooms[ip]->room); CRC(udp_send); pollfd pfd; pfd.fd = ctxt.rcsock; pfd.events = POLLOUT; isa.sin_family = AF_INET; isa.sin_port = htons(ctxt.conf->rc_port); inet_aton(ip.c_str(), &isa.sin_addr); int ready = poll(&pfd, 1, 2000); if(ready != -1) { if(pfd.revents == POLLOUT){ sendto(ctxt.rcsock, udp_send.str().c_str(), udp_send.str().length(), 0, (sockaddr *) &isa, sizeof(isa)); } } else { printf("error sending data\n"); }}inline bool is_KCWS(std::string& ip){ bool bRet = true; std::map<string, int>::iterator i = ctxt.ks.find(ip); if(i == ctxt.ks.end()) bRet = false; return bRet;}inline bool send_to_mng(std::ostringstream& msg, int id){ std::map<std::string, int>::iterator i = ctxt.ks.begin(); for(; i != ctxt.ks.end(); i++) { std::cout<<i->second<<std::endl; if(i->second == id) { break; } } if(i == ctxt.ks.end()) return false; std::cout<<i->first<<std::endl; std::map<std::string, int>::iterator mng = ctxt.mng.find(i->first); bool bRet = false; if(mng != ctxt.mng.end()) { logger(SEND, "mng: %s\n", msg.str().c_str()); msg << "\r\n"; pollfd pfd; pfd.fd = mng->second; pfd.events = POLLHUP; int ready = poll(&pfd, 1, 2000); if(ready != -1) { if((pfd.revents & POLLHUP) == POLLHUP){ bRet = false; std::cout<<"fail\n"; } else { bRet = true; std::cout<<"success\n"; send(mng->second, msg.str().c_str(), msg.str().length(), 0); } } } std::cout<<bRet<<" bRet"<<std::endl; return bRet;}inline int send_to_client(std::ostringstream& msg, int cfd ){ logger(SEND, "client: %s\n", msg.str().c_str()); std::ostringstream final; final << "\2" << msg.str() << "\3\r\n"; pollfd pfd; pfd.fd = cfd; pfd.events = POLLOUT; if(cfd) { int ready = poll(&pfd, 1, 2000); if(ready != -1) { if((pfd.revents & POLLHUP) == POLLHUP){ logger(ERROR, "client connection closed"); return 0;// break;// }// else if((pfd.revents & POLLOUT) == POLLOUT){// continue; } else { int n = send(cfd, final.str().c_str(), final.str().length(), 0); if(n == 0) return n; } } else{ logger(ERROR, "Error sending to client: %s", errno); return 0;// break; } } return 1;}inline void send_to_pms(std::ostringstream& msg, int pmssock = -1){ if(pmssock == -1) pmssock = ctxt.pmssock; logger(SEND, "pms: %d %s\n", pmssock, msg.str().c_str()); std::ostringstream final; final << "\2" << msg.str() << "\3";//\r\n"; pollfd pfd; pfd.fd = pmssock; pfd.events = POLLOUT;// while(1) { int ready = poll(&pfd, 1, 2000); if(ready != -1) { if((pfd.revents & POLLHUP) == POLLHUP){ logger(ERROR, "PMS connection closed");// break;// }// else if((pfd.revents & POLLOUT) == POLLOUT){// continue; } else { send(pmssock, final.str().c_str(), final.str().length(), 0); } } else{ logger(ERROR, "Error sending to PMS: %s", errno);// break; } }}inline void send_to_pms(const std::string& msg, int pmssock = -1){ if(pmssock == -1) pmssock = ctxt.pmssock; logger(SEND, "pms: %d %s\n", pmssock, msg.c_str()); std::ostringstream final; final << "\2" << msg << "\3";//\r\n"; pollfd pfd; pfd.fd = pmssock; pfd.events = POLLOUT;// while(1) { int ready = poll(&pfd, 1, 2000); if(ready != -1) { if((pfd.revents & POLLHUP) == POLLHUP){ logger(ERROR, "PMS connection closed");// break;// }// else if((pfd.revents & POLLOUT) == POLLOUT){// continue; } else { send(pmssock, final.str().c_str(), final.str().length(), 0); } } else{ logger(ERROR, "Error sending to PMS: %s", errno);// break; } }}void check_out(std::string& req);inline std::string& normalize_string(std::string& str){ pcrecpp::RE("(\\')").GlobalReplace("\\'\\'", &str); return str;}inline std::string get_rc_ip(mysqlpp::Query& qr, int RoomNo){ std::ostringstream rcs_ip; rcs_ip << "SELECT IP_RC FROM Room WHERE RoomID=" << RoomNo; mysqlpp::StoreQueryResult res1 = qr.store(rcs_ip.str().c_str()); return res1[0][0].c_str();}inline int get_h_type(mysqlpp::Query& qr, int RoomNo){ bool bOK = false; int HType = 0; if(RoomNo > 0) { std::string ip = get_rc_ip(qr, RoomNo); if(ctxt.conf->using_rc) { pthread_mutex_lock( &ctxt.rooms[ip]->lock); if(ctxt.rooms[ip]->status == 1) { bOK = true; } pthread_mutex_unlock( &ctxt.rooms[ip]->lock); } else { bOK = true; } } if(bOK) { std::ostringstream type_q; type_q << "SELECT Keycard.KHTypeID FROM ((RoomStatus LEFT JOIN KeycardRoom ON (KeycardRoom.RoomID = RoomStatus.RoomID AND Keycard.KeyID = RoomStatus.PowerKeyID)) INNER JOIN Keycard ON Keycard.KeyID = KeycardRoom.KeyID) WHERE RoomStatus.RoomID=" << RoomNo; mysqlpp::StoreQueryResult type_res = qr.store(type_q.str().c_str()); if(type_res.num_rows() > 0) { HType = type_res[0][0]; } } return HType;}inline std::string get_room_name(mysqlpp::Query& qr, int RoomNo){ std::ostringstream room_name_q; room_name_q << "SELECT RoomName FROM Room WHERE RoomID =" << RoomNo; mysqlpp::StoreQueryResult room_name_res = qr.store(room_name_q.str().c_str()); std::string sRoomName; if(room_name_res.num_rows() > 0) { sRoomName = room_name_res[0][0].c_str(); } return sRoomName;}/** * password is in admno */inline std::string gen_inet(int Amount, int RoomNo, int Official, const std::string& Reason, int EmpID){ char admno[8]={0,}; BEGIN_DB() std::ostringstream inet_time_q; inet_time_q << "SELECT InetTime, Price FROM Internet WHERE InetType=" << Amount; mysqlpp::StoreQueryResult inet_time_res = qr.store(inet_time_q.str().c_str()); int net_time = inet_time_res[0][0]; int price = 0; if(Official == 0) price = (int) inet_time_res[0][1]; srand(time(NULL)); int i = rand(); std::ostringstream s; s << i; char *c = crypt("MT", &s.str().c_str()[2]); memcpy(admno, &c[1], 7); admno[7] = '\0'; TRANSACTION_BEGIN(*conn) std::ostringstream inet_pay_q; inet_pay_q << "INSERT INTO InternetPay(RoomID, InetType, PayDate, User, Pwd, IsCronStarted, InetTime, Price, IsActive) VALUES ("<<RoomNo<<", "<< Amount <<", '"<< get_date_time <<"', 'room" << RoomNo <<"', '"<<admno<<"', 'FALSE', "<<net_time<<", "<<price<<", 'TRUE')"; qr.execute(inet_pay_q.str().c_str()); if(Official == 1) { std::ostringstream official_log; official_log << "INSERT INTO OfficialOperationLog (ObjectID, OperationID, RoomID, Date, EmpID, Allowed, OperationDate, Reason ) VALUES("<< Amount << ",2,"<< RoomNo << ",'" << get_date_time << "'," << EmpID << ",'TRUE','"<< get_date_time <<"','"<< Reason << "')"; } TRANSACTION_END() END_DB() logger(INFO, "gen_inet: pass %s RoomNo %d\n", admno, RoomNo); return admno;}inline void make_gen(int RoomNo, int Amount, int PostingType, int cfd, const std::string& SenderName, int Official, const std::string& Reason, int EmpID){ if(RoomNo == 0) return; BEGIN_DB() std::string ip; int HType = 1; if(SenderName == "PHP") HType = get_h_type(qr, RoomNo); if(HType == 1 || ctxt.conf->using_cards == 0) { if(ctxt.conf->using_pms && Official == 0) { if(PostingType == 0) { if(ctxt.is_in_php(RoomNo)) { ctxt.insert_php(cfd, RoomNo, PostingType, Amount); std::string sRoomName = get_room_name(qr, RoomNo); std::ostringstream pms_message; pms_message << "PS|RN" << sRoomName<<"|PTC|TA"<< Amount <<"|DA"<< get_date << "|TI"<< get_time <<"|"; if(ctxt.conf->second_interface) send_to_pms(pms_message, ctxt.pmssock2); else send_to_pms(pms_message); } } else { std::ostringstream internet; internet << "SELECT Price FROM Internet WHERE InetType=" << Amount; mysqlpp::StoreQueryResult internet_res = qr.store(internet.str().c_str()); int price = 0; if(internet_res.num_rows() > 0) { price = (int)internet_res[0][0]; price /= 100; } if(ctxt.is_in_php(RoomNo)) { ctxt.insert_php(cfd, RoomNo, PostingType, Amount); std::string sRoomName = get_room_name(qr, RoomNo); std::ostringstream pms_message; pms_message << "PS|RN" << sRoomName<<"|PTC|TA"<< price <<"|DA"<< get_date << "|TI"<< get_time <<"|"; if(ctxt.conf->second_interface) send_to_pms(pms_message, ctxt.pmssock2); else send_to_pms(pms_message); } } } else { if(PostingType == 0) { std::ostringstream message; message << "PA|RN" << RoomNo << "|ASOK|\r\n"; send(cfd, message.str().c_str(), message.str().length(), 0); } else { std::string admno = gen_inet(Amount, RoomNo, Official, Reason, EmpID); /*std::ostringstream inet_time_q; inet_time_q << "SELECT InetTime, Price FROM Internet WHERE InetType=" << Amount; mysqlpp::StoreQueryResult inet_time_res = qr.store(inet_time_q.str().c_str()); int net_time = inet_time_res[0][0]; int price = 0; if(Official == 0) price = (int) inet_time_res[0][1]; srand(time(NULL)); int i = rand(); std::ostringstream s; s << i; char *c = crypt("MT", &s.str().c_str()[2]); char admno[7]; memcpy(admno, &c[1], 7); TRANSACTION_BEGIN(conn) std::ostringstream inet_pay_q; inet_pay_q << "INSERT INTO InternetPay(RoomID, InetType, PayDate, User, Pwd, IsCronStarted, InetTime, Price, IsActive) VALUES ("<<RoomNo<<", "<< Amount <<", '"<< get_date_time <<"', 'room" << RoomNo <<"', '"<<admno<<"', 'FALSE', "<<net_time<<", "<<price<<", 'TRUE')"; qr.execute(inet_pay_q.str().c_str()); if(Official == 1) { std::ostringstream official_log; official_log << "INSERT INTO OfficialOperationLog (ObjectID, OperationID, RoomID, Date, EmpID, Allowed, OperationDate, Reason ) VALUES("<< Amount << ",2,"<< RoomNo << ",'" << get_date_time << "'," << EmpID << ",'TRUE','"<< get_date_time <<"','"<< Reason << "')"; } TRANSACTION_END()*/ if(!admno.empty()) { std::ostringstream message; message << "PA|RN" << RoomNo << "|NMroom" << RoomNo <<"|PD"<<admno<<"|ASOK|\r\n"; send(cfd, message.str().c_str(), message.str().length(), 0); } else { std::ostringstream message; message << "PA|RN" << RoomNo << "|NM|PD|ASNO|\r\n"; send(cfd, message.str().c_str(), message.str().length(), 0); } } } } END_DB()}inline int get_season(mysqlpp::Query &qr){ mysqlpp::StoreQueryResult res_seson = qr.store("SELECT Season FROM SystemInfo"); return (int)res_seson[0][0];}inline void process_command(std::string& req){ std::ostringstream command; command << "perl srv_parse.pl \""<< req <<"\" &"; system(command.str().c_str());}void server_accept(void* msg);void* server( int& sock, int port, std::string& ip, void (*message_loop)(void*), void (*accept_loop)(void*) = server_accept, void (context_t::*save_handle)(std::string&, int) = NULL, void (context_t::*del_handle)(std::string&) = NULL );#endif //__COMMON_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -