Example #1
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);
        }
Example #2
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!
                    }
                }
            }
        }
Example #3
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();
            }
        }
Example #4
0
 internal void MergeWith(VolumeDatabase source)
 {
     discs.AddRange(source.GetDiscs());
     mergeLogicalFolders(source.GetLogicalFolders());
 }