ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/trunk/runtime/IB.pas
Revision: 1
Committed: Mon Jul 31 16:43:00 2000 UTC (23 years, 9 months ago) by tony
Content type: text/x-pascal
File size: 13122 byte(s)
Log Message:
Borland IBX Open Source Release

File Contents

# Content
1 {************************************************************************}
2 { }
3 { Borland Delphi Visual Component Library }
4 { InterBase Express core components }
5 { }
6 { Copyright (c) 1998-2000 Inprise Corporation }
7 { }
8 { InterBase Express is based in part on the product }
9 { Free IB Components, written by Gregory H. Deatz for }
10 { Hoagland, Longo, Moran, Dunst & Doukas Company. }
11 { Free IB Components is used under license. }
12 { }
13 { The contents of this file are subject to the InterBase }
14 { Public License Version 1.0 (the "License"); you may not }
15 { use this file except in compliance with the License. You }
16 { may obtain a copy of the License at http://www.Inprise.com/IPL.html }
17 { Software distributed under the License is distributed on }
18 { an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either }
19 { express or implied. See the License for the specific language }
20 { governing rights and limitations under the License. }
21 { The Original Code was created by InterBase Software Corporation }
22 { and its successors. }
23 { Portions created by Inprise Corporation are Copyright (C) Inprise }
24 { Corporation. All Rights Reserved. }
25 { Contributor(s): Jeff Overcash }
26 { }
27 {************************************************************************}
28
29 unit IB;
30
31 interface
32
33 uses
34 Windows, SysUtils, Classes, IBHeader, IBExternals, IBUtils, DB, IBXConst;
35
36 type
37 TTraceFlag = (tfQPrepare, tfQExecute, tfQFetch, tfError, tfStmt, tfConnect,
38 tfTransact, tfBlob, tfService, tfMisc);
39 TTraceFlags = set of TTraceFlag;
40
41 EIBError = class(EDatabaseError)
42 private
43 FSQLCode: Long;
44 FIBErrorCode: Long;
45 public
46 constructor Create(ASQLCode: Long; Msg: string); overload;
47 constructor Create(ASQLCode: Long; AIBErrorCode: Long; Msg: string); overload;
48 property SQLCode: Long read FSQLCode;
49 property IBErrorCode: Long read FIBErrorCode;
50 end;
51
52 EIBInterBaseError = class(EIBError);
53 EIBClientError = class(EIBError);
54
55 TIBDataBaseErrorMessage = (ShowSQLCode,
56 ShowIBMessage,
57 ShowSQLMessage);
58 TIBDataBaseErrorMessages = set of TIBDataBaseErrorMessage;
59 TIBClientError = (
60 ibxeUnknownError,
61 ibxeInterBaseMissing,
62 ibxeInterBaseInstallMissing,
63 ibxeIB60feature,
64 ibxeNotSupported,
65 ibxeNotPermitted,
66 ibxeFileAccessError,
67 ibxeConnectionTimeout,
68 ibxeCannotSetDatabase,
69 ibxeCannotSetTransaction,
70 ibxeOperationCancelled,
71 ibxeDPBConstantNotSupported,
72 ibxeDPBConstantUnknown,
73 ibxeTPBConstantNotSupported,
74 ibxeTPBConstantUnknown,
75 ibxeDatabaseClosed,
76 ibxeDatabaseOpen,
77 ibxeDatabaseNameMissing,
78 ibxeNotInTransaction,
79 ibxeInTransaction,
80 ibxeTimeoutNegative,
81 ibxeNoDatabasesInTransaction,
82 ibxeUpdateWrongDB,
83 ibxeUpdateWrongTR,
84 ibxeDatabaseNotAssigned,
85 ibxeTransactionNotAssigned,
86 ibxeXSQLDAIndexOutOfRange,
87 ibxeXSQLDANameDoesNotExist,
88 ibxeEOF,
89 ibxeBOF,
90 ibxeInvalidStatementHandle,
91 ibxeSQLOpen,
92 ibxeSQLClosed,
93 ibxeDatasetOpen,
94 ibxeDatasetClosed,
95 ibxeUnknownSQLDataType,
96 ibxeInvalidColumnIndex,
97 ibxeInvalidParamColumnIndex,
98 ibxeInvalidDataConversion,
99 ibxeColumnIsNotNullable,
100 ibxeBlobCannotBeRead,
101 ibxeBlobCannotBeWritten,
102 ibxeEmptyQuery,
103 ibxeCannotOpenNonSQLSelect,
104 ibxeNoFieldAccess,
105 ibxeFieldReadOnly,
106 ibxeFieldNotFound,
107 ibxeNotEditing,
108 ibxeCannotInsert,
109 ibxeCannotPost,
110 ibxeCannotUpdate,
111 ibxeCannotDelete,
112 ibxeCannotRefresh,
113 ibxeBufferNotSet,
114 ibxeCircularReference,
115 ibxeSQLParseError,
116 ibxeUserAbort,
117 ibxeDataSetUniDirectional,
118 ibxeCannotCreateSharedResource,
119 ibxeWindowsAPIError,
120 ibxeColumnListsDontMatch,
121 ibxeColumnTypesDontMatch,
122 ibxeCantEndSharedTransaction,
123 ibxeFieldUnsupportedType,
124 ibxeCircularDataLink,
125 ibxeEmptySQLStatement,
126 ibxeIsASelectStatement,
127 ibxeRequiredParamNotSet,
128 ibxeNoStoredProcName,
129 ibxeIsAExecuteProcedure,
130 ibxeUpdateFailed,
131 ibxeNotCachedUpdates,
132 ibxeNotLiveRequest,
133 ibxeNoProvider,
134 ibxeNoRecordsAffected,
135 ibxeNoTableName,
136 ibxeCannotCreatePrimaryIndex,
137 ibxeCannotDropSystemIndex,
138 ibxeTableNameMismatch,
139 ibxeIndexFieldMissing,
140 ibxeInvalidCancellation,
141 ibxeInvalidEvent,
142 ibxeMaximumEvents,
143 ibxeNoEventsRegistered,
144 ibxeInvalidQueueing,
145 ibxeInvalidRegistration,
146 ibxeInvalidBatchMove,
147 ibxeSQLDialectInvalid,
148 ibxeSPBConstantNotSupported,
149 ibxeSPBConstantUnknown,
150 ibxeServiceActive,
151 ibxeServiceInActive,
152 ibxeServerNameMissing,
153 ibxeQueryParamsError,
154 ibxeStartParamsError,
155 ibxeOutputParsingError,
156 ibxeUseSpecificProcedures,
157 ibxeSQLMonitorAlreadyPresent
158 );
159
160 TStatusVector = array[0..19] of ISC_STATUS;
161 PStatusVector = ^TStatusVector;
162
163
164 const
165 IBPalette1 = 'InterBase'; {do not localize}
166 IBPalette2 = 'InterBase Admin'; {do not localize}
167
168 IBLocalBufferLength = 512;
169 IBBigLocalBufferLength = IBLocalBufferLength * 2;
170 IBHugeLocalBufferLength = IBBigLocalBufferLength * 20;
171
172 IBErrorMessages: array[TIBClientError] of string = (
173 SUnknownError,
174 SInterBaseMissing,
175 SInterBaseInstallMissing,
176 SIB60feature,
177 SNotSupported,
178 SNotPermitted,
179 SFileAccessError,
180 SConnectionTimeout,
181 SCannotSetDatabase,
182 SCannotSetTransaction,
183 SOperationCancelled,
184 SDPBConstantNotSupported,
185 SDPBConstantUnknown,
186 STPBConstantNotSupported,
187 STPBConstantUnknown,
188 SDatabaseClosed,
189 SDatabaseOpen,
190 SDatabaseNameMissing,
191 SNotInTransaction,
192 SInTransaction,
193 STimeoutNegative,
194 SNoDatabasesInTransaction,
195 SUpdateWrongDB,
196 SUpdateWrongTR,
197 SDatabaseNotAssigned,
198 STransactionNotAssigned,
199 SXSQLDAIndexOutOfRange,
200 SXSQLDANameDoesNotExist,
201 SEOF,
202 SBOF,
203 SInvalidStatementHandle,
204 SSQLOpen,
205 SSQLClosed,
206 SDatasetOpen,
207 SDatasetClosed,
208 SUnknownSQLDataType,
209 SInvalidColumnIndex,
210 SInvalidParamColumnIndex,
211 SInvalidDataConversion,
212 SColumnIsNotNullable,
213 SBlobCannotBeRead,
214 SBlobCannotBeWritten,
215 SEmptyQuery,
216 SCannotOpenNonSQLSelect,
217 SNoFieldAccess,
218 SFieldReadOnly,
219 SFieldNotFound,
220 SNotEditing,
221 SCannotInsert,
222 SCannotPost,
223 SCannotUpdate,
224 SCannotDelete,
225 SCannotRefresh,
226 SBufferNotSet,
227 SCircularReference,
228 SSQLParseError,
229 SUserAbort,
230 SDataSetUniDirectional,
231 SCannotCreateSharedResource,
232 SWindowsAPIError,
233 SColumnListsDontMatch,
234 SColumnTypesDontMatch,
235 SCantEndSharedTransaction,
236 SFieldUnsupportedType,
237 SCircularDataLink,
238 SEmptySQLStatement,
239 SIsASelectStatement,
240 SRequiredParamNotSet,
241 SNoStoredProcName,
242 SIsAExecuteProcedure,
243 SUpdateFailed,
244 SNotCachedUpdates,
245 SNotLiveRequest,
246 SNoProvider,
247 SNoRecordsAffected,
248 SNoTableName,
249 SCannotCreatePrimaryIndex,
250 SCannotDropSystemIndex,
251 STableNameMismatch,
252 SIndexFieldMissing,
253 SInvalidCancellation,
254 SInvalidEvent,
255 SMaximumEvents,
256 SNoEventsRegistered,
257 SInvalidQueueing,
258 SInvalidRegistration,
259 SInvalidBatchMove,
260 SSQLDialectInvalid,
261 SSPBConstantNotSupported,
262 SSPBConstantUnknown,
263 SServiceActive,
264 SServiceInActive,
265 SServerNameMissing,
266 SQueryParamsError,
267 SStartParamsError,
268 SOutputParsingError,
269 SUseSpecificProcedures,
270 SSQLMonitorAlreadyPresent
271 );
272
273 var
274 IBCS: TRTLCriticalSection;
275
276 procedure IBAlloc(var P; OldSize, NewSize: Integer);
277
278 procedure IBError(ErrMess: TIBClientError; const Args: array of const);
279 procedure IBDataBaseError;
280
281 function StatusVector: PISC_STATUS;
282 function StatusVectorArray: PStatusVector;
283 function CheckStatusVector(ErrorCodes: array of ISC_STATUS): Boolean;
284 function StatusVectorAsText: string;
285
286 procedure SetIBDataBaseErrorMessages(Value: TIBDataBaseErrorMessages);
287 function GetIBDataBaseErrorMessages: TIBDataBaseErrorMessages;
288
289 implementation
290
291 uses
292 IBIntf;
293
294 var
295 IBDataBaseErrorMessages: TIBDataBaseErrorMessages;
296 threadvar
297 FStatusVector : TStatusVector;
298
299 procedure IBAlloc(var P; OldSize, NewSize: Integer);
300 var
301 i: Integer;
302 begin
303 ReallocMem(Pointer(P), NewSize);
304 for i := OldSize to NewSize - 1 do PChar(P)[i] := #0;
305 end;
306
307 procedure IBError(ErrMess: TIBClientError; const Args: array of const);
308 begin
309 raise EIBClientError.Create(Ord(ErrMess),
310 Format(IBErrorMessages[ErrMess], Args));
311 end;
312
313 procedure IBDataBaseError;
314 var
315 sqlcode: Long;
316 IBErrorCode: Long;
317 local_buffer: array[0..IBHugeLocalBufferLength - 1] of char;
318 usr_msg: string;
319 status_vector: PISC_STATUS;
320 IBDataBaseErrorMessages: TIBDataBaseErrorMessages;
321 begin
322 usr_msg := '';
323
324 { Get a local reference to the status vector.
325 Get a local copy of the IBDataBaseErrorMessages options.
326 Get the SQL error code }
327 status_vector := StatusVector;
328 IBErrorCode := StatusVectorArray[1];
329 IBDataBaseErrorMessages := GetIBDataBaseErrorMessages;
330 sqlcode := isc_sqlcode(status_vector);
331
332 if (ShowSQLCode in IBDataBaseErrorMessages) then
333 usr_msg := usr_msg + 'SQLCODE: ' + IntToStr(sqlcode); {do not localize}
334 Exclude(IBDataBaseErrorMessages, ShowSQLMessage);
335 if (ShowSQLMessage in IBDataBaseErrorMessages) then
336 begin
337 isc_sql_interprete(sqlcode, local_buffer, IBLocalBufferLength);
338 if (ShowSQLCode in IBDataBaseErrorMessages) then
339 usr_msg := usr_msg + CRLF;
340 usr_msg := usr_msg + string(local_buffer);
341 end;
342
343 if (ShowIBMessage in IBDataBaseErrorMessages) then
344 begin
345 if (ShowSQLCode in IBDataBaseErrorMessages) or
346 (ShowSQLMessage in IBDataBaseErrorMessages) then
347 usr_msg := usr_msg + CRLF;
348 while (isc_interprete(local_buffer, @status_vector) > 0) do
349 begin
350 if (usr_msg <> '') and (usr_msg[Length(usr_msg)] <> LF) then
351 usr_msg := usr_msg + CRLF;
352 usr_msg := usr_msg + string(local_buffer);
353 end;
354 end;
355 if (usr_msg <> '') and (usr_msg[Length(usr_msg)] = '.') then
356 Delete(usr_msg, Length(usr_msg), 1);
357 raise EIBInterBaseError.Create(sqlcode, IBErrorCode, usr_msg);
358 end;
359
360 { Return the status vector for the current thread }
361 function StatusVector: PISC_STATUS;
362 begin
363 result := @FStatusVector;
364 end;
365
366 function StatusVectorArray: PStatusVector;
367 begin
368 result := @FStatusVector;
369 end;
370
371 function CheckStatusVector(ErrorCodes: array of ISC_STATUS): Boolean;
372 var
373 p: PISC_STATUS;
374 i: Integer;
375 procedure NextP(i: Integer);
376 begin
377 p := PISC_STATUS(PChar(p) + (i * SizeOf(ISC_STATUS)));
378 end;
379 begin
380 p := @FStatusVector;
381 result := False;
382 while (p^ <> 0) and (not result) do
383 case p^ of
384 3: NextP(3);
385 1, 4:
386 begin
387 NextP(1);
388 i := 0;
389 while (i <= High(ErrorCodes)) and (not result) do
390 begin
391 result := p^ = ErrorCodes[i];
392 Inc(i);
393 end;
394 NextP(1);
395 end;
396 else
397 NextP(2);
398 end;
399 end;
400
401 function StatusVectorAsText: string;
402 var
403 p: PISC_STATUS;
404 function NextP(i: Integer): PISC_STATUS;
405 begin
406 p := PISC_STATUS(PChar(p) + (i * SizeOf(ISC_STATUS)));
407 result := p;
408 end;
409 begin
410 p := @FStatusVector;
411 result := '';
412 while (p^ <> 0) do
413 if (p^ = 3) then
414 begin
415 result := result + Format('%d %d %d', [p^, NextP(1)^, NextP(1)^]) + CRLF;
416 NextP(1);
417 end
418 else begin
419 result := result + Format('%d %d', [p^, NextP(1)^]) + CRLF;
420 NextP(1);
421 end;
422 end;
423
424
425 { EIBError }
426 constructor EIBError.Create(ASQLCode: Long; Msg: string);
427 begin
428 inherited Create(Msg);
429 FSQLCode := ASQLCode;
430 end;
431
432 constructor EIBError.Create(ASQLCode: Long; AIBErrorCode: Long; Msg: string);
433 begin
434 inherited Create(Msg);
435 FSQLCode := ASQLCode;
436 FIBErrorCode := AIBErrorCode;
437 end;
438
439 procedure SetIBDataBaseErrorMessages(Value: TIBDataBaseErrorMessages);
440 begin
441 EnterCriticalSection(IBCS);
442 try
443 IBDataBaseErrorMessages := Value;
444 finally
445 LeaveCriticalSection(IBCS);
446 end;
447 end;
448
449 function GetIBDataBaseErrorMessages: TIBDataBaseErrorMessages;
450 begin
451 EnterCriticalSection(IBCS);
452 try
453 result := IBDataBaseErrorMessages;
454 finally
455 LeaveCriticalSection(IBCS);
456 end;
457 end;
458
459 initialization
460 IsMultiThread := True;
461 InitializeCriticalSection(IBCS);
462 IBDataBaseErrorMessages := [ShowSQLMessage, ShowIBMessage];
463
464 finalization
465 DeleteCriticalSection(IBCS);
466
467 end.