RealICQDBHistory.pas 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999
  1. {
  2. 文件名:RealICQDBHistory.pas
  3. 功 能:读取,保存历史记录。
  4. 建 立:尹进
  5. 历 史:
  6. 2006.5.10:创建文件(尹进)
  7. }
  8. unit RealICQDBHistory;
  9. interface
  10. uses
  11. classes,
  12. SysUtils,
  13. StrUtils,
  14. DateUtils,
  15. DB,
  16. ADODB,
  17. RealICQClient,
  18. WNDES,
  19. MD5;
  20. type
  21. TMessageSearchResult = class
  22. private
  23. FID: Integer;
  24. FTeamID: String;
  25. FSender,
  26. FReceiver: String;
  27. FSendDateTime: TDateTime;
  28. FFont: String;
  29. FMessage: String;
  30. public
  31. property ID: Integer read FID;
  32. property TeamID: String read FTeamID;
  33. property Sender: String read FSender;
  34. property Receiver: String read FReceiver;
  35. property SendDateTime: TDateTime read FSendDateTime;
  36. property Font: String read FFont;
  37. property MessageStr: String read FMessage;
  38. end;
  39. TSystemMessageSearchResult = class
  40. private
  41. FID: Integer;
  42. FMessageID: Integer;
  43. FMessageType: TRealICQSystemMessageType;
  44. FPositionType: TRealICQSystemMessagePosition;
  45. FLeft: Integer;
  46. FTop: Integer;
  47. FWidth: Integer;
  48. FHeight: Integer;
  49. FTitle: String;
  50. FContent: String;
  51. FUrl: String;
  52. FAutoCloseTime: Integer;
  53. FSendDateTime: TDateTime;
  54. public
  55. property ID: Integer read FID;
  56. property MessageID: Integer read FMessageID;
  57. property MessageType: TRealICQSystemMessageType read FMessageType;
  58. property PositionType: TRealICQSystemMessagePosition read FPositionType;
  59. property Left: Integer read FLeft;
  60. property Top: Integer read FTop;
  61. property Width: Integer read FWidth;
  62. property Height: Integer read FHeight;
  63. property Title: String read FTitle;
  64. property Content: String read FContent;
  65. property Url: String read FUrl;
  66. property AutoCloseTime: Integer read FAutoCloseTime;
  67. property SendDateTime: TDateTime read FSendDateTime;
  68. end;
  69. TSMSMessageSearchResult = class
  70. private
  71. FID: Integer;
  72. FSender: String;
  73. FReceiver: String;
  74. FSendDateTime: TDateTime;
  75. FContent: String;
  76. public
  77. property ID: Integer read FID;
  78. property Sender: String read FSender;
  79. property Receiver: String read FReceiver;
  80. property SendDateTime: TDateTime read FSendDateTime;
  81. property Content: String read FContent;
  82. end;
  83. TDBHistorySearchResult = class
  84. private
  85. FRecordCount: Integer;
  86. FPageCount: Integer;
  87. FPageIndex: Integer;
  88. FMessages: TList;
  89. public
  90. property RecordCount: Integer read FRecordCount;
  91. property PageCount: Integer read FPageCount;
  92. property PageIndex: Integer read FPageIndex;
  93. property Messages: TList read FMessages;
  94. end;
  95. TRealICQDBHistory = class
  96. private
  97. FDBFileName: String;
  98. FDesKey: String;
  99. FADOConnection: TADOConnection;
  100. FLoginName:String;
  101. procedure SetDBFileName(Value: String);
  102. procedure SetLoginName(Value: String);
  103. procedure CheckFieldTeamID;
  104. protected
  105. public
  106. constructor Create;
  107. destructor Destroy; override;
  108. procedure SaveMessage(ATeamID: String; ASender, AReceiver: String;
  109. ASendDateTime: TDateTime; AFont: String; AMessage: String);
  110. procedure SaveSystemMessage(AMessageID: Integer;
  111. AMessageType: TRealICQSystemMessageType;
  112. APositionType: TRealICQSystemMessagePosition;
  113. ALeft, ATop, AWidth, AHeight: Integer;
  114. ATitle, AContent, AUrl: String;
  115. AAutoCloseTime: Integer);
  116. procedure SaveSMSMessage(ASender, AReceiver: String; ASendDateTime: TDateTime; AContent: String; AMessageType: Integer);
  117. function GetMessage(ATeamID: String; ASender, AReceiver: String;
  118. ASendDateTime: TDateTime; AMaxCount: Integer = 0; Page: Integer = 1; PageSize: Integer = 20): TDBHistorySearchResult;
  119. function GetSystemMessage(ASendDateTime: TDateTime; Page: Integer = 1; PageSize: Integer = 20): TDBHistorySearchResult;
  120. function GetSMSMessage(ASendDateTime: TDateTime; AMaxCount: Integer = 0; Page: Integer = 1; PageSize: Integer = 20): TDBHistorySearchResult;
  121. function SearchMessage(ATeamID: String;
  122. ASender, AReceiver: String; SearchAllMessage: Boolean; AKeyword: String): TList;
  123. procedure DelMessage(AID: Integer);
  124. procedure DelSystemMessage(AID: Integer);
  125. procedure DelSMSMessage(AID: Integer);
  126. procedure DelMessageByLoginName(ALoginName: String);
  127. procedure DelMessageByTeamID(ATeamID: String);
  128. procedure DelAllSystemMessage;
  129. //获取最近联系人列表
  130. function GetLatests(AReceiver: String): TStringList;
  131. function GetContactors: TStringList;
  132. procedure RestoreMessageHistory(ADBFileName: String);
  133. published
  134. property DBFileName: String read FDBFileName write SetDBFileName;
  135. property LoginName:String read FLoginName write SetLoginName;
  136. end;
  137. function GetPaginationSelectQuery(Condition: String; TableName: String;
  138. RecordCount, PageCount, PageIndex: Integer; PageSize: Integer): String;
  139. implementation
  140. function GetPaginationSelectQuery(Condition: String; TableName: String;
  141. RecordCount, PageCount, PageIndex: Integer; PageSize: Integer): String;
  142. var
  143. SelectQuery: String;
  144. MiddlePage: Integer;
  145. begin
  146. //计算中间的页码
  147. MiddlePage := PageCount div 2;
  148. //根据页码的范围构造不同的SQL语句
  149. if (PageIndex = 1) then
  150. begin
  151. SelectQuery := 'SELECT TOP ' + IntToStr(PageSize) + ' * '
  152. + ' FROM ' + TableName + ' WHERE ' + Condition
  153. + ' ORDER BY ID ASC';
  154. end
  155. else if (PageIndex <= MiddlePage) then
  156. begin
  157. SelectQuery := 'SELECT TOP ' + IntToStr(PageSize) + ' * '
  158. + ' FROM ' + TableName + ' '
  159. + ' WHERE ID > (SELECT MAX(ID) FROM (SELECT TOP ' + IntToStr(PageSize * (PageIndex - 1))
  160. + ' ID FROM ' + TableName + ' WHERE ' + Condition
  161. + ' ORDER BY ID ASC) DERIVEDTB )'
  162. + ' AND ' + Condition
  163. + ' ORDER BY ID ASC';
  164. end
  165. else if (PageIndex = PageCount) then
  166. begin
  167. SelectQuery := 'SELECT TOP ' + IntToStr(RecordCount - (PageIndex - 1) * PageSize) + ' * '
  168. + ' FROM ' + TableName + ' '
  169. + ' WHERE ' + condition
  170. + ' ORDER BY ID DESC';
  171. SelectQuery := 'SELECT * FROM (' + SelectQuery + ') DERIVEDTB ORDER BY ID ASC';
  172. end
  173. else if (PageIndex < PageCount) then
  174. begin
  175. SelectQuery := 'SELECT TOP ' + IntToStr(PageSize) + ' * '
  176. + ' FROM ' + TableName + ' '
  177. + ' WHERE ID<(SELECT MIN(ID) FROM (SELECT TOP ' + IntToStr(RecordCount - PageSize * PageIndex)
  178. + ' ID FROM ' + TableName + ' WHERE ' + Condition
  179. + ' ORDER BY ID DESC) DERIVEDTB ) AND ' + Condition
  180. + ' ORDER BY ID DESC';
  181. SelectQuery := 'SELECT * FROM (' + SelectQuery + ') DERIVEDTB ORDER BY ID ASC';
  182. end;
  183. Result := SelectQuery;
  184. end;
  185. //------------------------------------------------------------------------------
  186. procedure TRealICQDBHistory.DelMessage(AID: Integer);
  187. var
  188. ADOQuery: TADOQuery;
  189. begin
  190. ADOQuery := TADOQuery.Create(nil);
  191. try
  192. ADOQuery.Connection := FADOConnection;
  193. ADOQuery.SQL.Add('DELETE FROM Messages WHERE ID = ' + IntToStr(AID));
  194. ADOQuery.ExecSQL;
  195. finally
  196. FreeAndNil(ADOQuery);
  197. end;
  198. end;
  199. //------------------------------------------------------------------------------
  200. procedure TRealICQDBHistory.DelSystemMessage(AID: Integer);
  201. var
  202. ADOQuery: TADOQuery;
  203. begin
  204. ADOQuery := TADOQuery.Create(nil);
  205. try
  206. ADOQuery.Connection := FADOConnection;
  207. ADOQuery.SQL.Add('DELETE FROM SystemMessages WHERE ID = ' + IntToStr(AID));
  208. ADOQuery.ExecSQL;
  209. finally
  210. FreeAndNil(ADOQuery);
  211. end;
  212. end;
  213. //------------------------------------------------------------------------------
  214. procedure TRealICQDBHistory.DelSMSMessage(AID: Integer);
  215. var
  216. ADOQuery: TADOQuery;
  217. begin
  218. ADOQuery := TADOQuery.Create(nil);
  219. try
  220. ADOQuery.Connection := FADOConnection;
  221. if AID = -1 then
  222. ADOQuery.SQL.Add('DELETE FROM Messages (TeamID =''-3'')')
  223. else
  224. ADOQuery.SQL.Add('DELETE FROM Messages WHERE ID = ' + IntToStr(AID));
  225. ADOQuery.ExecSQL;
  226. finally
  227. FreeAndNil(ADOQuery);
  228. end;
  229. end;
  230. //------------------------------------------------------------------------------
  231. procedure TRealICQDBHistory.DelMessageByLoginName(ALoginName: String);
  232. var
  233. ADOQuery: TADOQuery;
  234. begin
  235. ADOQuery := TADOQuery.Create(nil);
  236. try
  237. ADOQuery.Connection := FADOConnection;
  238. ADOQuery.SQL.Text := 'DELETE FROM Messages WHERE (TeamID = ''-1'')';
  239. ADOQuery.SQL.Text := ADOQuery.SQL.Text + ' AND (Sender=''' + ALoginName + ''' OR Receiver=''' + ALoginName + ''')';
  240. ADOQuery.ExecSQL;
  241. finally
  242. FreeAndNil(ADOQuery);
  243. end;
  244. end;
  245. //------------------------------------------------------------------------------
  246. procedure TRealICQDBHistory.DelMessageByTeamID(ATeamID: String);
  247. var
  248. ADOQuery: TADOQuery;
  249. begin
  250. ADOQuery := TADOQuery.Create(nil);
  251. try
  252. ADOQuery.Connection := FADOConnection;
  253. ADOQuery.SQL.Add('DELETE FROM Messages WHERE TeamID = ''' + ATeamID + '''');
  254. ADOQuery.ExecSQL;
  255. finally
  256. FreeAndNil(ADOQuery);
  257. end;
  258. end;
  259. //------------------------------------------------------------------------------
  260. procedure TRealICQDBHistory.DelAllSystemMessage;
  261. var
  262. ADOQuery: TADOQuery;
  263. begin
  264. ADOQuery := TADOQuery.Create(nil);
  265. try
  266. ADOQuery.Connection := FADOConnection;
  267. ADOQuery.SQL.Add('DELETE FROM SystemMessages');
  268. ADOQuery.ExecSQL;
  269. finally
  270. FreeAndNil(ADOQuery);
  271. end;
  272. end;
  273. //------------------------------------------------------------------------------
  274. function TRealICQDBHistory.SearchMessage(ATeamID: String;
  275. ASender, AReceiver: String; SearchAllMessage: Boolean; AKeyword: String): TList;
  276. var
  277. SearchResult: TMessageSearchResult;
  278. ADODataSet: TADODataSet;
  279. AMessageStr: String;
  280. ASendDateTime: TDateTime;
  281. begin
  282. ASender := AnsiReplaceStr(ASender, '''', '''''');
  283. AReceiver := AnsiReplaceStr(AReceiver, '''', '''''');
  284. Result := TList.Create;
  285. ADODataSet := TADODataSet.Create(nil);
  286. try
  287. ADODataSet.Connection := FADOConnection;
  288. ADODataSet.CommandText := 'SELECT * FROM Messages';
  289. if not SearchAllMessage then
  290. begin
  291. try
  292. if StrToInt(ATeamID) <= 0 then
  293. begin
  294. ADODataSet.CommandText := ADODataSet.CommandText + ' WHERE (TeamID=''' + ATeamID + ''' ';
  295. ADODataSet.CommandText := ADODataSet.CommandText + ' OR TeamID = ''-5'') AND ((Sender=''' + ASender + ''' AND Receiver=''' + AReceiver + ''')';
  296. ADODataSet.CommandText := ADODataSet.CommandText + ' OR (Receiver = ''' + ASender + ''' AND Sender=''' + AReceiver + '''))';
  297. end
  298. else
  299. begin
  300. ADODataSet.CommandText := ADODataSet.CommandText + ' WHERE TeamID=''' + ATeamID + '''';
  301. end;
  302. except
  303. ADODataSet.CommandText := ADODataSet.CommandText + ' WHERE TeamID=''' + ATeamID + '''';
  304. end;
  305. end;
  306. ADODataSet.Open;
  307. while not ADODataSet.Eof do
  308. begin
  309. ASendDateTime := ADODataSet.FieldByName('SendDateTime').AsFloat;
  310. FDesKey := Copy(MD5En(FLoginName), 25, 8);
  311. AMessageStr := DESryStrHex(ADODataSet.FieldByName('Message').AsString, FDesKey);
  312. if AnsiPos(AKeyword, AMessageStr) > 0 then
  313. begin
  314. SearchResult := TMessageSearchResult.Create;
  315. SearchResult.FTeamID := Trim(ADODataSet.FieldByName('TeamID').AsString);
  316. SearchResult.FSender := ADODataSet.FieldByName('Sender').AsString;
  317. SearchResult.FReceiver := ADODataSet.FieldByName('Receiver').AsString;
  318. SearchResult.FSendDateTime := ASendDateTime;
  319. SearchResult.FFont := ADODataSet.FieldByName('Font').AsString;
  320. SearchResult.FMessage := AMessageStr;
  321. Result.Add(SearchResult);
  322. end;
  323. ADODataSet.Next;
  324. end;
  325. finally
  326. FDesKey := Copy(MD5En(FLoginName), 25, 8);
  327. FreeAndNil(ADODataSet);
  328. end;
  329. end;
  330. //------------------------------------------------------------------------------
  331. function TRealICQDBHistory.GetSystemMessage(ASendDateTime: TDateTime; Page: Integer = 1; PageSize: Integer = 20): TDBHistorySearchResult;
  332. var
  333. SearchResult: TSystemMessageSearchResult;
  334. ADODataSet: TADODataSet;
  335. ADODataSetGetRecordCount: TADODataSet;
  336. Condition: String;
  337. begin
  338. Result := TDBHistorySearchResult.Create;
  339. Result.FMessages := TList.Create;
  340. Result.FRecordCount := 0;
  341. Result.FPageCount := 0;
  342. Result.FPageIndex := 0;
  343. ADODataSet := TADODataSet.Create(nil);
  344. ADODataSetGetRecordCount := TADODataSet.Create(nil);
  345. try
  346. ADODataSet.Connection := FADOConnection;
  347. ADODataSetGetRecordCount.Connection := FADOConnection;
  348. Condition := 'SendDateTime >= ' + FloatToStr(ASendDateTime);
  349. //-------------------------------------------------
  350. //获取符合条件的记录总数
  351. ADODataSetGetRecordCount.CommandText := 'SELECT COUNT(*) FROM SystemMessages WHERE ' + Condition;
  352. ADODataSetGetRecordCount.Open;
  353. Result.FRecordCount := ADODataSetGetRecordCount.Fields[0].AsInteger;
  354. ADODataSetGetRecordCount.Close;
  355. if (Result.FRecordCount = 0) then Exit;
  356. //-------------------------------------------------
  357. //-------------------------------------------------
  358. //计算总的页数
  359. if (Result.FRecordCount mod PageSize = 0) then
  360. Result.FPageCount := Result.FRecordCount div PageSize
  361. else
  362. Result.FPageCount := (Result.FRecordCount div PageSize) + 1;
  363. //-------------------------------------------------
  364. //-------------------------------------------------
  365. //设置PageIndex的值
  366. if (Page < 1) then Page := 1;
  367. if (Page > Result.FPageCount) then Page := Result.FPageCount;
  368. Result.FPageIndex := page;
  369. //-------------------------------------------------
  370. ADODataSet.CommandText := GetPaginationSelectQuery(Condition, 'SystemMessages',
  371. Result.FRecordCount, Result.FPageCount, Result.FPageIndex, PageSize);
  372. ADODataSet.Open;
  373. while not ADODataSet.Eof do
  374. begin
  375. SearchResult := TSystemMessageSearchResult.Create;
  376. SearchResult.FID := ADODataSet.FieldByName('ID').AsInteger;
  377. SearchResult.FMessageID := ADODataSet.FieldByName('MessageID').AsInteger;
  378. SearchResult.FMessageType := TRealICQSystemMessageType(ADODataSet.FieldByName('MessageType').AsInteger);
  379. SearchResult.FPositionType := TRealICQSystemMessagePosition(ADODataSet.FieldByName('PositionType').AsInteger);
  380. SearchResult.FLeft := ADODataSet.FieldByName('Left').AsInteger;
  381. SearchResult.FTop := ADODataSet.FieldByName('Top').AsInteger;
  382. SearchResult.FWidth := ADODataSet.FieldByName('Width').AsInteger;
  383. SearchResult.FHeight := ADODataSet.FieldByName('Height').AsInteger;
  384. SearchResult.FAutoCloseTime := ADODataSet.FieldByName('AutoCloseTime').AsInteger;
  385. SearchResult.FSendDateTime := ADODataSet.FieldByName('SendDateTime').AsFloat;
  386. FDesKey := Copy(MD5En(FLoginName), 25, 8);
  387. SearchResult.FTitle := DESryStrHex(ADODataSet.FieldByName('Title').AsString, FDesKey);
  388. SearchResult.FContent := DESryStrHex(ADODataSet.FieldByName('Content').AsString, FDesKey);
  389. SearchResult.FUrl := DESryStrHex(ADODataSet.FieldByName('Url').AsString, FDesKey);
  390. Result.Messages.Add(SearchResult);
  391. ADODataSet.Next;
  392. end;
  393. finally
  394. FDesKey := Copy(MD5En(FLoginName), 25, 8);
  395. FreeAndNil(ADODataSet);
  396. end;
  397. end;
  398. function TRealICQDBHistory.GetContactors: TStringList;
  399. var
  400. ADODataSet: TADODataSet;
  401. begin
  402. Result := TStringList.Create;
  403. ADODataSet := TADODataSet.Create(nil);
  404. try
  405. ADODataSet.Connection := FADOConnection;
  406. ADODataSet.CommandText := 'SELECT DISTINCT Sender FROM Messages WHERE TeamID = ''-1''';
  407. ADODataSet.Open;
  408. while not ADODataSet.Eof do
  409. begin
  410. if Result.IndexOf(ADODataSet.FieldByName('Sender').AsString) = -1 then
  411. Result.Add(ADODataSet.FieldByName('Sender').AsString);
  412. if Result.Count >= 100 then Break;
  413. ADODataSet.Next;
  414. end;
  415. ADODataSet.Close;
  416. ADODataSet.CommandText := 'SELECT DISTINCT Receiver FROM Messages WHERE TeamID = ''-1''';
  417. ADODataSet.Open;
  418. while not ADODataSet.Eof do
  419. begin
  420. if Result.IndexOf(ADODataSet.FieldByName('Receiver').AsString) = -1 then
  421. Result.Add(ADODataSet.FieldByName('Receiver').AsString);
  422. if Result.Count >= 100 then Break;
  423. ADODataSet.Next;
  424. end;
  425. finally
  426. FreeAndNil(ADODataSet);
  427. end;
  428. end;
  429. //获取最近联系人列表
  430. function TRealICQDBHistory.GetLatests(AReceiver: String): TStringList;
  431. var
  432. ADODataSet: TADODataSet;
  433. begin
  434. AReceiver := AnsiReplaceStr(AReceiver, '''', '''''');
  435. Result := TStringList.Create;
  436. ADODataSet := TADODataSet.Create(nil);
  437. try
  438. ADODataSet.Connection := FADOConnection;
  439. ADODataSet.CommandText := 'SELECT Top 1000 Sender FROM Messages WHERE Receiver = ''' + AReceiver + ''' AND TeamID = ''-1'' ORDER BY SendDateTime DESC';
  440. ADODataSet.Open;
  441. while not ADODataSet.Eof do
  442. begin
  443. if Result.IndexOf(ADODataSet.FieldByName('Sender').AsString) = -1 then
  444. Result.Add(ADODataSet.FieldByName('Sender').AsString);
  445. if Result.Count >= 20 then Break;
  446. ADODataSet.Next;
  447. end;
  448. finally
  449. FreeAndNil(ADODataSet);
  450. end;
  451. end;
  452. //------------------------------------------------------------------------------
  453. function TRealICQDBHistory.GetSMSMessage(ASendDateTime: TDateTime; AMaxCount: Integer = 0; Page: Integer = 1; PageSize: Integer = 20): TDBHistorySearchResult;
  454. var
  455. SearchResult: TSMSMessageSearchResult;
  456. ADODataSet: TADODataSet;
  457. ADODataSetGetRecordCount: TADODataSet;
  458. Condition: String;
  459. begin
  460. Result := TDBHistorySearchResult.Create;
  461. Result.FMessages := TList.Create;
  462. Result.FRecordCount := 0;
  463. Result.FPageCount := 0;
  464. Result.FPageIndex := 0;
  465. ADODataSet := TADODataSet.Create(nil);
  466. ADODataSetGetRecordCount := TADODataSet.Create(nil);
  467. try
  468. ADODataSet.Connection := FADOConnection;
  469. ADODataSetGetRecordCount.Connection := FADOConnection;
  470. Condition := 'SendDateTime >= ' + FloatToStr(ASendDateTime);
  471. if AMaxCount > 0 then
  472. begin
  473. ADODataSet.CommandText := 'SELECT TOP ' + IntToStr(AMaxCount) + ' * FROM Messages WHERE (TeamID =''-2'' or TeamID =''-3'') and (' + Condition + ')';
  474. ADODataSet.CommandText := ADODataSet.CommandText + ' ORDER BY SendDateTime DESC';
  475. end
  476. else
  477. begin
  478. //-------------------------------------------------
  479. //获取符合条件的记录总数
  480. ADODataSetGetRecordCount.CommandText := 'SELECT COUNT(*) FROM Messages WHERE (TeamID =''-2'' or TeamID =''-3'') and (' + Condition + ')';
  481. ADODataSetGetRecordCount.Open;
  482. Result.FRecordCount := ADODataSetGetRecordCount.Fields[0].AsInteger;
  483. ADODataSetGetRecordCount.Close;
  484. if (Result.FRecordCount = 0) then Exit;
  485. //-------------------------------------------------
  486. //-------------------------------------------------
  487. //计算总的页数
  488. if (Result.FRecordCount mod PageSize = 0) then
  489. Result.FPageCount := Result.FRecordCount div PageSize
  490. else
  491. Result.FPageCount := (Result.FRecordCount div PageSize) + 1;
  492. //-------------------------------------------------
  493. //-------------------------------------------------
  494. //设置PageIndex的值
  495. if (Page < 1) then Page := 1;
  496. if (Page > Result.FPageCount) then Page := Result.FPageCount;
  497. Result.FPageIndex := page;
  498. //-------------------------------------------------
  499. ADODataSet.CommandText := GetPaginationSelectQuery(Condition, 'Messages',
  500. Result.FRecordCount, Result.FPageCount, Result.FPageIndex, PageSize);
  501. end;
  502. ADODataSet.Open;
  503. while not ADODataSet.Eof do
  504. begin
  505. SearchResult := TSMSMessageSearchResult.Create;
  506. SearchResult.FID := ADODataSet.FieldByName('ID').AsInteger;
  507. SearchResult.FSender := ADODataSet.FieldByName('Sender').AsString;
  508. SearchResult.FReceiver := ADODataSet.FieldByName('Receiver').AsString;
  509. SearchResult.FSendDateTime := ADODataSet.FieldByName('SendDateTime').AsDateTime;
  510. try
  511. SearchResult.FContent := DESryStrHex(ADODataSet.FieldByName('Content').AsString, FDesKey);
  512. except
  513. FreeAndNil(SearchResult);
  514. Continue;
  515. end;
  516. Result.Messages.Add(SearchResult);
  517. ADODataSet.Next;
  518. end;
  519. finally
  520. FreeAndNil(ADODataSet);
  521. end;
  522. end;
  523. //------------------------------------------------------------------------------
  524. function TRealICQDBHistory.GetMessage(ATeamID: String; ASender, AReceiver: String;
  525. ASendDateTime: TDateTime; AMaxCount: Integer = 0; Page: Integer = 1; PageSize: Integer = 20): TDBHistorySearchResult;
  526. var
  527. SearchResult: TMessageSearchResult;
  528. ADODataSet: TADODataSet;
  529. ADODataSetGetRecordCount: TADODataSet;
  530. Condition: String;
  531. begin
  532. ASender := AnsiReplaceStr(ASender, '''', '''''');
  533. AReceiver := AnsiReplaceStr(AReceiver, '''', '''''');
  534. Result := TDBHistorySearchResult.Create;
  535. Result.FMessages := TList.Create;
  536. Result.FRecordCount := 0;
  537. Result.FPageCount := 0;
  538. Result.FPageIndex := 0;
  539. ADODataSet := TADODataSet.Create(nil);
  540. ADODataSetGetRecordCount := TADODataSet.Create(nil);
  541. try
  542. ADODataSet.Connection := FADOConnection;
  543. ADODataSetGetRecordCount.Connection := FADOConnection;
  544. if ATeamID = '-1' then
  545. Condition := '(TeamID = ''-5'' or TeamID = ''-1'') AND SendDateTime >= ' + FloatToStr(ASendDateTime)
  546. else if ATeamID = '-2' then
  547. Condition := '(TeamID = ''-2'' or TeamID = ''-1'' or TeamID = ''-5'') AND SendDateTime >= ' + FloatToStr(ASendDateTime)
  548. else
  549. Condition := 'TeamID=''' + ATeamID + ''' AND SendDateTime >= ' + FloatToStr(ASendDateTime);
  550. try
  551. if (StrToInt(ATeamID) <= 0) and (StrToInt(ATeamID) <> -3) then
  552. begin
  553. Condition := Condition + ' AND ((Sender=''' + ASender + ''' AND Receiver=''' + AReceiver + ''')';
  554. Condition := Condition + ' OR (Receiver=''' + ASender + ''' AND Sender=''' + AReceiver + '''))';
  555. end;
  556. except
  557. end;
  558. if AMaxCount > 0 then
  559. begin
  560. ADODataSet.CommandText := 'SELECT TOP ' + IntToStr(AMaxCount) + ' * FROM Messages WHERE ' + Condition;
  561. ADODataSet.CommandText := ADODataSet.CommandText + ' ORDER BY ID DESC';
  562. end
  563. else
  564. begin
  565. //-------------------------------------------------
  566. //获取符合条件的记录总数
  567. ADODataSetGetRecordCount.CommandText := 'SELECT COUNT(*) FROM Messages WHERE ' + Condition;
  568. ADODataSetGetRecordCount.Open;
  569. Result.FRecordCount := ADODataSetGetRecordCount.Fields[0].AsInteger;
  570. ADODataSetGetRecordCount.Close;
  571. if (Result.FRecordCount = 0) then Exit;
  572. //-------------------------------------------------
  573. //-------------------------------------------------
  574. //计算总的页数
  575. if (Result.FRecordCount mod PageSize = 0) then
  576. Result.FPageCount := Result.FRecordCount div PageSize
  577. else
  578. Result.FPageCount := (Result.FRecordCount div PageSize) + 1;
  579. //-------------------------------------------------
  580. //-------------------------------------------------
  581. //设置PageIndex的值
  582. if (Page < 1) then Page := 1;
  583. if (Page > Result.FPageCount) then Page := Result.FPageCount;
  584. Result.FPageIndex := page;
  585. //-------------------------------------------------
  586. ADODataSet.CommandText := GetPaginationSelectQuery(Condition, 'Messages',
  587. Result.FRecordCount, Result.FPageCount, Result.FPageIndex, PageSize);
  588. end;
  589. ADODataSet.Open;
  590. while not ADODataSet.Eof do
  591. begin
  592. SearchResult := TMessageSearchResult.Create;
  593. SearchResult.FID := ADODataSet.FieldByName('ID').AsInteger;
  594. SearchResult.FTeamID := Trim(ADODataSet.FieldByName('TeamID').AsString);
  595. SearchResult.FSender := ADODataSet.FieldByName('Sender').AsString;
  596. SearchResult.FReceiver := ADODataSet.FieldByName('Receiver').AsString;
  597. SearchResult.FSendDateTime := ADODataSet.FieldByName('SendDateTime').AsFloat;
  598. FDesKey := Copy(MD5En(FLoginName), 25, 8);
  599. SearchResult.FFont := ADODataSet.FieldByName('Font').AsString;
  600. try
  601. SearchResult.FMessage := DESryStrHex(ADODataSet.FieldByName('Message').AsString, FDesKey);
  602. except
  603. FreeAndNil(SearchResult);
  604. Continue;
  605. end;
  606. Result.FMessages.Add(SearchResult);
  607. ADODataSet.Next;
  608. end;
  609. finally
  610. FDesKey := Copy(MD5En(FLoginName), 25, 8);
  611. FreeAndNil(ADODataSetGetRecordCount);
  612. FreeAndNil(ADODataSet);
  613. end;
  614. end;
  615. //------------------------------------------------------------------------------
  616. procedure TRealICQDBHistory.SaveSMSMessage(ASender, AReceiver: String;
  617. ASendDateTime: TDateTime; AContent: String; AMessageType: Integer);
  618. var
  619. ADOQuery: TADOQuery;
  620. begin
  621. ADOQuery := TADOQuery.Create(nil);
  622. try
  623. ADOQuery.Connection := FADOConnection;
  624. ADOQuery.SQL.Add('INSERT INTO Messages ('
  625. + 'TeamID,'
  626. + '[Sender],'
  627. + '[Receiver],'
  628. + 'SendDateTime,'
  629. + 'Font,'
  630. + 'Message) VALUES ('
  631. + '''' + IntToStr(AMessageType) + ''','
  632. + '''' + AnsiReplaceStr(ASender, '''', '''''') + ''','
  633. + '''' + AnsiReplaceStr(AReceiver, '''', '''''') + ''','
  634. + FloatToStr(ASendDateTime) + ','
  635. + ''''','
  636. + '''' + EncryStrHex(AContent, FDesKey) + ''')');
  637. ADOQuery.ExecSQL;
  638. finally
  639. FreeAndNil(ADOQuery);
  640. end;
  641. end;
  642. //------------------------------------------------------------------------------
  643. procedure TRealICQDBHistory.SaveMessage(ATeamID: String; ASender, AReceiver: String;
  644. ASendDateTime: TDateTime; AFont: String; AMessage: String);
  645. var
  646. ADOQuery: TADOQuery;
  647. begin
  648. ADOQuery := TADOQuery.Create(nil);
  649. try
  650. ADOQuery.Connection := FADOConnection;
  651. ADOQuery.SQL.Add('INSERT INTO Messages ('
  652. + 'TeamID,'
  653. + '[Sender],'
  654. + '[Receiver],'
  655. + 'SendDateTime,'
  656. + 'Font,'
  657. + 'Message) VALUES ('
  658. + '''' + ATeamID + ''','
  659. + '''' + AnsiReplaceStr(ASender, '''', '''''') + ''','
  660. + '''' + AnsiReplaceStr(AReceiver, '''', '''''') + ''','
  661. + FloatToStr(ASendDateTime) + ','
  662. + '''' + AnsiReplaceStr(AFont, '''', '''''') + ''','
  663. + '''' + EncryStrHex(AMessage, FDesKey) + ''')');
  664. ADOQuery.ExecSQL;
  665. finally
  666. FreeAndNil(ADOQuery);
  667. end;
  668. end;
  669. //------------------------------------------------------------------------------
  670. procedure TRealICQDBHistory.SaveSystemMessage(AMessageID: Integer;
  671. AMessageType: TRealICQSystemMessageType;
  672. APositionType: TRealICQSystemMessagePosition;
  673. ALeft, ATop, AWidth, AHeight: Integer;
  674. ATitle, AContent, AUrl: String;
  675. AAutoCloseTime: Integer);
  676. var
  677. ADOQuery: TADOQuery;
  678. begin
  679. ADOQuery := TADOQuery.Create(nil);
  680. try
  681. ADOQuery.Connection := FADOConnection;
  682. ADOQuery.SQL.Add('INSERT INTO SystemMessages ('
  683. + 'MessageID,'
  684. + 'MessageType,'
  685. + 'PositionType,'
  686. + '[Left],'
  687. + '[Top],'
  688. + '[Width],'
  689. + '[Height],'
  690. + '[Title],'
  691. + '[Content],'
  692. + '[Url],'
  693. + 'AutoCloseTime,'
  694. + 'SendDateTime) VALUES ('
  695. + IntToStr(AMessageID) + ','
  696. + IntToStr(Byte(AMessageType)) + ','
  697. + IntToStr(Byte(APositionType)) + ','
  698. + IntToStr(ALeft) + ','
  699. + IntToStr(ATop) + ','
  700. + IntToStr(AWidth) + ','
  701. + IntToStr(AHeight) + ','
  702. + '''' + EncryStrHex(ATitle, FDesKey) + ''','
  703. + '''' + EncryStrHex(AContent, FDesKey) + ''','
  704. + '''' + EncryStrHex(AUrl, FDesKey) + ''','
  705. + IntToStr(AAutoCloseTime) + ','
  706. + FloatToStr(Now) + ')');
  707. ADOQuery.ExecSQL;
  708. finally
  709. FreeAndNil(ADOQuery);
  710. end;
  711. end;
  712. //------------------------------------------------------------------------------
  713. procedure TRealICQDBHistory.SetLoginName(Value: String);
  714. begin
  715. FLoginName := Value;
  716. if Pos('+', FLoginName) > 0 then FLoginName := Copy(FLoginName, Pos('+', FLoginName) + 1, Length(FLoginName));
  717. end;
  718. //------------------------------------------------------------------------------
  719. procedure TRealICQDBHistory.SetDBFileName(Value: String);
  720. begin
  721. FDBFileName := Value;
  722. try
  723. if FADOConnection.Connected then FADOConnection.Close;
  724. except
  725. end;
  726. if FDBFileName = '' then Exit;
  727. FADOConnection.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; ' +
  728. 'Data Source=' + FDBFileName + ';';
  729. FADOConnection.Open;
  730. FDesKey := Copy(MD5En(FLoginName), 25, 8);
  731. //CheckFieldTeamID;
  732. end;
  733. //------------------------------------------------------------------------------
  734. procedure TRealICQDBHistory.CheckFieldTeamID;
  735. var
  736. ADOCommand: TADOCommand;
  737. begin
  738. try
  739. ADOCommand := TADOCommand.Create(nil);
  740. try
  741. ADOCommand.Connection := FADOConnection;
  742. ADOCommand.CommandText := 'ALTER TABLE Messages ALTER COLUMN TeamID Char';
  743. ADOCommand.Execute;
  744. finally
  745. ADOCommand.Free;
  746. end;
  747. except
  748. end;
  749. end;
  750. //------------------------------------------------------------------------------
  751. procedure TRealICQDBHistory.RestoreMessageHistory(ADBFileName: String);
  752. var
  753. AADOConnection: TADOConnection;
  754. ADODataSet: TADODataSet;
  755. ADODataSet1: TADODataSet;
  756. ADOQuery: TADOQuery;
  757. ATeamID: String;
  758. ASender: String;
  759. AReceiver: String;
  760. ASendDateTime: TDateTime;
  761. AFont: String;
  762. AMessage: String;
  763. SearchResult: TSystemMessageSearchResult;
  764. begin
  765. try
  766. AADOConnection := TADOConnection.Create(nil);
  767. ADODataSet := TADODataSet.Create(nil);
  768. ADODataSet1 := TADODataSet.Create(nil);
  769. ADOQuery := TADOQuery.Create(nil);
  770. AADOConnection.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; ' +
  771. 'Data Source=' + ADBFileName + ';';
  772. AADOConnection.Open;
  773. ADOQuery.Connection := FADOConnection;
  774. ADODataSet1.Connection := FADOConnection;
  775. ADODataSet.Connection := AADOConnection;
  776. ADODataSet.CommandText := 'SELECT * FROM Messages';
  777. ADODataSet.Open;
  778. while not ADODataSet.Eof do
  779. begin
  780. ATeamID := ADODataSet.FieldByName('TeamID').AsString;
  781. ASender:= ADODataSet.FieldByName('Sender').AsString;
  782. AReceiver := ADODataSet.FieldByName('Receiver').AsString;
  783. ASendDateTime := ADODataSet.FieldByName('SendDateTime').AsFloat;
  784. AFont := ADODataSet.FieldByName('Font').AsString;
  785. AMessage := ADODataSet.FieldByName('Message').AsString;
  786. ADODataSet1.CommandText := 'Select ID From Messages Where '
  787. + 'SendDateTime = ' + FloatToStr(ASendDateTime)
  788. + ' and Message = ''' + AMessage + '''';
  789. ADODataSet1.Open;
  790. if ADODataSet1.Eof then
  791. begin
  792. ADOQuery.SQL.Clear;
  793. ADOQuery.SQL.Add('INSERT INTO Messages ('
  794. + 'TeamID,'
  795. + '[Sender],'
  796. + '[Receiver],'
  797. + 'SendDateTime,'
  798. + 'Font,'
  799. + 'Message) VALUES ('
  800. + '''' + ATeamID + ''','
  801. + '''' + AnsiReplaceStr(ASender, '''', '''''') + ''','
  802. + '''' + AnsiReplaceStr(AReceiver, '''', '''''') + ''','
  803. + FloatToStr(ASendDateTime) + ','
  804. + '''' + AnsiReplaceStr(AFont, '''', '''''') + ''','
  805. + '''' + AMessage + ''')');
  806. try
  807. ADOQuery.ExecSQL;
  808. except
  809. end;
  810. end;
  811. ADODataSet1.Close;
  812. ADODataSet.Next;
  813. end;
  814. ADODataSet.Close;
  815. ADODataSet.CommandText := 'SELECT * FROM SystemMessages';
  816. ADODataSet.Open;
  817. while not ADODataSet.Eof do
  818. begin
  819. SearchResult := TSystemMessageSearchResult.Create;
  820. SearchResult.FID := ADODataSet.FieldByName('ID').AsInteger;
  821. SearchResult.FMessageID := ADODataSet.FieldByName('MessageID').AsInteger;
  822. SearchResult.FMessageType := TRealICQSystemMessageType(ADODataSet.FieldByName('MessageType').AsInteger);
  823. SearchResult.FPositionType := TRealICQSystemMessagePosition(ADODataSet.FieldByName('PositionType').AsInteger);
  824. SearchResult.FLeft := ADODataSet.FieldByName('Left').AsInteger;
  825. SearchResult.FTop := ADODataSet.FieldByName('Top').AsInteger;
  826. SearchResult.FWidth := ADODataSet.FieldByName('Width').AsInteger;
  827. SearchResult.FHeight := ADODataSet.FieldByName('Height').AsInteger;
  828. SearchResult.FAutoCloseTime := ADODataSet.FieldByName('AutoCloseTime').AsInteger;
  829. SearchResult.FSendDateTime := ADODataSet.FieldByName('SendDateTime').AsFloat;
  830. SearchResult.FTitle := ADODataSet.FieldByName('Title').AsString;
  831. SearchResult.FContent := ADODataSet.FieldByName('Content').AsString;
  832. SearchResult.FUrl := ADODataSet.FieldByName('Url').AsString;
  833. ADODataSet1.CommandText := 'Select ID From SystemMessages Where '
  834. + 'SendDateTime = ' + FloatToStr(SearchResult.FSendDateTime)
  835. + ' and MessageID = ' + IntToStr(Integer(SearchResult.FMessageID));
  836. ADODataSet1.Open;
  837. if ADODataSet1.Eof then
  838. begin
  839. ADOQuery.SQL.Clear;
  840. ADOQuery.SQL.Add('INSERT INTO SystemMessages ('
  841. + 'MessageID,'
  842. + 'MessageType,'
  843. + 'PositionType,'
  844. + '[Left],'
  845. + '[Top],'
  846. + '[Width],'
  847. + '[Height],'
  848. + '[Title],'
  849. + '[Content],'
  850. + '[Url],'
  851. + 'AutoCloseTime,'
  852. + 'SendDateTime) VALUES ('
  853. + IntToStr(SearchResult.FMessageID) + ','
  854. + IntToStr(Byte(SearchResult.FMessageType)) + ','
  855. + IntToStr(Byte(SearchResult.FPositionType)) + ','
  856. + IntToStr(SearchResult.FLeft) + ','
  857. + IntToStr(SearchResult.FTop) + ','
  858. + IntToStr(SearchResult.FWidth) + ','
  859. + IntToStr(SearchResult.FHeight) + ','
  860. + '''' + SearchResult.FTitle + ''','
  861. + '''' + SearchResult.FContent + ''','
  862. + '''' + SearchResult.FUrl + ''','
  863. + IntToStr(SearchResult.FAutoCloseTime) + ','
  864. + FloatToStr(SearchResult.FSendDateTime) + ')');
  865. FreeAndNil(SearchResult);
  866. try
  867. ADOQuery.ExecSQL;
  868. except
  869. end;
  870. end;
  871. ADODataSet1.Close;
  872. ADODataSet.Next;
  873. end;
  874. ADODataSet.Close;
  875. finally
  876. FreeAndNil(ADOQuery);
  877. FreeAndNil(ADODataSet);
  878. FreeAndNil(ADODataSet1);
  879. if AADOConnection.Connected then AADOConnection.Close;
  880. FreeAndNil(AADOConnection);
  881. end;
  882. end;
  883. //------------------------------------------------------------------------------
  884. constructor TRealICQDBHistory.Create;
  885. begin
  886. FADOConnection := TADOConnection.Create(nil);
  887. end;
  888. //------------------------------------------------------------------------------
  889. destructor TRealICQDBHistory.Destroy;
  890. begin
  891. try
  892. try
  893. if FADOConnection.Connected then FADOConnection.Close;
  894. except
  895. end;
  896. FreeAndNil(FADOConnection);
  897. finally
  898. inherited Destroy;
  899. end;
  900. end;
  901. end.