mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 21:49:09 +02:00
* Patch from Inoussa implementing getter/setter for variants (bug ID 25759)
git-svn-id: trunk@26862 -
This commit is contained in:
parent
88f32a7593
commit
5848e5e33a
@ -395,7 +395,7 @@ type
|
|||||||
const AOffset : PtrUInt;
|
const AOffset : PtrUInt;
|
||||||
const AValue : TSDOVariant
|
const AValue : TSDOVariant
|
||||||
); override;
|
); override;
|
||||||
|
|
||||||
function getBoolean(
|
function getBoolean(
|
||||||
const ABuffer : TSDOFieldBuffer;
|
const ABuffer : TSDOFieldBuffer;
|
||||||
const AOffset : PtrUInt
|
const AOffset : PtrUInt
|
||||||
@ -565,7 +565,7 @@ type
|
|||||||
const AOffset : PtrUInt;
|
const AOffset : PtrUInt;
|
||||||
const AValue : TSDOVariant
|
const AValue : TSDOVariant
|
||||||
); override;
|
); override;
|
||||||
|
|
||||||
function getBoolean(
|
function getBoolean(
|
||||||
const ABuffer : TSDOFieldBuffer;
|
const ABuffer : TSDOFieldBuffer;
|
||||||
const AOffset : PtrUInt
|
const AOffset : PtrUInt
|
||||||
@ -670,6 +670,15 @@ type
|
|||||||
const ABuffer : TSDOFieldBuffer;
|
const ABuffer : TSDOFieldBuffer;
|
||||||
const AOffset : PtrUInt
|
const AOffset : PtrUInt
|
||||||
);override;
|
);override;
|
||||||
|
function getVariant(
|
||||||
|
const ABuffer : TSDOFieldBuffer;
|
||||||
|
const AOffset : PtrUInt
|
||||||
|
) : TSDOVariant; override;
|
||||||
|
procedure setVariant(
|
||||||
|
const ABuffer : TSDOFieldBuffer;
|
||||||
|
const AOffset : PtrUInt;
|
||||||
|
const AValue : TSDOVariant
|
||||||
|
); override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
TSDOChangeSummaryField = class(TSDOBaseField,IInterface,ISDOField)
|
TSDOChangeSummaryField = class(TSDOBaseField,IInterface,ISDOField)
|
||||||
@ -706,7 +715,7 @@ type
|
|||||||
const AOffset : PtrUInt;
|
const AOffset : PtrUInt;
|
||||||
const AValue : TSDOVariant
|
const AValue : TSDOVariant
|
||||||
); override;
|
); override;
|
||||||
|
|
||||||
function getBoolean(
|
function getBoolean(
|
||||||
const ABuffer : TSDOFieldBuffer;
|
const ABuffer : TSDOFieldBuffer;
|
||||||
const AOffset : PtrUInt
|
const AOffset : PtrUInt
|
||||||
@ -793,7 +802,7 @@ type
|
|||||||
const AOffset : PtrUInt;
|
const AOffset : PtrUInt;
|
||||||
const AValue : TSDOVariant
|
const AValue : TSDOVariant
|
||||||
); override;
|
); override;
|
||||||
|
|
||||||
function getBytes(
|
function getBytes(
|
||||||
const ABuffer : TSDOFieldBuffer;
|
const ABuffer : TSDOFieldBuffer;
|
||||||
const AOffset : PtrUInt
|
const AOffset : PtrUInt
|
||||||
@ -1836,7 +1845,7 @@ procedure TSDOBooleanField.setVariant(
|
|||||||
const AValue: TSDOVariant
|
const AValue: TSDOVariant
|
||||||
);
|
);
|
||||||
begin
|
begin
|
||||||
if isNull(ABuffer,AOffset) then
|
if VarIsNull(AValue) then
|
||||||
setNull(ABuffer,AOffset)
|
setNull(ABuffer,AOffset)
|
||||||
else
|
else
|
||||||
setBoolean(ABuffer,AOffset,AValue);
|
setBoolean(ABuffer,AOffset,AValue);
|
||||||
@ -1995,7 +2004,7 @@ procedure TSDOIntegerField.setVariant(
|
|||||||
const AValue: TSDOVariant
|
const AValue: TSDOVariant
|
||||||
);
|
);
|
||||||
begin
|
begin
|
||||||
if isNull(ABuffer,AOffset) then
|
if VarIsNull(AValue) then
|
||||||
setNull(ABuffer,AOffset)
|
setNull(ABuffer,AOffset)
|
||||||
else
|
else
|
||||||
setInteger(ABuffer,AOffset,AValue);
|
setInteger(ABuffer,AOffset,AValue);
|
||||||
@ -2200,7 +2209,7 @@ procedure TSDOBaseStringField.setVariant(
|
|||||||
const AValue: TSDOVariant
|
const AValue: TSDOVariant
|
||||||
);
|
);
|
||||||
begin
|
begin
|
||||||
if isNull(ABuffer,AOffset) then
|
if VarIsNull(AValue) then
|
||||||
setNull(ABuffer,AOffset)
|
setNull(ABuffer,AOffset)
|
||||||
else
|
else
|
||||||
setString(ABuffer,AOffset,AValue);
|
setString(ABuffer,AOffset,AValue);
|
||||||
@ -2264,6 +2273,17 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TSDOObjectField.getVariant(
|
||||||
|
const ABuffer: TSDOFieldBuffer;
|
||||||
|
const AOffset: PtrUInt
|
||||||
|
) : TSDOVariant;
|
||||||
|
begin
|
||||||
|
if isNull(ABuffer,AOffset) then
|
||||||
|
Result := Null
|
||||||
|
else
|
||||||
|
Result := getDataObject(ABuffer,AOffset);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TSDOObjectField.setDataObject(
|
procedure TSDOObjectField.setDataObject(
|
||||||
const ABuffer : TSDOFieldBuffer;
|
const ABuffer : TSDOFieldBuffer;
|
||||||
const AOffset : PtrUInt;
|
const AOffset : PtrUInt;
|
||||||
@ -2292,6 +2312,31 @@ begin
|
|||||||
objBuffer^^ := AValue;
|
objBuffer^^ := AValue;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TSDOObjectField.setVariant(
|
||||||
|
const ABuffer : TSDOFieldBuffer;
|
||||||
|
const AOffset : PtrUInt;
|
||||||
|
const AValue : TSDOVariant
|
||||||
|
);
|
||||||
|
var
|
||||||
|
x : IInterface;
|
||||||
|
obj : ISDODataObject;
|
||||||
|
begin
|
||||||
|
if VarIsNull(AValue) then begin
|
||||||
|
setNull(ABuffer,AOffset);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
if not VarIsType(AValue,varUnknown) then
|
||||||
|
raise ESDOInvalidConversionException.Create(ClassName);
|
||||||
|
x := AValue;
|
||||||
|
if (x = nil) then begin
|
||||||
|
obj := nil;
|
||||||
|
end else begin
|
||||||
|
if not Supports(x,ISDODataObject,obj) then
|
||||||
|
raise ESDOInvalidConversionException.Create(ClassName);
|
||||||
|
end;
|
||||||
|
setDataObject(ABuffer,AOffset,obj);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TSDOObjectField.setNull(const ABuffer: TSDOFieldBuffer; const AOffset: PtrUInt);
|
procedure TSDOObjectField.setNull(const ABuffer: TSDOFieldBuffer; const AOffset: PtrUInt);
|
||||||
var
|
var
|
||||||
rawBuffer : PByte;
|
rawBuffer : PByte;
|
||||||
@ -2580,7 +2625,7 @@ procedure TSDOByteField.setVariant(
|
|||||||
const AValue: TSDOVariant
|
const AValue: TSDOVariant
|
||||||
);
|
);
|
||||||
begin
|
begin
|
||||||
if isNull(ABuffer,AOffset) then
|
if VarIsNull(AValue) then
|
||||||
setNull(ABuffer,AOffset)
|
setNull(ABuffer,AOffset)
|
||||||
else
|
else
|
||||||
setByte(ABuffer,AOffset,AValue);
|
setByte(ABuffer,AOffset,AValue);
|
||||||
@ -2658,10 +2703,10 @@ procedure TSDODateField.setVariant(
|
|||||||
const AValue: TSDOVariant
|
const AValue: TSDOVariant
|
||||||
);
|
);
|
||||||
begin
|
begin
|
||||||
if isNull(ABuffer,AOffset) then
|
if VarIsNull(AValue) then
|
||||||
setNull(ABuffer,AOffset)
|
setNull(ABuffer,AOffset)
|
||||||
else
|
else
|
||||||
setDate(ABuffer,AOffset,DateTimeToDateTimeRec(AValue));
|
setDate(ABuffer,AOffset,DateTimeToDateTimeRec(VarToDateTime(AValue)));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TSDOCharField }
|
{ TSDOCharField }
|
||||||
@ -2910,16 +2955,11 @@ procedure TSDOCharField.setVariant(
|
|||||||
const AOffset: PtrUInt;
|
const AOffset: PtrUInt;
|
||||||
const AValue: TSDOVariant
|
const AValue: TSDOVariant
|
||||||
);
|
);
|
||||||
var
|
|
||||||
locStr : TSDOString;
|
|
||||||
begin
|
begin
|
||||||
if isNull(ABuffer,AOffset) then begin
|
if VarIsNull(AValue) then begin
|
||||||
setNull(ABuffer,AOffset)
|
setNull(ABuffer,AOffset)
|
||||||
end else begin
|
end else begin
|
||||||
locStr := AValue;
|
setCharacter(ABuffer,AOffset,AValue);
|
||||||
if IsStrEmpty(locStr) then
|
|
||||||
locStr := #0;
|
|
||||||
setCharacter(ABuffer,AOffset,locStr[1]);
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -3080,7 +3120,7 @@ procedure TSDOLongField.setVariant(
|
|||||||
const AValue: TSDOVariant
|
const AValue: TSDOVariant
|
||||||
);
|
);
|
||||||
begin
|
begin
|
||||||
if isNull(ABuffer,AOffset) then
|
if VarIsNull(AValue) then
|
||||||
setNull(ABuffer,AOffset)
|
setNull(ABuffer,AOffset)
|
||||||
else
|
else
|
||||||
setLong(ABuffer,AOffset,AValue);
|
setLong(ABuffer,AOffset,AValue);
|
||||||
@ -3245,7 +3285,7 @@ procedure TSDOShortField.setVariant(
|
|||||||
const AValue: TSDOVariant
|
const AValue: TSDOVariant
|
||||||
);
|
);
|
||||||
begin
|
begin
|
||||||
if isNull(ABuffer,AOffset) then
|
if VarIsNull(AValue) then
|
||||||
setNull(ABuffer,AOffset)
|
setNull(ABuffer,AOffset)
|
||||||
else
|
else
|
||||||
setShort(ABuffer,AOffset,AValue);
|
setShort(ABuffer,AOffset,AValue);
|
||||||
@ -3562,11 +3602,25 @@ procedure TSDOBytesField.setVariant(
|
|||||||
const AOffset: PtrUInt;
|
const AOffset: PtrUInt;
|
||||||
const AValue: TSDOVariant
|
const AValue: TSDOVariant
|
||||||
);
|
);
|
||||||
|
var
|
||||||
|
tempValue : TSDOBytes;
|
||||||
|
i, c : Integer;
|
||||||
begin
|
begin
|
||||||
if isNull(ABuffer,AOffset) then
|
if VarIsNull(AValue) or VarIsEmpty(AValue) then begin
|
||||||
setNull(ABuffer,AOffset)
|
setNull(ABuffer,AOffset)
|
||||||
else
|
end else begin
|
||||||
setBytes(ABuffer,AOffset,AValue);
|
if not VarIsArray(AValue) then
|
||||||
|
raise ESDOInvalidConversionException.Create(ClassName);
|
||||||
|
c := VarArrayHighBound(AValue,1) - VarArrayLowBound(AValue,1) + 1;
|
||||||
|
if (c > 0) then begin
|
||||||
|
SetLength(tempValue,c);
|
||||||
|
for i := VarArrayLowBound(AValue,1) to VarArrayHighBound(AValue,1) do
|
||||||
|
tempValue[i] := AValue[i];
|
||||||
|
end else begin
|
||||||
|
tempValue := nil;
|
||||||
|
end;
|
||||||
|
setBytes(ABuffer,AOffset,tempValue);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSDOCurrencyField.getVariant(
|
function TSDOCurrencyField.getVariant(
|
||||||
@ -3586,7 +3640,7 @@ procedure TSDOCurrencyField.setVariant(
|
|||||||
const AValue: TSDOVariant
|
const AValue: TSDOVariant
|
||||||
);
|
);
|
||||||
begin
|
begin
|
||||||
if isNull(ABuffer,AOffset) then
|
if VarIsNull(AValue) then
|
||||||
setNull(ABuffer,AOffset)
|
setNull(ABuffer,AOffset)
|
||||||
else
|
else
|
||||||
setCurrency(ABuffer,AOffset,AValue);
|
setCurrency(ABuffer,AOffset,AValue);
|
||||||
@ -3609,7 +3663,7 @@ procedure TSDODoubleField.setVariant(
|
|||||||
const AValue: TSDOVariant
|
const AValue: TSDOVariant
|
||||||
);
|
);
|
||||||
begin
|
begin
|
||||||
if isNull(ABuffer,AOffset) then
|
if VarIsNull(AValue) then
|
||||||
setNull(ABuffer,AOffset)
|
setNull(ABuffer,AOffset)
|
||||||
else
|
else
|
||||||
setDouble(ABuffer,AOffset,AValue);
|
setDouble(ABuffer,AOffset,AValue);
|
||||||
@ -3632,7 +3686,7 @@ procedure TSDOFloatField.setVariant(
|
|||||||
const AValue: TSDOVariant
|
const AValue: TSDOVariant
|
||||||
);
|
);
|
||||||
begin
|
begin
|
||||||
if isNull(ABuffer,AOffset) then
|
if VarIsNull(AValue) then
|
||||||
setNull(ABuffer,AOffset)
|
setNull(ABuffer,AOffset)
|
||||||
else
|
else
|
||||||
setFloat(ABuffer,AOffset,AValue);
|
setFloat(ABuffer,AOffset,AValue);
|
||||||
@ -3643,5 +3697,6 @@ initialization
|
|||||||
|
|
||||||
finalization
|
finalization
|
||||||
UnprepareMap();
|
UnprepareMap();
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
{$IFEND}
|
{$IFEND}
|
||||||
{$IFEND}
|
{$IFEND}
|
||||||
{$DEFINE USE_INLINE}
|
{$DEFINE USE_INLINE}
|
||||||
|
{$DEFINE CHAR_TO_VARARIANT_ERROR}
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
{$UNDEF HAS_QWORD}
|
{$UNDEF HAS_QWORD}
|
||||||
{$UNDEF USE_INLINE}
|
{$UNDEF USE_INLINE}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<CONFIG>
|
<CONFIG>
|
||||||
<ProjectOptions>
|
<ProjectOptions>
|
||||||
<Version Value="9"/>
|
<Version Value="9"/>
|
||||||
@ -118,14 +118,14 @@
|
|||||||
</Units>
|
</Units>
|
||||||
</ProjectOptions>
|
</ProjectOptions>
|
||||||
<CompilerOptions>
|
<CompilerOptions>
|
||||||
<Version Value="9"/>
|
<Version Value="11"/>
|
||||||
<PathDelim Value="\"/>
|
<PathDelim Value="\"/>
|
||||||
<Target>
|
<Target>
|
||||||
<Filename Value="sdo_test_suite_gui"/>
|
<Filename Value="sdo_test_suite_gui"/>
|
||||||
</Target>
|
</Target>
|
||||||
<SearchPaths>
|
<SearchPaths>
|
||||||
<IncludeFiles Value="..\..\.."/>
|
<IncludeFiles Value="..\..\..\src\base"/>
|
||||||
<OtherUnitFiles Value="..;..\..;..\..\..;..\..\..\xsd;..\..\..\rtti_filter"/>
|
<OtherUnitFiles Value="..;..\..;..\..\..;..\..\..\src\base"/>
|
||||||
<UnitOutputDirectory Value="obj"/>
|
<UnitOutputDirectory Value="obj"/>
|
||||||
</SearchPaths>
|
</SearchPaths>
|
||||||
<Parsing>
|
<Parsing>
|
||||||
@ -136,8 +136,13 @@
|
|||||||
</Parsing>
|
</Parsing>
|
||||||
<Linking>
|
<Linking>
|
||||||
<Debugging>
|
<Debugging>
|
||||||
<GenerateDebugInfo Value="True"/>
|
<DebugInfoType Value="dsStabs"/>
|
||||||
</Debugging>
|
</Debugging>
|
||||||
|
<Options>
|
||||||
|
<Win32>
|
||||||
|
<GraphicApplication Value="True"/>
|
||||||
|
</Win32>
|
||||||
|
</Options>
|
||||||
</Linking>
|
</Linking>
|
||||||
<Other>
|
<Other>
|
||||||
<CompilerMessages>
|
<CompilerMessages>
|
||||||
@ -166,4 +171,4 @@
|
|||||||
</Item4>
|
</Item4>
|
||||||
</Exceptions>
|
</Exceptions>
|
||||||
</Debugging>
|
</Debugging>
|
||||||
</CONFIG>
|
</CONFIG>
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user