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