/// <summary> /// 单文件数据库上下文,代表一个单文件数据库。SharpFileDB的核心类型。 /// </summary> /// <param name="fullname">数据库文件据对路径。</param> /// <param name="config">数据库配置信息。只有在新建数据库时此参数才会发挥作用。</param> /// <param name="onlyRead">只读方式打开。</param> public FileDBContext(string fullname, DBConfig config = null, bool onlyRead = false) { this.transaction = new Transaction(this); this.Fullname = fullname; if (!onlyRead) { if (!File.Exists(fullname)) { if (config == null) { config = new DBConfig(); } CreateDB(fullname, config); } InitializeDB(fullname, onlyRead); } else { InitializeDB(fullname, onlyRead); } }
/// <summary> /// 创建初始状态的数据库文件。 /// </summary> /// <param name="fullname">数据库文件据对路径。</param> /// <param name="config">数据库配置信息。</param> private void CreateDB(string fullname, DBConfig config) { FileInfo fileInfo = new FileInfo(fullname); Directory.CreateDirectory(fileInfo.DirectoryName); using (FileStream fs = new FileStream(fullname, FileMode.CreateNew, FileAccess.Write, FileShare.None, Consts.pageSize)) { PageHeaderBlock page = new PageHeaderBlock() { OccupiedBytes = Consts.pageSize, AvailableBytes = 0, }; fs.WriteBlock(page); DBHeaderBlock dbHeader = new DBHeaderBlock() { MaxLevelOfSkipList = config.MaxLevelOfSkipList, ProbabilityOfSkipList = config.ProbabilityOfSkipList, MaxSunkCountInMemory = config.MaxSunkCountInMemory, LockTimeout = config.LockTimeout, ThisPos = fs.Position }; fs.WriteBlock(dbHeader); TableBlock tableHead = new TableBlock() { ThisPos = fs.Position, }; fs.WriteBlock(tableHead); byte[] leftSpace = new byte[Consts.pageSize - fs.Length]; fs.Write(leftSpace, 0, leftSpace.Length); BlockCache.TryRemoveFloatingBlock(page); BlockCache.TryRemoveFloatingBlock(dbHeader); BlockCache.TryRemoveFloatingBlock(tableHead); BlockCache.TryRemoveSunkBlock(page); BlockCache.TryRemoveSunkBlock(dbHeader); BlockCache.TryRemoveSunkBlock(tableHead); } }