コード例 #1
0
ファイル: DBViewer.cs プロジェクト: lyragosa/aleph
        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();
        }
コード例 #2
0
ファイル: DBViewer.cs プロジェクト: lyragosa/aleph
 private void CloseFile()
 {
     m_definition = null;
     m_dataTable  = null;
 }