source: oup/current/DataAccess/ConnectionManager.pas @ 112

Last change on this file since 112 was 112, checked in by alloc, 17 years ago
File size: 6.6 KB
Line 
1unit ConnectionManager;
2interface
3
4uses TypeDefs, DataAccess, Access_OniArchive, Access_OUP_ADB;
5
6type
7  TConnections = array of TDataAccess;
8
9  TConnectionListChangedEvent = procedure of object;
10
11 
12  TConnectionManager = class
13  private
14    FConnections: TConnections;
15    FLastID:      Integer;
16    FConnectionListChanged: TConnectionListChangedEvent;
17    function GetConnectionCount: Integer;
18    function GetConnection(ConnectionID: Integer): TDataAccess;
19    function GetConnectionByIndex(Index: Integer): TDataAccess;
20    function GetConnectionIndex(ConnectionID: Integer): Integer;
21    procedure RemoveConnection(ArrayIndex: Integer);
22  protected
23  public
24    property Count: Integer read GetConnectionCount;
25    property Connection[ConnectionID: Integer]: TDataAccess read GetConnection;
26    property ConnectionByIndex[Index: Integer]: TDataAccess read GetConnectionByIndex;
27    property ConnectionIndexByID[ConnectionID: Integer]: Integer read GetConnectionIndex;
28    property OnCoonnectionListChanged: TConnectionListChangedEvent read FConnectionListChanged write FConnectionListChanged;
29
30    constructor Create;
31    function Close: Boolean;
32
33    function OpenConnection(FileName: String; var Msg: TStatusMessages): Integer;
34    function CloseConnectionByIndex(Index: Integer; var Msg: TStatusMessages): Boolean; overload;
35    function CloseConnection(ID: Integer; var Msg: TStatusMessages): Boolean; overload;
36    function CloseConnection(FileName: String; var Msg: TStatusMessages): Boolean; overload;
37    function FileOpened(FileName: String): Integer;
38  published
39  end;
40
41
42var
43  ConManager: TConnectionManager;
44
45
46implementation
47uses
48  SysUtils, Dialogs;
49
50(*
51 Implementation of TConnectionManager
52*)
53
54
55function TConnectionManager.GetConnectionCount: Integer;
56begin
57  Result := Length(FConnections);
58end;
59
60function TConnectionManager.GetConnectionIndex(ConnectionID: Integer): Integer;
61var
62  i: Integer;
63begin
64  Result := -1;
65  if Count > 0 then
66    for i := 0 to Count - 1 do
67      if ConnectionByIndex[i].ConnectionID = ConnectionID then
68      begin
69        Result := i;
70        Break;
71      end;
72end;
73
74function TConnectionManager.GetConnection(ConnectionID: Integer): TDataAccess;
75var
76  i: Integer;
77begin
78  Result := nil;
79  if Length(FConnections) > 0 then
80  begin
81    for i := 0 to High(FConnections) do
82    begin
83      if FConnections[i].ConnectionID = ConnectionID then
84      begin
85        Result := FConnections[i];
86        Break;
87      end;
88    end;
89    if i = Length(FConnections) then
90      ShowMessage('Couldn''t find specified ConnectionID (' +
91          IntToStr(ConnectionID) + '). Please contact developer!!!');
92  end;
93end;
94
95
96function TConnectionManager.GetConnectionByIndex(Index: Integer): TDataAccess;
97begin
98  Result := nil;
99  if index < Length(FConnections) then
100  begin
101    Result := FConnections[index];
102  end;
103end;
104
105constructor TConnectionManager.Create;
106begin
107  inherited;
108  FLastID := 0;
109end;
110
111function TConnectionManager.Close: Boolean;
112begin
113  Result := False;
114  if Length(FConnections) > 0 then
115    Exit;
116
117  inherited;
118end;
119
120
121
122function TConnectionManager.OpenConnection(FileName: String; var Msg: TStatusMessages): Integer;
123var
124  i: Integer;
125  ext: String;
126  backend: TDataBackend;
127  CreateMsg: TStatusMessages;
128begin
129  Msg := SM_UnknownError;
130  Result := -1;
131
132  if Length(FConnections) > 0 then
133  begin
134    for i := 0 to High(FConnections) do
135    begin
136      if FConnections[i].FileName = FileName then
137      begin
138        Result := FConnections[i].ConnectionID;
139        Msg := SM_AlreadyOpened;
140        Exit;
141      end;
142    end;
143  end;
144
145  if not FileExists(FileName) then
146  begin
147    Msg := SM_FileNotFound;
148    Exit;
149  end;
150
151  ext := UpperCase(ExtractFileExt(FileName));
152
153  if ext = '.OLDB' then
154    backend := DB_ADB
155  else if ext = '.DAT' then
156    backend := DB_ONI
157  else
158  begin
159    Msg := SM_UnknownExtension;
160    Exit;
161  end;
162
163  SetLength(FConnections, Length(FConnections) + 1);
164  i := High(FConnections);
165  case backend of
166    DB_ONI:
167      FConnections[i] := TAccess_OniArchive.Create(FileName, FLastID + 1, CreateMsg);
168    DB_ADB:
169      FConnections[i] := TAccess_OUP_ADB.Create(FileName, FLastID + 1, CreateMsg);
170  end;
171
172  if CreateMsg = SM_OK then
173  begin
174    FLastID := FConnections[i].ConnectionID;
175    Result := FLastID;
176    Msg := SM_OK;
177  end
178  else
179  begin
180    FConnections[i].Close;
181    FConnections[i].Free;
182    FConnections[i] := nil;
183    SetLength(FConnections, Length(FConnections) - 1);
184    Msg := CreateMsg;
185  end;
186end;
187
188
189procedure TConnectionManager.RemoveConnection(ArrayIndex: Integer);
190var
191  i: Integer;
192begin
193  if Length(FConnections) > 1 then
194  begin
195    for i := ArrayIndex to High(FConnections) - 1 do
196    begin
197      FConnections[i] := FConnections[i + 1];
198    end;
199  end;
200  SetLength(FConnections, Length(FConnections) - 1);
201end;
202
203function TConnectionManager.CloseConnectionByIndex(Index: Integer; var Msg: TStatusMessages): Boolean;
204begin
205  Msg := SM_UnknownError;
206  Result := False;
207
208  if Index < Length(FConnections) then
209  begin
210    FConnections[Index].Close;
211    RemoveConnection(Index);
212    Msg := SM_OK;
213    Result := True;
214  end;
215end;
216
217function TConnectionManager.CloseConnection(ID: Integer; var Msg: TStatusMessages): Boolean;
218var
219  i: Integer;
220begin
221  Msg := SM_UnknownError;
222  Result := False;
223
224  if Length(FConnections) > 0 then
225  begin
226    for i := 0 to High(FConnections) do
227    begin
228      if FConnections[i].ConnectionID = ID then
229      begin
230        FConnections[i].Close;
231        RemoveConnection(i);
232        Msg := SM_OK;
233        Result := True;
234        Exit;
235      end;
236    end;
237  end;
238end;
239
240function TConnectionManager.CloseConnection(FileName: String; var Msg: TStatusMessages): Boolean;
241var
242  i: Integer;
243begin
244  Msg := SM_UnknownError;
245  Result := False;
246
247  if Length(FConnections) > 0 then
248  begin
249    for i := 0 to High(FConnections) do
250    begin
251      if FConnections[i].FileName = FileName then
252      begin
253        FConnections[i].Close;
254        RemoveConnection(i);
255        Msg := SM_OK;
256        Result := True;
257        Exit;
258      end;
259    end;
260  end;
261end;
262
263
264function TConnectionManager.FileOpened(FileName: String): Integer;
265var
266  i: Integer;
267begin
268  Result := -1;
269  if Length(FConnections) > 0 then
270    for i := 0 to High(FConnections) do
271      if FConnections[i].FileName = FileName then
272      begin
273        Result := FConnections[i].ConnectionID;
274        Exit;
275      end;
276end;
277
278
279initialization
280  ConManager := TConnectionManager.Create;
281finalization
282  ConManager.Free;
283end.
Note: See TracBrowser for help on using the repository browser.