mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-30 15:53:40 +02:00
150 lines
3.3 KiB
ObjectPascal
150 lines
3.3 KiB
ObjectPascal
{
|
|
}
|
|
program testib;
|
|
|
|
uses Ibase40, strings;
|
|
|
|
{$h-}
|
|
|
|
Const
|
|
{ Change to YOUR database server }
|
|
|
|
ServerDb : pchar = 'testdb.gdb';
|
|
|
|
{ CHange to YOUR username and password. These may be empty }
|
|
|
|
username = '';
|
|
PWD = '';
|
|
|
|
{ Don't edit after this }
|
|
|
|
dbinfo : array [1..3] of byte
|
|
= (isc_info_page_size,isc_info_num_buffers,isc_info_end);
|
|
query : pchar = 'select * from FPDev;';
|
|
flag : array[0..2] of shortint = (0,0,0);
|
|
|
|
Type
|
|
TStatusArray = Array[0..19] of ISC_Status;
|
|
|
|
Var
|
|
DB : Tisc_db_handle;
|
|
TA : TISC_tr_handle;
|
|
statement : TISC_stmt_handle;
|
|
DPB : String;
|
|
Status : TStatusArray;
|
|
sqlda : PXSQLDA;
|
|
name,email : String;
|
|
i,id : longint;
|
|
fs : longint;
|
|
|
|
Function CheckIBstatus (Const Status : TStatusArray) : Boolean;
|
|
|
|
begin
|
|
CheckIBstatus:=Not ((Status[0]=1) and (status[1]<>0))
|
|
end;
|
|
|
|
Procedure DoError (Const status : TStatusArray);
|
|
|
|
begin
|
|
Writeln ('Failed:');
|
|
isc_print_status(@status);
|
|
halt(1);
|
|
end;
|
|
|
|
begin
|
|
db:=Nil;
|
|
dpb:=chr(isc_dpb_version1);
|
|
If UserName<>'' then
|
|
begin
|
|
dpb:=dpb+chr(isc_dpb_user_name)+chr(length(UserName))+username;
|
|
If pwd<>'' then
|
|
dpb:=dpb+chr(isc_dpb_password)+chr(length(pwd))+pwd;
|
|
end;
|
|
Write ('Connecting to ',serverdb,': ');
|
|
isc_attach_database(@Status[0],strlen(serverdb),serverdb,@db,length(dpb),@dpb[1]);
|
|
if Not CheckIBStatus(Status) then
|
|
DoError(status)
|
|
else
|
|
Writeln ('OK.');
|
|
Write ('Starting Transaction : ');
|
|
If ISC_start_transaction (@status[0],@ta,1,@db,0,Nil)<>0 then
|
|
DoError(Status)
|
|
else
|
|
Writeln ('OK.');
|
|
getmem (sqlda,XSQLDA_Length(3));
|
|
sqlda^.sqln:=3;
|
|
sqlda^.sqld:=3;
|
|
sqlda^.version:=1;
|
|
Write('Allocating statement : ');
|
|
If isc_dsql_allocate_statement(@status ,@db,@statement)<>0 then
|
|
DoError(Status)
|
|
else
|
|
Writeln ('OK.');
|
|
Write ('Preparing statement : ');
|
|
if ISC_dsql_prepare(@status,@ta,@statement,0,query,1,sqlda)<>0 then
|
|
DoError(Status)
|
|
else
|
|
Writeln ('OK.');
|
|
I:=0;
|
|
With sqlda^.sqlvar[i] do
|
|
begin
|
|
sqldata := @id;
|
|
sqltype := sql_long;
|
|
sqlind := @flag[0];
|
|
end;
|
|
inc(i);
|
|
With sqlda^.sqlvar[i] do
|
|
begin
|
|
sqldata := @name[1];
|
|
sqltype := sql_text;
|
|
sqlind := @flag[1];
|
|
end;
|
|
inc(i);
|
|
With sqlda^.sqlvar[i] do
|
|
begin
|
|
sqldata := @email[1];
|
|
sqltype := sql_text;
|
|
sqlind := @flag[2];
|
|
end;
|
|
Write ('Executing statement : ');
|
|
if isc_dsql_execute(@status,@ta,@statement,1,Nil)<>0 then
|
|
DoError(Status)
|
|
else
|
|
Writeln ('OK.');
|
|
|
|
Writeln ('Fetching rows :');
|
|
Repeat
|
|
FS:=isc_dsql_fetch(@status,@statement,1,sqlda);
|
|
If FS=0 then
|
|
begin
|
|
I:=255;
|
|
While Name[I]=' ' do Dec(i);
|
|
setlength(Name,i);
|
|
I:=255;
|
|
While Email[I]=' ' do Dec(i);
|
|
setlength(email,i);
|
|
Writeln ('(',ID,',',name,',',email,')');
|
|
end;
|
|
until FS<>0;
|
|
If FS<>100 then
|
|
DoError(status)
|
|
else
|
|
Writeln ('At end.');
|
|
Write ('Freeing statement : ');
|
|
if isc_dsql_free_statement(@status,@statement,DSQL_Close)<>0 then
|
|
DoError(Status)
|
|
else
|
|
Writeln ('OK.');
|
|
Write ('Committing transaction : ');
|
|
If ISC_Commit_transaction(@status,@ta)<>0 then
|
|
doerror(status)
|
|
else
|
|
Writeln ('OK.');
|
|
Write ('Disconnecting from database: ');
|
|
isc_detach_database(@status,@db);
|
|
If CheckIBStatus (Status) Then
|
|
Writeln ('OK.')
|
|
else
|
|
doerror(status);
|
|
end.
|