예제 #1
0
        private ConsolidationParams ReadConsolidationConfig()
        {
            var result = new ConsolidationParams();

            var sql = $"select entity_type, column_name from {GetQualifiedTableName(ConsolidationConfig)}";

            DatabaseUtils.EnumerateResults(ConnectionString, sql, TimeoutSecs, r =>
            {
                var e = EntityUtils.FromString((string)r["entity_type"]);

                if (EntityUtils.CanParticipateInConsolidation(e))
                {
                    string colName = (string)DatabaseUtils.SafeRead(r, "column_name", string.Empty);
                    if (!string.IsNullOrEmpty(colName))
                    {
                        var entry = new ConsolidationEntry
                        {
                            Entity = e.ToString(),
                            Column = colName
                        };

                        result.Entries.Add(entry);
                    }
                }
            });

            result.Enabled = result.Entries.Count > 0;

            return(result);
        }
예제 #2
0
 public static void Execute(
     string connectionString,
     int timeoutSecs,
     int maxDegreeOfParallelism,
     ConsolidationParams consolidationParams,
     string stagingSchemaName)
 {
     if (consolidationParams.Enabled)
     {
         _log.Debug("Checking that consolidation keys aren't blank");
         DoParallelProcessing(connectionString, timeoutSecs, maxDegreeOfParallelism, consolidationParams, stagingSchemaName);
     }
 }
예제 #3
0
        /// <summary>
        /// Updates the consolidation config table
        /// </summary>
        /// <param name="c">
        /// The new values
        /// </param>
        /// <returns>
        /// True if configuration was changed
        /// </returns>
        public bool UpdateConsolidationConfigTable(ConsolidationParams c)
        {
            var fromDb = ReadConsolidationConfig();

            if (fromDb.DiffersFrom(c))
            {
                _log.Debug("Consolidation configuration has changed since last federation process");

                WriteConsolidationConfig(c);
                return(true);
            }

            return(false);
        }
예제 #4
0
        private static void DoParallelProcessing(
            string connectionString,
            int timeoutSecs,
            int maxDegreeOfParallelism,
            ConsolidationParams consolidationParams,
            string stagingSchemaName)
        {
            List <Entity> entities = Enum.GetValues(typeof(Entity)).Cast <object>().Cast <Entity>().ToList();

            var pOptions = new ParallelOptions {
                MaxDegreeOfParallelism = maxDegreeOfParallelism
            };

            Parallel.ForEach(entities, pOptions, (e, loopState) =>
            {
                if (!loopState.IsExceptional && EntityUtils.CanParticipateInConsolidation(e))
                {
                    var entry = consolidationParams.Get(e);

                    if (!entry.None)
                    {
                        var qualifiedStagingTableName =
                            DatabaseUtils.GetQualifiedTableName(stagingSchemaName, EntityUtils.ToCtTableName(e));

                        var naturalKey = entry.Column;

                        var sql =
                            $"select count(1) from {qualifiedStagingTableName} where {naturalKey} is null or RTRIM(LTRIM({naturalKey})) = ''";

                        var count = Convert.ToInt32(DatabaseUtils.ExecuteScalar(connectionString, sql, timeoutSecs));
                        if (count > 0)
                        {
                            loopState.Stop();

                            var msg =
                                $"There are {count} rows in {qualifiedStagingTableName} with empty consolidation values (column='{naturalKey}')";

                            _log.Error(msg);

                            throw new ApplicationException(msg);
                        }
                    }
                }
            });
        }
예제 #5
0
        public bool ConsolidationConfigChanged(ConsolidationParams c)
        {
            if (DatabaseUtils.DatabaseExists(AdminConnectionString, Timeouts.AdminDatabase))
            {
                var fs = new FederationSchema(
                    AdminConnectionString,
                    Timeouts.AdminDatabase,
                    _configuration.MaxDegreeOfParallelism,
                    _configuration.Pipelines);

                if (fs.ConsolidationConfigTableExists())
                {
                    return(fs.ConsolidationConfigChanged(c));
                }
            }

            return(false);
        }
예제 #6
0
        /// <summary>
        /// Checks that the column names specified in the configuration, consolidation
        /// section are valid for the given entity
        /// </summary>
        public static void CheckNaturalKeyColumnsInConfiguration(ConsolidationParams consolidationParams)
        {
            _log.Debug("Checking that consolidation key columns are valid in configuration");

            StagingTablesBuilder b = StagingTablesBuilder.Get(StagingSchema.PrimaryStagingSchemaName);

            if (consolidationParams.Enabled)
            {
                var entitiesUsed = new List <Entity>();

                foreach (Entity entity in Enum.GetValues(typeof(Entity)))
                {
                    if (EntityUtils.CanParticipateInConsolidation(entity))
                    {
                        if (entitiesUsed.Contains(entity))
                        {
                            throw new ApplicationException(string.Format("Entity declared more than once in consolidation configuration: {0}", entity));
                        }

                        entitiesUsed.Add(entity);

                        var entry = consolidationParams.Get(entity);
                        if (entry != null && !entry.None)
                        {
                            string stagingTableName = EntityUtils.ToCtTableName(entity);

                            var table = b.GetTable(stagingTableName);

                            if (!table.ColumnExists(entry.Column))
                            {
                                throw new ApplicationException(string.Format("The specified consolidation column ({0}) does not exist in the entity: {1}", entry.Column, entity));
                            }
                        }
                    }
                }
            }
        }
예제 #7
0
        private void WriteConsolidationConfig(ConsolidationParams c)
        {
            var qualifiedConfigTable = GetQualifiedTableName(ConsolidationConfig);

            var sql = $"delete from {qualifiedConfigTable}";

            DatabaseUtils.ExecuteSql(ConnectionString, sql, TimeoutSecs);

            if (c.Enabled)
            {
                foreach (var entry in c.Entries)
                {
                    var e = EntityUtils.FromString(entry.Entity);

                    if (EntityUtils.CanParticipateInConsolidation(e))
                    {
                        sql = $"insert into {qualifiedConfigTable} (entity_type, column_name) values (@E, @C)";

                        SqlParameter[] p = { new SqlParameter("@E", entry.Entity), new SqlParameter("@C", entry.Column) };
                        DatabaseUtils.ExecuteSql(ConnectionString, sql, TimeoutSecs, p);
                    }
                }
            }
        }
예제 #8
0
        public bool ConsolidationConfigChanged(ConsolidationParams c)
        {
            var fromDb = ReadConsolidationConfig();

            return(fromDb.DiffersFrom(c));
        }
예제 #9
0
 private void CheckForChangeInConsolidationConfig(AdminDatabase adminDb, PublicDatabase publicDb, ConsolidationParams consolidation)
 {
     if (adminDb.ConsolidationConfigChanged(consolidation) && publicDb.TablesExist())
     {
         throw new ApplicationException("Consolidation configuration has changed. Please rebuild the data store by deleting ADMIN and PUBLIC databases");
     }
 }