private void SetInitialTableHeights(long targetHeight) { SetInitialTableHeights(); // determine which height still need to be transformed var minimal = GetMinimalHeight(tableTransformationStates.Values); // TODO Do we want this? //if (targetHeight < minimal) // throw new ApplicationException("Explorer ledger height is higher than current ledger height. Please wipe the Explorer database!"); //TODO use batch var ledgers = DatabaseService.ReadDatabaseManager.GetLedgersWithStateFromHeight(minimal).ToDictionary(_ => _.Ledger.Ledger.LedgerLight.Height); var min = tableTransformationStates.Values.Min(table => table.CurrentHeight); for (var height = min + 1; height <= targetHeight; height++) { Debug.Assert(ledgers.ContainsKey(height)); var context = new DataTransformationContext(ledgers[height]); foreach (var entity in tableTransformationStates.Values) { if (entity.CurrentHeight < height) { TransformLedgerState(context, entity.TableName, height); } else if (entity.TableName == "transactiondeclarations") { var declarations = CreateDeclarationContext(context.SignedLedgerState.Ledger, ExplorerDatabaseService.ReadDatabaseManager.GetDeclarations(height)); context.SetDeclarations(declarations); } } } }
private DataTransformationContext RebuildContext(DataTransformationContext context, HashSet <Address> knownAccounts) { var oldState = context.SignedLedgerState.State; var accounts = MarkNewAccounts(knownAccounts, oldState.Accounts); var state = new LedgerStateChange(accounts, oldState.MultiSignatures, oldState.HashLocks, oldState.TimeLocks, oldState.VendingMachines); var signedLedgerState = new SignedLedgerState(context.SignedLedgerState.Ledger, state); return(new DataTransformationContext(signedLedgerState)); }
// Called on run public void ProcessLedger(SignedLedgerState ledger) { var target = ledger.Ledger.Ledger.LedgerLight.Height; var context = new DataTransformationContext(ledger); foreach (var table in tableTransformationStates.Values) { Debug.Assert(table.TargetHeight + 1 == target); TransformLedgerState(context, table.TableName, target); } current = target; }
private void SetInitialTableHeights(long targetHeight) { SetInitialTableHeights(); // determine which height still need to be transformed var minimal = GetMinimalHeight(tableTransformationStates.Values); var min = tableTransformationStates.Values.Min(table => table.CurrentHeight); if (targetHeight == min) { return; } //TODO use batch var ledgers = DatabaseService.ReadDatabaseManager.GetLedgersWithStateFromHeight(minimal).ToDictionary(_ => _.Ledger.Ledger.LedgerLight.Height); var knownAddresses = DatabaseService.ReadDatabaseManager.GetAddresses(); for (var height = min + 1; height <= targetHeight; height++) { Debug.Assert(ledgers.ContainsKey(height)); var context = new DataTransformationContext(ledgers[height]); foreach (var entity in tableTransformationStates.Values) { if (entity.TableName == "accounts") { context = RebuildContext(context, knownAddresses); } if (entity.CurrentHeight < height) { TransformLedgerState(context, entity.TableName, height); } } } }
private void TransformLedgerState(DataTransformationContext context, string table, long height) { tableTransformationStates[table].TargetHeight = context.SignedLedgerState.Ledger.Ledger.LedgerLight.Height; DataTransformationService.DataTransformerManager.Transform(context, new TableLedgerHeight(table, height)); }
public void Transform(DataTransformationContext context, TableLedgerHeight table) { services[table.TableName].ProcessNext(context); }