protected override async Task EmitBatchAsync(IEnumerable <RequestEntry> events)
        {
            var list = events as IList <RequestEntry> ?? events.ToList();

            this.Fill(list);

            using (var connection = new SqlConnection(_options.ConnectionString))
            {
                connection.Open();
                using (var copy = new SqlBulkCopy(connection))
                {
                    copy.DestinationTableName = string.Format(_options.RequestsTableName);
                    foreach (var column in _eventsTable.Columns)
                    {
                        var columnName = ((DataColumn)column).ColumnName;
                        var mapping    = new SqlBulkCopyColumnMapping(columnName, columnName);
                        copy.ColumnMappings.Add(mapping);
                    }

                    await copy.WriteToServerAsync(_eventsTable).ConfigureAwait(false);
                }
            }
            _eventsTable.Clear();

            await _locations.Append(list.Select(e => e.SourceAddress).Distinct().ToArray()).ConfigureAwait(false);
        }
Exemple #2
0
        /// <summary>
        ///     Emit a batch of log events, running asynchronously.
        /// </summary>
        /// <param name="events">The events to emit.</param>
        /// <remarks>
        ///     Override either <see cref="PeriodicBatchingSink.EmitBatch" /> or <see cref="PeriodicBatchingSink.EmitBatchAsync" />
        ///     ,
        ///     not both.
        /// </remarks>
        protected override async Task EmitBatchAsync(IEnumerable <LogEvent> events)
        {
            // Copy the events to the data table
            this.FillDataTable(events);

            try
            {
                using (var cn = new SqlConnection(_connectionString))
                {
                    await cn.OpenAsync().ConfigureAwait(false);

                    using (var copy = _columnOptions.DisableTriggers
                                          ? new SqlBulkCopy(cn)
                                          : new SqlBulkCopy(cn, SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.FireTriggers, null)
                           )
                    {
                        copy.DestinationTableName = _tableName;
                        foreach (var column in _eventsTable.Columns)
                        {
                            var columnName = ((DataColumn)column).ColumnName;
                            var mapping    = new SqlBulkCopyColumnMapping(columnName, columnName);
                            copy.ColumnMappings.Add(mapping);
                        }

                        await copy.WriteToServerAsync(_eventsTable).ConfigureAwait(false);
                    }
                }

                await _locations.Append(_eventsTable.Rows.OfType <DataRow>().Select(e => e["SourceAddress"].ToString()).Distinct().ToArray()).ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                SelfLog.WriteLine("Unable to write {0} log events to the database due to following error: {1}", events.Count(), ex.Message);
            }
            finally
            {
                // Processed the items, clear for the next run
                _eventsTable.Clear();
            }
        }