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