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));
 }
Exemplo n.º 6
0
 public void Transform(DataTransformationContext context, TableLedgerHeight table)
 {
     services[table.TableName].ProcessNext(context);
 }