UPCRPCFileUtils.pas 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. unit UPCRPCFileUtils;
  2. { Copyright (c) 2020 by PascalCoin developers, orignal code by Albert Molina
  3. Distributed under the MIT software license, see the accompanying file LICENSE
  4. or visit http://www.opensource.org/licenses/mit-license.php.
  5. This unit is a part of the PascalCoin Project, an infinitely scalable
  6. cryptocurrency. Find us here:
  7. Web: https://www.pascalcoin.org
  8. Source: https://github.com/PascalCoin/PascalCoin
  9. If you like it, consider a donation using Bitcoin:
  10. 16K3HCZRhFUtM8GdWRcfKeaa6KsuyxZaYk
  11. THIS LICENSE HEADER MUST NOT BE REMOVED.
  12. }
  13. {$IFDEF FPC}
  14. {$MODE Delphi}
  15. {$ENDIF}
  16. interface
  17. {$I ./../config.inc}
  18. Uses classes, SysUtils,
  19. UJSONFunctions, URPC, UCrypto, ULog,
  20. {$IFDEF USE_ABSTRACTMEM}
  21. UPCAbstractMem, UPCAbstractMemAccountKeys,
  22. {$ENDIF}
  23. {$IFNDEF FPC}System.Generics.Collections{$ELSE}Generics.Collections{$ENDIF},
  24. UBlockChain, UPCOrderedLists;
  25. Type
  26. { TRPCFileUtils }
  27. TRPCFileUtils = Class
  28. private
  29. public
  30. class function SaveAsSafeboxStream(const ASender : TRPCProcess; const AMethodName : String; AInputParams, AJSONResponse : TPCJSONObject; var AErrorNum : Integer; var AErrorDesc : String) : Boolean;
  31. class function GenerateNewAbstractMemSafebox(const ASender : TRPCProcess; const AMethodName : String; AInputParams, AJSONResponse : TPCJSONObject; var AErrorNum : Integer; var AErrorDesc : String) : Boolean;
  32. class function AbstractMemStats(const ASender : TRPCProcess; const AMethodName : String; AInputParams, AJSONResponse : TPCJSONObject; var AErrorNum : Integer; var AErrorDesc : String) : Boolean;
  33. End;
  34. implementation
  35. uses UPCDataTypes, UFileStorage, UNode;
  36. { TRPCFileUtils }
  37. class function TRPCFileUtils.GenerateNewAbstractMemSafebox(
  38. const ASender: TRPCProcess; const AMethodName: String; AInputParams,
  39. AJSONResponse: TPCJSONObject; var AErrorNum: Integer;
  40. var AErrorDesc: String): Boolean;
  41. {$IFDEF USE_ABSTRACTMEM}
  42. var
  43. LFileName : String;
  44. {$ENDIF}
  45. begin
  46. if Not ASender.RPCServer.AllowUsePrivateKeys then begin
  47. AErrorNum := CT_RPC_ErrNum_NotAllowedCall;
  48. Exit(False);
  49. end;
  50. {$IFDEF USE_ABSTRACTMEM}
  51. LFileName := AInputParams.AsString('filename', '').Trim;
  52. if (LFileName='') then begin
  53. LFileName := TFileStorage.GetSafeboxCheckpointingFileName(TFileStorage(TNode.Node.Bank.Storage).DatabaseFolder,TNode.Node.Bank.BlocksCount);
  54. end;
  55. TNode.Node.Bank.SafeBox.SaveCheckpointing(LFileName);
  56. AJSONResponse.GetAsObject('result').GetAsVariant('filename').Value := LFileName;
  57. AErrorNum := 0;
  58. AErrorDesc := '';
  59. Result := True;
  60. {$ELSE}
  61. AErrorNum := CT_RPC_ErrNum_NotImplemented;
  62. AErrorDesc := 'AbstractMem library is not available in this build';
  63. Result := False;
  64. {$ENDIF}
  65. end;
  66. class function TRPCFileUtils.AbstractMemStats(const ASender: TRPCProcess;
  67. const AMethodName: String; AInputParams, AJSONResponse: TPCJSONObject;
  68. var AErrorNum: Integer; var AErrorDesc: String): Boolean;
  69. var LStrings, LReport : TStrings;
  70. LTotalUsedSize, LTotalUsedBlocksCount, LTotalLeaksSize, LTotalLeaksBlocksCount : Integer;
  71. i, nMax : Integer;
  72. Lobj : TPCJSONObject;
  73. Larray : TPCJSONArray;
  74. begin
  75. if Not ASender.RPCServer.AllowUsePrivateKeys then begin
  76. AErrorNum := CT_RPC_ErrNum_NotAllowedCall;
  77. Exit(False);
  78. end;
  79. {$IFDEF USE_ABSTRACTMEM}
  80. LStrings := TStringList.Create;
  81. Try
  82. if AInputParams.GetAsVariant('report').AsBoolean(False) then LReport := LStrings
  83. else LReport := Nil;
  84. Lobj := AJSONResponse.GetAsObject('result').GetAsObject('abstractmem');
  85. if TNode.Node.Bank.SafeBox.PCAbstractMem.AbstractMem.CheckConsistency(LReport, LTotalUsedSize, LTotalUsedBlocksCount, LTotalLeaksSize, LTotalLeaksBlocksCount) then begin
  86. Lobj.GetAsVariant('checkconsistency').Value := True;
  87. end else begin
  88. Lobj.GetAsVariant('checkconsistency').Value := False;
  89. end;
  90. Lobj.GetAsVariant('total_used_size').Value := LTotalUsedSize;
  91. Lobj.GetAsVariant('total_used_blocks_count').Value := LTotalUsedBlocksCount;
  92. Lobj.GetAsVariant('total_leaks_size').Value := LTotalLeaksSize;
  93. Lobj.GetAsVariant('total_leaks_blocks_count').Value := LTotalLeaksBlocksCount;
  94. if Assigned(LReport) then begin
  95. Larray := Lobj.GetAsArray('report');
  96. i := AInputParams.GetAsVariant('report_start').AsInteger(0);
  97. nMax := AInputParams.GetAsVariant('report_max').AsInteger(100);
  98. while (nMax>0) and (i>=0) and (i<LStrings.Count-1) do begin
  99. Larray.GetAsVariant(Larray.Count).Value := LStrings[i];
  100. inc(i);
  101. dec(nMax);
  102. end;
  103. end;
  104. Result := True;
  105. Finally
  106. LStrings.Free;
  107. end;
  108. {$ELSE}
  109. AErrorNum := CT_RPC_ErrNum_NotImplemented;
  110. AErrorDesc := 'AbstractMem library is not available in this build';
  111. Result := False;
  112. {$ENDIF}
  113. //
  114. end;
  115. class function TRPCFileUtils.SaveAsSafeboxStream(const ASender: TRPCProcess;
  116. const AMethodName: String; AInputParams, AJSONResponse: TPCJSONObject;
  117. var AErrorNum: Integer; var AErrorDesc: String): Boolean;
  118. var LFileName : String;
  119. LFs : TFileStream;
  120. LStart,LEnd : Integer;
  121. begin
  122. if Not ASender.RPCServer.AllowUsePrivateKeys then begin
  123. AErrorNum := CT_RPC_ErrNum_NotAllowedCall;
  124. Exit(False);
  125. end;
  126. LFileName := AInputParams.AsString('filename', '').Trim;
  127. if (LFileName='') then begin
  128. LFileName := TFileStorage.GetSafeboxCheckpointingFileName(TFileStorage(TNode.Node.Bank.Storage).DatabaseFolder,TNode.Node.Bank.BlocksCount);
  129. LFileName := ChangeFileExt(LFileName,'.safebox');
  130. end;
  131. LFs := TFileStream.Create(LFileName,fmCreate);
  132. try
  133. LFs.Size := 0;
  134. LFs.Position := 0;
  135. LStart := 0;
  136. LEnd := TNode.Node.Bank.BlocksCount-1;
  137. TNode.Node.Bank.SafeBox.SaveSafeBoxToAStream(LFs,LStart,LEnd);
  138. finally
  139. LFs.Free;
  140. end;
  141. AJSONResponse.GetAsObject('result').GetAsVariant('filename').Value := LFileName;
  142. AJSONResponse.GetAsObject('result').GetAsVariant('start').Value := LStart;
  143. AJSONResponse.GetAsObject('result').GetAsVariant('end').Value := LEnd;
  144. AErrorNum := 0;
  145. AErrorDesc := '';
  146. Result := True;
  147. end;
  148. initialization
  149. TRPCProcess.RegisterProcessMethod('save-safebox-stream',TRPCFileUtils.SaveAsSafeboxStream);
  150. TRPCProcess.RegisterProcessMethod('save-safebox-abstractmem',TRPCFileUtils.GenerateNewAbstractMemSafebox);
  151. TRPCProcess.RegisterProcessMethod('abstractmem-stats',TRPCFileUtils.AbstractMemStats);
  152. finalization
  153. TRPCProcess.UnregisterProcessMethod('save-safebox-stream');
  154. TRPCProcess.UnregisterProcessMethod('save-safebox-abstractmem');
  155. TRPCProcess.UnregisterProcessMethod('abstractmem-stats');
  156. end.