/// <summary> /// 索引无效是设置索引 /// </summary> /// <param name="value">目标值</param> /// <returns>是否成功</returns> public bool SetIfNull(TmphIdentity value) { if (Index == errorIndex) { Index = value.Index; Identity = value.Identity; return true; } return false; }
/// <summary> /// 刷新写入文件缓存区 /// </summary> /// <param name="identity">数据库物理层唯一标识</param> /// <param name="isDiskFile">是否写入到磁盘文件</param> /// <returns>是否成功</returns> internal bool FlushFile(TmphIdentity identity, bool isDiskFile) { var physical = physicals[identity.Index]; if (physical.Identity == identity.Identity) { if (physical.Physical.FlushFile(isDiskFile)) return true; Close(identity, false); } return false; }
/// <summary> /// 判断是否相等 /// </summary> /// <param name="value">比较值</param> /// <returns>0表示相等</returns> public int Equals(TmphIdentity value) { return (Index ^ value.Index) | (Identity ^ value.Identity); }
/// <summary> /// 写入日志 /// </summary> /// <param name="identity">数据库物理层唯一标识</param> /// <param name="data">日志数据</param> /// <returns>是否成功写入缓冲区</returns> internal int Append(TmphIdentity identity, TmphSubArray<byte> data) { var physical = physicals[identity.Index]; if (physical.Identity == identity.Identity) { var value = physical.Physical.Append(data); if (value != 0) return value; Close(identity, false); } return 0; }
/// <summary> /// 等待缓存写入 /// </summary> /// <param name="identity">数据库物理层唯一标识</param> internal void WaitBuffer(TmphIdentity identity) { var physical = physicals[identity.Index]; if (physical.Identity == identity.Identity) physical.Physical.WaitBuffer(); }
/// <summary> /// 数据库文件加载完毕 /// </summary> /// <param name="identity">数据库物理层唯一标识</param> /// <returns>是否加载成功</returns> internal bool Loaded(TmphIdentity identity, bool isLoaded) { var physical = physicals[identity.Index]; if (physical.Identity == identity.Identity) { if (physical.Physical.Loaded(isLoaded)) return true; Close(identity, false); } return false; }
/// <summary> /// 数据库文件数据加载 /// </summary> /// <param name="identity">数据库物理层唯一标识</param> /// <returns>文件数据,空数组表示结束,null表示失败</returns> internal TmphSubArray<byte> Load(TmphIdentity identity) { var physical = physicals[identity.Index]; if (physical.Identity == identity.Identity) { var data = physical.Physical.Load(); if (data.array != null) return data; Close(identity, false); } return default(TmphSubArray<byte>); }
/// <summary> /// 关闭数据库文件 /// </summary> /// <param name="identity">数据库物理层唯一标识</param> /// <param name="isWait">是否等待关闭</param> internal void Close(TmphIdentity identity, bool isWait) { TmphInterlocked.NoCheckCompareSetSleep0(ref physicalLock); var physical = physicals[identity.Index]; try { if (physical.Identity == identity.Identity) { physicals[identity.Index].Clear(); fileNameIndexs.Remove(physical.FileName); freeIndexs.Add(identity.Index); } } finally { physicalLock = 0; } if (physical.Identity == identity.Identity) physical.Close(isWait); }
/// <summary> /// 创建数据库文件 /// </summary> /// <param name="identity">数据库物理层唯一标识</param> /// <param name="header">文件头数据</param> /// <returns>是否创建成功</returns> internal bool Create(TmphIdentity identity, TmphSubArray<byte> header) { var physical = physicals[identity.Index]; if (physical.Identity == identity.Identity) { if (physical.Physical.Create(header)) return true; Close(identity, false); } return false; }
/// <summary> /// 获取数据库物理层集合唯一标识 /// </summary> /// <param name="fileName">数据文件名</param> /// <returns>数据库物理层集合唯一标识</returns> internal TmphIdentity GetIdentity(string fileName) { int index; var identity = new TmphIdentity { Index = errorIndex }; TmphHashString key = fileName; if (fileNameIndexs.TryGetValue(key, out index)) { identity.Identity = physicals[index].Identity; int nextIndex; if (fileNameIndexs.TryGetValue(key, out nextIndex) && index == nextIndex) identity.Index = index; } return identity; }