瀏覽代碼

Improvements on LoadSafebox methods

PascalCoin 2 年之前
父節點
當前提交
41caf25659
共有 2 個文件被更改,包括 19 次插入10 次删除
  1. 18 2
      src/core/UAccounts.pas
  2. 1 8
      src/core/UBlockChain.pas

+ 18 - 2
src/core/UAccounts.pas

@@ -281,7 +281,8 @@ Type
     Function LoadSafeBoxChunkFromStream(Stream : TStream; checkAll : Boolean; checkSafeboxHash : TRawBytes; progressNotify : TProgressNotify; previousCheckedSafebox : TPCSafebox; var ALastReadBlock : TBlockAccount; var errors : String) : Boolean;
     Function LoadSafeBoxFromStream(Stream : TStream; checkAll : Boolean; var LastReadBlock : TBlockAccount; var errors : String) : Boolean; overload;
     Function LoadSafeBoxFromStream(Stream : TStream; checkAll : Boolean; checkSafeboxHash : TRawBytes; progressNotify : TProgressNotify; previousCheckedSafebox : TPCSafebox; var ALastReadBlock : TBlockAccount; var errors : String) : Boolean; overload;
-    Class Function LoadSafeBoxStreamHeader(Stream : TStream; var sbHeader : TPCSafeBoxHeader) : Boolean;
+    Class Function LoadSafeBoxStreamHeader(Stream : TStream; var sbHeader : TPCSafeBoxHeader; out AStreamFinalPos : Int64) : Boolean; overload;
+    Class Function LoadSafeBoxStreamHeader(Stream : TStream; var sbHeader : TPCSafeBoxHeader) : Boolean; overload;
     Class Function SaveSafeBoxStreamHeader(Stream : TStream; protocol : Word; OffsetStartBlock, OffsetEndBlock, CurrentSafeBoxBlocksCount : Cardinal) : Boolean;
     Class Function MustSafeBoxBeSaved(BlocksCount : Cardinal) : Boolean;
     Class Function InitialSafeboxHash : TRawBytes;
@@ -3837,8 +3838,16 @@ end;
 
 
 function TPCSafeBox.LoadSafeBoxFromStream(Stream : TStream; checkAll : Boolean; checkSafeboxHash : TRawBytes; progressNotify : TProgressNotify; previousCheckedSafebox : TPCSafebox; var ALastReadBlock : TBlockAccount; var errors : String) : Boolean;
+var Ltc : TTickCount;
 begin
+  Ltc := TPlatform.GetTickCount;
   Result := LoadSafeBoxChunkFromStream(Stream,checkAll,checkSafeboxHash,progressNotify,previousCheckedSafebox,ALastReadBlock,errors);
+  if Result then begin
+    while LoadSafeBoxChunkFromStream(Stream,checkAll,checkSafeboxHash,progressNotify,previousCheckedSafebox,ALastReadBlock,errors) do begin
+      TLog.NewLog(ltdebug,ClassName,Format('Loading safebox from stream... %.2f secs',[TPlatform.GetElapsedMilliseconds(Ltc)/1000]));
+    end;
+  end;
+  TLog.NewLog(ltdebug,ClassName,Format('Finalized Loading safebox from stream in %.2f secs',[TPlatform.GetElapsedMilliseconds(Ltc)/1000]));
 end;
 
 function TPCSafeBox.LoadSafeBoxFromStream(Stream: TStream; checkAll: Boolean; var LastReadBlock: TBlockAccount; var errors: String): Boolean;
@@ -3848,7 +3857,13 @@ begin
   Result := LoadSafeBoxFromStream(Stream,checkAll,Nil,pn,Nil,LastReadBlock,errors);
 end;
 
-class function TPCSafeBox.LoadSafeBoxStreamHeader(Stream: TStream; var sbHeader : TPCSafeBoxHeader) : Boolean;
+class function TPCSafeBox.LoadSafeBoxStreamHeader(Stream: TStream; var sbHeader: TPCSafeBoxHeader): Boolean;
+var LPos : Int64;
+begin
+  Result := LoadSafeBoxStreamHeader(Stream,sbHeader,LPos);
+end;
+
+class function TPCSafeBox.LoadSafeBoxStreamHeader(Stream: TStream; var sbHeader : TPCSafeBoxHeader; out AStreamFinalPos : Int64) : Boolean;
   // This function reads SafeBox stream info and sets position at offset start zone if valid, otherwise sets position to actual position
 Var w : Word;
   raw : TRawBytes;
@@ -3881,6 +3896,7 @@ begin
     If (Stream.Size<offsetPos + (endBlocks)) then exit;
     Stream.Position:=offsetPos + endBlocks;
     If TStreamOp.ReadAnsiString(Stream,sbHeader.safeBoxHash)<0 then exit;
+    AStreamFinalPos := Stream.position;
     // Back
     Stream.Position:=offsetPos;
     Result := True;

+ 1 - 8
src/core/UBlockChain.pas

@@ -1311,18 +1311,11 @@ end;
 
 function TPCBank.LoadBankFileInfo(const AFilename: String;
   var ASafeBoxHeader: TPCSafeBoxHeader): Boolean;
-var fs: TFileStream;
 begin
   Result := false;
   ASafeBoxHeader := CT_PCSafeBoxHeader_NUL;
   If Not FileExists(AFilename) then exit;
-  fs := TFileStream.Create(AFilename,fmOpenRead);
-  try
-    fs.Position:=0;
-    Result := SafeBox.LoadSafeBoxStreamHeader(fs,ASafeBoxHeader);
-  finally
-    fs.Free;
-  end;
+  Result := TPCSafeboxChunks.GetSafeboxHeaderFromFile(AFilename,ASafeBoxHeader);
 end;
 
 function TPCBank.LoadBankFromChunks(AChunks : TPCSafeboxChunks;