| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999 |
- {
- 文件名:RealICQDBHistory.pas
- 功 能:读取,保存历史记录。
- 建 立:尹进
- 历 史:
- 2006.5.10:创建文件(尹进)
- }
- unit RealICQDBHistory;
- interface
- uses
- classes,
- SysUtils,
- StrUtils,
- DateUtils,
- DB,
- ADODB,
- RealICQClient,
- WNDES,
- MD5;
- type
- TMessageSearchResult = class
- private
- FID: Integer;
- FTeamID: String;
- FSender,
- FReceiver: String;
- FSendDateTime: TDateTime;
- FFont: String;
- FMessage: String;
- public
- property ID: Integer read FID;
- property TeamID: String read FTeamID;
- property Sender: String read FSender;
- property Receiver: String read FReceiver;
- property SendDateTime: TDateTime read FSendDateTime;
- property Font: String read FFont;
- property MessageStr: String read FMessage;
- end;
- TSystemMessageSearchResult = class
- private
- FID: Integer;
- FMessageID: Integer;
- FMessageType: TRealICQSystemMessageType;
- FPositionType: TRealICQSystemMessagePosition;
- FLeft: Integer;
- FTop: Integer;
- FWidth: Integer;
- FHeight: Integer;
- FTitle: String;
- FContent: String;
- FUrl: String;
- FAutoCloseTime: Integer;
- FSendDateTime: TDateTime;
- public
- property ID: Integer read FID;
- property MessageID: Integer read FMessageID;
- property MessageType: TRealICQSystemMessageType read FMessageType;
- property PositionType: TRealICQSystemMessagePosition read FPositionType;
- property Left: Integer read FLeft;
- property Top: Integer read FTop;
- property Width: Integer read FWidth;
- property Height: Integer read FHeight;
- property Title: String read FTitle;
- property Content: String read FContent;
- property Url: String read FUrl;
- property AutoCloseTime: Integer read FAutoCloseTime;
- property SendDateTime: TDateTime read FSendDateTime;
- end;
- TSMSMessageSearchResult = class
- private
- FID: Integer;
- FSender: String;
- FReceiver: String;
- FSendDateTime: TDateTime;
- FContent: String;
- public
- property ID: Integer read FID;
- property Sender: String read FSender;
- property Receiver: String read FReceiver;
- property SendDateTime: TDateTime read FSendDateTime;
- property Content: String read FContent;
- end;
- TDBHistorySearchResult = class
- private
- FRecordCount: Integer;
- FPageCount: Integer;
- FPageIndex: Integer;
- FMessages: TList;
- public
- property RecordCount: Integer read FRecordCount;
- property PageCount: Integer read FPageCount;
- property PageIndex: Integer read FPageIndex;
- property Messages: TList read FMessages;
- end;
- TRealICQDBHistory = class
- private
- FDBFileName: String;
- FDesKey: String;
- FADOConnection: TADOConnection;
- FLoginName:String;
- procedure SetDBFileName(Value: String);
- procedure SetLoginName(Value: String);
- procedure CheckFieldTeamID;
- protected
- public
- constructor Create;
- destructor Destroy; override;
- procedure SaveMessage(ATeamID: String; ASender, AReceiver: String;
- ASendDateTime: TDateTime; AFont: String; AMessage: String);
- procedure SaveSystemMessage(AMessageID: Integer;
- AMessageType: TRealICQSystemMessageType;
- APositionType: TRealICQSystemMessagePosition;
- ALeft, ATop, AWidth, AHeight: Integer;
- ATitle, AContent, AUrl: String;
- AAutoCloseTime: Integer);
- procedure SaveSMSMessage(ASender, AReceiver: String; ASendDateTime: TDateTime; AContent: String; AMessageType: Integer);
- function GetMessage(ATeamID: String; ASender, AReceiver: String;
- ASendDateTime: TDateTime; AMaxCount: Integer = 0; Page: Integer = 1; PageSize: Integer = 20): TDBHistorySearchResult;
- function GetSystemMessage(ASendDateTime: TDateTime; Page: Integer = 1; PageSize: Integer = 20): TDBHistorySearchResult;
- function GetSMSMessage(ASendDateTime: TDateTime; AMaxCount: Integer = 0; Page: Integer = 1; PageSize: Integer = 20): TDBHistorySearchResult;
- function SearchMessage(ATeamID: String;
- ASender, AReceiver: String; SearchAllMessage: Boolean; AKeyword: String): TList;
- procedure DelMessage(AID: Integer);
- procedure DelSystemMessage(AID: Integer);
- procedure DelSMSMessage(AID: Integer);
- procedure DelMessageByLoginName(ALoginName: String);
- procedure DelMessageByTeamID(ATeamID: String);
- procedure DelAllSystemMessage;
- //获取最近联系人列表
- function GetLatests(AReceiver: String): TStringList;
- function GetContactors: TStringList;
- procedure RestoreMessageHistory(ADBFileName: String);
- published
- property DBFileName: String read FDBFileName write SetDBFileName;
- property LoginName:String read FLoginName write SetLoginName;
- end;
- function GetPaginationSelectQuery(Condition: String; TableName: String;
- RecordCount, PageCount, PageIndex: Integer; PageSize: Integer): String;
-
- implementation
-
- function GetPaginationSelectQuery(Condition: String; TableName: String;
- RecordCount, PageCount, PageIndex: Integer; PageSize: Integer): String;
- var
- SelectQuery: String;
- MiddlePage: Integer;
- begin
- //计算中间的页码
- MiddlePage := PageCount div 2;
- //根据页码的范围构造不同的SQL语句
- if (PageIndex = 1) then
- begin
- SelectQuery := 'SELECT TOP ' + IntToStr(PageSize) + ' * '
- + ' FROM ' + TableName + ' WHERE ' + Condition
- + ' ORDER BY ID ASC';
- end
- else if (PageIndex <= MiddlePage) then
- begin
- SelectQuery := 'SELECT TOP ' + IntToStr(PageSize) + ' * '
- + ' FROM ' + TableName + ' '
- + ' WHERE ID > (SELECT MAX(ID) FROM (SELECT TOP ' + IntToStr(PageSize * (PageIndex - 1))
- + ' ID FROM ' + TableName + ' WHERE ' + Condition
- + ' ORDER BY ID ASC) DERIVEDTB )'
- + ' AND ' + Condition
- + ' ORDER BY ID ASC';
- end
- else if (PageIndex = PageCount) then
- begin
- SelectQuery := 'SELECT TOP ' + IntToStr(RecordCount - (PageIndex - 1) * PageSize) + ' * '
- + ' FROM ' + TableName + ' '
- + ' WHERE ' + condition
- + ' ORDER BY ID DESC';
- SelectQuery := 'SELECT * FROM (' + SelectQuery + ') DERIVEDTB ORDER BY ID ASC';
- end
- else if (PageIndex < PageCount) then
- begin
- SelectQuery := 'SELECT TOP ' + IntToStr(PageSize) + ' * '
- + ' FROM ' + TableName + ' '
- + ' WHERE ID<(SELECT MIN(ID) FROM (SELECT TOP ' + IntToStr(RecordCount - PageSize * PageIndex)
- + ' ID FROM ' + TableName + ' WHERE ' + Condition
- + ' ORDER BY ID DESC) DERIVEDTB ) AND ' + Condition
- + ' ORDER BY ID DESC';
- SelectQuery := 'SELECT * FROM (' + SelectQuery + ') DERIVEDTB ORDER BY ID ASC';
- end;
- Result := SelectQuery;
- end;
-
- //------------------------------------------------------------------------------
- procedure TRealICQDBHistory.DelMessage(AID: Integer);
- var
- ADOQuery: TADOQuery;
- begin
- ADOQuery := TADOQuery.Create(nil);
- try
- ADOQuery.Connection := FADOConnection;
- ADOQuery.SQL.Add('DELETE FROM Messages WHERE ID = ' + IntToStr(AID));
- ADOQuery.ExecSQL;
- finally
- FreeAndNil(ADOQuery);
- end;
- end;
- //------------------------------------------------------------------------------
- procedure TRealICQDBHistory.DelSystemMessage(AID: Integer);
- var
- ADOQuery: TADOQuery;
- begin
- ADOQuery := TADOQuery.Create(nil);
- try
- ADOQuery.Connection := FADOConnection;
- ADOQuery.SQL.Add('DELETE FROM SystemMessages WHERE ID = ' + IntToStr(AID));
- ADOQuery.ExecSQL;
- finally
- FreeAndNil(ADOQuery);
- end;
- end;
- //------------------------------------------------------------------------------
- procedure TRealICQDBHistory.DelSMSMessage(AID: Integer);
- var
- ADOQuery: TADOQuery;
- begin
- ADOQuery := TADOQuery.Create(nil);
- try
- ADOQuery.Connection := FADOConnection;
- if AID = -1 then
- ADOQuery.SQL.Add('DELETE FROM Messages (TeamID =''-3'')')
- else
- ADOQuery.SQL.Add('DELETE FROM Messages WHERE ID = ' + IntToStr(AID));
- ADOQuery.ExecSQL;
- finally
- FreeAndNil(ADOQuery);
- end;
- end;
- //------------------------------------------------------------------------------
- procedure TRealICQDBHistory.DelMessageByLoginName(ALoginName: String);
- var
- ADOQuery: TADOQuery;
- begin
- ADOQuery := TADOQuery.Create(nil);
- try
- ADOQuery.Connection := FADOConnection;
- ADOQuery.SQL.Text := 'DELETE FROM Messages WHERE (TeamID = ''-1'')';
- ADOQuery.SQL.Text := ADOQuery.SQL.Text + ' AND (Sender=''' + ALoginName + ''' OR Receiver=''' + ALoginName + ''')';
- ADOQuery.ExecSQL;
- finally
- FreeAndNil(ADOQuery);
- end;
- end;
- //------------------------------------------------------------------------------
- procedure TRealICQDBHistory.DelMessageByTeamID(ATeamID: String);
- var
- ADOQuery: TADOQuery;
- begin
- ADOQuery := TADOQuery.Create(nil);
- try
- ADOQuery.Connection := FADOConnection;
- ADOQuery.SQL.Add('DELETE FROM Messages WHERE TeamID = ''' + ATeamID + '''');
- ADOQuery.ExecSQL;
- finally
- FreeAndNil(ADOQuery);
- end;
- end;
- //------------------------------------------------------------------------------
- procedure TRealICQDBHistory.DelAllSystemMessage;
- var
- ADOQuery: TADOQuery;
- begin
- ADOQuery := TADOQuery.Create(nil);
- try
- ADOQuery.Connection := FADOConnection;
- ADOQuery.SQL.Add('DELETE FROM SystemMessages');
- ADOQuery.ExecSQL;
- finally
- FreeAndNil(ADOQuery);
- end;
- end;
- //------------------------------------------------------------------------------
- function TRealICQDBHistory.SearchMessage(ATeamID: String;
- ASender, AReceiver: String; SearchAllMessage: Boolean; AKeyword: String): TList;
- var
- SearchResult: TMessageSearchResult;
- ADODataSet: TADODataSet;
- AMessageStr: String;
- ASendDateTime: TDateTime;
- begin
- ASender := AnsiReplaceStr(ASender, '''', '''''');
- AReceiver := AnsiReplaceStr(AReceiver, '''', '''''');
- Result := TList.Create;
- ADODataSet := TADODataSet.Create(nil);
- try
- ADODataSet.Connection := FADOConnection;
- ADODataSet.CommandText := 'SELECT * FROM Messages';
- if not SearchAllMessage then
- begin
- try
- if StrToInt(ATeamID) <= 0 then
- begin
- ADODataSet.CommandText := ADODataSet.CommandText + ' WHERE (TeamID=''' + ATeamID + ''' ';
- ADODataSet.CommandText := ADODataSet.CommandText + ' OR TeamID = ''-5'') AND ((Sender=''' + ASender + ''' AND Receiver=''' + AReceiver + ''')';
- ADODataSet.CommandText := ADODataSet.CommandText + ' OR (Receiver = ''' + ASender + ''' AND Sender=''' + AReceiver + '''))';
- end
- else
- begin
- ADODataSet.CommandText := ADODataSet.CommandText + ' WHERE TeamID=''' + ATeamID + '''';
- end;
- except
- ADODataSet.CommandText := ADODataSet.CommandText + ' WHERE TeamID=''' + ATeamID + '''';
- end;
- end;
- ADODataSet.Open;
- while not ADODataSet.Eof do
- begin
- ASendDateTime := ADODataSet.FieldByName('SendDateTime').AsFloat;
- FDesKey := Copy(MD5En(FLoginName), 25, 8);
- AMessageStr := DESryStrHex(ADODataSet.FieldByName('Message').AsString, FDesKey);
-
- if AnsiPos(AKeyword, AMessageStr) > 0 then
- begin
- SearchResult := TMessageSearchResult.Create;
- SearchResult.FTeamID := Trim(ADODataSet.FieldByName('TeamID').AsString);
- SearchResult.FSender := ADODataSet.FieldByName('Sender').AsString;
- SearchResult.FReceiver := ADODataSet.FieldByName('Receiver').AsString;
- SearchResult.FSendDateTime := ASendDateTime;
- SearchResult.FFont := ADODataSet.FieldByName('Font').AsString;
- SearchResult.FMessage := AMessageStr;
- Result.Add(SearchResult);
- end;
- ADODataSet.Next;
- end;
- finally
- FDesKey := Copy(MD5En(FLoginName), 25, 8);
- FreeAndNil(ADODataSet);
- end;
- end;
- //------------------------------------------------------------------------------
- function TRealICQDBHistory.GetSystemMessage(ASendDateTime: TDateTime; Page: Integer = 1; PageSize: Integer = 20): TDBHistorySearchResult;
- var
- SearchResult: TSystemMessageSearchResult;
- ADODataSet: TADODataSet;
- ADODataSetGetRecordCount: TADODataSet;
- Condition: String;
- begin
- Result := TDBHistorySearchResult.Create;
- Result.FMessages := TList.Create;
- Result.FRecordCount := 0;
- Result.FPageCount := 0;
- Result.FPageIndex := 0;
- ADODataSet := TADODataSet.Create(nil);
- ADODataSetGetRecordCount := TADODataSet.Create(nil);
- try
- ADODataSet.Connection := FADOConnection;
- ADODataSetGetRecordCount.Connection := FADOConnection;
- Condition := 'SendDateTime >= ' + FloatToStr(ASendDateTime);
- //-------------------------------------------------
- //获取符合条件的记录总数
- ADODataSetGetRecordCount.CommandText := 'SELECT COUNT(*) FROM SystemMessages WHERE ' + Condition;
- ADODataSetGetRecordCount.Open;
- Result.FRecordCount := ADODataSetGetRecordCount.Fields[0].AsInteger;
- ADODataSetGetRecordCount.Close;
- if (Result.FRecordCount = 0) then Exit;
- //-------------------------------------------------
- //-------------------------------------------------
- //计算总的页数
- if (Result.FRecordCount mod PageSize = 0) then
- Result.FPageCount := Result.FRecordCount div PageSize
- else
- Result.FPageCount := (Result.FRecordCount div PageSize) + 1;
- //-------------------------------------------------
-
- //-------------------------------------------------
- //设置PageIndex的值
- if (Page < 1) then Page := 1;
- if (Page > Result.FPageCount) then Page := Result.FPageCount;
- Result.FPageIndex := page;
- //-------------------------------------------------
- ADODataSet.CommandText := GetPaginationSelectQuery(Condition, 'SystemMessages',
- Result.FRecordCount, Result.FPageCount, Result.FPageIndex, PageSize);
- ADODataSet.Open;
- while not ADODataSet.Eof do
- begin
- SearchResult := TSystemMessageSearchResult.Create;
- SearchResult.FID := ADODataSet.FieldByName('ID').AsInteger;
- SearchResult.FMessageID := ADODataSet.FieldByName('MessageID').AsInteger;
- SearchResult.FMessageType := TRealICQSystemMessageType(ADODataSet.FieldByName('MessageType').AsInteger);
- SearchResult.FPositionType := TRealICQSystemMessagePosition(ADODataSet.FieldByName('PositionType').AsInteger);
- SearchResult.FLeft := ADODataSet.FieldByName('Left').AsInteger;
- SearchResult.FTop := ADODataSet.FieldByName('Top').AsInteger;
- SearchResult.FWidth := ADODataSet.FieldByName('Width').AsInteger;
- SearchResult.FHeight := ADODataSet.FieldByName('Height').AsInteger;
- SearchResult.FAutoCloseTime := ADODataSet.FieldByName('AutoCloseTime').AsInteger;
- SearchResult.FSendDateTime := ADODataSet.FieldByName('SendDateTime').AsFloat;
- FDesKey := Copy(MD5En(FLoginName), 25, 8);
- SearchResult.FTitle := DESryStrHex(ADODataSet.FieldByName('Title').AsString, FDesKey);
- SearchResult.FContent := DESryStrHex(ADODataSet.FieldByName('Content').AsString, FDesKey);
- SearchResult.FUrl := DESryStrHex(ADODataSet.FieldByName('Url').AsString, FDesKey);
-
- Result.Messages.Add(SearchResult);
-
- ADODataSet.Next;
- end;
- finally
- FDesKey := Copy(MD5En(FLoginName), 25, 8);
- FreeAndNil(ADODataSet);
- end;
- end;
- function TRealICQDBHistory.GetContactors: TStringList;
- var
- ADODataSet: TADODataSet;
- begin
- Result := TStringList.Create;
-
- ADODataSet := TADODataSet.Create(nil);
- try
- ADODataSet.Connection := FADOConnection;
- ADODataSet.CommandText := 'SELECT DISTINCT Sender FROM Messages WHERE TeamID = ''-1''';
-
- ADODataSet.Open;
- while not ADODataSet.Eof do
- begin
- if Result.IndexOf(ADODataSet.FieldByName('Sender').AsString) = -1 then
- Result.Add(ADODataSet.FieldByName('Sender').AsString);
- if Result.Count >= 100 then Break;
- ADODataSet.Next;
- end;
- ADODataSet.Close;
- ADODataSet.CommandText := 'SELECT DISTINCT Receiver FROM Messages WHERE TeamID = ''-1''';
-
- ADODataSet.Open;
- while not ADODataSet.Eof do
- begin
- if Result.IndexOf(ADODataSet.FieldByName('Receiver').AsString) = -1 then
- Result.Add(ADODataSet.FieldByName('Receiver').AsString);
- if Result.Count >= 100 then Break;
- ADODataSet.Next;
- end;
- finally
- FreeAndNil(ADODataSet);
- end;
- end;
- //获取最近联系人列表
- function TRealICQDBHistory.GetLatests(AReceiver: String): TStringList;
- var
- ADODataSet: TADODataSet;
- begin
- AReceiver := AnsiReplaceStr(AReceiver, '''', '''''');
- Result := TStringList.Create;
-
- ADODataSet := TADODataSet.Create(nil);
- try
- ADODataSet.Connection := FADOConnection;
- ADODataSet.CommandText := 'SELECT Top 1000 Sender FROM Messages WHERE Receiver = ''' + AReceiver + ''' AND TeamID = ''-1'' ORDER BY SendDateTime DESC';
-
- ADODataSet.Open;
- while not ADODataSet.Eof do
- begin
- if Result.IndexOf(ADODataSet.FieldByName('Sender').AsString) = -1 then
- Result.Add(ADODataSet.FieldByName('Sender').AsString);
- if Result.Count >= 20 then Break;
- ADODataSet.Next;
- end;
- finally
- FreeAndNil(ADODataSet);
- end;
- end;
- //------------------------------------------------------------------------------
- function TRealICQDBHistory.GetSMSMessage(ASendDateTime: TDateTime; AMaxCount: Integer = 0; Page: Integer = 1; PageSize: Integer = 20): TDBHistorySearchResult;
- var
- SearchResult: TSMSMessageSearchResult;
- ADODataSet: TADODataSet;
- ADODataSetGetRecordCount: TADODataSet;
- Condition: String;
- begin
- Result := TDBHistorySearchResult.Create;
- Result.FMessages := TList.Create;
- Result.FRecordCount := 0;
- Result.FPageCount := 0;
- Result.FPageIndex := 0;
- ADODataSet := TADODataSet.Create(nil);
- ADODataSetGetRecordCount := TADODataSet.Create(nil);
- try
- ADODataSet.Connection := FADOConnection;
- ADODataSetGetRecordCount.Connection := FADOConnection;
- Condition := 'SendDateTime >= ' + FloatToStr(ASendDateTime);
- if AMaxCount > 0 then
- begin
- ADODataSet.CommandText := 'SELECT TOP ' + IntToStr(AMaxCount) + ' * FROM Messages WHERE (TeamID =''-2'' or TeamID =''-3'') and (' + Condition + ')';
- ADODataSet.CommandText := ADODataSet.CommandText + ' ORDER BY SendDateTime DESC';
- end
- else
- begin
- //-------------------------------------------------
- //获取符合条件的记录总数
- ADODataSetGetRecordCount.CommandText := 'SELECT COUNT(*) FROM Messages WHERE (TeamID =''-2'' or TeamID =''-3'') and (' + Condition + ')';
- ADODataSetGetRecordCount.Open;
- Result.FRecordCount := ADODataSetGetRecordCount.Fields[0].AsInteger;
- ADODataSetGetRecordCount.Close;
- if (Result.FRecordCount = 0) then Exit;
- //-------------------------------------------------
- //-------------------------------------------------
- //计算总的页数
- if (Result.FRecordCount mod PageSize = 0) then
- Result.FPageCount := Result.FRecordCount div PageSize
- else
- Result.FPageCount := (Result.FRecordCount div PageSize) + 1;
- //-------------------------------------------------
- //-------------------------------------------------
- //设置PageIndex的值
- if (Page < 1) then Page := 1;
- if (Page > Result.FPageCount) then Page := Result.FPageCount;
- Result.FPageIndex := page;
- //-------------------------------------------------
- ADODataSet.CommandText := GetPaginationSelectQuery(Condition, 'Messages',
- Result.FRecordCount, Result.FPageCount, Result.FPageIndex, PageSize);
- end;
- ADODataSet.Open;
- while not ADODataSet.Eof do
- begin
- SearchResult := TSMSMessageSearchResult.Create;
- SearchResult.FID := ADODataSet.FieldByName('ID').AsInteger;
- SearchResult.FSender := ADODataSet.FieldByName('Sender').AsString;
- SearchResult.FReceiver := ADODataSet.FieldByName('Receiver').AsString;
- SearchResult.FSendDateTime := ADODataSet.FieldByName('SendDateTime').AsDateTime;
- try
- SearchResult.FContent := DESryStrHex(ADODataSet.FieldByName('Content').AsString, FDesKey);
- except
- FreeAndNil(SearchResult);
- Continue;
- end;
- Result.Messages.Add(SearchResult);
- ADODataSet.Next;
- end;
- finally
- FreeAndNil(ADODataSet);
- end;
- end;
- //------------------------------------------------------------------------------
- function TRealICQDBHistory.GetMessage(ATeamID: String; ASender, AReceiver: String;
- ASendDateTime: TDateTime; AMaxCount: Integer = 0; Page: Integer = 1; PageSize: Integer = 20): TDBHistorySearchResult;
- var
- SearchResult: TMessageSearchResult;
- ADODataSet: TADODataSet;
- ADODataSetGetRecordCount: TADODataSet;
- Condition: String;
- begin
- ASender := AnsiReplaceStr(ASender, '''', '''''');
- AReceiver := AnsiReplaceStr(AReceiver, '''', '''''');
- Result := TDBHistorySearchResult.Create;
- Result.FMessages := TList.Create;
- Result.FRecordCount := 0;
- Result.FPageCount := 0;
- Result.FPageIndex := 0;
-
- ADODataSet := TADODataSet.Create(nil);
- ADODataSetGetRecordCount := TADODataSet.Create(nil);
- try
- ADODataSet.Connection := FADOConnection;
- ADODataSetGetRecordCount.Connection := FADOConnection;
- if ATeamID = '-1' then
- Condition := '(TeamID = ''-5'' or TeamID = ''-1'') AND SendDateTime >= ' + FloatToStr(ASendDateTime)
- else if ATeamID = '-2' then
- Condition := '(TeamID = ''-2'' or TeamID = ''-1'' or TeamID = ''-5'') AND SendDateTime >= ' + FloatToStr(ASendDateTime)
- else
- Condition := 'TeamID=''' + ATeamID + ''' AND SendDateTime >= ' + FloatToStr(ASendDateTime);
- try
- if (StrToInt(ATeamID) <= 0) and (StrToInt(ATeamID) <> -3) then
- begin
- Condition := Condition + ' AND ((Sender=''' + ASender + ''' AND Receiver=''' + AReceiver + ''')';
- Condition := Condition + ' OR (Receiver=''' + ASender + ''' AND Sender=''' + AReceiver + '''))';
- end;
- except
- end;
-
- if AMaxCount > 0 then
- begin
- ADODataSet.CommandText := 'SELECT TOP ' + IntToStr(AMaxCount) + ' * FROM Messages WHERE ' + Condition;
- ADODataSet.CommandText := ADODataSet.CommandText + ' ORDER BY ID DESC';
- end
- else
- begin
- //-------------------------------------------------
- //获取符合条件的记录总数
- ADODataSetGetRecordCount.CommandText := 'SELECT COUNT(*) FROM Messages WHERE ' + Condition;
- ADODataSetGetRecordCount.Open;
- Result.FRecordCount := ADODataSetGetRecordCount.Fields[0].AsInteger;
- ADODataSetGetRecordCount.Close;
- if (Result.FRecordCount = 0) then Exit;
- //-------------------------------------------------
- //-------------------------------------------------
- //计算总的页数
- if (Result.FRecordCount mod PageSize = 0) then
- Result.FPageCount := Result.FRecordCount div PageSize
- else
- Result.FPageCount := (Result.FRecordCount div PageSize) + 1;
- //-------------------------------------------------
-
- //-------------------------------------------------
- //设置PageIndex的值
- if (Page < 1) then Page := 1;
- if (Page > Result.FPageCount) then Page := Result.FPageCount;
- Result.FPageIndex := page;
- //-------------------------------------------------
- ADODataSet.CommandText := GetPaginationSelectQuery(Condition, 'Messages',
- Result.FRecordCount, Result.FPageCount, Result.FPageIndex, PageSize);
- end;
-
- ADODataSet.Open;
- while not ADODataSet.Eof do
- begin
- SearchResult := TMessageSearchResult.Create;
- SearchResult.FID := ADODataSet.FieldByName('ID').AsInteger;
- SearchResult.FTeamID := Trim(ADODataSet.FieldByName('TeamID').AsString);
- SearchResult.FSender := ADODataSet.FieldByName('Sender').AsString;
- SearchResult.FReceiver := ADODataSet.FieldByName('Receiver').AsString;
- SearchResult.FSendDateTime := ADODataSet.FieldByName('SendDateTime').AsFloat;
- FDesKey := Copy(MD5En(FLoginName), 25, 8);
-
- SearchResult.FFont := ADODataSet.FieldByName('Font').AsString;
- try
- SearchResult.FMessage := DESryStrHex(ADODataSet.FieldByName('Message').AsString, FDesKey);
- except
- FreeAndNil(SearchResult);
- Continue;
- end;
-
- Result.FMessages.Add(SearchResult);
-
- ADODataSet.Next;
- end;
- finally
- FDesKey := Copy(MD5En(FLoginName), 25, 8);
- FreeAndNil(ADODataSetGetRecordCount);
- FreeAndNil(ADODataSet);
- end;
- end;
- //------------------------------------------------------------------------------
- procedure TRealICQDBHistory.SaveSMSMessage(ASender, AReceiver: String;
- ASendDateTime: TDateTime; AContent: String; AMessageType: Integer);
- var
- ADOQuery: TADOQuery;
- begin
-
- ADOQuery := TADOQuery.Create(nil);
- try
- ADOQuery.Connection := FADOConnection;
- ADOQuery.SQL.Add('INSERT INTO Messages ('
- + 'TeamID,'
- + '[Sender],'
- + '[Receiver],'
- + 'SendDateTime,'
- + 'Font,'
- + 'Message) VALUES ('
- + '''' + IntToStr(AMessageType) + ''','
- + '''' + AnsiReplaceStr(ASender, '''', '''''') + ''','
- + '''' + AnsiReplaceStr(AReceiver, '''', '''''') + ''','
- + FloatToStr(ASendDateTime) + ','
- + ''''','
- + '''' + EncryStrHex(AContent, FDesKey) + ''')');
- ADOQuery.ExecSQL;
- finally
- FreeAndNil(ADOQuery);
- end;
- end;
- //------------------------------------------------------------------------------
- procedure TRealICQDBHistory.SaveMessage(ATeamID: String; ASender, AReceiver: String;
- ASendDateTime: TDateTime; AFont: String; AMessage: String);
- var
- ADOQuery: TADOQuery;
- begin
- ADOQuery := TADOQuery.Create(nil);
- try
- ADOQuery.Connection := FADOConnection;
- ADOQuery.SQL.Add('INSERT INTO Messages ('
- + 'TeamID,'
- + '[Sender],'
- + '[Receiver],'
- + 'SendDateTime,'
- + 'Font,'
- + 'Message) VALUES ('
- + '''' + ATeamID + ''','
- + '''' + AnsiReplaceStr(ASender, '''', '''''') + ''','
- + '''' + AnsiReplaceStr(AReceiver, '''', '''''') + ''','
- + FloatToStr(ASendDateTime) + ','
- + '''' + AnsiReplaceStr(AFont, '''', '''''') + ''','
- + '''' + EncryStrHex(AMessage, FDesKey) + ''')');
- ADOQuery.ExecSQL;
- finally
- FreeAndNil(ADOQuery);
- end;
- end;
- //------------------------------------------------------------------------------
- procedure TRealICQDBHistory.SaveSystemMessage(AMessageID: Integer;
- AMessageType: TRealICQSystemMessageType;
- APositionType: TRealICQSystemMessagePosition;
- ALeft, ATop, AWidth, AHeight: Integer;
- ATitle, AContent, AUrl: String;
- AAutoCloseTime: Integer);
- var
- ADOQuery: TADOQuery;
- begin
- ADOQuery := TADOQuery.Create(nil);
- try
- ADOQuery.Connection := FADOConnection;
- ADOQuery.SQL.Add('INSERT INTO SystemMessages ('
- + 'MessageID,'
- + 'MessageType,'
- + 'PositionType,'
- + '[Left],'
- + '[Top],'
- + '[Width],'
- + '[Height],'
- + '[Title],'
- + '[Content],'
- + '[Url],'
- + 'AutoCloseTime,'
- + 'SendDateTime) VALUES ('
- + IntToStr(AMessageID) + ','
- + IntToStr(Byte(AMessageType)) + ','
- + IntToStr(Byte(APositionType)) + ','
- + IntToStr(ALeft) + ','
- + IntToStr(ATop) + ','
- + IntToStr(AWidth) + ','
- + IntToStr(AHeight) + ','
- + '''' + EncryStrHex(ATitle, FDesKey) + ''','
- + '''' + EncryStrHex(AContent, FDesKey) + ''','
- + '''' + EncryStrHex(AUrl, FDesKey) + ''','
- + IntToStr(AAutoCloseTime) + ','
- + FloatToStr(Now) + ')');
- ADOQuery.ExecSQL;
- finally
- FreeAndNil(ADOQuery);
- end;
- end;
- //------------------------------------------------------------------------------
- procedure TRealICQDBHistory.SetLoginName(Value: String);
- begin
- FLoginName := Value;
- if Pos('+', FLoginName) > 0 then FLoginName := Copy(FLoginName, Pos('+', FLoginName) + 1, Length(FLoginName));
- end;
- //------------------------------------------------------------------------------
- procedure TRealICQDBHistory.SetDBFileName(Value: String);
- begin
- FDBFileName := Value;
- try
- if FADOConnection.Connected then FADOConnection.Close;
- except
- end;
- if FDBFileName = '' then Exit;
-
- FADOConnection.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; ' +
- 'Data Source=' + FDBFileName + ';';
- FADOConnection.Open;
- FDesKey := Copy(MD5En(FLoginName), 25, 8);
- //CheckFieldTeamID;
- end;
- //------------------------------------------------------------------------------
- procedure TRealICQDBHistory.CheckFieldTeamID;
- var
- ADOCommand: TADOCommand;
- begin
- try
- ADOCommand := TADOCommand.Create(nil);
- try
- ADOCommand.Connection := FADOConnection;
- ADOCommand.CommandText := 'ALTER TABLE Messages ALTER COLUMN TeamID Char';
- ADOCommand.Execute;
- finally
- ADOCommand.Free;
- end;
- except
- end;
- end;
- //------------------------------------------------------------------------------
- procedure TRealICQDBHistory.RestoreMessageHistory(ADBFileName: String);
- var
- AADOConnection: TADOConnection;
- ADODataSet: TADODataSet;
- ADODataSet1: TADODataSet;
- ADOQuery: TADOQuery;
-
- ATeamID: String;
- ASender: String;
- AReceiver: String;
- ASendDateTime: TDateTime;
- AFont: String;
- AMessage: String;
- SearchResult: TSystemMessageSearchResult;
- begin
- try
- AADOConnection := TADOConnection.Create(nil);
- ADODataSet := TADODataSet.Create(nil);
- ADODataSet1 := TADODataSet.Create(nil);
- ADOQuery := TADOQuery.Create(nil);
- AADOConnection.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; ' +
- 'Data Source=' + ADBFileName + ';';
- AADOConnection.Open;
-
- ADOQuery.Connection := FADOConnection;
- ADODataSet1.Connection := FADOConnection;
- ADODataSet.Connection := AADOConnection;
- ADODataSet.CommandText := 'SELECT * FROM Messages';
- ADODataSet.Open;
-
- while not ADODataSet.Eof do
- begin
- ATeamID := ADODataSet.FieldByName('TeamID').AsString;
- ASender:= ADODataSet.FieldByName('Sender').AsString;
- AReceiver := ADODataSet.FieldByName('Receiver').AsString;
- ASendDateTime := ADODataSet.FieldByName('SendDateTime').AsFloat;
- AFont := ADODataSet.FieldByName('Font').AsString;
- AMessage := ADODataSet.FieldByName('Message').AsString;
- ADODataSet1.CommandText := 'Select ID From Messages Where '
- + 'SendDateTime = ' + FloatToStr(ASendDateTime)
- + ' and Message = ''' + AMessage + '''';
- ADODataSet1.Open;
-
- if ADODataSet1.Eof then
- begin
- ADOQuery.SQL.Clear;
- ADOQuery.SQL.Add('INSERT INTO Messages ('
- + 'TeamID,'
- + '[Sender],'
- + '[Receiver],'
- + 'SendDateTime,'
- + 'Font,'
- + 'Message) VALUES ('
- + '''' + ATeamID + ''','
- + '''' + AnsiReplaceStr(ASender, '''', '''''') + ''','
- + '''' + AnsiReplaceStr(AReceiver, '''', '''''') + ''','
- + FloatToStr(ASendDateTime) + ','
- + '''' + AnsiReplaceStr(AFont, '''', '''''') + ''','
- + '''' + AMessage + ''')');
- try
- ADOQuery.ExecSQL;
- except
- end;
- end;
- ADODataSet1.Close;
- ADODataSet.Next;
- end;
- ADODataSet.Close;
-
- ADODataSet.CommandText := 'SELECT * FROM SystemMessages';
- ADODataSet.Open;
-
- while not ADODataSet.Eof do
- begin
- SearchResult := TSystemMessageSearchResult.Create;
- SearchResult.FID := ADODataSet.FieldByName('ID').AsInteger;
- SearchResult.FMessageID := ADODataSet.FieldByName('MessageID').AsInteger;
- SearchResult.FMessageType := TRealICQSystemMessageType(ADODataSet.FieldByName('MessageType').AsInteger);
- SearchResult.FPositionType := TRealICQSystemMessagePosition(ADODataSet.FieldByName('PositionType').AsInteger);
- SearchResult.FLeft := ADODataSet.FieldByName('Left').AsInteger;
- SearchResult.FTop := ADODataSet.FieldByName('Top').AsInteger;
- SearchResult.FWidth := ADODataSet.FieldByName('Width').AsInteger;
- SearchResult.FHeight := ADODataSet.FieldByName('Height').AsInteger;
- SearchResult.FAutoCloseTime := ADODataSet.FieldByName('AutoCloseTime').AsInteger;
- SearchResult.FSendDateTime := ADODataSet.FieldByName('SendDateTime').AsFloat;
- SearchResult.FTitle := ADODataSet.FieldByName('Title').AsString;
- SearchResult.FContent := ADODataSet.FieldByName('Content').AsString;
- SearchResult.FUrl := ADODataSet.FieldByName('Url').AsString;
- ADODataSet1.CommandText := 'Select ID From SystemMessages Where '
- + 'SendDateTime = ' + FloatToStr(SearchResult.FSendDateTime)
- + ' and MessageID = ' + IntToStr(Integer(SearchResult.FMessageID));
- ADODataSet1.Open;
-
- if ADODataSet1.Eof then
- begin
- ADOQuery.SQL.Clear;
- ADOQuery.SQL.Add('INSERT INTO SystemMessages ('
- + 'MessageID,'
- + 'MessageType,'
- + 'PositionType,'
- + '[Left],'
- + '[Top],'
- + '[Width],'
- + '[Height],'
- + '[Title],'
- + '[Content],'
- + '[Url],'
- + 'AutoCloseTime,'
- + 'SendDateTime) VALUES ('
- + IntToStr(SearchResult.FMessageID) + ','
- + IntToStr(Byte(SearchResult.FMessageType)) + ','
- + IntToStr(Byte(SearchResult.FPositionType)) + ','
- + IntToStr(SearchResult.FLeft) + ','
- + IntToStr(SearchResult.FTop) + ','
- + IntToStr(SearchResult.FWidth) + ','
- + IntToStr(SearchResult.FHeight) + ','
- + '''' + SearchResult.FTitle + ''','
- + '''' + SearchResult.FContent + ''','
- + '''' + SearchResult.FUrl + ''','
- + IntToStr(SearchResult.FAutoCloseTime) + ','
- + FloatToStr(SearchResult.FSendDateTime) + ')');
- FreeAndNil(SearchResult);
- try
- ADOQuery.ExecSQL;
- except
- end;
- end;
- ADODataSet1.Close;
- ADODataSet.Next;
- end;
- ADODataSet.Close;
- finally
- FreeAndNil(ADOQuery);
- FreeAndNil(ADODataSet);
- FreeAndNil(ADODataSet1);
- if AADOConnection.Connected then AADOConnection.Close;
- FreeAndNil(AADOConnection);
- end;
- end;
- //------------------------------------------------------------------------------
- constructor TRealICQDBHistory.Create;
- begin
- FADOConnection := TADOConnection.Create(nil);
- end;
- //------------------------------------------------------------------------------
- destructor TRealICQDBHistory.Destroy;
- begin
- try
- try
- if FADOConnection.Connected then FADOConnection.Close;
- except
- end;
- FreeAndNil(FADOConnection);
- finally
- inherited Destroy;
- end;
- end;
- end.
|