Esempio n. 1
0
        /// <summary>
        ///     Write in collection of relationships.
        /// </summary>
        /// <param name="relationships"></param>
        /// <param name="context"></param>
        void IDataTarget.WriteRelationships(IEnumerable <RelationshipEntry> relationships, IProcessingContext context)
        {
            Func <DataColumn[]> getColumnsAction = () => new[]
            {
                new DataColumn("Id", typeof(long))
                {
                    AllowDBNull = true
                },
                new DataColumn("AppVerUid", typeof(Guid))
                {
                    AllowDBNull = false
                },
                new DataColumn("TypeUid", typeof(Guid))
                {
                    AllowDBNull = false
                },
                new DataColumn("FromUid", typeof(Guid))
                {
                    AllowDBNull = false
                },
                new DataColumn("ToUid", typeof(Guid))
                {
                    AllowDBNull = false
                }
            };

            Func <RelationshipEntry, DataRow, PopulateRowResult> populateRowAction = (entry, row) =>
            {
                row[1] = ApplicationVersionId;

                row[2] = entry.TypeId;
                row[3] = entry.FromId;
                row[4] = entry.ToId;

                return(PopulateRowResult.Success);
            };

            Action <int> setCopiedCountAction = count =>
            {
                if (context != null)
                {
                    context.Report.Counts.Add(new StatisticsCount("Copied Relationships", count, StatisticsCountType.Copied));
                }
            };

            var executionArguments = new LibraryAppTargetExecutionArguments <RelationshipEntry>
            {
                Entries              = relationships,
                GetColumnsAction     = getColumnsAction,
                TableName            = "AppRelationship",
                Context              = context,
                SetCopiedCountAction = setCopiedCountAction,
                PopulateRowAction    = populateRowAction
            };

            Execute(executionArguments);
        }
Esempio n. 2
0
        /// <summary>
        ///     Write in collection of entities.
        /// </summary>
        /// <param name="entities"></param>
        /// <param name="context"></param>
        void IDataTarget.WriteDoNotRemove(IEnumerable <Guid> entities, IProcessingContext context)
        {
            Func <DataColumn []> getColumnsAction = () => new []
            {
                new DataColumn("Id", typeof(long))
                {
                    AllowDBNull = true
                },
                new DataColumn("AppVerUid", typeof(Guid))
                {
                    AllowDBNull = false
                },
                new DataColumn("EntityUid", typeof(Guid))
                {
                    AllowDBNull = false
                }
            };

            Func <Guid, DataRow, PopulateRowResult> populateRowAction = (entityUid, row) =>
            {
                row [1] = ApplicationVersionId;
                row [2] = entityUid;

                return(PopulateRowResult.Success);
            };

            Action <int> setCopiedCountAction = count =>
            {
                if (context != null)
                {
                    context.Report.Counts.Add(new StatisticsCount("Copied DoNotRemove entries", count, StatisticsCountType.Copied));
                }
            };

            var executionArguments = new LibraryAppTargetExecutionArguments <Guid>
            {
                Entries              = entities,
                GetColumnsAction     = getColumnsAction,
                TableName            = "AppDoNotRemove",
                Context              = context,
                SetCopiedCountAction = setCopiedCountAction,
                PopulateRowAction    = populateRowAction
            };

            Execute(executionArguments);
        }
Esempio n. 3
0
        /// <summary>
        ///     Writes the field data_ alias.
        /// </summary>
        /// <param name="data">The data.</param>
        /// <param name="context">The context.</param>
        private void WriteFieldData_Alias(IEnumerable <DataEntry> data, IProcessingContext context)
        {
            Func <DataColumn[]> getColumnsAction = () => new[]
            {
                new DataColumn("Id", typeof(long))
                {
                    AllowDBNull = true
                },
                new DataColumn("AppVerUid", typeof(Guid))
                {
                    AllowDBNull = false
                },
                new DataColumn("EntityUid", typeof(Guid))
                {
                    AllowDBNull = false
                },
                new DataColumn("FieldUid", typeof(Guid))
                {
                    AllowDBNull = false
                },
                new DataColumn("Data", typeof(string))
                {
                    AllowDBNull = true
                },
                new DataColumn("Namespace", typeof(string))
                {
                    AllowDBNull = false
                },
                new DataColumn("AliasMarkerId", typeof(int))
                {
                    AllowDBNull = false
                }
            };

            Func <DataEntry, DataRow, PopulateRowResult> populateRowAction = (entry, row) =>
            {
                row[1] = ApplicationVersionId;
                row[2] = entry.EntityId;
                row[3] = entry.FieldId;
                row[4] = entry.Data;
                row[5] = entry.Namespace;
                row[6] = entry.AliasMarkerId;

                return(PopulateRowResult.Success);
            };

            Action <int> setCopiedCountAction = count =>
            {
                if (context != null)
                {
                    context.Report.Counts.Add(new StatisticsCount("Copied Alias Data", count, StatisticsCountType.Copied));
                }
            };

            var executionArguments = new LibraryAppTargetExecutionArguments <DataEntry>
            {
                Entries              = data,
                GetColumnsAction     = getColumnsAction,
                TableName            = "AppData_Alias",
                Context              = context,
                SetCopiedCountAction = setCopiedCountAction,
                PopulateRowAction    = populateRowAction
            };

            Execute(executionArguments);
        }
Esempio n. 4
0
        /// <summary>
        ///     Executes the specified entries.
        /// </summary>
        /// <typeparam name="TEntry">The type of the entry.</typeparam>
        /// <param name="arguments">The arguments.</param>
        /// <exception cref="System.InvalidOperationException">No active database connection.</exception>
        private void Execute <TEntry>(LibraryAppTargetExecutionArguments <TEntry> arguments)
        {
            /////
            // Argument checks.
            /////
            if (arguments == null || arguments.Entries == null || arguments.GetColumnsAction == null || string.IsNullOrEmpty(arguments.TableName) || arguments.PopulateRowAction == null)
            {
                return;
            }

            IList <TEntry> entryList = arguments.Entries as IList <TEntry> ?? arguments.Entries.ToList( );

            /////
            // Early out.
            /////
            if (entryList.Count <= 0)
            {
                if (arguments.SetCopiedCountAction != null)
                {
                    arguments.SetCopiedCountAction(0);
                }

                return;
            }

            var connection = DatabaseContext.GetUnderlyingConnection( ) as SqlConnection;

            if (connection == null)
            {
                throw new InvalidOperationException("No active database connection.");
            }

            var table = new DataTable( );

            /////
            // Populate the columns.
            /////
            table.Columns.AddRange(arguments.GetColumnsAction( ));

            /////
            // Populate the rows.
            /////
            foreach (TEntry entry in entryList)
            {
                DataRow row = table.NewRow( );

                if (arguments.PopulateRowAction(entry, row) != PopulateRowResult.Success)
                {
                    continue;
                }

                table.Rows.Add(row);
            }

            using (IDbCommand command = CreateCommand( ))
            {
                if (arguments.ClearExistingData)
                {
                    /////
                    // Clear existing data.
                    /////
                    command.CommandText = string.Format("DELETE FROM {0} WHERE AppVerUid = @appVer", arguments.TableName);
                    command.AddParameterWithValue("@appVer", ApplicationVersionId);
                    command.CommandType = CommandType.Text;
                    command.ExecuteNonQuery( );
                }

                int rowsCopied = 0;

                if (table.Rows.Count > 0)
                {
                    /////
                    // Bulk load into the staging table.
                    /////
                    using (var bulkCopy = new SqlBulkCopy(connection))
                    {
                        bulkCopy.BulkCopyTimeout = 600;
                        bulkCopy.NotifyAfter     = 100;

                        string sanitizedTableName = arguments.TableName.Replace("#", "").Replace("App", "").Replace("Data", "").Replace("_", "");

                        if (arguments.Context != null)
                        {
                            bulkCopy.SqlRowsCopied += (sender, args) => arguments.Context.WriteProgress(string.Format("Copying {0} data... {1} rows", sanitizedTableName, args.RowsCopied));
                        }

                        bulkCopy.DestinationTableName = string.Format("{0}", arguments.TableName);
                        bulkCopy.WriteToServer(table);

                        rowsCopied = bulkCopy.RowsCopiedCount( );
                    }
                }

                if (arguments.SetCopiedCountAction != null)
                {
                    arguments.SetCopiedCountAction(rowsCopied);
                }

                if (arguments.CustomCommandExecuteAction != null)
                {
                    arguments.CustomCommandExecuteAction(command);
                }
            }
        }
Esempio n. 5
0
        /// <summary>
        ///     Writes the binary data.
        /// </summary>
        /// <param name="data">The data.</param>
        /// <param name="context">The context.</param>
        void IDataTarget.WriteBinaryData(IEnumerable <BinaryDataEntry> data, IProcessingContext context)
        {
            Func <DataColumn[]> getColumnsAction = () => new[]
            {
                new DataColumn("OldDataHash", typeof(string))
                {
                    AllowDBNull = false
                },
                new DataColumn("NewDataHash", typeof(string))
                {
                    AllowDBNull = false
                },
                new DataColumn("FileExtension", typeof(string))
                {
                    AllowDBNull = true
                }
            };

            Func <BinaryDataEntry, DataRow, PopulateRowResult> populateRowAction = (entry, row) =>
            {
                if (entry.Data == null)
                {
                    return(PopulateRowResult.InvalidData);
                }

                using (var source = new MemoryStream(entry.Data))
                {
                    try
                    {
                        // Add the file to the repository
                        string newDataHash = Factory.AppLibraryFileRepository.Put(source);

                        row[0] = entry.DataHash;
                        row[1] = newDataHash;
                        row[2] = string.IsNullOrWhiteSpace(entry.FileExtension) ? null : entry.FileExtension;
                    }
                    catch (Exception ex)
                    {
                        context.WriteWarning(string.Format("An error occurred putting binary file into file repository. DataHash: {0}. Error {1}.", entry.DataHash, ex.ToString()));

                        return(PopulateRowResult.InvalidData);
                    }
                }

                return(PopulateRowResult.Success);
            };

            Func <IDbCommand, int> customCommandExecuteAction = command =>
            {
                // Upgrade datahashes and file extensions
                command.CommandText = string.Format(CommandText.AppLibraryUpgradeFileDataHashesAndFileExtensions, "#Binary");
                command.CommandType = CommandType.Text;
                command.AddParameterWithValue("@appVerId", ApplicationVersionId);
                command.AddParameterWithValue("@fileDataHashFieldId", Helpers.FileDataHashFieldUpgradeId);
                command.AddParameterWithValue("@fileExtensionFieldId", Helpers.FileExtensionFieldUpgradeId);
                command.ExecuteNonQuery();
                return(0);
            };

            Action <int> setCopiedCountAction = count =>
            {
                if (context != null)
                {
                    context.Report.Counts.Add(new StatisticsCount("Copied Binary Data", count, StatisticsCountType.Copied));
                }
            };

            var executionArguments = new LibraryAppTargetExecutionArguments <BinaryDataEntry>
            {
                Entries                    = data,
                GetColumnsAction           = getColumnsAction,
                TableName                  = "#Binary",
                Context                    = context,
                SetCopiedCountAction       = setCopiedCountAction,
                PopulateRowAction          = populateRowAction,
                ClearExistingData          = false,
                CustomCommandExecuteAction = customCommandExecuteAction
            };

            Execute(executionArguments);
        }