/// <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); }
/// <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); }
/// <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); }
/// <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); } } }
/// <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); }