private void ReadDB(string file) { try { m_dbreader = DBReaderFactory.GetReader(file); } catch (Exception ex) { // 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); bool notDB5 = !(m_dbreader is DB5Reader); int fcount = GetFieldsCount(m_fields); if (fcount != m_dbreader.FieldsCount && notADB && notWDB && notSTL && notDB5) { if (!types[0].Equals("index")) { string msg = String.Format(CultureInfo.InvariantCulture, "{0} has invalid definition!\nFields count mismatch: got {1}, expected {2}", Path.GetFileName(file), fcount, m_dbreader.FieldsCount); return; } } m_dataTable = new PluginInterface.DataTable(Path.GetFileName(file)); m_dataTable.Locale = CultureInfo.InvariantCulture; CreateColumns(); // Add columns CreateIndexes(); // Add indexes //bool extraData = false; // Console.WriteLine(m_dbreader.RecordsCount); for (int i = 0; i < m_dbreader.RecordsCount; ++i) // Add rows { DataRow dataRow = m_dataTable.NewRow(); // Console.WriteLine(m_dbreader.RecordsCount); using (BinaryReader br = m_dbreader[i]) { // Console.WriteLine(m_dbreader[i].BaseStream.Length); for (int j = 0; j < m_fields.Count; ++j) // Add cells { // Console.WriteLine(m_fields.Count); 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 "index": dataRow[j] = m_dbreader.index[i]; break; case "int3": byte[] bytes = br.ReadBytes(3); byte[] buffer = new byte[4]; Buffer.BlockCopy(bytes, 0, buffer, 0, bytes.Length); dataRow[j] = BitConverter.ToInt32(buffer, 0); 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; case "nstring": try { dataRow[j] = br.ReadStringNull(); } catch { dataRow[j] = "Invalid string index!"; } break; case "cstring": dataRow[j] = br.ReadStringNumber(); 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); } Export2SQL.Export2SQL tosql = new Export2SQL.Export2SQL(); tosql.Run(m_dataTable); CloseFile(); }
private void CloseFile() { m_definition = null; m_dataTable = null; }