rundb.pas
来自「FIR引擎最新源码+注册」· PAS 代码 · 共 633 行 · 第 1/2 页
PAS
633 行
end;
function LoadHumRcdFromDB(sAccount, sCharName, sStr: string; var HumanRcd: THumDataInfo; nCertCode: Integer): Boolean;
begin
Result := False;
FillChar(HumanRcd, SizeOf(THumDataInfo), #0);
if LoadRcd(sAccount, sCharName, sStr, nCertCode, HumanRcd) then begin
if (HumanRcd.Data.sChrName = sCharName) and ((HumanRcd.Data.sAccount = '') or (HumanRcd.Data.sAccount = sAccount)) then
Result := True;
end;
Inc(g_Config.nLoadDBCount);
end;
function SaveHumRcdToDB(sAccount, sCharName: string; nSessionID: Integer; boIsHero: Boolean; var HumanRcd: THumDataInfo): Boolean;
begin
if boIsHero then begin
Result := SaveHeroRcd(sAccount, sCharName, nSessionID, HumanRcd);
end else begin
Result := SaveRcd(sAccount, sCharName, nSessionID, HumanRcd);
Inc(g_Config.nSaveDBCount);
end;
end;
function SaveHeroRcdToDB(sAccount, sCharName: string; nSessionID: Integer; var HumanRcd: THumDataInfo): Boolean;
begin
Result := SaveHeroRcd(sAccount, sCharName, nSessionID, HumanRcd);
//Inc(g_Config.nSaveDBCount);
end;
function SaveRcd(sAccount, sCharName: string; nSessionID: Integer; var HumanRcd: THumDataInfo): Boolean;
var
nQueryID: Integer;
nIdent: Integer;
nRecog: Integer;
sStr: string;
begin
nQueryID := GetQueryID(@g_Config);
Result := False;
n4EBB68 := 101;
SendDBSockMsg(nQueryID, EncodeMessage(MakeDefaultMsg(DB_SAVEHUMANRCD, nSessionID, 0, 0, 0)) + EncodeString(sAccount) + '/' + EncodeString(sCharName) + '/' + EncodeBuffer(@HumanRcd, SizeOf(THumDataInfo)));
if GetDBSockMsg(nQueryID, nIdent, nRecog, sStr, g_Config.dwGetDBSockMsgTime {5000}, False) then begin
if (nIdent = DBR_SAVEHUMANRCD) and (nRecog = 1) then
Result := True;
end;
end;
function SaveHeroRcd(sAccount, sCharName: string; nSessionID: Integer; var HumanRcd: THumDataInfo): Boolean;
var
nQueryID: Integer;
nIdent: Integer;
nRecog: Integer;
sStr: string;
begin
nQueryID := GetQueryID(@g_Config);
Result := False;
n4EBB68 := 101;
SendDBSockMsg(nQueryID, EncodeMessage(MakeDefaultMsg(DB_SAVEHERORCD, nSessionID, 0, 0, 0)) + EncodeString(sAccount) + '/' + EncodeString(sCharName) + '/' + EncodeBuffer(@HumanRcd, SizeOf(THumDataInfo)));
if GetDBSockMsg(nQueryID, nIdent, nRecog, sStr, g_Config.dwGetDBSockMsgTime {5000}, False) then begin
if (nIdent = DB_SAVEHERORCD) and (nRecog = 1) then
Result := True;
end;
end;
function LoadRcd(sAccount, sCharName, sStr: string; nCertCode: Integer; var HumanRcd: THumDataInfo): Boolean;
var
DefMsg: TDefaultMessage;
LoadHuman: TLoadHuman;
nQueryID: Integer;
nIdent, nRecog: Integer;
sHumanRcdStr: string;
sDBMsg, sDBCharName: string;
begin
nQueryID := GetQueryID(@g_Config);
DefMsg := MakeDefaultMsg(DB_LOADHUMANRCD, 0, 0, 0, 0);
LoadHuman.sAccount := sAccount;
LoadHuman.sChrName := sCharName;
LoadHuman.sUserAddr := sStr;
LoadHuman.nSessionID := nCertCode;
sDBMsg := EncodeMessage(DefMsg) + EncodeBuffer(@LoadHuman, SizeOf(TLoadHuman));
n4EBB68 := 100;
{MainOutMessage('Send DB Socket Load HumRcd Msg ... ' +
LoadHuman.sAccount + '/' +
LoadHuman.sChrName + '/' +
LoadHuman.sUserAddr + '/' +
IntToStr(LoadHuman.nSessionID)); }
SendDBSockMsg(nQueryID, sDBMsg);
if GetDBSockMsg(nQueryID, nIdent, nRecog, sHumanRcdStr, g_Config.dwGetDBSockMsgTime {5000}, True) then begin
Result := False;
if nIdent = DBR_LOADHUMANRCD then begin
if nRecog = 1 then begin
sHumanRcdStr := GetValidStr3(sHumanRcdStr, sDBMsg, ['/']);
sDBCharName := DeCodeString(sDBMsg);
if sDBCharName = sCharName then begin
if GetCodeMsgSize(SizeOf(THumDataInfo) * 4 / 3) = Length(sHumanRcdStr) then begin
DecodeBuffer(sHumanRcdStr, @HumanRcd, SizeOf(THumDataInfo));
Result := True;
end;
end else Result := False;
end else Result := False;
end else Result := False;
end else Result := False;
end;
function LoadHeroRcd(sAccount, sCharName, sStr: string; nCertCode: Integer; var HumanRcd: THumDataInfo): Boolean;
var
DefMsg: TDefaultMessage;
LoadHuman: TLoadHuman;
nQueryID: Integer;
nIdent, nRecog: Integer;
sHumanRcdStr: string;
sDBMsg, sDBCharName: string;
begin
nQueryID := GetQueryID(@g_Config);
DefMsg := MakeDefaultMsg(DB_LOADHERORCD, 0, 0, 0, 0);
LoadHuman.sAccount := sAccount;
LoadHuman.sChrName := sCharName;
LoadHuman.sUserAddr := sStr;
LoadHuman.nSessionID := nCertCode;
sDBMsg := EncodeMessage(DefMsg) + EncodeBuffer(@LoadHuman, SizeOf(TLoadHuman));
n4EBB68 := 100;
{MainOutMessage('Send DB Socket Load HumRcd Msg ... ' +
LoadHuman.sAccount + '/' +
LoadHuman.sChrName + '/' +
LoadHuman.sUserAddr + '/' +
IntToStr(LoadHuman.nSessionID)); }
SendDBSockMsg(nQueryID, sDBMsg);
if GetDBSockMsg(nQueryID, nIdent, nRecog, sHumanRcdStr, g_Config.dwGetDBSockMsgTime {5000}, True) then begin
Result := False;
if nIdent = DB_LOADHERORCD then begin
if nRecog = 1 then begin
sHumanRcdStr := GetValidStr3(sHumanRcdStr, sDBMsg, ['/']);
sDBCharName := DeCodeString(sDBMsg);
if sDBCharName = sCharName then begin
if GetCodeMsgSize(SizeOf(THumDataInfo) * 4 / 3) = Length(sHumanRcdStr) then begin
DecodeBuffer(sHumanRcdStr, @HumanRcd, SizeOf(THumDataInfo));
Result := True;
end;
end else Result := False;
end else Result := False;
end else Result := False;
end else Result := False;
end;
function QueryHeroRcd(sAccount, sCharName, sStr: string; nCertCode: Integer): Boolean;
var
DefMsg: TDefaultMessage;
LoadHuman: TLoadHuman;
nQueryID: Integer;
nIdent, nRecog: Integer;
sHumanRcdStr: string;
sDBMsg, sDBCharName: string;
begin
nQueryID := GetQueryID(@g_Config);
DefMsg := MakeDefaultMsg(DB_QUERYHERORCD, 0, 0, 0, 0);
LoadHuman.sAccount := sAccount;
LoadHuman.sChrName := sCharName;
LoadHuman.sUserAddr := sStr;
LoadHuman.nSessionID := nCertCode;
sDBMsg := EncodeMessage(DefMsg) + EncodeBuffer(@LoadHuman, SizeOf(TLoadHuman));
n4EBB68 := 100;
SendDBSockMsg(nQueryID, sDBMsg);
if GetDBSockMsg(nQueryID, nIdent, nRecog, sHumanRcdStr, g_Config.dwGetDBSockMsgTime {5000}, True) then begin
Result := False;
if nIdent = DB_QUERYHERORCD then begin
if nRecog = 1 then begin
sDBCharName := DeCodeString(sDBMsg);
if sDBCharName = sCharName then begin
Result := True;
end else Result := False;
end else Result := False;
end else Result := False;
end else Result := False;
end;
function NewHeroRcd(sChrName, sMsg: string): Integer;
var
DefMsg: TDefaultMessage;
nQueryID: Integer;
nIdent, nRecog: Integer;
sHumanRcdStr: string;
sDBMsg, sDBCharName: string;
begin
nQueryID := GetQueryID(@g_Config);
DefMsg := MakeDefaultMsg(DB_NEWHERORCD, 0, 0, 0, 0);
sDBMsg := EncodeMessage(DefMsg) + EncodeString(sMsg);
n4EBB68 := 100;
SendDBSockMsg(nQueryID, sDBMsg);
if GetDBSockMsg(nQueryID, nIdent, nRecog, sHumanRcdStr, g_Config.dwGetDBSockMsgTime {5000}, True) then begin
Result := -1;
if nIdent = DB_NEWHERORCD then begin
sDBCharName := DeCodeString(sHumanRcdStr);
if sDBCharName = sChrName then begin
Result := nRecog;
end else Result := -1;
end else Result := -1;
end else Result := -1;
end;
function DelHeroRcd(sAccount, sCharName, sStr: string; nCertCode: Integer): Boolean;
var
DefMsg: TDefaultMessage;
LoadHuman: TLoadHuman;
nQueryID: Integer;
nIdent, nRecog: Integer;
sHumanRcdStr: string;
sDBMsg, sDBCharName: string;
begin
nQueryID := GetQueryID(@g_Config);
DefMsg := MakeDefaultMsg(DB_DELHERORCD, 0, 0, 0, 0);
LoadHuman.sAccount := sAccount;
LoadHuman.sChrName := sCharName;
LoadHuman.sUserAddr := sStr;
LoadHuman.nSessionID := nCertCode;
sDBMsg := EncodeMessage(DefMsg) + EncodeBuffer(@LoadHuman, SizeOf(TLoadHuman));
n4EBB68 := 100;
SendDBSockMsg(nQueryID, sDBMsg);
if GetDBSockMsg(nQueryID, nIdent, nRecog, sHumanRcdStr, g_Config.dwGetDBSockMsgTime {5000}, True) then begin
Result := False;
if nIdent = DB_DELHERORCD then begin
if nRecog = 1 then begin
sDBCharName := DeCodeString(sHumanRcdStr);
if sDBCharName = sCharName then begin
Result := True;
end else Result := False;
end else Result := False;
end else Result := False;
end else Result := False;
end;
procedure SendDBSockMsg(nQueryID: Integer; sMsg: string);
var
sSENDMSG: string;
nCheckCode: Integer;
sCheckStr: string;
boSendData: Boolean;
Config: pTConfig;
ThreadInfo: pTThreadInfo;
timeout: TTimeVal;
writefds: TFDSet;
nRet: Integer;
s: TSocket;
begin
Config := @g_Config;
ThreadInfo := @g_Config.DBSOcketThread;
if not DBSocketConnected then Exit;
EnterCriticalSection(UserDBSection);
try
Config.sDBSocketRecvText := '';
finally
LeaveCriticalSection(UserDBSection);
end;
nCheckCode := MakeLong(nQueryID xor 170, Length(sMsg) + 6);
//MainOutMessage('nCheckCode: ' + IntToStr(nCheckCode));
sCheckStr := EncodeBuffer(@nCheckCode, SizeOf(Integer));
sSENDMSG := '#' + IntToStr(nQueryID) + '/' + sMsg + sCheckStr + '!';
Config.boDBSocketWorking := True;
{$IF DBSOCKETMODE = TIMERENGINE}
FrmMain.DBSocket.Socket.SendText(sSENDMSG);
{$ELSE}
s := Config.DBSocket;
boSendData := False;
while True do begin
if not boSendData then Sleep(1)
else Sleep(0);
boSendData := False;
ThreadInfo.dwRunTick := GetTickCount();
ThreadInfo.boActived := True;
ThreadInfo.nRunFlag := 128;
ThreadInfo.nRunFlag := 129;
timeout.tv_sec := 0;
timeout.tv_usec := 20;
writefds.fd_count := 1;
writefds.fd_array[0] := s;
nRet := select(0, nil, @writefds, nil, @timeout);
if nRet = SOCKET_ERROR then begin
nRet := WSAGetLastError();
Config.nDBSocketWSAErrCode := nRet - WSABASEERR;
Inc(Config.nDBSocketErrorCount);
if nRet = WSAEWOULDBLOCK then begin
Continue;
end;
if Config.DBSocket = INVALID_SOCKET then Break;
Config.DBSocket := INVALID_SOCKET;
Sleep(100);
Config.boDBSocketConnected := False;
Break;
end;
if nRet <= 0 then begin
Continue;
end;
boSendData := True;
nRet := Send(s, sSENDMSG[1], Length(sSENDMSG), 0);
if nRet = SOCKET_ERROR then begin
Inc(Config.nDBSocketErrorCount);
Config.nDBSocketWSAErrCode := WSAGetLastError - WSABASEERR;
Continue;
end;
Inc(Config.nDBSocketSendLen, nRet);
Break;
end;
{$IFEND}
end;
function GetQueryID(Config: pTConfig): Integer;
begin
Inc(Config.nDBQueryID);
if Config.nDBQueryID > High(SmallInt) - 1 then Config.nDBQueryID := 1;
Result := Config.nDBQueryID;
end;
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?