XPTransactIniFile.pas
上传用户:yjb1804
上传日期:2021-01-30
资源大小:3105k
文件大小:4k
源码类别:

Email服务器

开发平台:

Delphi

  1. unit XPTransactIniFile;
  2. {
  3.  $Source: /cvsroot/dunit/dunit/Contrib/DUnitWizard/Source/Common/XPTransactIniFile.pas,v $
  4.  $Revision: 1.2 $
  5.  $Date: 2004/05/03 15:07:15 $
  6.  Last amended by $Author: pvspain $
  7.  $State: Exp $
  8.  XPTransactIniFile:
  9.  Copyright (c) 2003 by The Excellent Programming Company Pty Ltd
  10.  (Australia) (ABN 27 005 394 918). All rights reserved.
  11.  Contact Paul Spain via email: paul@xpro.com.au
  12.  This unit is free software; you can redistribute it and/or
  13.  modify it under the terms of the GNU Lesser General Public
  14.  License as published by the Free Software Foundation; either
  15.  version 2.1 of the License, or (at your option) any later version.
  16.  This unit is distributed in the hope that it will be useful,
  17.  but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  19.  Lesser General Public License for more details.
  20.  You should have received a copy of the GNU Lesser General Public
  21.  License along with this unit; if not, the license can be viewed at:
  22.  http://www.gnu.org/copyleft/lesser.html
  23.  or write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  24.  Boston, MA  02111-1307  USA
  25.  }
  26. interface
  27. uses
  28.   IniFiles,     // TMemIniFile
  29.   Classes;      // TStrings
  30. type
  31.   TXPTransactIniFile = class(TMemIniFile)
  32.   private
  33.     FInTransaction: boolean;
  34.     FScratch: TStrings;
  35.   public
  36.     constructor Create(const FileName: string);
  37.     destructor Destroy; override;
  38.     // New functionality
  39.     procedure Commit;
  40.     procedure Rollback;
  41.     procedure RestoreDefaults;
  42.     property InTransaction: boolean read FInTransaction;
  43.     // Necessary overrides
  44.     procedure Clear;
  45.     procedure DeleteKey(const Section, Ident: String); override;
  46.     procedure EraseSection(const Section: string); override;
  47.     procedure Rename(const FileName: string; Reload: Boolean);
  48.     procedure SetStrings(List: TStrings);
  49.     procedure UpdateFile; override;
  50.     procedure WriteString(const Section, Ident, Value: String); override;
  51.   end;
  52. implementation
  53. uses
  54.   SysUtils;
  55. const CVSID: string = '$Header: /cvsroot/dunit/dunit/Contrib/DUnitWizard/Source/Common/XPTransactIniFile.pas,v 1.2 2004/05/03 15:07:15 pvspain Exp $';
  56. constructor TXPTransactIniFile.Create(const FileName: string);
  57. begin
  58.   inherited;
  59.   FScratch := TStringList.Create;
  60.   // Set after inherited constructor as SetStrings() is called there
  61.   FInTransaction := false;
  62. end;
  63. destructor TXPTransactIniFile.Destroy;
  64. begin
  65.   FScratch.Free;
  66.   inherited;
  67. end;
  68. procedure TXPTransactIniFile.Clear;
  69. begin
  70.   // Check that we had content and set flag accordingly
  71.   ReadSections(FScratch);
  72.   FInTransaction := FInTransaction or (FScratch.Count > 0);
  73.   FScratch.Clear;
  74.   inherited;
  75. end;
  76. procedure TXPTransactIniFile.Commit;
  77. begin
  78.   if InTransaction then
  79.     // Write buffer to file. InTransaction cleared in UpdateFile
  80.     UpdateFile;
  81. end;
  82. procedure TXPTransactIniFile.DeleteKey(const Section, Ident: String);
  83. begin
  84.   FInTransaction := FInTransaction or ValueExists(Section, Ident);
  85.   inherited;
  86. end;
  87. procedure TXPTransactIniFile.EraseSection(const Section: string);
  88. begin
  89.   FInTransaction := FInTransaction or SectionExists(Section);
  90.   inherited;
  91. end;
  92. procedure TXPTransactIniFile.Rename(const FileName: string;
  93.   Reload: Boolean);
  94. begin
  95.   inherited Rename(FileName, Reload);
  96.   // Only in transaction if we are currently in transaction and buffer
  97.   // not refreshed from disk
  98.   FInTransaction := FInTransaction and (not Reload);
  99. end;
  100. procedure TXPTransactIniFile.RestoreDefaults;
  101. begin
  102.   // Delete buffer and file content
  103.   Clear;
  104.   // InTransaction cleared in UpdateFile
  105.   UpdateFile;
  106. end;
  107. procedure TXPTransactIniFile.Rollback;
  108. const
  109.   Reload = true;
  110. begin
  111.   if InTransaction then
  112.     // Repopulate buffer from file and clear transaction. 
  113.     Rename(FileName, Reload);
  114. end;
  115. procedure TXPTransactIniFile.SetStrings(List: TStrings);
  116. begin
  117.   inherited SetStrings(List);
  118.   // True except where file and List content match (negligible probability ?)
  119.   // eg empty List and empty file
  120.   FInTransaction := true;
  121. end;
  122. procedure TXPTransactIniFile.UpdateFile;
  123. begin
  124.   // Write all buffered data to file
  125.   inherited;
  126.   FInTransaction := false;
  127. end;
  128. procedure TXPTransactIniFile.WriteString(const Section, Ident,
  129.   Value: String);
  130. begin
  131.   inherited;
  132.   FInTransaction := true;
  133. end;
  134. end.