Пример #1
0
        private void UpdateToc()
        {
            //Open buffer for all objects
            byte[]           objectTocBuffer = new byte[TOC_ENTRY_LENGTH * objects.Count];
            BufferBinaryTool writer          = new BufferBinaryTool(objectTocBuffer);

            //Add all
            for (int i = 0; i < objects.Count; i += 1)
            {
                int offset = TOC_ENTRY_LENGTH * i;
                writer.WriteUInt64(offset + 0, objects[i].object_id);
                writer.WriteUInt64(offset + 8, objects[i].page_id);
                writer.WriteUInt64(offset + 16, objects[i].commit_id);
                writer.WriteInt32(offset + 24, objects[i].group_id);
                objectTocBuffer[offset + 28] = objects[i].commit_type;
                objectTocBuffer[offset + 29] = objects[i].flags;
                writer.WriteUInt16(offset + 30, objects[i].reserved);
            }

            //Add or update
            if (tocPage == -1)
            {
                tocPage = file.WriteNewBlob(PAGE_TYPE_TOC, objectTocBuffer);
            }
            else
            {
                tocPage = file.UpdateBlob(tocPage, PAGE_TYPE_TOC, objectTocBuffer);
            }
        }
Пример #2
0
        public static ContentDatabaseSession OpenDatabase(string path)
        {
            //Open file
            DatabaseFile file = DatabaseFile.LoadFile(path);

            //Open DB
            var db = new ContentDatabaseSession(file);

            //Read TOC
            if (db.tocPage != -1)
            {
                //Read blob
                byte[]           tocBytes = file.ReadBlob(db.tocPage);
                int              count    = tocBytes.Length / TOC_ENTRY_LENGTH;
                BufferBinaryTool reader   = new BufferBinaryTool(tocBytes);

                //Add all
                for (int i = 0; i < count; i++)
                {
                    int offset = TOC_ENTRY_LENGTH * i;
                    DatabaseObjectHeader entry = new DatabaseObjectHeader();
                    entry.object_id   = reader.ReadUInt64(offset + 0);
                    entry.page_id     = reader.ReadUInt64(offset + 8);
                    entry.commit_id   = reader.ReadUInt64(offset + 16);
                    entry.group_id    = reader.ReadInt32(offset + 24);
                    entry.commit_type = tocBytes[offset + 28];
                    entry.flags       = tocBytes[offset + 29];
                    entry.reserved    = reader.ReadUInt16(offset + 30);
                    db.objects.Add(entry);
                }
            }

            //Read Name Table
            if (db.nameTablePage != -1)
            {
                //Read blob
                byte[]           ntBytes = file.ReadBlob(db.nameTablePage);
                BufferBinaryTool reader  = new BufferBinaryTool(ntBytes);

                //Begin reading
                int index = 0;
                while (index < ntBytes.Length)
                {
                    //Read length
                    int length = reader.ReadInt32(index);

                    //Read string
                    db.nameTable.Add(Encoding.ASCII.GetString(ntBytes, index + 4, length));

                    //Update
                    index += length + 4;
                }
            }

            return(db);
        }
Пример #3
0
        private void UpdateNameTable()
        {
            //Calculate the length of the name table
            int nameTableLength = 0;

            foreach (var n in nameTable)
            {
                nameTableLength += Encoding.ASCII.GetByteCount(n) + 4;
            }

            //Open buffer
            byte[]           buffer = new byte[nameTableLength];
            BufferBinaryTool writer = new BufferBinaryTool(buffer);

            //Write
            int byteIndex = 0;

            foreach (var n in nameTable)
            {
                byte[] nameBytes = Encoding.ASCII.GetBytes(n);
                nameBytes.CopyTo(buffer, byteIndex + 4);
                writer.WriteInt32(byteIndex, nameBytes.Length);
                byteIndex += nameBytes.Length + 4;
            }

            //Add or update
            if (nameTablePage == -1)
            {
                nameTablePage = file.WriteNewBlob(PAGE_TYPE_NAMETABLE, buffer);
            }
            else
            {
                nameTablePage = file.UpdateBlob(nameTablePage, PAGE_TYPE_NAMETABLE, buffer);
            }

            //Set flag
            nameTableDirty = false;
        }