private FileHeader m_fileHeader; //the only file header in the two files, it is located at page 0. public memSegmentManager(DiskFile file) { m_cache = new CacheHashtable(m_cacheSize); m_pageSize = 1 << m_pageBits; m_diskFile = file; m_bitmap = new PageBitmap(); m_fileHeader = new FileHeader(); if (file.Length < m_bitmap.Data.Length + m_pageSize*2) //page 0 for fileheader, page 33 for segTree, page 44 for spacetree { //this helper file is a new one for (int i=0; i<(m_bitmap.Data.Length >> (m_pageBits + 3)); i++) m_bitmap.Data[i] = 0xFF; m_bitmap.SetPageTaken(m_bitmap.GetFirstFreePageID()); //one more page taken because of the fileheader m_bitmap.Dirty = true; m_fileHeader.SetInitializeNeeded(); } else { byte[] header = file.SynRead(0, m_pageSize); m_fileHeader.Deserialize(header); file.SynRead(m_bitmap.Data, 0, m_pageSize, m_bitmap.Data.Length); } m_LRU = new BNode(); }
private int m_threshold = 256; //256 bytes public dbSegmentManager(uint nextSegmentId, SegTree segTree, SpaceTree spaceTree, DiskFile file) { m_next_segment_id = nextSegmentId; m_segTree = segTree; m_cache = new CacheHashtable(m_cacheSize); m_diskFile = file; m_spaceTree = spaceTree; m_LRU = new BNode(); }
private DiskFile m_dbFile; //the file handler for main database file public SpaceTree(uint topSid, SegmentManager sgManager, DiskFile dbFile) { m_tree = new BTree(topSid, sgManager, new KOffset()); m_sgManager = sgManager; m_dbFile = dbFile; }
/// <summary> /// Create the internal storage for the dbFile. /// Note: /// 1. a helper file for segment managment b-tree is also created if this database file /// does not exist. /// </summary> /// <param name="dbFile"></param> public ObjectStore(string dbFileName) { m_dbFile = new DiskFile(dbFileName); m_indexFile = new DiskFile(dbFileName+".idx"); m_indexPageManager = new memSegmentManager(m_indexFile); if (m_indexPageManager.Header.InitializeNeeded) { m_indexPageManager.Header.NextSegmentId = 0; m_indexPageManager.Header.NextObjectId = 0; m_indexPageManager.Header.NextClassId = 0; //initialize the segment b-tree's top node id OOD.Imp.Storage.BNode segTreeTop = new OOD.Imp.Storage.BNode(); m_indexPageManager.GetNewSegment(segTreeTop); segTreeTop.SetOrder(m_segTreeNodeOrder); segTreeTop.Leaf = true; m_indexPageManager.Header.SegmentTreeTopNodeSId = segTreeTop.SegmentID; //initialize the space b-tree's top node id BNode spaceTreeTop = new BNode(); m_indexPageManager.GetNewSegment(spaceTreeTop); spaceTreeTop.SetOrder(m_spaceTreeNodeOrder); spaceTreeTop.Leaf = true; m_indexPageManager.Header.FreeSpaceTreeTopNodeSId = spaceTreeTop.SegmentID; } m_segmentIndexTree = new SegTree(m_indexPageManager.Header.SegmentTreeTopNodeSId, m_indexPageManager); m_spaceIndexTree = new SpaceTree(m_indexPageManager.Header.FreeSpaceTreeTopNodeSId, m_indexPageManager, m_dbFile); m_dbSegmentManager = new dbSegmentManager( m_indexPageManager.Header.NextSegmentId, m_segmentIndexTree, m_spaceIndexTree, m_dbFile); if (m_indexPageManager.Header.InitializeNeeded) { BNode catalogTop = new BNode(); m_dbSegmentManager.GetNewSegment(catalogTop); catalogTop.SetOrder(m_catalogTreeNodeOrder); catalogTop.Leaf = true; m_indexPageManager.Header.CatalogTreeTopNodeSId = catalogTop.SegmentID; } m_catalogTree = new CatalogTree( m_indexPageManager.Header.CatalogTreeTopNodeSId, m_dbSegmentManager, m_indexPageManager.Header.NextClassId); m_classCache = new LRUHashtable(m_cache_size, m_classCacheLimit); m_objectTreeCache = new LRUHashtable(m_cache_size, m_objectTreeCacheLimit); //bring top node's segment tree, space tree, catalog tree into cache, they will be needed anyway if (!m_indexPageManager.Header.InitializeNeeded) { m_indexPageManager.GetSegment(m_segmentIndexTree.TopNodSegId, new BNode(), new KSegId()); m_indexPageManager.GetSegment(m_spaceIndexTree.TopNodeSId, new BNode(), new KOffset()); m_dbSegmentManager.GetSegment(m_catalogTree.TopNodeSId, new BNode(), new KCatalog()); } }
/// <summary> /// Create the internal storage for the dbFile. /// Note: /// 1. a helper file for segment managment b-tree is also created if this database file /// does not exist. /// </summary> /// <param name="dbFile"></param> public ObjectStore(string dbFileName) { m_dbFile = new DiskFile(dbFileName); m_indexFile = new DiskFile(dbFileName + ".idx"); m_indexPageManager = new memSegmentManager(m_indexFile); if (m_indexPageManager.Header.InitializeNeeded) { m_indexPageManager.Header.NextSegmentId = 0; m_indexPageManager.Header.NextObjectId = 0; m_indexPageManager.Header.NextClassId = 0; //initialize the segment b-tree's top node id OOD.Imp.Storage.BNode segTreeTop = new OOD.Imp.Storage.BNode(); m_indexPageManager.GetNewSegment(segTreeTop); segTreeTop.SetOrder(m_segTreeNodeOrder); segTreeTop.Leaf = true; m_indexPageManager.Header.SegmentTreeTopNodeSId = segTreeTop.SegmentID; //initialize the space b-tree's top node id BNode spaceTreeTop = new BNode(); m_indexPageManager.GetNewSegment(spaceTreeTop); spaceTreeTop.SetOrder(m_spaceTreeNodeOrder); spaceTreeTop.Leaf = true; m_indexPageManager.Header.FreeSpaceTreeTopNodeSId = spaceTreeTop.SegmentID; } m_segmentIndexTree = new SegTree(m_indexPageManager.Header.SegmentTreeTopNodeSId, m_indexPageManager); m_spaceIndexTree = new SpaceTree(m_indexPageManager.Header.FreeSpaceTreeTopNodeSId, m_indexPageManager, m_dbFile); m_dbSegmentManager = new dbSegmentManager( m_indexPageManager.Header.NextSegmentId, m_segmentIndexTree, m_spaceIndexTree, m_dbFile); if (m_indexPageManager.Header.InitializeNeeded) { BNode catalogTop = new BNode(); m_dbSegmentManager.GetNewSegment(catalogTop); catalogTop.SetOrder(m_catalogTreeNodeOrder); catalogTop.Leaf = true; m_indexPageManager.Header.CatalogTreeTopNodeSId = catalogTop.SegmentID; } m_catalogTree = new CatalogTree( m_indexPageManager.Header.CatalogTreeTopNodeSId, m_dbSegmentManager, m_indexPageManager.Header.NextClassId); m_classCache = new LRUHashtable(m_cache_size, m_classCacheLimit); m_objectTreeCache = new LRUHashtable(m_cache_size, m_objectTreeCacheLimit); //bring top node's segment tree, space tree, catalog tree into cache, they will be needed anyway if (!m_indexPageManager.Header.InitializeNeeded) { m_indexPageManager.GetSegment(m_segmentIndexTree.TopNodSegId, new BNode(), new KSegId()); m_indexPageManager.GetSegment(m_spaceIndexTree.TopNodeSId, new BNode(), new KOffset()); m_dbSegmentManager.GetSegment(m_catalogTree.TopNodeSId, new BNode(), new KCatalog()); } }