Exemplo n.º 1
0
        public async Task <int> Extract(DbExtract extract, DbProtocol dbProtocol)
        {
            var mapper = dbProtocol.SupportsDifferential ? ExtractDiffMapper.Instance : ExtractMapper.Instance;

            int batch = 500;

            var list = new List <TempContactListingExtract>();

            int count  = 0;
            int loaded = 0;

            using (var rdr = await _reader.ExecuteReader(dbProtocol, extract))
            {
                while (rdr.Read())
                {
                    count++;
                    loaded++;
                    // AutoMapper profiles
                    var extractRecord = mapper.Map <IDataRecord, TempContactListingExtract>(rdr);
                    extractRecord.Id = LiveGuid.NewGuid();
                    list.Add(extractRecord);

                    if (count == batch)
                    {
                        _extractRepository.BatchInsert(list);

                        count = 0;


                        DomainEvents.Dispatch(
                            new ExtractActivityNotification(extract.Id, new DwhProgress(
                                                                nameof(ContactListingExtract),
                                                                nameof(ExtractStatus.Finding),
                                                                loaded, 0, 0, 0, 0)));
                        list = new List <TempContactListingExtract>();
                    }
                }

                if (count > 0)
                {
                    // save remaining list;
                    _extractRepository.BatchInsert(list);
                }
                _extractRepository.CloseConnection();
            }

            // TODO: Notify Completed;
            DomainEvents.Dispatch(
                new ExtractActivityNotification(extract.Id, new DwhProgress(
                                                    nameof(ContactListingExtract),
                                                    nameof(ExtractStatus.Found),
                                                    loaded, 0, 0, 0, 0)));

            return(loaded);
        }