HashDBProvider.pas 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. unit HashDBProvider;
  2. interface
  3. uses
  4. System.Classes, BaseDataProvider, InterfaceDataProvider, WideStrings;
  5. type
  6. THashDBProvider = class(TBaseDataProvider, IHashProvider)
  7. private
  8. protected
  9. function GetTableName: string; override;
  10. function GetCreateTableSQL: string; override;
  11. function GetSQL(ASQL: string): string; virtual;
  12. public
  13. procedure Insert(AKey, AValue: WideString); overload; stdcall;
  14. procedure Insert(AKey, AValue: WideString; AVersion: Integer); overload; virtual; stdcall;
  15. procedure Insert(AHashs: TKeyValues); overload; virtual; stdcall;
  16. procedure Insert(AHash: TKeyValue); overload; stdcall;
  17. function Find(AKey: WideString): WideString; overload; stdcall;
  18. function FindKeyValue(AKey: WideString): TKeyValue; overload; virtual; stdcall;
  19. function FindAll: TWideStrings; stdcall;
  20. function Find(AKeys: array of WideString): TKeyValues; overload; virtual; stdcall;
  21. function FindLike(AKey: WideString): TStrings; stdcall;
  22. procedure Delete(AKey: WideString); stdcall;
  23. procedure DeleteAll; stdcall;
  24. procedure DestroyResult(AObject: TStrings); overload;
  25. end;
  26. implementation
  27. uses
  28. FireDAC.Comp.Client, BaseDataModule, System.SysUtils, System.VarUtils, System.Variants,
  29. Data.DB, LoggerImport, MD5_32;
  30. const
  31. TABLE_NAME: string = 'DefaultHash';
  32. CREATE_TABLE: string = 'CREATE TABLE %s('+
  33. 'Key Text, ' +
  34. 'Value Text, ' +
  35. 'MD5 Text, ' +
  36. 'Version Integer, ' +
  37. 'CreateTime Double)';
  38. INSERT_SQL: string = 'INSERT INTO %s(Key, Value, MD5, Version, CreateTime) VALUES(:key, :value, :md5, :version, :createTime)';
  39. DELETE_SQL: string = 'DELETE FROM %s WHERE Key = :key';
  40. DELETE_ALL_SQL: string = 'DELETE FROM %s WHERE';
  41. SELECT_SQL: string = 'SELECT Key, Value, Version FROM %s WHERE Key = :key';
  42. SELECT_ALL_SQL: string = 'SELECT Key, Value, Version FROM %s';
  43. SELECT_LIKE_SQL: string = 'SELECT Key, Value, Version FROM %s WHERE Key = %s';
  44. SELECT_BY_VERSION_SQL: string = 'SELECT Value FROM %s WHERE Key = :key and Version =:version';
  45. { TAppIconProvider }
  46. procedure THashDBProvider.Delete(AKey: WideString);
  47. var
  48. AConnection: TFDCustomConnection;
  49. begin
  50. if (AKey = '') then
  51. Exit;
  52. if not Inited and not ReInit then
  53. Exit;
  54. AConnection := BaseDataModel.GetConnection;
  55. try
  56. AConnection.Connected := True;
  57. AConnection.ExecSQL(GetSQL(DELETE_SQL), [AKey]);
  58. finally
  59. BaseDataModel.GiveBackConnection(AConnection);
  60. end;
  61. end;
  62. procedure THashDBProvider.DeleteAll;
  63. var
  64. AConnection: TFDCustomConnection;
  65. begin
  66. if not Inited and not ReInit then
  67. Exit;
  68. AConnection := BaseDataModel.GetConnection;
  69. try
  70. AConnection.Connected := True;
  71. AConnection.ExecSQL(GetSQL(DELETE_ALL_SQL));
  72. finally
  73. BaseDataModel.GiveBackConnection(AConnection);
  74. end;
  75. end;
  76. procedure THashDBProvider.DestroyResult(AObject: TStrings);
  77. begin
  78. if AObject <> nil then
  79. begin
  80. AObject.Clear;
  81. FreeAndNil(AObject);
  82. end;
  83. end;
  84. function THashDBProvider.FindKeyValue(AKey: WideString): TKeyValue;
  85. var
  86. AQuery: TFDQuery;
  87. ACode: string;
  88. begin
  89. Result[0] := '';
  90. Result[1] := '';
  91. Result[2] := '0';
  92. if not Inited and not ReInit then
  93. Exit;
  94. if (AKey = '') then
  95. Exit;
  96. ACode := Format('THashDBProvider.Find(%s)', [AKey]);
  97. try
  98. AQuery := BaseDataModel.GetQuery;
  99. AQuery.Connection.Connected := True;
  100. AQuery.Open(GetSQL(SELECT_SQL), [AKey]);
  101. AQuery.First;
  102. if not AQuery.Eof then
  103. begin
  104. Result[0] := AKey;
  105. Result[1] := AQuery.FieldByName('Value').AsString;
  106. Result[2] := IntToStr(AQuery.FieldByName('Version').AsInteger);
  107. end;
  108. except
  109. on E: Exception do
  110. begin
  111. Error(E.Message, ACode);
  112. BaseDataModel.GiveBackQuery(AQuery);
  113. end;
  114. end;
  115. BaseDataModel.GiveBackQuery(AQuery);
  116. end;
  117. function THashDBProvider.Find(AKey: WideString): WideString;
  118. begin
  119. Result := FindKeyValue(AKey)[1];
  120. end;
  121. procedure THashDBProvider.Insert(AKey, AValue: WideString);
  122. begin
  123. Insert(AKey, AValue, 0);
  124. end;
  125. function THashDBProvider.FindAll: TWideStrings;
  126. var
  127. AQuery: TFDQuery;
  128. begin
  129. if not Inited and not ReInit then
  130. Exit;
  131. try
  132. AQuery := BaseDataModel.GetQuery;
  133. AQuery.Connection.Connected := True;
  134. AQuery.Open(GetSQL(SELECT_ALL_SQL));
  135. AQuery.First;
  136. Result := TWideStringList.Create;
  137. while not AQuery.Eof do
  138. begin
  139. Result.Add(AQuery.FieldByName('Value').AsString);
  140. AQuery.Next;
  141. end;
  142. except
  143. on E: Exception do
  144. begin
  145. Error(E.Message, 'THashDBProvider.FindAll');
  146. DestroyResult(TObject(Result));
  147. BaseDataModel.GiveBackQuery(AQuery);
  148. end;
  149. end;
  150. BaseDataModel.GiveBackQuery(AQuery);
  151. end;
  152. function THashDBProvider.Find(AKeys: array of WideString): TKeyValues;
  153. var
  154. AQuery: TFDQuery;
  155. ALen: Cardinal;
  156. iLoop,
  157. jLoop: Integer;
  158. begin
  159. if not Inited and not ReInit then
  160. Exit;
  161. ALen := Length(AKeys);
  162. if (ALen = 0) then
  163. Exit;
  164. try
  165. AQuery := BaseDataModel.GetQuery;
  166. AQuery.Connection.Connected := True;
  167. AQuery.FetchOptions.AutoClose := False;
  168. for iLoop := 0 to ALen - 1 do
  169. begin
  170. AQuery.SQL.Add(GetSql(SELECT_ALL_SQL) + ' WHERE KEY = "' + AKeys[iLoop] + '";');
  171. end;
  172. SetLength(Result, ALen);
  173. jLoop := 0;
  174. AQuery.Open;
  175. for iLoop := 0 to ALen - 1 do
  176. begin
  177. if AQuery.Eof then
  178. begin
  179. AQuery.NextRecordSet;
  180. continue;
  181. end;
  182. Result[jLoop][0] := AQuery.FieldByName('Key').AsString;
  183. Result[jLoop][1] := AQuery.FieldByName('Value').AsString;
  184. Result[jLoop][2] := IntToStr(AQuery.FieldByName('Version').AsInteger);
  185. inc(jLoop);
  186. AQuery.NextRecordSet;
  187. end;
  188. if jLoop < ALen then
  189. SetLength(Result, jLoop);//Result := Copy(Result, 0, jLoop);
  190. except
  191. on E: Exception do
  192. begin
  193. Error(E.Message, 'THashDBProvider.Insert');
  194. BaseDataModel.GiveBackQuery(AQuery);
  195. SetLength(Result, 0);
  196. end;
  197. end;
  198. BaseDataModel.GiveBackQuery(AQuery);
  199. Success(Format('查询出%d条数据.', [jLoop]), 'THashDBProvider.Find');
  200. end;
  201. function THashDBProvider.FindLike(AKey: WideString): TStrings;
  202. var
  203. ASQL: string;
  204. var
  205. AQuery: TFDQuery;
  206. begin
  207. if not Inited and not ReInit then
  208. Exit;
  209. if (AKey = '') then
  210. Exit;
  211. ASQL := GetSQL(SELECT_ALL_SQL) + Format(' WHERE Key = %s', [AKey]);
  212. try
  213. AQuery := BaseDataModel.GetQuery;
  214. AQuery.Connection.Connected := True;
  215. AQuery.Open(ASQL);
  216. AQuery.First;
  217. Result := TStringList.Create;
  218. while not AQuery.Eof do
  219. begin
  220. Result.Add(AQuery.FieldByName('Value').AsString);
  221. AQuery.Next;
  222. end;
  223. except
  224. on E: Exception do
  225. begin
  226. Error(E.Message, 'THashDBProvider.FindLike');
  227. DestroyResult(TObject(Result));
  228. BaseDataModel.GiveBackQuery(AQuery);
  229. end;
  230. end;
  231. BaseDataModel.GiveBackQuery(AQuery);
  232. end;
  233. function THashDBProvider.GetCreateTableSQL: string;
  234. begin
  235. Result := GetSQL(CREATE_TABLE);
  236. end;
  237. function THashDBProvider.GetSQL(ASQL: string): string;
  238. begin
  239. Result := Format(ASQL, [GetTableName]);
  240. end;
  241. function THashDBProvider.GetTableName: string;
  242. begin
  243. Result := TABLE_NAME;
  244. end;
  245. procedure THashDBProvider.Insert(AKey, AValue: WideString; AVersion: Integer);
  246. var
  247. AConnection: TFDCustomConnection;
  248. ALen: Cardinal;
  249. begin
  250. if not Inited and not ReInit then
  251. Exit;
  252. ALen := Length(AValue);
  253. if (AKey = '') or (ALen = 0) then
  254. Exit;
  255. AConnection := BaseDataModel.GetConnection;
  256. try
  257. AConnection.Connected := True;
  258. AConnection.ExecSQL(GetSQL(DELETE_SQL), [AKey]);
  259. AConnection.ExecSQL(GetSQL(INSERT_SQL), [AKey, AValue, MD5Print(MD5String(AValue)), AVersion, Now]);
  260. except
  261. on E: Exception do
  262. begin
  263. BaseDataModel.GiveBackConnection(AConnection);
  264. ERROR(E.Message, 'THashDBProvider.Insert');
  265. end;
  266. end;
  267. BaseDataModel.GiveBackConnection(AConnection);
  268. Success(Format('AKey:%s', [AKey]), 'THashDBProvider.Insert');
  269. end;
  270. procedure THashDBProvider.Insert(AHash: TKeyValue);
  271. begin
  272. Insert(AHash[0], AHash[1], StrToIntDef(AHash[2], -1));
  273. end;
  274. procedure THashDBProvider.Insert(AHashs: TKeyValues);
  275. var
  276. AQuery: TFDQuery;
  277. ALen: Cardinal;
  278. iLoop: Integer;
  279. begin
  280. if not Inited and not ReInit then
  281. Exit;
  282. ALen := Length(AHashs);
  283. if (ALen = 0) then
  284. Exit;
  285. if ALen = 1 then
  286. begin
  287. Insert(AHashs[0]);
  288. Exit;
  289. end;
  290. try
  291. AQuery := BaseDataModel.GetQuery;
  292. AQuery.Connection.Connected := True;
  293. AQuery.FetchOptions.AutoClose := False;
  294. AQuery.SQL.Text := GetSQL(INSERT_SQL);
  295. AQuery.Params.ArraySize := ALen;
  296. for iLoop := 0 to ALen - 1 do
  297. begin
  298. //:key, :value, :md5, :version, :createTime
  299. AQuery.Params[0].AsStrings[iLoop] := AHashs[iLoop][0];
  300. AQuery.Params[1].AsStrings[iLoop] := AHashs[iLoop][1];
  301. AQuery.Params[2].AsStrings[iLoop] := MD5Print(MD5String(AHashs[iLoop][1]));
  302. AQuery.Params[3].AsIntegers[iLoop] := StrToIntDef(AHashs[iLoop][2], -1);
  303. AQuery.Params[4].AsFloats[iLoop] := Now;
  304. end;
  305. AQuery.Execute(ALen, 0);
  306. AQuery.NextRecordSet;
  307. except
  308. on E: Exception do
  309. begin
  310. Error(E.Message, 'THashDBProvider.Insert');
  311. BaseDataModel.GiveBackQuery(AQuery);
  312. end;
  313. end;
  314. BaseDataModel.GiveBackQuery(AQuery);
  315. Success(Format('批量插入%d条数据.', [ALen]), 'THashDBProvider.Insert');
  316. end;
  317. end.