Exemple #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="connection"></param>
        /// <param name="tableName"></param>
        /// <param name="reader"></param>
        /// <param name="qualifiers"></param>
        /// <param name="mappings"></param>
        /// <param name="bulkCopyTimeout"></param>
        /// <param name="keepIdentity"></param>
        /// <param name="pseudoTableType"></param>
        /// <param name="transaction"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        private static async Task <int> BinaryBulkDeleteBaseAsync(this NpgsqlConnection connection,
                                                                  string tableName,
                                                                  DbDataReader reader,
                                                                  IEnumerable <Field> qualifiers = null,
                                                                  IEnumerable <NpgsqlBulkInsertMapItem> mappings = null,
                                                                  int?bulkCopyTimeout = null,
                                                                  bool keepIdentity   = true,
                                                                  BulkImportPseudoTableType pseudoTableType = default,
                                                                  NpgsqlTransaction transaction             = null,
                                                                  CancellationToken cancellationToken       = default)
        {
            var dbSetting = connection.GetDbSetting();
            var dbFields  = await DbFieldCache.GetAsync(connection, tableName, transaction, cancellationToken);

            var pseudoTableName  = tableName;
            var identityBehavior = keepIdentity ? BulkImportIdentityBehavior.KeepIdentity : BulkImportIdentityBehavior.Unspecified;

            return(await PseudoBasedBinaryImportAsync(connection,
                                                      tableName,
                                                      bulkCopyTimeout,
                                                      dbFields,

                                                      // getPseudoTableName
                                                      () =>
                                                      pseudoTableName = GetBinaryBulkDeletePseudoTableName(tableName, dbSetting),

                                                      // getMappings
                                                      () =>
            {
                var includeIdentity = identityBehavior == BulkImportIdentityBehavior.KeepIdentity;
                var includePrimary = true;

                return mappings = mappings?.Any() == true ? mappings :
                                  GetMappings(reader,
                                              dbFields,
                                              includePrimary,
                                              includeIdentity,
                                              dbSetting);
            },

                                                      // binaryImport
                                                      async (tableName) =>
                                                      await connection.BinaryImportAsync(tableName,
                                                                                         reader,
                                                                                         mappings,
                                                                                         dbFields,
                                                                                         bulkCopyTimeout,
                                                                                         identityBehavior,
                                                                                         dbSetting,
                                                                                         transaction,
                                                                                         cancellationToken),

                                                      // getDeleteToPseudoCommandText
                                                      () =>
                                                      GetDeleteCommandText(pseudoTableName,
                                                                           tableName,
                                                                           mappings.Select(mapping => new Field(mapping.DestinationColumn)),
                                                                           qualifiers,
                                                                           dbFields.FirstOrDefault(dbField => dbField.IsPrimary)?.AsField(),
                                                                           dbFields.FirstOrDefault(dbField => dbField.IsIdentity)?.AsField(),
                                                                           identityBehavior,
                                                                           dbSetting),

                                                      // setIdentities
                                                      null,

                                                      qualifiers,
                                                      false,
                                                      identityBehavior : identityBehavior,
                                                      pseudoTableType : pseudoTableType,
                                                      dbSetting,
                                                      transaction : transaction,
                                                      cancellationToken));
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="connection"></param>
        /// <param name="tableName"></param>
        /// <param name="table"></param>
        /// <param name="rowState"></param>
        /// <param name="mappings"></param>
        /// <param name="bulkCopyTimeout"></param>
        /// <param name="batchSize"></param>
        /// <param name="identityBehavior"></param>
        /// <param name="pseudoTableType"></param>
        /// <param name="transaction"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        private static async Task <int> BinaryBulkInsertBaseAsync(this NpgsqlConnection connection,
                                                                  string tableName,
                                                                  DataTable table,
                                                                  DataRowState?rowState = null,
                                                                  IEnumerable <NpgsqlBulkInsertMapItem> mappings = null,
                                                                  int?bulkCopyTimeout = null,
                                                                  int?batchSize       = null,
                                                                  BulkImportIdentityBehavior identityBehavior = default,
                                                                  BulkImportPseudoTableType pseudoTableType   = default,
                                                                  NpgsqlTransaction transaction       = null,
                                                                  CancellationToken cancellationToken = default)
        {
            var dbSetting = connection.GetDbSetting();
            var dbFields  = await DbFieldCache.GetAsync(connection, tableName, transaction, cancellationToken);

            var pseudoTableName = tableName;

            return(await PseudoBasedBinaryImportAsync(connection,
                                                      tableName,
                                                      bulkCopyTimeout,
                                                      dbFields,

                                                      // getPseudoTableName
                                                      () =>
                                                      pseudoTableName = GetBinaryBulkInsertPseudoTableName(tableName, dbSetting),

                                                      // getMappings
                                                      () =>
            {
                var includeIdentity = identityBehavior == BulkImportIdentityBehavior.KeepIdentity;
                var isPrimaryAnIdentity = IsPrimaryAnIdentity(dbFields);
                var includePrimary = isPrimaryAnIdentity == false ||
                                     (isPrimaryAnIdentity && includeIdentity);

                return mappings = mappings?.Any() == true ? mappings :
                                  GetMappings(table,
                                              dbFields,
                                              includePrimary,
                                              includeIdentity,
                                              dbSetting);
            },

                                                      // binaryImport
                                                      async (tableName) =>
                                                      await connection.BinaryImportAsync(tableName,
                                                                                         table,
                                                                                         rowState,
                                                                                         mappings,
                                                                                         dbFields,
                                                                                         bulkCopyTimeout,
                                                                                         batchSize,
                                                                                         identityBehavior,
                                                                                         dbSetting,
                                                                                         transaction,
                                                                                         cancellationToken),

                                                      // getMergeToPseudoCommandText
                                                      () =>
                                                      GetInsertCommandText(pseudoTableName,
                                                                           tableName,
                                                                           mappings.Select(mapping => new Field(mapping.DestinationColumn)),
                                                                           dbFields.FirstOrDefault(dbField => dbField.IsIdentity)?.AsField(),
                                                                           identityBehavior,
                                                                           dbSetting),

                                                      // setIdentities
                                                      (identityResults) =>
                                                      SetDataTableIdentities(table, dbFields, identityResults, dbSetting),

                                                      null,
                                                      true,
                                                      identityBehavior : identityBehavior,
                                                      pseudoTableType : pseudoTableType,
                                                      dbSetting,
                                                      transaction : transaction,
                                                      cancellationToken));
        }
Exemple #3
0
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="TEntity"></typeparam>
        /// <param name="connection"></param>
        /// <param name="tableName"></param>
        /// <param name="entities"></param>
        /// <param name="qualifiers"></param>
        /// <param name="mappings"></param>
        /// <param name="bulkCopyTimeout"></param>
        /// <param name="batchSize"></param>
        /// <param name="keepIdentity"></param>
        /// <param name="pseudoTableType"></param>
        /// <param name="transaction"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        private static async Task <int> BinaryBulkDeleteBaseAsync <TEntity>(this NpgsqlConnection connection,
                                                                            string tableName,
                                                                            IEnumerable <TEntity> entities,
                                                                            IEnumerable <Field> qualifiers = null,
                                                                            IEnumerable <NpgsqlBulkInsertMapItem> mappings = null,
                                                                            int?bulkCopyTimeout = null,
                                                                            int?batchSize       = null,
                                                                            bool keepIdentity   = true,
                                                                            BulkImportPseudoTableType pseudoTableType = default,
                                                                            NpgsqlTransaction transaction             = null,
                                                                            CancellationToken cancellationToken       = default)
            where TEntity : class
        {
            var entityType   = entities?.First()?.GetType() ?? typeof(TEntity); // Solving the anonymous types
            var isDictionary = entityType.IsDictionaryStringObject();
            var dbSetting    = connection.GetDbSetting();
            var dbFields     = await DbFieldCache.GetAsync(connection, tableName, transaction, cancellationToken);

            var pseudoTableName  = tableName;
            var identityBehavior = keepIdentity ? BulkImportIdentityBehavior.KeepIdentity : BulkImportIdentityBehavior.Unspecified;

            return(await PseudoBasedBinaryImportAsync(connection,
                                                      tableName,
                                                      bulkCopyTimeout,
                                                      dbFields,

                                                      // getPseudoTableName
                                                      () =>
                                                      pseudoTableName = GetBinaryBulkDeletePseudoTableName(tableName ?? ClassMappedNameCache.Get <TEntity>(), dbSetting),

                                                      // getMappings
                                                      () =>
            {
                var includeIdentity = identityBehavior == BulkImportIdentityBehavior.KeepIdentity;
                var includePrimary = true;

                return mappings = mappings?.Any() == true ? mappings :
                                  isDictionary ?
                                  GetMappings(entities?.First() as IDictionary <string, object>,
                                              dbFields,
                                              includePrimary,
                                              includeIdentity,
                                              dbSetting) :
                                  GetMappings(dbFields,
                                              PropertyCache.Get(entityType),
                                              includePrimary,
                                              includeIdentity,
                                              dbSetting);
            },

                                                      // binaryImport
                                                      async (tableName) =>
                                                      await connection.BinaryImportAsync <TEntity>(tableName,
                                                                                                   entities,
                                                                                                   mappings,
                                                                                                   dbFields,
                                                                                                   bulkCopyTimeout,
                                                                                                   batchSize,
                                                                                                   identityBehavior,
                                                                                                   dbSetting,
                                                                                                   transaction,
                                                                                                   cancellationToken),

                                                      // getDeleteToPseudoCommandText
                                                      () =>
                                                      GetDeleteCommandText(pseudoTableName,
                                                                           tableName,
                                                                           mappings.Select(mapping => new Field(mapping.DestinationColumn)),
                                                                           qualifiers,
                                                                           dbFields.FirstOrDefault(dbField => dbField.IsPrimary)?.AsField(),
                                                                           dbFields.FirstOrDefault(dbField => dbField.IsIdentity)?.AsField(),
                                                                           identityBehavior,
                                                                           dbSetting),

                                                      // setIdentities
                                                      (identityResults) =>
                                                      SetIdentities(entityType, entities, dbFields, identityResults, dbSetting),

                                                      qualifiers,
                                                      false,
                                                      identityBehavior,
                                                      pseudoTableType,
                                                      dbSetting,
                                                      transaction,
                                                      cancellationToken));
        }
Exemple #4
0
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="TPrimaryKey"></typeparam>
        /// <param name="connection"></param>
        /// <param name="tableName"></param>
        /// <param name="primaryKeys"></param>
        /// <param name="bulkCopyTimeout"></param>
        /// <param name="batchSize"></param>
        /// <param name="pseudoTableType"></param>
        /// <param name="transaction"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        private static async Task <int> BinaryBulkDeleteByKeyBaseAsync <TPrimaryKey>(this NpgsqlConnection connection,
                                                                                     string tableName,
                                                                                     IEnumerable <TPrimaryKey> primaryKeys,
                                                                                     int?bulkCopyTimeout = null,
                                                                                     int?batchSize       = null,
                                                                                     BulkImportPseudoTableType pseudoTableType = default,
                                                                                     NpgsqlTransaction transaction             = null,
                                                                                     CancellationToken cancellationToken       = default)
        {
            var identityBehavior = BulkImportIdentityBehavior.Unspecified;
            var dbSetting        = connection.GetDbSetting();
            var dbFields         = await DbFieldCache.GetAsync(connection, tableName, transaction, cancellationToken);

            var primaryKey      = dbFields.FirstOrDefault(dbField => dbField.IsPrimary);
            var pseudoTableName = tableName;
            IEnumerable <NpgsqlBulkInsertMapItem> mappings = null;

            return(await PseudoBasedBinaryImportAsync(connection,
                                                      tableName,
                                                      bulkCopyTimeout,
                                                      dbFields,

                                                      // getPseudoTableName
                                                      () =>
                                                      pseudoTableName = GetBinaryBulkDeleteByKeyPseudoTableName(tableName ?? ClassMappedNameCache.Get <TPrimaryKey>(), dbSetting),

                                                      // getMappings
                                                      () =>
                                                      mappings = new[]
            {
                new NpgsqlBulkInsertMapItem(primaryKey.Name, primaryKey.Name)
            },

                                                      // binaryImport
                                                      async (tableName) =>
                                                      await connection.BinaryImportAsync(tableName,
                                                                                         GetExpandoObjectData(primaryKeys, primaryKey.AsField()),
                                                                                         mappings,
                                                                                         dbFields,
                                                                                         bulkCopyTimeout,
                                                                                         batchSize,
                                                                                         identityBehavior,
                                                                                         dbSetting,
                                                                                         transaction,
                                                                                         cancellationToken),

                                                      // getDeleteToPseudoCommandText
                                                      () =>
                                                      GetDeleteByKeyCommandText(pseudoTableName,
                                                                                tableName,
                                                                                dbFields.FirstOrDefault(dbField => dbField.IsPrimary)?.AsField(),
                                                                                dbSetting),

                                                      // setIdentities
                                                      null,

                                                      null,
                                                      false,
                                                      identityBehavior,
                                                      pseudoTableType,
                                                      dbSetting,
                                                      transaction,
                                                      cancellationToken));
        }