Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2008-09

UIB on Linux X86_64

2 messages · 1 person · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Lukas Gradl

Another problem occured:

When using UIB with fpc on X86_64 field values are always empty (for strings) or 0 (for integers).

For demonstrating the problem I created the following program: Failes with: FPC 2.3.1 svn, UIB latest svn, Firebird 2.0, OS Ubuntu 8.04 X86_64
OK with: FPC 2.3.1 svn, UIB latest svn, Firebird 2.0, OS Ubuntu 8.04 i386

program Project1;
{$mode Delphi}{$H+}
uses
   Classes, SysUtils, UIB, UIBLib, UIBDataset;
var IDB: TUIBDataBase;
     ITrans: TUIBTransaction;
     IQuery: TUIBDataSet;
begin
   IDB:=TUIBDataBase.Create(nil);
   ITrans:=TUIBTransaction.Create(nil);
   IQuery:=TUIBDataSet.Create(nil);
   IDB.DatabaseName:='DB.fdb';
   IDB.CharacterSet:=csISO8859_1;
   IDB.LibraryName:='libfbclient.so';
   IDB.UserName:='User';
   IDB.PassWord:='Pass';
   ITrans.DataBase:=IDB;
   ITrans.AutoStart:=false;
   ITrans.AutoStop:=false;
   IDB.Connected:=True;
   ITrans.StartTransaction;
   IQuery.DataBase:=IDB;
   IQuery.Transaction:=ITrans;
   IQuery.SQL.Text:='SELECT "DocID","DocName" FROM "Docs";';
   try
     IQuery.Open;
     IQuery.First;
     while not IQuery.EOF do begin
       Writeln('Line found:'+IQuery.Fields[0].AsString+'
'+IQuery.Fields[1].AsString);
       IQuery.Next;
     end;
   finally
     if IQuery.Active then IQuery.Close;
     if ITrans.InTransaction then ITrans.RollBack;
     IDB.Connected:=False;
   end;
end.

The DB-definition in Firebird 2.0 is as follows:

CREATE DOMAIN "dm_Key" AS Integer
DEFAULT 0
NOT NULL
CHECK (VALUE>=0)
;
CREATE DOMAIN "dm_TypID" AS Smallint
DEFAULT 0
NOT NULL
;
CREATE DOMAIN "dm_Text" AS
VARCHAR(80) CHARACTER SET ISO8859_1
DEFAULT ''
COLLATE DE_DE
;

CREATE TABLE "Docs"(
"DocID" "dm_Key" DEFAULT 0,
"DocType" "dm_TypID" DEFAULT 0,
"DocName" "dm_Text",
PRIMARY KEY ("DocID")
);

INSERT INTO "Docs" ("DocID","DocType","DocName") VALUES
(1,2,'DocNameTest');

When executed the output should be:

Line found: 1 DocNameTest

but instead you will get:

Line found: 0

Anyone an idea how to proceed?

regards
Lukas

-------------------------- software security networks Lukas Gradl <fpc#ssn.at> Eduard-Bodem-Gasse 9 A - 6020 Innsbruck Tel: +43-512-214040-0 Fax: +43-512-214040-21 --------------------------

Reply by email

Lukas Gradl
to Lukas Gradl

Solved the problem:

Its in uiblib.pas and uibase.pas:

{$IFNDEF CPU64}
   {$ALIGN ON}
   {$MINENUMSIZE 4}
{$ENDIF}

The MINENUMSIZE should be set always and not only for non-64bit CPUs as the source is compiled using {$mode delphi} - MINENUMSIZE is 1 by default for delphi.

So it should read:
{$IFNDEF CPU64}
   {$ALIGN ON}
{$ENDIF}
{$MINENUMSIZE 4}

Regards
Lukas
(already posted to the UIB-Forum, just for information here...)

Show quoted text 99 lines
Another problem occured: When using UIB with fpc on X86_64 field values are always empty (for strings) or 0 (for integers). For demonstrating the problem I created the following program: Failes with: FPC 2.3.1 svn, UIB latest svn, Firebird 2.0, OS Ubuntu 8.04 X86_64 OK with: FPC 2.3.1 svn, UIB latest svn, Firebird 2.0, OS Ubuntu 8.04 i386 program Project1; {$mode Delphi}{$H+} uses Classes, SysUtils, UIB, UIBLib, UIBDataset; var IDB: TUIBDataBase; ITrans: TUIBTransaction; IQuery: TUIBDataSet; begin IDB:=TUIBDataBase.Create(nil); ITrans:=TUIBTransaction.Create(nil); IQuery:=TUIBDataSet.Create(nil); IDB.DatabaseName:='DB.fdb'; IDB.CharacterSet:=csISO8859_1; IDB.LibraryName:='libfbclient.so'; IDB.UserName:='User'; IDB.PassWord:='Pass'; ITrans.DataBase:=IDB; ITrans.AutoStart:=false; ITrans.AutoStop:=false; IDB.Connected:=True; ITrans.StartTransaction; IQuery.DataBase:=IDB; IQuery.Transaction:=ITrans; IQuery.SQL.Text:='SELECT "DocID","DocName" FROM "Docs";'; try IQuery.Open; IQuery.First; while not IQuery.EOF do begin Writeln('Line found:'+IQuery.Fields[0].AsString+' '+IQuery.Fields[1].AsString); IQuery.Next; end; finally if IQuery.Active then IQuery.Close; if ITrans.InTransaction then ITrans.RollBack; IDB.Connected:=False; end; end. The DB-definition in Firebird 2.0 is as follows: CREATE DOMAIN "dm_Key" AS Integer DEFAULT 0 NOT NULL CHECK (VALUE>=0) ; CREATE DOMAIN "dm_TypID" AS Smallint DEFAULT 0 NOT NULL ; CREATE DOMAIN "dm_Text" AS VARCHAR(80) CHARACTER SET ISO8859_1 DEFAULT '' COLLATE DE_DE ; CREATE TABLE "Docs"( "DocID" "dm_Key" DEFAULT 0, "DocType" "dm_TypID" DEFAULT 0, "DocName" "dm_Text", PRIMARY KEY ("DocID") ); INSERT INTO "Docs" ("DocID","DocType","DocName") VALUES (1,2,'DocNameTest'); When executed the output should be: Line found: 1 DocNameTest but instead you will get: Line found: 0 Anyone an idea how to proceed? regards Lukas
---------------------------- software security networks Lukas Gradl <lazarus#ssn.at> Eduard-Bodem-Gasse 9 A - 6020 Innsbruck Tel: +43-512-214040-0 Fax: +43-512-214040-21 ----------------------------

Reply by email