以检查账号和密码为例,说明存储过程在游戏服务器中查询的使用。查询执行的处理是在单独的线程里处理(账号管理线程),返回是通过队列方式异步返回。
存储过程函数proc_validateuserlogin
begin
declare nUserId bigint default null;
declare sUserPswd varchar(48) default null;
#根据账号id,从users表查询用户id和密码 (sAccount,sPswd是存入的函数存数)
select userid, passwd into nUserId, sUserPswd from users where account = sAccount;
if nUserId is null then
select 1, 0;#返回1,0,表示用户不存在
else
if sUserPswd != sPswd then
select 2, 0;#返回2,0,表示密码错误
else
select 0, nUserId;#返回0,用户id
end if;
end if;
end
参数(账号、密码):
in sAccount varchar(32), in sPswd varchar(48)
检查查询请求
void CAccountManager::ValidateLoginRequest(const LoginRequest *pRequest)
{
//数据库未就绪
if (!m_AccountSQL.Connected())
{
ResultLoginRequest(pRequest, -1, 0);//返回消息
return;
}
//数据库查询错误(1)
if (m_AccountSQL.Query("call proc_validateuserlogin(\"%s\", \"%s\")", pRequest->sAccount, pRequest->sPasswd))
{
ResultLoginRequest(pRequest, -2, 0);
return;
}
do
{
//数据库查询错误(2)
MYSQL_ROW pRow = m_AccountSQL.CurrentRow();
if (!pRow || m_AccountSQL.GetFieldCount() < 2)
{
ResultLoginRequest(pRequest, -3, 0);
break;
}
int nErrorCode = -100;
int nUserId = 0;
sscanf(pRow[0], "%d", &nErrorCode);
sscanf(pRow[1], "%d", &nUserId);
if (nErrorCode != 0 || nUserId == 0)
{
//用户不存在
if (nErrorCode == 1)
{
ResultLoginRequest(pRequest, -4, 0);
break;
}
//密码错误
if (nErrorCode == 2)
{
ResultLoginRequest(pRequest, -5, 0);
break;
}
//未知的数据库错误码
ResultLoginRequest(pRequest, -6, 0);
}
ResultLoginRequest(pRequest, 0, nUserId);
}
while (0);
m_AccountSQL.ResetQuery();
}
其中:
CMySQLConenction m_AccountSQL;//mysql数据连接类