DBCViewer.MainForm.backgroundWorker1_DoWork C# (CSharp) Method

backgroundWorker1_DoWork() private method

private backgroundWorker1_DoWork ( object sender, DoWorkEventArgs e ) : void
sender object
e DoWorkEventArgs
return void
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            m_startTime = DateTime.Now;

            string file = (string)e.Argument;

            m_dbreader = DBReaderFactory.GetReader(file, m_definition);

            m_fields = new List<Field>(m_definition.Fields);

            string[] colNames = m_fields.Select(f => f.Name).ToArray();

            int[] arraySizes = m_fields.Select(f => f.ArraySize).ToArray();

            bool isDBCorDB2 = m_dbreader is DBCReader || m_dbreader is DB2Reader;

            m_dataTable = new DataTable(Path.GetFileName(file));
            m_dataTable.Locale = CultureInfo.InvariantCulture;

            CreateColumns();                                // Add columns

            CreateIndexes();                                // Add indexes

            TypeCode[] types = m_dataTable.Columns.Cast<DataColumn>().Select(c => Type.GetTypeCode(c.DataType)).ToArray();

            var meta = (m_dbreader as DB5Reader)?.Meta;

            Func<TypeCode, bool> isSmallType = (t) =>
            {
                if (t == TypeCode.SByte || t == TypeCode.Byte || t == TypeCode.Int16 || t == TypeCode.UInt16)
                    return true;
                return false;
            };

            foreach (var row in m_dbreader.Rows) // Add rows
            {
                DataRow dataRow = m_dataTable.NewRow();

                using (BinaryReader br = row)
                {
                    int colIndex = 0;

                    for (int j = 0; j < m_fields.Count; j++)    // Add cells
                    {
                        for (int k = 0; k < arraySizes[j]; k++)
                        {
                            switch (types[colIndex])
                            {
                                case TypeCode.SByte:
                                    dataRow.SetField(colIndex, br.ReadInt8(meta?[j]));
                                    break;
                                case TypeCode.Byte:
                                    dataRow.SetField(colIndex, br.ReadUInt8(meta?[j]));
                                    break;
                                case TypeCode.Int16:
                                    dataRow.SetField(colIndex, br.ReadInt16(meta?[j]));
                                    break;
                                case TypeCode.UInt16:
                                    dataRow.SetField(colIndex, br.ReadUInt16(meta?[j]));
                                    break;
                                case TypeCode.Int32:
                                    dataRow.SetField(colIndex, br.ReadInt32(meta?[j]));
                                    break;
                                case TypeCode.UInt32:
                                    dataRow.SetField(colIndex, br.ReadUInt32(meta?[j]));
                                    break;
                                case TypeCode.Int64:
                                    dataRow.SetField(colIndex, br.ReadInt64(meta?[j]));
                                    break;
                                case TypeCode.UInt64:
                                    dataRow.SetField(colIndex, br.ReadUInt64(meta?[j]));
                                    break;
                                case TypeCode.Single:
                                    dataRow.SetField(colIndex, br.ReadSingle(meta?[j]));
                                    break;
                                case TypeCode.Double:
                                    dataRow.SetField(colIndex, br.ReadDouble(meta?[j]));
                                    break;
                                case TypeCode.String:
                                    ReadStringField(colIndex, meta?[j], dataRow, br);
                                    break;
                                default:
                                    throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Unknown field type {0} for column {1}!", types[colIndex], colNames[j]));
                            }

                            // small fields are padded with zeros in old format versions if next field isn't small
                            long frem = br.BaseStream.Position % 4;
                            if (isDBCorDB2 && frem != 0 && isSmallType(types[colIndex]) && (colIndex + 1 < types.Length) && !isSmallType(types[colIndex + 1]))
                                br.BaseStream.Position += (4 - frem);

                            colIndex++;
                        }
                    }
                }

                m_dataTable.Rows.Add(dataRow);

                int percent = (int)((float)m_dataTable.Rows.Count / m_dbreader.RecordsCount * 100.0f);
                (sender as BackgroundWorker).ReportProgress(percent);
            }

            e.Result = file;
        }