Beispiel #1
0
        /// <summary>
        /// 等待缓存写入
        /// </summary>
        /// <param name="identity">数据库物理层唯一标识</param>
        internal void WaitBuffer(indexIdentity identity)
        {
            physicalInfo physical = physicalPool.Pool[identity.Index];

            //physicalInfo physical = physicals[identity.Index];
            if (physical.Identity == identity.Identity)
            {
                physical.Physical.WaitBuffer();
            }
        }
Beispiel #2
0
        /// <summary>
        /// 刷新写入文件缓存区
        /// </summary>
        /// <param name="identity">数据库物理层唯一标识</param>
        /// <param name="isDiskFile">是否写入到磁盘文件</param>
        /// <returns>是否成功</returns>
        internal bool FlushFile(indexIdentity identity, bool isDiskFile)
        {
            physicalInfo physical = physicalPool.Pool[identity.Index];

            //physicalInfo physical = physicals[identity.Index];
            if (physical.Identity == identity.Identity)
            {
                if (physical.Physical.FlushFile(isDiskFile))
                {
                    return(true);
                }
                Close(identity, false);
            }
            return(false);
        }
Beispiel #3
0
        /// <summary>
        /// 数据库文件加载完毕
        /// </summary>
        /// <param name="identity">数据库物理层唯一标识</param>
        /// <param name="isLoaded">是否加载成功</param>
        /// <returns>是否加载成功</returns>
        internal bool Loaded(indexIdentity identity, bool isLoaded)
        {
            physicalInfo physical = physicalPool.Pool[identity.Index];

            //physicalInfo physical = physicals[identity.Index];
            if (physical.Identity == identity.Identity)
            {
                if (physical.Physical.Loaded(isLoaded))
                {
                    return(true);
                }
                Close(identity, false);
            }
            return(false);
        }
Beispiel #4
0
        /// <summary>
        /// 创建数据库文件
        /// </summary>
        /// <param name="identity">数据库物理层唯一标识</param>
        /// <param name="header">文件头数据</param>
        /// <returns>是否创建成功</returns>
        internal bool Create(indexIdentity identity, ref subArray <byte> header)
        {
            physicalInfo physical = physicalPool.Pool[identity.Index];

            //physicalInfo physical = physicals[identity.Index];
            if (physical.Identity == identity.Identity)
            {
                if (physical.Physical.Create(ref header))
                {
                    return(true);
                }
                Close(identity, false);
            }
            return(false);
        }
Beispiel #5
0
        /// <summary>
        /// 写入日志
        /// </summary>
        /// <param name="identity">数据库物理层唯一标识</param>
        /// <param name="data">日志数据</param>
        /// <returns>是否成功写入缓冲区</returns>
        internal int Append(indexIdentity identity, ref subArray <byte> data)
        {
            physicalInfo physical = physicalPool.Pool[identity.Index];

            //physicalInfo physical = physicals[identity.Index];
            if (physical.Identity == identity.Identity)
            {
                int value = physical.Physical.Append(ref data);
                if (value != 0)
                {
                    return(value);
                }
                Close(identity, false);
            }
            return(0);
        }
Beispiel #6
0
        /// <summary>
        /// 数据库文件数据加载
        /// </summary>
        /// <param name="identity">数据库物理层唯一标识</param>
        /// <returns>文件数据,空数组表示结束,null表示失败</returns>
        internal subArray <byte> Load(indexIdentity identity)
        {
            physicalInfo physical = physicalPool.Pool[identity.Index];

            //physicalInfo physical = physicals[identity.Index];
            if (physical.Identity == identity.Identity)
            {
                subArray <byte> data = physical.Physical.Load();
                if (data.array != null)
                {
                    return(data);
                }
                Close(identity, false);
            }
            return(default(subArray <byte>));
        }
Beispiel #7
0
 /// <summary>
 /// 关闭数据库文件
 /// </summary>
 /// <param name="identity">数据库物理层唯一标识</param>
 /// <param name="isWait">是否等待关闭</param>
 internal void Close(indexIdentity identity, bool isWait)
 {
     if (physicalPool.Enter())
     {
         physicalInfo physical = physicalPool.Pool[identity.Index];
         if (physical.Identity == identity.Identity)
         {
             physicalPool.Pool[identity.Index].Clear();
             fileNameIndexs.Remove(physical.FileName);
             physicalPool.FreeExit(identity.Index);
             physical.Close(isWait);
         }
         else
         {
             physicalPool.Exit();
         }
     }
 }
 /// <summary>
 /// 获取一个可用的集合索引
 /// </summary>
 /// <returns>集合索引</returns>
 private int newIndex()
 {
     if (freeIndexs.Count != 0) return freeIndexs.UnsafePop();
     if (maxIndex == physicals.Length)
     {
         physicalInfo[] newPhysicals = new physicalInfo[maxIndex << 1];
         Array.Copy(physicals, 0, newPhysicals, 0, maxIndex);
         physicals = newPhysicals;
     }
     return maxIndex++;
 }