private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { string file = (string)e.Argument; try { m_dbreader = DBReaderFactory.GetReader(file, m_definition); } catch (Exception ex) { ShowErrorMessageBox(ex.Message); e.Cancel = true; return; } m_fields = m_definition.GetElementsByTagName("field"); string[] types = new string[m_fields.Count]; int[] sizes = new int[m_fields.Count]; for (int j = 0; j < m_fields.Count; ++j) { types[j] = m_fields[j].Attributes["type"].Value; sizes[j] = int.Parse(m_fields[j].Attributes["size"]?.Value ?? "1"); } m_formats = new XmlAttribute[sizes.Sum()]; for (int j = 0, k = 0; j < m_fields.Count; ++j, ++k) { for (var s = 0; s < sizes[j]; ++s) { m_formats[k] = m_fields[j].Attributes["format"]; } } // hack for *.adb files (because they don't have FieldsCount) bool notADB = !(m_dbreader is ADBReader); // hack for *.wdb files (because they don't have FieldsCount) bool notWDB = !(m_dbreader is WDBReader); // hack for *.wdb files (because they don't have FieldsCount) bool notSTL = !(m_dbreader is STLReader); // hack for *.db2 files v3 (because they don't have FieldsCount) bool notDB3 = !(m_dbreader is DB3Reader); if (m_fields.Count != m_dbreader.FieldsCount && notADB && notWDB && notSTL && notDB3) { string msg = String.Format(CultureInfo.InvariantCulture, "{0} has invalid definition!\nFields count mismatch: got {1}, expected {2}", Path.GetFileName(file), m_fields.Count, m_dbreader.FieldsCount); ShowErrorMessageBox(msg); e.Cancel = true; return; } m_dataTable = new DataTable(Path.GetFileName(file)); m_dataTable.Locale = CultureInfo.InvariantCulture; CreateColumns(); // Add columns CreateIndexes(); // Add indexes //bool extraData = false; foreach (var row in m_dbreader.Rows) // Add rows { DataRow dataRow = m_dataTable.NewRow(); using (BinaryReader br = row) { int j = 0; if (m_dbreader.HasSeparateIndexColumn) { dataRow[j++] = br.ReadUInt32(); } for (int c = 0; c < m_fields.Count; ++c) // Add cells { for (var arrSize = 0; arrSize < sizes[c]; ++arrSize, ++j) { var type = types[c]; if (type == "int" || type == "uint") { var typeOverride = m_dbreader.GetIntLength(c); if (typeOverride != null) { type = typeOverride; } } switch (type) { case "long": dataRow[j] = br.ReadInt64(); break; case "ulong": dataRow[j] = br.ReadUInt64(); break; case "int": dataRow[j] = br.ReadInt32(); break; case "uint": dataRow[j] = br.ReadUInt32(); break; case "short": dataRow[j] = br.ReadInt16(); break; case "ushort": dataRow[j] = br.ReadUInt16(); break; case "sbyte": dataRow[j] = br.ReadSByte(); break; case "byte": dataRow[j] = br.ReadByte(); break; case "float": dataRow[j] = br.ReadSingle(); break; case "double": dataRow[j] = br.ReadDouble(); break; case "string": if (m_dbreader.HasInlineStrings) { dataRow[j] = br.ReadStringNull(); } else if (m_dbreader is STLReader) { int offset = br.ReadInt32(); dataRow[j] = (m_dbreader as STLReader).ReadString(offset); } else { try { dataRow[j] = m_dbreader.StringTable[br.ReadInt32()]; } catch { dataRow[j] = "Invalid string index!"; } } break; case "intarray": { int columns = br.ReadByte(); var sb = new StringBuilder(); for (var c2 = 0; c2 < columns; ++c2) { sb.Append(br.ReadUInt32()).Append(", "); } dataRow[j] = sb.ToString(); break; } case "int24": dataRow[j] = br.ReadInt24(); break; case "uint24": dataRow[j] = br.ReadUInt24(); break; default: throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Unknown field type {0}!", type)); } } } } m_dataTable.Rows.Add(dataRow); int percent = (int)((float)m_dataTable.Rows.Count / m_dbreader.RecordsCount * 100.0f); (sender as BackgroundWorker).ReportProgress(percent); } //if (extraData) //{ // MessageBox.Show("extra data detected!"); //} if (dataGridView1.InvokeRequired) { SetDataViewDelegate d = new SetDataViewDelegate(SetDataSource); Invoke(d, new object[] { m_dataTable.DefaultView }); } else { SetDataSource(m_dataTable.DefaultView); } e.Result = file; }
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { var file = (string)e.Argument; try { m_reader = DBReaderFactory.GetReader(file); } catch (Exception ex) { ShowErrorMessageBox(ex.Message); e.Cancel = true; return; } m_fields = m_definition.GetElementsByTagName("field"); string[] types = new string[m_fields.Count]; for (var j = 0; j < m_fields.Count; ++j) types[j] = m_fields[j].Attributes["type"].Value; // hack for *.adb files (because they don't have FieldsCount) var notADB = !(m_reader is ADBReader); // hack for *.wdb files (because they don't have FieldsCount) var notWDB = !(m_reader is WDBReader); if (GetFieldsCount(m_fields) != m_reader.FieldsCount && notADB && notWDB) { var msg = String.Format(CultureInfo.InvariantCulture, "{0} has invalid definition!\nFields count mismatch: got {1}, expected {2}", Path.GetFileName(file), m_fields.Count, m_reader.FieldsCount); ShowErrorMessageBox(msg); e.Cancel = true; return; } m_dataTable = new DataTable(Path.GetFileName(file)); m_dataTable.Locale = CultureInfo.InvariantCulture; CreateColumns(); // Add columns CreateIndexes(); // Add indexes for (var i = 0; i < m_reader.RecordsCount; ++i) // Add rows { var dataRow = m_dataTable.NewRow(); #region Test //var bytes = m_reader.GetRowAsByteArray(i); //unsafe //{ // fixed (void* b = bytes) // { // IntPtr ptr = new IntPtr(b); // int offset = 0; // for (var j = 0; j < m_fields.Count; ++j) // Add cells // { // switch (types[j]) // { // case "long": // dataRow[j] = *(long*)(ptr + offset); // offset += 8; // break; // case "ulong": // dataRow[j] = *(ulong*)(ptr + offset); // offset += 8; // break; // case "int": // dataRow[j] = *(int*)(ptr + offset); // offset += 4; // break; // case "uint": // dataRow[j] = *(uint*)(ptr + offset); // offset += 4; // break; // case "short": // dataRow[j] = *(short*)(ptr + offset); // offset += 2; // break; // case "ushort": // dataRow[j] = *(ushort*)(ptr + offset); // offset += 2; // break; // case "sbyte": // dataRow[j] = *(sbyte*)(ptr + offset); // offset += 1; // break; // case "byte": // dataRow[j] = *(byte*)(ptr + offset); // offset += 1; // break; // case "float": // dataRow[j] = *(float*)(ptr + offset); // offset += 4; // break; // case "double": // dataRow[j] = *(double*)(ptr + offset); // offset += 8; // break; // case "string": // dataRow[j] = m_reader.StringTable[*(int*)(ptr + offset)]; // offset += 4; // break; // default: // throw new Exception(String.Format("Unknown field type {0}!", m_fields[j].Attributes["type"].Value)); // } // } // } //} #endregion var br = m_reader[i]; for (var j = 0; j < m_fields.Count; ++j) // Add cells { switch (types[j]) { case "long": dataRow[j] = br.ReadInt64(); break; case "ulong": dataRow[j] = br.ReadUInt64(); break; case "int": dataRow[j] = br.ReadInt32(); break; case "uint": dataRow[j] = br.ReadUInt32(); break; case "short": dataRow[j] = br.ReadInt16(); break; case "ushort": dataRow[j] = br.ReadUInt16(); break; case "sbyte": dataRow[j] = br.ReadSByte(); break; case "byte": dataRow[j] = br.ReadByte(); break; case "float": dataRow[j] = br.ReadSingle(); break; case "double": dataRow[j] = br.ReadDouble(); break; case "string": dataRow[j] = m_reader is WDBReader ? br.ReadStringNull() : m_reader.StringTable[br.ReadInt32()]; break; default: throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "Unknown field type {0}!", types[j])); } } m_dataTable.Rows.Add(dataRow); int percent = (int)((float)m_dataTable.Rows.Count / (float)m_reader.RecordsCount * 100.0f); (sender as BackgroundWorker).ReportProgress(percent); } if (dataGridView1.InvokeRequired) { SetDataViewDelegate d = new SetDataViewDelegate(SetDataSource); Invoke(d, new object[] { m_dataTable.DefaultView }); } else SetDataSource(m_dataTable.DefaultView); e.Result = file; }
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { string file = (string)e.Argument; try { m_dbreader = DBReaderFactory.GetReader(file); } catch (Exception ex) { ShowErrorMessageBox(ex.Message); e.Cancel = true; return; } m_fields = m_definition.GetElementsByTagName("field"); string[] types = new string[m_fields.Count]; for (int j = 0; j < m_fields.Count; ++j) types[j] = m_fields[j].Attributes["type"].Value; // hack for *.adb files (because they don't have FieldsCount) bool notADB = !(m_dbreader is ADBReader); // hack for *.wdb files (because they don't have FieldsCount) bool notWDB = !(m_dbreader is WDBReader); // hack for *.wdb files (because they don't have FieldsCount) bool notSTL = !(m_dbreader is STLReader); int fcount = GetFieldsCount(m_fields); if (fcount != m_dbreader.FieldsCount && notADB && notWDB && notSTL) { string msg = String.Format(CultureInfo.InvariantCulture, "{0} has invalid definition!\nFields count mismatch: got {1}, expected {2}", Path.GetFileName(file), fcount, m_dbreader.FieldsCount); ShowErrorMessageBox(msg); e.Cancel = true; return; } m_dataTable = new DataTable(Path.GetFileName(file)); m_dataTable.Locale = CultureInfo.InvariantCulture; CreateColumns(); // Add columns CreateIndexes(); // Add indexes //bool extraData = false; for (int i = 0; i < m_dbreader.RecordsCount; ++i) // Add rows { DataRow dataRow = m_dataTable.NewRow(); using (BinaryReader br = m_dbreader[i]) { for (int j = 0; j < m_fields.Count; ++j) // Add cells { switch (types[j]) { case "long": dataRow[j] = br.ReadInt64(); break; case "ulong": dataRow[j] = br.ReadUInt64(); break; case "int": dataRow[j] = br.ReadInt32(); break; case "uint": dataRow[j] = br.ReadUInt32(); break; case "short": dataRow[j] = br.ReadInt16(); break; case "ushort": dataRow[j] = br.ReadUInt16(); break; case "sbyte": dataRow[j] = br.ReadSByte(); break; case "byte": dataRow[j] = br.ReadByte(); break; case "float": dataRow[j] = br.ReadSingle(); break; case "double": dataRow[j] = br.ReadDouble(); break; case "string": if (m_dbreader is WDBReader) dataRow[j] = br.ReadStringNull(); else if (m_dbreader is STLReader) { int offset = br.ReadInt32(); dataRow[j] = (m_dbreader as STLReader).ReadString(offset); } else { try { dataRow[j] = m_dbreader.StringTable[br.ReadInt32()]; } catch { dataRow[j] = "Invalid string index!"; } } break; default: throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "Unknown field type {0}!", types[j])); } } } m_dataTable.Rows.Add(dataRow); int percent = (int)((float)m_dataTable.Rows.Count / (float)m_dbreader.RecordsCount * 100.0f); (sender as BackgroundWorker).ReportProgress(percent); } //if (extraData) //{ // MessageBox.Show("extra data detected!"); //} if (dataGridView1.InvokeRequired) { SetDataViewDelegate d = new SetDataViewDelegate(SetDataSource); Invoke(d, new object[] { m_dataTable.DefaultView }); } else SetDataSource(m_dataTable.DefaultView); e.Result = file; }
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { var file = (string)e.Argument; try { var ext = Path.GetExtension(file).ToUpperInvariant(); if (ext == ".DBC") { m_reader = new DBCReader(file); } else if (ext == ".DB2") { m_reader = new DB2Reader(file); } else if (ext == ".ADB") { m_reader = new ADBReader(file); } else if (ext == ".WDB") { m_reader = new WDBReader(file); } else { throw new InvalidDataException(String.Format("Unknown file type {0}", ext)); } } catch (Exception ex) { ShowErrorMessageBox(ex.Message); e.Cancel = true; return; } m_fields = m_definition.GetElementsByTagName("field"); string[] types = new string[m_fields.Count]; for (var j = 0; j < m_fields.Count; ++j) { types[j] = m_fields[j].Attributes["type"].Value; } // hack for *.adb files (because they don't have FieldsCount) var notADB = !(m_reader is ADBReader); // hack for *.wdb files (because they don't have FieldsCount) var notWDB = !(m_reader is WDBReader); if (GetFieldsCount(m_fields) != m_reader.FieldsCount && notADB && notWDB) { var msg = String.Format(CultureInfo.InvariantCulture, "{0} has invalid definition!\nFields count mismatch: got {1}, expected {2}", Path.GetFileName(file), m_fields.Count, m_reader.FieldsCount); ShowErrorMessageBox(msg); e.Cancel = true; return; } m_dataTable = new DataTable(Path.GetFileName(file)); m_dataTable.Locale = CultureInfo.InvariantCulture; CreateColumns(); // Add columns CreateIndexes(); // Add indexes for (var i = 0; i < m_reader.RecordsCount; ++i) // Add rows { var dataRow = m_dataTable.NewRow(); #region Test //var bytes = m_reader.GetRowAsByteArray(i); //unsafe //{ // fixed (void* b = bytes) // { // IntPtr ptr = new IntPtr(b); // int offset = 0; // for (var j = 0; j < m_fields.Count; ++j) // Add cells // { // switch (types[j]) // { // case "long": // dataRow[j] = *(long*)(ptr + offset); // offset += 8; // break; // case "ulong": // dataRow[j] = *(ulong*)(ptr + offset); // offset += 8; // break; // case "int": // dataRow[j] = *(int*)(ptr + offset); // offset += 4; // break; // case "uint": // dataRow[j] = *(uint*)(ptr + offset); // offset += 4; // break; // case "short": // dataRow[j] = *(short*)(ptr + offset); // offset += 2; // break; // case "ushort": // dataRow[j] = *(ushort*)(ptr + offset); // offset += 2; // break; // case "sbyte": // dataRow[j] = *(sbyte*)(ptr + offset); // offset += 1; // break; // case "byte": // dataRow[j] = *(byte*)(ptr + offset); // offset += 1; // break; // case "float": // dataRow[j] = *(float*)(ptr + offset); // offset += 4; // break; // case "double": // dataRow[j] = *(double*)(ptr + offset); // offset += 8; // break; // case "string": // dataRow[j] = m_reader.StringTable[*(int*)(ptr + offset)]; // offset += 4; // break; // default: // throw new Exception(String.Format("Unknown field type {0}!", m_fields[j].Attributes["type"].Value)); // } // } // } //} #endregion var br = m_reader[i]; for (var j = 0; j < m_fields.Count; ++j) // Add cells { switch (types[j]) { case "long": dataRow[j] = br.ReadInt64(); break; case "ulong": dataRow[j] = br.ReadUInt64(); break; case "int": dataRow[j] = br.ReadInt32(); break; case "uint": dataRow[j] = br.ReadUInt32(); break; case "short": dataRow[j] = br.ReadInt16(); break; case "ushort": dataRow[j] = br.ReadUInt16(); break; case "sbyte": dataRow[j] = br.ReadSByte(); break; case "byte": dataRow[j] = br.ReadByte(); break; case "float": dataRow[j] = br.ReadSingle(); break; case "double": dataRow[j] = br.ReadDouble(); break; case "string": dataRow[j] = m_reader is WDBReader?br.ReadStringNull() : m_reader.StringTable[br.ReadInt32()]; break; default: throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "Unknown field type {0}!", types[j])); } } m_dataTable.Rows.Add(dataRow); int percent = (int)((float)m_dataTable.Rows.Count / (float)m_reader.RecordsCount * 100.0f); (sender as BackgroundWorker).ReportProgress(percent); } if (dataGridView1.InvokeRequired) { SetDataViewDelegate d = new SetDataViewDelegate(SetDataSource); Invoke(d, new object[] { m_dataTable.DefaultView }); } else { SetDataSource(m_dataTable.DefaultView); } e.Result = file; }
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { string file = (string)e.Argument; try { m_dbreader = DBReaderFactory.GetReader(file, m_definition); } catch (Exception ex) { ShowErrorMessageBox(ex.Message); e.Cancel = true; return; } m_fields = m_definition.GetElementsByTagName("field"); string[] types = new string[m_fields.Count]; int[] sizes = new int[m_fields.Count]; for (int j = 0; j < m_fields.Count; ++j) { types[j] = m_fields[j].Attributes["type"].Value; sizes[j] = int.Parse(m_fields[j].Attributes["size"]?.Value ?? "1"); } m_formats = new XmlAttribute[sizes.Sum()]; for (int j = 0, k = 0; j < m_fields.Count; ++j, ++k) for (var s = 0; s < sizes[j]; ++s) m_formats[k] = m_fields[j].Attributes["format"]; // hack for *.adb files (because they don't have FieldsCount) bool notADB = !(m_dbreader is ADBReader); // hack for *.wdb files (because they don't have FieldsCount) bool notWDB = !(m_dbreader is WDBReader); // hack for *.wdb files (because they don't have FieldsCount) bool notSTL = !(m_dbreader is STLReader); // hack for *.db2 files v3 (because they don't have FieldsCount) bool notDB3 = !(m_dbreader is DB3Reader); if (m_fields.Count != m_dbreader.FieldsCount && notADB && notWDB && notSTL && notDB3) { string msg = String.Format(CultureInfo.InvariantCulture, "{0} has invalid definition!\nFields count mismatch: got {1}, expected {2}", Path.GetFileName(file), m_fields.Count , m_dbreader.FieldsCount); ShowErrorMessageBox(msg); e.Cancel = true; return; } m_dataTable = new DataTable(Path.GetFileName(file)); m_dataTable.Locale = CultureInfo.InvariantCulture; CreateColumns(); // Add columns CreateIndexes(); // Add indexes //bool extraData = false; foreach (var row in m_dbreader.Rows) // Add rows { DataRow dataRow = m_dataTable.NewRow(); using (BinaryReader br = row) { int j = 0; if (m_dbreader.HasSeparateIndexColumn) dataRow[j++] = br.ReadUInt32(); for (int c = 0; c < m_fields.Count; ++c) // Add cells { for (var arrSize = 0; arrSize < sizes[c]; ++arrSize, ++j) { var type = types[c]; if (type == "int" || type == "uint") { var typeOverride = m_dbreader.GetIntLength(c); if (typeOverride != null) type = typeOverride; } switch (type) { case "long": dataRow[j] = br.ReadInt64(); break; case "ulong": dataRow[j] = br.ReadUInt64(); break; case "int": dataRow[j] = br.ReadInt32(); break; case "uint": dataRow[j] = br.ReadUInt32(); break; case "short": dataRow[j] = br.ReadInt16(); break; case "ushort": dataRow[j] = br.ReadUInt16(); break; case "sbyte": dataRow[j] = br.ReadSByte(); break; case "byte": dataRow[j] = br.ReadByte(); break; case "float": dataRow[j] = br.ReadSingle(); break; case "double": dataRow[j] = br.ReadDouble(); break; case "string": if (m_dbreader.HasInlineStrings) dataRow[j] = br.ReadStringNull(); else if (m_dbreader is STLReader) { int offset = br.ReadInt32(); dataRow[j] = (m_dbreader as STLReader).ReadString(offset); } else { try { dataRow[j] = m_dbreader.StringTable[br.ReadInt32()]; } catch { dataRow[j] = "Invalid string index!"; } } break; case "intarray": { int columns = br.ReadByte(); var sb = new StringBuilder(); for (var c2 = 0; c2 < columns; ++c2) sb.Append(br.ReadUInt32()).Append(", "); dataRow[j] = sb.ToString(); break; } case "int24": dataRow[j] = br.ReadInt24(); break; case "uint24": dataRow[j] = br.ReadUInt24(); break; default: throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Unknown field type {0}!", type)); } } } } m_dataTable.Rows.Add(dataRow); int percent = (int)((float)m_dataTable.Rows.Count / m_dbreader.RecordsCount * 100.0f); (sender as BackgroundWorker).ReportProgress(percent); } //if (extraData) //{ // MessageBox.Show("extra data detected!"); //} if (dataGridView1.InvokeRequired) { SetDataViewDelegate d = new SetDataViewDelegate(SetDataSource); Invoke(d, new object[] { m_dataTable.DefaultView }); } else SetDataSource(m_dataTable.DefaultView); e.Result = file; }
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { string file = (string)e.Argument; try { m_reader = DBReaderFactory.GetReader(file); } catch (Exception ex) { ShowErrorMessageBox(ex.Message); e.Cancel = true; return; } m_fields = m_definition.GetElementsByTagName("field"); string[] types = new string[m_fields.Count]; for (int j = 0; j < m_fields.Count; ++j) { types[j] = m_fields[j].Attributes["type"].Value; } // hack for *.adb files (because they don't have FieldsCount) bool notADB = !(m_reader is ADBReader); // hack for *.wdb files (because they don't have FieldsCount) bool notWDB = !(m_reader is WDBReader); if (GetFieldsCount(m_fields) != m_reader.FieldsCount && notADB && notWDB) { string msg = String.Format(CultureInfo.InvariantCulture, "{0} has invalid definition!\nFields count mismatch: got {1}, expected {2}", Path.GetFileName(file), m_fields.Count, m_reader.FieldsCount); ShowErrorMessageBox(msg); e.Cancel = true; return; } m_dataTable = new DataTable(Path.GetFileName(file)); m_dataTable.Locale = CultureInfo.InvariantCulture; CreateColumns(); // Add columns CreateIndexes(); // Add indexes for (int i = 0; i < m_reader.RecordsCount; ++i) // Add rows { DataRow dataRow = m_dataTable.NewRow(); BinaryReader br = m_reader[i]; for (int j = 0; j < m_fields.Count; ++j) // Add cells { switch (types[j]) { case "long": dataRow[j] = br.ReadInt64(); break; case "ulong": dataRow[j] = br.ReadUInt64(); break; case "int": dataRow[j] = br.ReadInt32(); break; case "uint": dataRow[j] = br.ReadUInt32(); break; case "short": dataRow[j] = br.ReadInt16(); break; case "ushort": dataRow[j] = br.ReadUInt16(); break; case "sbyte": dataRow[j] = br.ReadSByte(); break; case "byte": dataRow[j] = br.ReadByte(); break; case "float": dataRow[j] = br.ReadSingle(); break; case "double": dataRow[j] = br.ReadDouble(); break; case "string": dataRow[j] = m_reader is WDBReader?br.ReadStringNull() : m_reader.StringTable[br.ReadInt32()]; break; default: throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "Unknown field type {0}!", types[j])); } } m_dataTable.Rows.Add(dataRow); int percent = (int)((float)m_dataTable.Rows.Count / (float)m_reader.RecordsCount * 100.0f); (sender as BackgroundWorker).ReportProgress(percent); } if (dataGridView1.InvokeRequired) { SetDataViewDelegate d = new SetDataViewDelegate(SetDataSource); Invoke(d, new object[] { m_dataTable.DefaultView }); } else { SetDataSource(m_dataTable.DefaultView); } e.Result = file; }