Browse Source

TStorage updates

Added public BlockExists and a forceSave variable to SaveBank function
PascalCoin 6 years ago
parent
commit
cba6052016
2 changed files with 13 additions and 7 deletions
  1. 11 5
      src/core/UBlockChain.pas
  2. 2 2
      src/core/UFileStorage.pas

+ 11 - 5
src/core/UBlockChain.pas

@@ -459,7 +459,7 @@ Type
     Function DoSaveBank : Boolean; virtual; abstract;
     Function DoSaveBank : Boolean; virtual; abstract;
     Function DoRestoreBank(max_block : Int64; restoreProgressNotify : TProgressNotify) : Boolean; virtual; abstract;
     Function DoRestoreBank(max_block : Int64; restoreProgressNotify : TProgressNotify) : Boolean; virtual; abstract;
     Procedure DoDeleteBlockChainBlocks(StartingDeleteBlock : Cardinal); virtual; abstract;
     Procedure DoDeleteBlockChainBlocks(StartingDeleteBlock : Cardinal); virtual; abstract;
-    Function BlockExists(Block : Cardinal) : Boolean; virtual; abstract;
+    Function DoBlockExists(Block : Cardinal) : Boolean; virtual; abstract;
     function GetFirstBlockNumber: Int64; virtual; abstract;
     function GetFirstBlockNumber: Int64; virtual; abstract;
     function GetLastBlockNumber: Int64; virtual; abstract;
     function GetLastBlockNumber: Int64; virtual; abstract;
     function DoInitialize:Boolean; virtual; abstract;
     function DoInitialize:Boolean; virtual; abstract;
@@ -472,7 +472,7 @@ Type
     Function SaveBlockChainBlock(Operations : TPCOperationsComp) : Boolean;
     Function SaveBlockChainBlock(Operations : TPCOperationsComp) : Boolean;
     Function MoveBlockChainBlocks(StartBlock : Cardinal; Const DestOrphan : TOrphan; DestStorage : TStorage) : Boolean;
     Function MoveBlockChainBlocks(StartBlock : Cardinal; Const DestOrphan : TOrphan; DestStorage : TStorage) : Boolean;
     Procedure DeleteBlockChainBlocks(StartingDeleteBlock : Cardinal);
     Procedure DeleteBlockChainBlocks(StartingDeleteBlock : Cardinal);
-    Function SaveBank : Boolean;
+    Function SaveBank(forceSave : Boolean) : Boolean;
     Function RestoreBank(max_block : Int64; restoreProgressNotify : TProgressNotify = Nil) : Boolean;
     Function RestoreBank(max_block : Int64; restoreProgressNotify : TProgressNotify = Nil) : Boolean;
     Constructor Create(AOwner : TComponent); Override;
     Constructor Create(AOwner : TComponent); Override;
     Property Orphan : TOrphan read FOrphan write SetOrphan;
     Property Orphan : TOrphan read FOrphan write SetOrphan;
@@ -488,6 +488,7 @@ Type
     Procedure EraseStorage;
     Procedure EraseStorage;
     Procedure SavePendingBufferOperations(OperationsHashTree : TOperationsHashTree);
     Procedure SavePendingBufferOperations(OperationsHashTree : TOperationsHashTree);
     Procedure LoadPendingBufferOperations(OperationsHashTree : TOperationsHashTree);
     Procedure LoadPendingBufferOperations(OperationsHashTree : TOperationsHashTree);
+    Function BlockExists(Block : Cardinal) : Boolean;
   End;
   End;
 
 
   TStorageClass = Class of TStorage;
   TStorageClass = Class of TStorage;
@@ -933,7 +934,7 @@ begin
                 // To prevent continuous saving...
                 // To prevent continuous saving...
                 if ((BlocksCount+(CT_BankToDiskEveryNBlocks*2)) >= Storage.LastBlock ) or
                 if ((BlocksCount+(CT_BankToDiskEveryNBlocks*2)) >= Storage.LastBlock ) or
                    ((BlocksCount MOD (CT_BankToDiskEveryNBlocks*10))=0) then begin
                    ((BlocksCount MOD (CT_BankToDiskEveryNBlocks*10))=0) then begin
-                  Storage.SaveBank;
+                  Storage.SaveBank(False);
                 end;
                 end;
                 if (Assigned(restoreProgressNotify)) And (TPlatform.GetElapsedMilliseconds(tc)>1000) then begin
                 if (Assigned(restoreProgressNotify)) And (TPlatform.GetElapsedMilliseconds(tc)>1000) then begin
                   tc := TPlatform.GetTickCount;
                   tc := TPlatform.GetTickCount;
@@ -2658,6 +2659,11 @@ end;
 
 
 { TStorage }
 { TStorage }
 
 
+function TStorage.BlockExists(Block: Cardinal): Boolean;
+begin
+  Result := DoBlockExists(Block);
+end;
+
 procedure TStorage.CopyConfiguration(const CopyFrom: TStorage);
 procedure TStorage.CopyConfiguration(const CopyFrom: TStorage);
 begin
 begin
   Orphan := CopyFrom.Orphan;
   Orphan := CopyFrom.Orphan;
@@ -2722,11 +2728,11 @@ begin
   Result := DoRestoreBank(max_block,restoreProgressNotify);
   Result := DoRestoreBank(max_block,restoreProgressNotify);
 end;
 end;
 
 
-function TStorage.SaveBank: Boolean;
+function TStorage.SaveBank(forceSave : Boolean): Boolean;
 begin
 begin
   Result := true;
   Result := true;
   If FIsMovingBlockchain then Exit;
   If FIsMovingBlockchain then Exit;
-  if Not TPCSafeBox.MustSafeBoxBeSaved(Bank.BlocksCount) then exit; // No save
+  if (Not forceSave) AND (Not TPCSafeBox.MustSafeBoxBeSaved(Bank.BlocksCount)) then exit; // No save
   Try
   Try
     Result := DoSaveBank;
     Result := DoSaveBank;
     FBank.SafeBox.CheckMemory;
     FBank.SafeBox.CheckMemory;

+ 2 - 2
src/core/UFileStorage.pas

@@ -67,7 +67,7 @@ Type
     Function DoSaveBank : Boolean; override;
     Function DoSaveBank : Boolean; override;
     Function DoRestoreBank(max_block : Int64; restoreProgressNotify : TProgressNotify) : Boolean; override;
     Function DoRestoreBank(max_block : Int64; restoreProgressNotify : TProgressNotify) : Boolean; override;
     Procedure DoDeleteBlockChainBlocks(StartingDeleteBlock : Cardinal); override;
     Procedure DoDeleteBlockChainBlocks(StartingDeleteBlock : Cardinal); override;
-    Function BlockExists(Block : Cardinal) : Boolean; override;
+    Function DoBlockExists(Block : Cardinal) : Boolean; override;
     Function LockBlockChainStream : TFileStream;
     Function LockBlockChainStream : TFileStream;
     Procedure UnlockBlockChainStream;
     Procedure UnlockBlockChainStream;
     Function LoadBankFileInfo(Const Filename : AnsiString; var safeBoxHeader : TPCSafeBoxHeader) : Boolean;
     Function LoadBankFileInfo(Const Filename : AnsiString; var safeBoxHeader : TPCSafeBoxHeader) : Boolean;
@@ -129,7 +129,7 @@ Const CT_TBlockHeader_NUL : TBlockHeader = (BlockNumber:0;StreamBlockRelStartPos
 
 
   }
   }
 
 
-function TFileStorage.BlockExists(Block: Cardinal): Boolean;
+function TFileStorage.DoBlockExists(Block: Cardinal): Boolean;
 Var  iBlockHeaders : Integer;
 Var  iBlockHeaders : Integer;
   BlockHeaderFirstBlock : Cardinal;
   BlockHeaderFirstBlock : Cardinal;
   stream : TStream;
   stream : TStream;