[fpc-pascal] ibconnection patch
Joao Morais
post at joaomorais.com.br
Sun May 25 04:51:28 CEST 2008
Hello,
The following patches fixes the lack of sqlscale var when writing =
decimal and numeric fields to ib/fb databases. I've used the same =
approach used to read such fields, ie, intpower.
Patch 1 has also a small improvement regarding the read of the XSQLVAR =
record, patch 2 only fixes the sqlscale.
Both patches are against fixes_2_2. Let me know if it's still useful, =
otherwise I will checkout trunk and create another patch.
--
Joao Morais
-------------- next part --------------
Index: fcl-db/src/sqldb/interbase/ibconnection.pp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- fcl-db/src/sqldb/interbase/ibconnection.pp (revision 11044)
+++ fcl-db/src/sqldb/interbase/ibconnection.pp (working copy)
@@ -693,6 +693,7 @@
var ParNr,SQLVarNr : integer;
s : string;
i : integer;
+ si : smallint;
li : LargeInt;
currbuff : pchar;
w : word;
@@ -736,30 +737,40 @@
{$R+}
end;
=
+var
+ VSQLVar: XSQLVAR;
begin
{$R-}
with cursor as TIBCursor do for SQLVarNr :=3D 0 to High(ParamBinding){AP=
arams.count-1} do
begin
ParNr :=3D ParamBinding[SQLVarNr];
+ VSQLVar :=3D in_sqlda^.SQLvar[SQLVarNr];
if AParams[ParNr].IsNull then
begin
- If Assigned(in_sqlda^.SQLvar[SQLVarNr].SQLInd) then
- in_sqlda^.SQLvar[SQLVarNr].SQLInd^ :=3D -1;
+ If Assigned(VSQLVar.SQLInd) then
+ VSQLVar.SQLInd^ :=3D -1;
end
else
begin
- if assigned(in_sqlda^.SQLvar[SQLVarNr].SQLInd) then in_sqlda^.SQLvar=
[SQLVarNr].SQLInd^ :=3D 0;
+ if assigned(VSQLVar.SQLInd) then VSQLVar.SQLInd^ :=3D 0;
=
- case (in_sqlda^.SQLvar[SQLVarNr].sqltype and not 1) of
+ case (VSQLVar.sqltype and not 1) of
SQL_LONG :
begin
- i :=3D AParams[ParNr].AsInteger;
- Move(i, in_sqlda^.SQLvar[SQLVarNr].SQLData^, in_SQLDA^.SQLVar[SQ=
LVarNr].SQLLen);
+ if VSQLVar.sqlscale =3D 0 then
+ i :=3D AParams[ParNr].AsInteger
+ else
+ i :=3D Round(AParams[ParNr].AsCurrency * IntPower(10, -VSQLV=
ar.sqlscale));
+ Move(i, VSQLVar.SQLData^, VSQLVar.SQLLen);
end;
SQL_SHORT :
begin
- i :=3D AParams[ParNr].AsSmallInt;
- Move(i, in_sqlda^.SQLvar[SQLVarNr].SQLData^, in_SQLDA^.SQLVar[SQ=
LVarNr].SQLLen);
+ if VSQLVar.sqlscale =3D 0 then
+ si :=3D AParams[ParNr].AsSmallint
+ else
+ si :=3D Round(AParams[ParNr].AsCurrency * IntPower(10, -VSQL=
Var.sqlscale));
+ i :=3D si;
+ Move(i, VSQLVar.SQLData^, VSQLVar.SQLLen);
end;
SQL_BLOB :
SetBlobParam;
@@ -767,27 +778,30 @@
begin
s :=3D AParams[ParNr].AsString;
w :=3D length(s); // a word is enough, since the max-length of a=
string in interbase is 32k
- if ((in_sqlda^.SQLvar[SQLVarNr].SQLType and not 1) =3D SQL_VARYI=
NG) then
+ if ((VSQLVar.SQLType and not 1) =3D SQL_VARYING) then
begin
- in_sqlda^.SQLvar[SQLVarNr].SQLLen :=3D w;
- ReAllocMem(in_sqlda^.SQLvar[SQLVarNr].SQLData,in_SQLDA^.SQLVar=
[SQLVarNr].SQLLen+2);
- CurrBuff :=3D in_sqlda^.SQLvar[SQLVarNr].SQLData;
+ VSQLVar.SQLLen :=3D w;
+ ReAllocMem(VSQLVar.SQLData, VSQLVar.SQLLen+2);
+ CurrBuff :=3D VSQLVar.SQLData;
move(w,CurrBuff^,sizeof(w));
inc(CurrBuff,2);
end
else
- CurrBuff :=3D in_sqlda^.SQLvar[SQLVarNr].SQLData;
+ CurrBuff :=3D VSQLVar.SQLData;
Move(s[1], CurrBuff^, w);
end;
SQL_TYPE_DATE, SQL_TYPE_TIME, SQL_TIMESTAMP :
- SetDateTime(in_sqlda^.SQLvar[SQLVarNr].SQLData, AParams[ParNr].A=
sDateTime, in_SQLDA^.SQLVar[SQLVarNr].SQLType);
+ SetDateTime(VSQLVar.SQLData, AParams[ParNr].AsDateTime, VSQLVar.=
SQLType);
SQL_INT64:
begin
- li :=3D AParams[ParNr].AsLargeInt;
- Move(li, in_sqlda^.SQLvar[SQLVarNr].SQLData^, in_SQLDA^.SQLVar[S=
QLVarNr].SQLLen);
+ if VSQLVar.sqlscale =3D 0 then
+ li :=3D AParams[ParNr].AsLargeInt
+ else
+ li :=3D Round(AParams[ParNr].AsCurrency * IntPower(10, -VSQL=
Var.sqlscale));
+ Move(li, VSQLVar.SQLData^, VSQLVar.SQLLen);
end;
SQL_DOUBLE, SQL_FLOAT:
- SetFloat(in_sqlda^.SQLvar[SQLVarNr].SQLData, AParams[ParNr].AsFl=
oat, in_SQLDA^.SQLVar[SQLVarNr].SQLLen);
+ SetFloat(VSQLVar.SQLData, AParams[ParNr].AsFloat, VSQLVar.SQLLen=
);
else
DatabaseErrorFmt(SUnsupportedParameter,[Fieldtypenames[AParams[Par=
Nr].DataType]],self);
end {case}
-------------- next part --------------
Index: fcl-db/src/sqldb/interbase/ibconnection.pp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- fcl-db/src/sqldb/interbase/ibconnection.pp (revision 11044)
+++ fcl-db/src/sqldb/interbase/ibconnection.pp (working copy)
@@ -693,6 +693,7 @@
var ParNr,SQLVarNr : integer;
s : string;
i : integer;
+ si : smallint;
li : LargeInt;
currbuff : pchar;
w : word;
@@ -753,13 +754,20 @@
case (in_sqlda^.SQLvar[SQLVarNr].sqltype and not 1) of
SQL_LONG :
begin
- i :=3D AParams[ParNr].AsInteger;
- Move(i, in_sqlda^.SQLvar[SQLVarNr].SQLData^, in_SQLDA^.SQLVar[SQ=
LVarNr].SQLLen);
+ if in_sqlda^.SQLvar[SQLVarNr].sqlscale =3D 0 then
+ i :=3D AParams[ParNr].AsInteger
+ else
+ i :=3D Round(AParams[ParNr].AsCurrency * IntPower(10, -in_sq=
lda^.SQLvar[SQLVarNr].sqlscale));
+ Move(i, in_sqlda^.SQLvar[SQLVarNr].SQLData^, in_sqlda^.SQLvar[SQ=
LVarNr].SQLLen);
end;
SQL_SHORT :
begin
- i :=3D AParams[ParNr].AsSmallInt;
- Move(i, in_sqlda^.SQLvar[SQLVarNr].SQLData^, in_SQLDA^.SQLVar[SQ=
LVarNr].SQLLen);
+ if in_sqlda^.SQLvar[SQLVarNr].sqlscale =3D 0 then
+ si :=3D AParams[ParNr].AsSmallint
+ else
+ si :=3D Round(AParams[ParNr].AsCurrency * IntPower(10, -in_s=
qlda^.SQLvar[SQLVarNr].sqlscale));
+ i :=3D si;
+ Move(i, in_sqlda^.SQLvar[SQLVarNr].SQLData^, in_sqlda^.SQLvar[SQ=
LVarNr].SQLLen);
end;
SQL_BLOB :
SetBlobParam;
@@ -783,8 +791,11 @@
SetDateTime(in_sqlda^.SQLvar[SQLVarNr].SQLData, AParams[ParNr].A=
sDateTime, in_SQLDA^.SQLVar[SQLVarNr].SQLType);
SQL_INT64:
begin
- li :=3D AParams[ParNr].AsLargeInt;
- Move(li, in_sqlda^.SQLvar[SQLVarNr].SQLData^, in_SQLDA^.SQLVar[S=
QLVarNr].SQLLen);
+ if in_sqlda^.SQLvar[SQLVarNr].sqlscale =3D 0 then
+ li :=3D AParams[ParNr].AsLargeInt
+ else
+ li :=3D Round(AParams[ParNr].AsCurrency * IntPower(10, -in_s=
qlda^.SQLvar[SQLVarNr].sqlscale));
+ Move(li, in_sqlda^.SQLvar[SQLVarNr].SQLData^, in_sqlda^.SQLvar[S=
QLVarNr].SQLLen);
end;
SQL_DOUBLE, SQL_FLOAT:
SetFloat(in_sqlda^.SQLvar[SQLVarNr].SQLData, AParams[ParNr].AsFl=
oat, in_SQLDA^.SQLVar[SQLVarNr].SQLLen);
More information about the fpc-pascal
mailing list