⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mng_server.cpp.svn-base

📁 sigmadesign smp8623 gui source code ,bingo
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
	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 + -