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); } }
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); }
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; }