📄 rundb.pas
字号:
unit RunDB;
interface
uses
Windows, SysUtils, Grobal2, WinSock, UnitManage, MudUtil,Classes,forms ,D7ScktComp;
procedure DBSOcketThread(ThreadInfo: pTThreadInfo); stdcall;
function DBSocketConnected(): Boolean;
function GetDBSockMsg(nQueryID: Integer; var Msg:TDefaultMessage; var sStr: string; dwTimeOut: LongWord; boLoadRcd: Boolean): Boolean;
function MakeHumRcdFromLocal(var HumanRcd: THumDataInfo): Boolean;
function LoadHumRcdFromDB(sAccount, sCharName, sStr: string; var HumanRcd:
THumDataInfo; nCertCode: Integer): Boolean;
function SaveHumRcdToDB(sAccount, sCharName: string; nSessionID: Integer; var
HumanRcd: THumDataInfo): Boolean;
function SaveRcd(sAccount, sCharName: string; nSessionID: Integer; var HumanRcd:
THumDataInfo): Boolean; //004B42C8
function LoadRcd(sAccount, sCharName, sStr: string; nCertCode: Integer; var
HumanRcd: THumDataInfo): Boolean;
procedure SendDBSockMsg(nQueryID: Integer; sMsg: string);
function GetQueryID(Config: pTConfig): Integer;
function RCheckGuildName(GuildName:string):Boolean;
implementation
uses M2Share, svMain, HUtil32, EDcode;
procedure DBSocketRead(Config: pTConfig);
var
dwReceiveTimeTick : LongWord;
nReceiveTime : Integer;
sRecvText : string;
nRecvLen : Integer;
nRet : Integer;
begin
if Config.DBSocket = INVALID_SOCKET then
exit;
dwReceiveTimeTick := GetTickCount();
nRet := ioctlsocket(Config.DBSocket, FIONREAD, nRecvLen);
if (nRet = SOCKET_ERROR) or (nRecvLen = 0) then
begin
nRet := WSAGetLastError;
Config.DBSocket := INVALID_SOCKET;
Sleep(100);
Config.boDBSocketConnected := False;
exit;
end;
setlength(sRecvText, nRecvLen);
nRecvLen := recv(Config.DBSocket, Pointer(sRecvText)^, nRecvLen, 0);
setlength(sRecvText, nRecvLen);
Inc(Config.nDBSocketRecvIncLen, nRecvLen);
if (nRecvLen <> SOCKET_ERROR) and (nRecvLen > 0) then
begin
if nRecvLen > Config.nDBSocketRecvMaxLen then
Config.nDBSocketRecvMaxLen := nRecvLen;
EnterCriticalSection(UserDBSection);
try
Config.sDBSocketRecvText := Config.sDBSocketRecvText + sRecvText;
if not Config.boDBSocketWorking then
begin
Config.sDBSocketRecvText := '';
end;
finally
LeaveCriticalSection(UserDBSection);
end;
end;
Inc(Config.nDBSocketRecvCount);
nReceiveTime := GetTickCount - dwReceiveTimeTick;
if Config.nDBReceiveMaxTime < nReceiveTime then
Config.nDBReceiveMaxTime := nReceiveTime;
end;
procedure DBSocketProcess(Config: pTConfig; ThreadInfo: pTThreadInfo);
var
s : TSocket;
Name : sockaddr_in;
HostEnt : PHostEnt;
argp : LongInt;
readfds : TFDSet;
timeout : TTimeVal;
nRet : Integer;
boRecvData : BOOL;
nRunTime : Integer;
dwRunTick : LongWord;
begin
s := INVALID_SOCKET;
if Config.DBSocket <> INVALID_SOCKET then
s := Config.DBSocket;
dwRunTick := GetTickCount();
ThreadInfo.dwRunTick := dwRunTick;
boRecvData := False;
while True do
begin
if ThreadInfo.boTerminaled then
break;
if not boRecvData then
Sleep(1)
else
Sleep(0);
boRecvData := False;
nRunTime := GetTickCount - ThreadInfo.dwRunTick;
if ThreadInfo.nRunTime < nRunTime then
ThreadInfo.nRunTime := nRunTime;
if ThreadInfo.nMaxRunTime < nRunTime then
ThreadInfo.nMaxRunTime := nRunTime;
if GetTickCount - dwRunTick >= 1000 then
begin
dwRunTick := GetTickCount();
if ThreadInfo.nRunTime > 0 then
Dec(ThreadInfo.nRunTime);
end;
ThreadInfo.dwRunTick := GetTickCount();
ThreadInfo.boActived := True;
ThreadInfo.nRunFlag := 125;
if (Config.DBSocket = INVALID_SOCKET) or (s = INVALID_SOCKET) then
begin
if Config.DBSocket <> INVALID_SOCKET then
begin
Config.DBSocket := INVALID_SOCKET;
Sleep(100);
ThreadInfo.nRunFlag := 126;
Config.boDBSocketConnected := False;
end;
if s <> INVALID_SOCKET then
begin
closesocket(s);
s := INVALID_SOCKET;
end;
if Config.sDBAddr = '' then
Continue;
s := Socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
if s = INVALID_SOCKET then
Continue;
ThreadInfo.nRunFlag := 127;
HostEnt := gethostbyname(PChar(@Config.sDBAddr[1]));
if HostEnt = nil then
Continue;
PInteger(@Name.sin_addr.S_addr)^ := PInteger(HostEnt.h_addr^)^;
Name.sin_family := HostEnt.h_addrtype;
Name.sin_port := htons(Config.nDBPort);
Name.sin_family := PF_INET;
ThreadInfo.nRunFlag := 128;
if connect(s, Name, SizeOf(Name)) = SOCKET_ERROR then
begin
nRet := WSAGetLastError;
closesocket(s);
s := INVALID_SOCKET;
Continue;
end;
argp := 1;
if ioctlsocket(s, FIONBIO, argp) = SOCKET_ERROR then
begin
closesocket(s);
s := INVALID_SOCKET;
Continue;
end;
ThreadInfo.nRunFlag := 129;
Config.DBSocket := s;
Config.boDBSocketConnected := True;
end;
readfds.fd_count := 1;
readfds.fd_array[0] := s;
timeout.tv_sec := 0;
timeout.tv_usec := 20;
ThreadInfo.nRunFlag := 130;
nRet := select(0, @readfds, nil, nil, @timeout);
if nRet = SOCKET_ERROR then
begin
ThreadInfo.nRunFlag := 131;
nRet := WSAGetLastError;
if nRet = WSAEWOULDBLOCK then
begin
Sleep(10);
Continue;
end;
ThreadInfo.nRunFlag := 132;
nRet := WSAGetLastError;
Config.nDBSocketWSAErrCode := nRet - WSABASEERR;
Inc(Config.nDBSocketErrorCount);
Config.DBSocket := INVALID_SOCKET;
Sleep(100);
Config.boDBSocketConnected := False;
closesocket(s);
s := INVALID_SOCKET;
Continue;
end;
boRecvData := True;
ThreadInfo.nRunFlag := 133;
while True do
begin
if nRet <= 0 then
break;
DBSocketRead(Config);
Dec(nRet);
end;
end;
if Config.DBSocket <> INVALID_SOCKET then
begin
Config.DBSocket := INVALID_SOCKET;
Config.boDBSocketConnected := False;
end;
if s <> INVALID_SOCKET then
begin
closesocket(s);
end;
end;
procedure DBSOcketThread(ThreadInfo: pTThreadInfo); stdcall;
var
nErrorCount : Integer;
resourcestring
sExceptionMsg =
'[Exception] DBSocketThread ErrorCount = %d';
begin
nErrorCount := 0;
while True do
begin
try
DBSocketProcess(ThreadInfo.Config, ThreadInfo);
break;
except
Inc(nErrorCount);
if nErrorCount > 10 then
break;
MainOutMessage(format(sExceptionMsg, [nErrorCount]));
end;
end;
ExitThread(0);
end;
// 2006-3-16 18:56:25 判断是否和dbserver连接
function DBSocketConnected(): Boolean;
begin
Result := FrmMain.DBSocket.Socket.Connected;
end;
function GetDBSockMsg(nQueryID: Integer; var Msg:TDefaultMessage; var sStr: string; dwTimeOut: LongWord; boLoadRcd: Boolean): Boolean;
var
SocketStream : TWinSocketStream;
ReceiveBuffer : Array[0..4095] Of Char;
sReviceBuff,sReviceMsg : String;
s24, s28, s2C, sCheckFlag, sDefMsg, s38 : string;
nLen,nMsgLen,nCheckCode : Integer;
Begin
Result:=False;
SocketStream :=TWinSocketStream.Create(FrmMain.DBSocket.Socket,dwTimeOut);
if SocketStream.WaitForData(dwTimeOut) then
Begin
try
repeat
if not FrmMain.DBSocket.Socket.Connected then break;
nMsgLen:=SocketStream.Read(ReceiveBuffer,SizeOf(ReceiveBuffer));
if nMsgLen <> 0 then
begin
SetLength(sReviceBuff,nMsgLen);
Move(ReceiveBuffer,sReviceBuff[1],nMsgLen);
sReviceMsg:=sReviceMsg + sReviceBuff;
if Pos('!', sReviceMsg) > 0 then
begin
if sReviceMsg <> '' then
begin
s28 := '';
sReviceMsg := ArrestStringEx(sReviceMsg, '#', '!', s28);
if s28 <> '' then
begin
s28 := GetValidStr3(s28, s2C, ['/']);
nLen := length(s28);
if (nLen >= SizeOf(TDefaultMessage)) and (Str_ToInt(s2C, 0) = nQueryID)
then
begin
nCheckCode := MakeLong(Str_ToInt(s2C, 0) xor 170, nLen);
sCheckFlag := EncodeBuffer(@nCheckCode, SizeOf(Integer));
// if CompareBackLStr(s28, sCheckFlag, length(sCheckFlag)) then
begin
if nLen = DEFBLOCKSIZE then
begin
sDefMsg := s28;
s38 := ''; // -> 004B3F56
end
else
begin //004B3F1F
sDefMsg := Copy(s28, 1, DEFBLOCKSIZE);
s38 := Copy(s28, DEFBLOCKSIZE + 1, length(s28) - DEFBLOCKSIZE -
6);
end; //004B3F56
Msg := DecodeMessage(sDefMsg);
sStr := s38;
Result := True;
break;
end ;
end
end;
End;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -