Exemplo n.º 1
0
        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");
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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!
                    }
                }
            }
        }
Exemplo n.º 4
0
        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();
            }
        }
Exemplo n.º 5
0
        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);
                    }
                }
            }
        }
Exemplo n.º 6
0
        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);
                    }
                }
            }
        }
Exemplo n.º 7
0
 internal void RemoveFromDatabase(VolumeDatabase database)
 {
     RemoveFromLogicalFolders();
     database.RemoveDisc(this);
 }
Exemplo n.º 8
0
 internal void MergeWith(VolumeDatabase source)
 {
     discs.AddRange(source.GetDiscs());
     mergeLogicalFolders(source.GetLogicalFolders());
 }
Exemplo n.º 9
0
        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);
            }
        }