[fpc-pascal] Firebird stored procedure exceptions generate access violation
Jim
hakkie42 at gmail.com
Sun Jun 6 12:39:35 CEST 2010
On 6-6-2010 11:54, Michael Van Canneyt wrote:
> On Sun, 6 Jun 2010, Jim wrote:
>> On 5-6-2010 12:23, Michael Van Canneyt wrote:
>>> On Sat, 5 Jun 2010, Jim wrote:
>>>> On 5-6-2010 10:47, Michael Van Canneyt wrote:
>>>>> On Sat, 5 Jun 2010, Jim wrote:
>>>> <snip>
>
> Is the firebird UDF written in fpc ?
Yep, but the error still happens even if I strip out the UDF - which
I've done now.
Here's the source code for the debug UDF anyway - without some comments:
{$IFDEF FPC}
// Compiler constants for the FreePascal compiler.
{$MODE OBJFPC}// Needed for the Result := construct
{$SMARTLINK ON}// Try to slim down resulting binary. Seems to work
only on Windows at the moment. Apparently doesn't work on dlls
{$PACKRECORDS C} // Try packrecords c to pack bytes just the way c
does it. Doesn't seem to have any effect, but let's leave it in.
{$IFDEF WINDOWS}
{$VERSION 1.0} // DLL version number
{$ENDIF}
{$ENDIF}
library fbdebug;
{$IFDEF FPC}
uses
Classes,
SysUtils;
{$ENDIF}
function ib_util_malloc(Bytes: integer): pointer; cdecl; external
'ib_util';
function debug(Message, DestinationFile: PChar): longint; cdecl; export;
// Appends Message to File. Returns 0 if succesful.
// 73 if file system error (todo: lookup FreeBSD EX_CANTCREAT
sysexits exit code)
// longint=4 bytes, signed. We don't use unsigned, because
// Firebird can't handle that at the moment.
var
OutputFile: TFileStream;
RightNow: String;
const
LineFeed = #13#10;
begin
RightNow:=DateTimeToStr(Now)+':';
Result := 73; //Default failure code
if DestinationFile <> '' then
begin
if FileExists(DestinationFile) then
begin
OutputFile := TFileStream.Create(DestinationFile,
fmOpenReadWrite or fmShareDenyWrite);
OutputFile.Seek(0, soFromEnd);
end
else
begin
OutputFile :=
TFileStream.Create(DestinationFile, fmCreate or fmOpenWrite or
fmShareDenyWrite);
end;
try
OutputFile.Write(RightNow[1], Length(RightNow));
OutputFile.Write(Message^, Length(Message));
OutputFile.Write(LineFeed[1], Length(Linefeed));
Result := 0;
finally
OutputFile.Free;
end; //try
end //if outputfile
else //No outputfile given
begin
Result := 65; //equivalent to EX_DATAERR in FreeBSD
end;
{$IFDEF DEBUG}
writeln('debug: message: ', Message, ' to file: ', OutputFile);
writeln('Result code: ', Result);
{$ENDIF}
end;
exports
debug Name 'debug';
begin
end.
> Well, I've succesfully used embedded firebird with FPC, so that part
> should work. But I didn't use exceptions in Firebird, and also no UDF, so
> these are 2 unknowns for me.
Well, as long as you're there and willing to help ;) - for embedded I
have to copy over the dlls etc. Tried it for win 64; was able to connect
to the database using isql.exe so assume I've got the proper dlls set.
Next, my db access unit uses these database units:
sqldb {queries, db access}
ibconnection {Firebird access};
and in the implementation section it uses:
ibase60dyn {for embedded firebird declaration}
DB {for parameter types};
In my db setup code, I tried to do this:
FUseEmbedded := true;
UseEmbeddedFirebird := FUseEmbedded; //know this option is deprecated,
but can't get embedded to work
FDBHost := ''; //empty for embedded;
FDBPort := 3050; //Default port for Firebird is 3050; maybe 0 for
embedded?
FDBDatabase := 'flocate'; //for embedded, specify database filename
//for normal db: 'flocate'; //use an alias on firebird server for easy
management
FDBUser := 'SYSDBA';
FDBPassword := 'masterkey';
if false = false then
begin
DBParams := TStringList.Create;
DBParams.Add('port=' + IntToStr(FDBPort));
end;
If I set the port to either 3050 or 0, I get an error:
EControlC/Control-C hit
If I don't add the port to the DBParams when using embedded:
if FUseEmbedded = false then
I get an access violation.
I'm using the 64 bit Firebird client version 2.1.2.18118 (also tried
with a 2.5 release candidate)
What am I doing wrong?
>
> Maybe there is some special handling required for firebird exceptions,
> although that would surprise me. Normally I'd simply expect this to
> be a special error code, and the message of the exception as the error
> message...
True, I have some docs regarding Delphi and Firebird exception handling
somewhere, I'll look them up...
More information about the fpc-pascal
mailing list