Menu

[r3136]: / branches / new-backend / Src / Experimental / DB.UObjectDestructionMgr.pas  Maximize  Restore  History

Download this file

159 lines (141 with data), 4.1 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
{
* DB.UObjectDestructionMgr.pas
*
* Implements a helper class that manages destruction of controlled conditional-
* free objects.
*
* $Rev$
* $Date$
*
* ***** BEGIN LICENSE BLOCK *****
*
* Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
*
* The Original Code is DB.UObjectDestructionMgr.pas
*
* The Initial Developer of the Original Code is Peter Johnson
* (http://www.delphidabbler.com/).
*
* Portions created by the Initial Developer are Copyright (C) 2010 Peter
* Johnson. All Rights Reserved.
*
* Contributor(s)
* NONE
*
* ***** END LICENSE BLOCK *****
}
unit DB.UObjectDestructionMgr;
interface
uses
SysUtils,
UBaseObjects, DB.UCookies, DB.UDataItem;
type
TObjectDestructionMgr = class(TObject)
strict private
type
TPermissionFn = TFunc<TDBDataItem,Boolean>;
public // todo: try to make private after testing
type
TController = class(TInterfacedObject, IConditionalFreeController)
strict private
fCanDestroy: TPermissionFn;
public
function PermitDestruction(const Obj: TObject): Boolean;
{Checks if an object can be destroyed.
@param Obj [in] Object to be checked.
@return True if object can be destroyed, False if not.
}
constructor Create(const CanDestroy: TPermissionFn);
end;
strict private
type
TPermission = (dpFreeAll, dpFreePerCookie, dpFreeNone);
var
fState: TPermission;
fCookie: TDBCookie;
fController: IConditionalFreeController;
public
constructor Create;
procedure AllowDestroyNone;
procedure AllowDestroyAll;
procedure AllowDestroyCookie(const Cookie: TDBCookie);
procedure HookController(const Obj: TControlledConditionalFreeObject;
const Lock: Boolean = False);
end;
implementation
uses
UExceptions;
{ TObjectDestructionMgr }
procedure TObjectDestructionMgr.AllowDestroyAll;
begin
fState := dpFreeAll;
end;
procedure TObjectDestructionMgr.AllowDestroyCookie(const Cookie: TDBCookie);
begin
fState := dpFreePerCookie;
fCookie := Cookie;
end;
procedure TObjectDestructionMgr.AllowDestroyNone;
begin
fState := dpFreeNone;
end;
constructor TObjectDestructionMgr.Create;
var
PermissionFn: TPermissionFn;
begin
inherited Create;
AllowDestroyNone;
PermissionFn :=
function(Obj: TDBDataItem): Boolean
begin
case fState of
dpFreeAll:
Result := True;
dpFreePerCookie:
Result := Obj.Cookie = fCookie;
dpFreeNone:
Result := False;
else
raise EBug.CreateFmt(
'%s.Create (AnonMethod): unknown fState', [ClassName]
);
end;
end;
fController := TController.Create(PermissionFn);
end;
procedure TObjectDestructionMgr.HookController(
const Obj: TControlledConditionalFreeObject; const Lock: Boolean = False);
begin
Obj.FreeController := fController; // will raise exception if Obj locked
if Lock then
Obj.Lock;
end;
{ TObjectDestructionMgr.TController }
constructor TObjectDestructionMgr.TController.Create(
const CanDestroy: TPermissionFn);
begin
Assert(Assigned(CanDestroy), ClassName + '.Create: CanDestroy is nil');
inherited Create;
fCanDestroy := CanDestroy;
end;
function TObjectDestructionMgr.TController.PermitDestruction(
const Obj: TObject): Boolean;
resourcestring
sBadObject = '%0:s.TController.PermitDestruction: Obj parameter must descend '
+ 'from %1:s';
begin
if not (Obj is TDBDataItem) then
raise EArgumentException.CreateFmt(
sBadObject, [ClassName, TDBDataItem.ClassName]
);
Result := fCanDestroy(Obj as TDBDataItem);
end;
end.
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.