public static void WriteToDb(VolumeDatabase mem) { // TODO KBR allow user to name file, location SQLite sdb = new SQLite(); sdb.logit("SQLite-DBWrite", true); string dbName = "Indexer.db"; string dbFile = AppDomain.CurrentDomain.BaseDirectory + dbName; string dbSrc = string.Format("Data Source={0};Version=3;", dbName); if (File.Exists(dbFile)) { File.Delete(dbFile); SQLiteConnection.CreateFile(dbFile); } using (var conn = new SQLiteConnection(dbSrc)) { conn.Open(); CreateTables(conn); WriteData(conn, mem); CreateIndices(conn); } sdb.logit("SQLite-DBWrite"); }
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(); } }
private static void ReadLogicalFolders(SQLiteConnection conn, VolumeDatabase mem) { var lFoldList = mem.GetLogicalFolders(); // Note: order by owner insures that sub-folders are after their parents and hookup works string txt = "select * from LFold ORDER BY Owner"; using (SQLiteCommand cmd = new SQLiteCommand(txt, conn)) { using (SQLiteDataReader rdr = cmd.ExecuteReader()) { while (rdr.Read()) { /* * [ID] INTEGER NOT NULL PRIMARY KEY, * [Owner] INTEGER NOT NULL, * [Name] TEXT, * [Desc] TEXT, * [Type] INTEGER */ LogicalFolder lfold = new LogicalFolder(); lfold.DbId = rdr.GetInt32(0); lfold.Name = rdr.GetString(2); lfold.Description = rdr.GetString(3); lfold.FolderType = (LogicalFolderType)rdr.GetInt32(4); int owner = rdr.GetInt32(1); if (owner != 0) { HookupParent(lfold, rdr.GetInt32(1), lFoldList); } else { lFoldList.Add(lfold); } _lfoldHash.Add(lfold.DbId, lfold); } } } }
private static void ReadAllFiles(SQLiteConnection conn, VolumeDatabase mem) { // All folders have been read. // Read ALL the file rows, and push them into the correct folder // NOTE: this is *only* faster if folder-by-id lookup is fast enough, which the HashTable gives us string txt = "SELECT * FROM [FILES]"; using (SQLiteCommand cmd = new SQLiteCommand(txt, conn)) { using (SQLiteDataReader rdr = cmd.ExecuteReader()) { while (rdr.Read()) { int ownerId; var afile = FileFromRow(rdr, out ownerId); IFolder fid = _foldHash[ownerId] as IFolder; fid.AddToFiles(afile); _fileHash.Add(afile.DbId, afile); } } } }
internal void RemoveFromDatabase(VolumeDatabase database) { RemoveFromLogicalFolders(); database.RemoveDisc(this); }
internal void MergeWith(VolumeDatabase source) { discs.AddRange(source.GetDiscs()); mergeLogicalFolders(source.GetLogicalFolders()); }
internal static DiscInDatabase GetOptions(List <string> exludedElements, string drive, out LogicalFolder[] logicalFolders, Form parentForm, VolumeDatabase database, out DiscInDatabase discToReplace) { DlgReadVolume dlg = new DlgReadVolume(drive); Cursor oldCursor = parentForm.Cursor; parentForm.Cursor = Cursors.WaitCursor; try { discToReplace = null; dlg.database = database; DriveInfo di = new DriveInfo(drive); dlg.tbUserLabel.Text = dlg.llCdLabel.Text = di.VolumeLabel; if (dlg.tbUserLabel.Text == string.Empty) { dlg.tbUserLabel.Text = di.Name; } if (dlg.llCdLabel.Text == string.Empty) { dlg.llCdLabel.Text = "(no label)"; } dlg.llDriveFormat.Text = di.DriveFormat; dlg.llDriveType.Text = di.DriveType.ToString(); dlg.llFreeSpace.Text = di.TotalFreeSpace.ToKBAndB(); dlg.llSize.Text = di.TotalSize.ToKBAndB(); dlg.tbKeywords.Text = string.Empty; dlg.tbPhysicalLocation.Text = string.Empty; dlg.cbAutoEject.Checked = Properties.Settings.Default.AutoEject; dlg.cbReadFileVersion.Checked = Properties.Settings.Default.ReadFileInfo; dlg.llSerialNumber.Text = Win32.GetVolumeSerialNumber(drive); dlg.cbComputeCrc.Checked = Properties.Settings.Default.ComputeCrc; dlg.cbAutosaveAfterReading.Checked = Properties.Settings.Default.AutosaveAfterReading; dlg.cbBrowseZippedFiles.Checked = Properties.Settings.Default.BrowseInsideCompressed; TreeNode node = new TreeNode(); node.Tag = di; node.Text = di.Name.Replace(@"\", ""); node.Checked = true; node.SelectedImageIndex = node.ImageIndex = Win32.GetFileIconIndex(di.Name, Win32.FileIconSize.Small); Win32.UpdateSystemImageList(dlg.tvFileTree.ImageList, Win32.FileIconSize.Small, false, Properties.Resources.delete); dlg.tvFileTree.Nodes.Add(node); addLoadingString(node); } finally { parentForm.Cursor = oldCursor; } if (dlg.ShowDialog() == DialogResult.OK) { DiscInDatabase discInDatabase = new DiscInDatabase(); discInDatabase.Name = dlg.tbUserLabel.Text; discInDatabase.Keywords = dlg.tbKeywords.Text; discInDatabase.PhysicalLocation = dlg.tbPhysicalLocation.Text; logicalFolders = dlg.ucItemFolderClassification.LogicalFolders; Properties.Settings.Default.AutoEject = dlg.cbAutoEject.Checked; Properties.Settings.Default.ReadFileInfo = dlg.cbReadFileVersion.Checked; Properties.Settings.Default.ComputeCrc = dlg.cbComputeCrc.Checked; Properties.Settings.Default.AutosaveAfterReading = dlg.cbAutosaveAfterReading.Checked; Properties.Settings.Default.BrowseInsideCompressed = dlg.cbBrowseZippedFiles.Checked; if (dlg.cbReadFromSelected.Checked) { getExcludedElements(exludedElements, dlg.tvFileTree.Nodes); } discToReplace = dlg.returnDiscToReplace(); return(discInDatabase); } else { logicalFolders = null; return(null); } }