* Patch from Inoussa implementing getter/setter for variants (bug ID 25759)

git-svn-id: trunk@26862 -
This commit is contained in:
michael 2014-02-24 09:34:21 +00:00
parent 88f32a7593
commit 5848e5e33a
4 changed files with 1387 additions and 52 deletions

View File

@ -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.

View File

@ -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}

View File

@ -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