private static VolumeDatabase ReadData(SQLiteConnection conn) { // Track all folders by db-id for fast lookup _foldHash = new Hashtable(); _lfoldHash = new Hashtable(); _fileHash = new Hashtable(); VolumeDatabase mem = new VolumeDatabase(); string txt = "select * from Discs"; using (SQLiteCommand cmd = new SQLiteCommand(txt, conn)) { using (SQLiteDataReader rdr = cmd.ExecuteReader()) { while (rdr.Read()) { var dbid = (long)rdr["ID"]; // The top folder has this as the owner id DiscInDatabase did = new DiscInDatabase(-(int)dbid); did.DriveFormat = rdr["Format"] as string; did.DriveType = (DriveType)((long)rdr["Type"]); did.TotalFreeSpace = (long)rdr["Free"]; did.TotalSize = (long)rdr["Size"]; did.Scanned = DateTime.Parse((string)rdr["ScanTime"]); did.SerialNumber = rdr["Serial"] as string; did.PhysicalLocation = rdr["PhysicalLocation"] as string; did.FromDrive = rdr["FromDrive"] as string; did.Name = rdr.GetString(10); did.Keywords = rdr.GetString(11); did.Flags = rdr.GetInt32(12); did.Description = rdr.GetString(13); did.ClusterSize = (uint)rdr.GetInt32(14); mem.AddDisc(did); _foldHash.Add(-(int)dbid, did); } } } foreach (var discInDatabase in mem.GetDiscs()) { ReadFolders(conn, discInDatabase); } ReadAllFiles(conn, mem); ReadLogicalFolders(conn, mem); ReadLogicalFolderItems(conn, mem); _lfoldHash = _fileHash = _foldHash = null; // GC return(mem); }
private static void ReadLogicalFolderItems(SQLiteConnection conn, VolumeDatabase mem) { string txt = "SELECT * FROM [LFoldMap]"; using (SQLiteCommand cmd = new SQLiteCommand(txt, conn)) { using (SQLiteDataReader rdr = cmd.ExecuteReader()) { while (rdr.Read()) { int lFoldId = rdr.GetInt32(1); int iidId = rdr.GetInt32(2); int typeId = rdr.GetInt16(3); LogicalFolder lfold = _lfoldHash[lFoldId] as LogicalFolder; ItemInDatabase iid = null; switch (typeId) { case 1: // folder iid = _foldHash[iidId] as ItemInDatabase; break; case 2: // file iid = _fileHash[iidId] as ItemInDatabase; break; case 3: // disc. brute it. foreach (var discInDatabase in mem.GetDiscs()) { if (-discInDatabase.DbId == iidId) { iid = discInDatabase as ItemInDatabase; break; } } break; } lfold.AddItem(iid); // TODO make sure the two-way mapping is set! } } } }
private static void WriteData(SQLiteConnection conn, VolumeDatabase mem) { foreach (var disc in mem.GetDiscs()) { using (var tx = conn.BeginTransaction()) { WriteDisc(conn, disc); tx.Commit(); } } using (var tx = conn.BeginTransaction()) { foreach (var lFold in mem.GetLogicalFolders()) { WriteLFold(conn, lFold); WriteLFoldMap(conn, lFold); } tx.Commit(); } }
internal void MergeWith(VolumeDatabase source) { discs.AddRange(source.GetDiscs()); mergeLogicalFolders(source.GetLogicalFolders()); }