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;
}