source: oup/releases/0.34b/DataAccess/ConnectionManager.pas@ 853

Last change on this file since 853 was 205, 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.