public override string Execute(IDictionary<string, DataSource> dataSources, IQueryExecutionOptions options, IDictionary<string, Type> parameterTypes, IDictionary<string, object> parameterValues) { _executionCount++; try { if (!dataSources.TryGetValue(DataSource, out var dataSource)) throw new QueryExecutionException("Missing datasource " + DataSource); List<Entity> entities; EntityMetadata meta; Dictionary<string, AttributeMetadata> attributes; Dictionary<string, Func<Entity, object>> attributeAccessors; Func<Entity, object> primaryIdAccessor; using (_timer.Run()) { entities = GetDmlSourceEntities(dataSources, options, parameterTypes, parameterValues, out var schema); // Precompile mappings with type conversions meta = dataSource.Metadata[LogicalName]; attributes = meta.Attributes.ToDictionary(a => a.LogicalName); var dateTimeKind = options.UseLocalTimeZone ? DateTimeKind.Local : DateTimeKind.Utc; attributeAccessors = CompileColumnMappings(meta, ColumnMappings, schema, attributes, dateTimeKind); attributeAccessors.TryGetValue(meta.PrimaryIdAttribute, out primaryIdAccessor); } // Check again that the update is allowed. Don't count any UI interaction in the execution time if (options.Cancelled || !options.ConfirmInsert(entities.Count, meta)) throw new OperationCanceledException("INSERT cancelled by user"); using (_timer.Run()) { return ExecuteDmlOperation( dataSource.Connection, options, entities, meta, entity => CreateInsertRequest(meta, entity, attributeAccessors, primaryIdAccessor, attributes), new OperationNames { InProgressUppercase = "Inserting", InProgressLowercase = "inserting", CompletedLowercase = "inserted" }); } } catch (QueryExecutionException ex) { if (ex.Node == null) ex.Node = this; throw; } catch (Exception ex) { throw new QueryExecutionException(ex.Message, ex) { Node = this }; } }
public bool ConfirmInsert(int count, EntityMetadata meta) { return(_options.ConfirmInsert(count, meta)); }