Example #1
0
        /// <summary>
        /// 打开日志文件
        /// </summary>
        private void open()
        {
#if XAMARIN
            try
            {
                fileStream  = new fileStreamWriter(fileName, FileMode.Create, FileShare.Read, FileOptions.None, false, fastCSharp.config.appSetting.Encoding);
                isFieStream = true;
                return;
            }
            catch (Exception error)
            {
                Console.WriteLine(error.ToString());
            }
#else
            try
            {
                fileStream  = new fileStreamWriter(fileName, FileMode.OpenOrCreate, FileShare.Read, FileOptions.None, false, fastCSharp.config.appSetting.Encoding);
                isFieStream = true;
                return;
            }
            catch (Exception error)
            {
                Console.WriteLine(error.ToString());
            }
            try
            {
                if (File.Exists(fileName))
                {
                    fileStream  = new fileStreamWriter(io.file.MoveBakFileName(fileName), FileMode.OpenOrCreate, FileShare.Read, FileOptions.None, false, fastCSharp.config.appSetting.Encoding);
                    isFieStream = true;
                    return;
                }
            }
            catch (Exception error)
            {
                Console.WriteLine(error.ToString());
            }
#endif
            isFieStream = false;
        }
 /// <summary>
 /// 数据文件刷新
 /// </summary>
 /// <param name="physical">内存数据库物理层</param>
 /// <param name="logHeaderDataLength">日志文件头长度</param>
 public dataFileRefresh(physicalOld physical, int logHeaderDataLength)
 {
     this.physical = physical;
     LogHeaderDataLength = logHeaderDataLength;
     string fileName = physical.path + physical.fileName;
     BakFileName = fastCSharp.io.file.MoveBak(fileName);
     fileWriter = new fileStreamWriter(fileName, FileMode.CreateNew, FileShare.Read, FileOptions.None, null);
     lastTime = date.NowSecond;
 }
 /// <summary>
 /// 数据文件刷新结束
 /// </summary>
 /// <param name="dataRefresh">数据文件刷新结束</param>
 public void RefreshEnd(dataFileRefresh dataRefresh)
 {
     if (dataRefresh.Equals(this.dataRefresh))
     {
         bool isDeleteBakFile = false;
         Monitor.Enter(refreshLock);
         try
         {
             if (dataRefresh.Equals(this.dataRefresh))
             {
                 this.dataRefresh = null;
                 if (dataRefresh.LastException == null) isDeleteBakFile = true;
                 else
                 {
                     lastException = dataRefresh.LastException;
                     if (File.Exists(dataRefresh.BakFileName) && File.Exists(dataRefresh.BakLogFileName))
                     {
                         try
                         {
                             string fileName = path + this.fileName, errorFileName = fileName + ".error";
                             if (File.Exists(fileName))
                             {
                                 file.MoveBak(errorFileName);
                                 File.Move(fileName, errorFileName);
                             }
                             File.Move(dataRefresh.BakFileName, fileName);
                             isRefreshErrorLog = true;
                             interlocked.CompareSetSleep0(ref logFileLock);
                             try
                             {
                                 //flushLog();
                                 logFileWriter.Flush(true);
                                 logFileWriter.Dispose();
                                 if (logFileWriter.LastException == null)
                                 {
                                     string logFileName = path + this.logFileName,
                                         bakLogFileName = file.MoveBak(logFileName);
                                     File.Move(dataRefresh.BakLogFileName, logFileName);
                                     logFileWriter = new fileStreamWriter(logFileName, FileMode.Open,
                                         FileShare.Read, FileOptions.None, null);
                                     logFileWriter.WriteFile(bakLogFileName, dataRefresh.LogHeaderDataLength);
                                 }
                                 if (logFileWriter.LastException == null)
                                 {
                                     log.Default.Add(lastException, "数据文件已恢复 " + fileName, false);
                                     lastException = null;
                                 }
                                 else log.Error.Add(logFileWriter.LastException, null, false);
                             }
                             finally
                             {
                                 logFileLock = 0;
                                 isRefreshErrorLog = false;
                             }
                         }
                         catch (Exception error)
                         {
                             log.Error.Add(error, null, false);
                         }
                     }
                 }
             }
         }
         finally
         {
             Monitor.Exit(refreshLock);
             if (lastException != null) Dispose();
             if (isDeleteBakFile)
             {
                 try
                 {
                     if (File.Exists(dataRefresh.BakFileName)) File.Delete(dataRefresh.BakFileName);
                     if (File.Exists(dataRefresh.BakLogFileName)) File.Delete(dataRefresh.BakLogFileName);
                 }
                 catch (Exception error)
                 {
                     log.Error.Add(error, null, false);
                 }
             }
         }
     }
 }
 ///// <summary>
 ///// 写入缓存
 ///// </summary>
 //private void flushLog()
 //{
 //    if (logBufferIndex != 0)
 //    {
 //        try
 //        {
 //            if (logFileWriter.UnsafeWrite(new memoryPool.pushSubArray { Value = subArray<byte>.Unsafe(logBuffer, 0, logBufferIndex), PushPool = Buffers.PushHandle }) >= 0)
 //            {
 //                logBuffer = null;
 //                logBufferIndex = 0;
 //                return;
 //            }
 //            lastException = logFileWriter.LastException;
 //        }
 //        catch (Exception error)
 //        {
 //            lastException = error;
 //        }
 //    }
 //}
 /// <summary>
 /// 获取数据文件刷新
 /// </summary>
 /// <param name="logHeaderData">日志文件标识</param>
 /// <returns>数据文件刷新,失败返回null</returns>
 public dataFileRefresh CreateRefresh(byte[] logHeaderData)
 {
     if (currentStep == (int) physicalOld.step.Waitting && this.dataRefresh == null)
     {
         string logFileName = path + this.logFileName;
         dataFileRefresh dataRefresh = new dataFileRefresh(this, logHeaderData.Length);
         Monitor.Enter(refreshLock);
         try
         {
             if (this.dataRefresh == null)
             {
                 interlocked.CompareSetSleep0(ref logFileLock);
                 try
                 {
                     //flushLog();
                     logFileWriter.Flush(true);
                     logFileWriter.Dispose();
                     logFileWriter = null;
                     dataRefresh.BakLogFileName = fastCSharp.io.file.MoveBak(logFileName);
                     logFileWriter = new fileStreamWriter(logFileName, FileMode.CreateNew, FileShare.Read,
                         FileOptions.None, null);
                     logFileWriter.UnsafeWrite(logHeaderData, 0, logHeaderData.Length);
                 }
                 finally
                 {
                     logFileLock = 0;
                 }
                 this.dataRefresh = dataRefresh;
             }
         }
         catch (Exception error)
         {
             lastException = error;
             Dispose();
         }
         finally
         {
             Monitor.Exit(refreshLock);
         }
         if (dataRefresh.Equals(this.dataRefresh)) return dataRefresh;
         dataRefresh.Dispose();
     }
     return null;
 }
 /// <summary>
 /// 内存数据库物理层
 /// </summary>
 /// <param name="fileName">数据文件名</param>
 public physicalOld(string fileName)
 {
     try
     {
         FileInfo file = new FileInfo(fileName + ".fmd");
         path = file.Directory.fullName();
         this.fileName = file.Name;
         bool isOpen = file.Exists;
         logFileWriter = new fileStreamWriter(path + logFileName, isOpen ? FileMode.Open : FileMode.CreateNew,
             FileShare.Read, FileOptions.None, null);
         CurrentStep = isOpen ? physicalOld.step.Opened : physicalOld.step.Waitting;
     }
     catch (Exception error)
     {
         lastException = error;
         Dispose();
     }
 }
 /// <summary>
 /// 读取数据完毕
 /// </summary>
 /// <param name="isLoaded">是否成功</param>
 /// <returns></returns>
 public bool Loaded(bool isLoaded)
 {
     if (currentLock == 1)
     {
         if (isLoaded)
         {
             try
             {
                 pub.Dispose(ref loader);
                 memoryPool.Push(ref loadBuffer);
                 fileWriter = new fileStreamWriter(path + fileName, FileMode.Open, FileShare.Read, FileOptions.None, true, null);
                 return true;
             }
             catch (Exception error)
             {
                 LastException = error;
             }
             finally { currentLock = 0; }
         }
         else currentLock = 0;
     }
     Dispose();
     return false;
 }
 /// <summary>
 /// 内存数据库物理层
 /// </summary>
 /// <param name="fileName"></param>
 /// <param name="isDomainUnloadDispose"></param>
 public physical(string fileName, bool isDomainUnloadDispose = true)
 {
     try
     {
         FileInfo file = new FileInfo(this.fileName = fileName + ".fmd");
         path = file.Directory.fullName();
         if (file.Exists)
         {
             currentLock = 1;
             loader = new fileReader(this);
         }
         else fileWriter = new fileStreamWriter(path + this.fileName, FileMode.CreateNew, FileShare.Read, FileOptions.None, true, null);
         if (isDomainUnloadDispose) fastCSharp.domainUnload.Add(Dispose);
     }
     catch (Exception error)
     {
         LastException = error;
         currentLock = 2;
         Dispose();
     }
 }
Example #8
0
 /// <summary>
 /// 打开日志文件
 /// </summary>
 private void Open()
 {
     try
     {
         _fileStream = new fileStreamWriter(_fileName, FileMode.OpenOrCreate, FileShare.Read, FileOptions.None, false, fastCSharp.config.appSetting.Encoding);
     }
     catch (Exception error)
     {
         Console.WriteLine(error.ToString());
     }
     if (_fileStream == null)
     {
         try
         {
             if (File.Exists(_fileName))
             {
                 _fileStream = new fileStreamWriter(io.file.MoveBakFileName(_fileName), FileMode.OpenOrCreate, FileShare.Read, FileOptions.None, false, fastCSharp.config.appSetting.Encoding);
             }
         }
         catch (Exception error)
         {
             Console.WriteLine(error.ToString());
         }
     }
 }