mORMot and Open Source friends
Check-in [3420df26a0]
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:{2093} fixed DocVariant trouble with FPC 3.1.1 as reported by [1364a0e3e1]
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 3420df26a0b2146057d09facc24402fd576f80c8
User & Date: ab 2015-11-27 14:47:53
Context
2015-11-27
14:57
{2094} fixed FPC/Linux compilation check-in: 676fa1a0dd user: ab tags: trunk
14:47
{2093} fixed DocVariant trouble with FPC 3.1.1 as reported by [1364a0e3e1] check-in: 3420df26a0 user: ab tags: trunk
10:43
{2092} fixed FireDAC and UniDAC support after Informix RDBMS support check-in: 38420e284a user: ab tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to SynCommons.pas.

17210
17211
17212
17213
17214
17215
17216








17217
17218
17219
17220
17221
17222
17223
.....
34377
34378
34379
34380
34381
34382
34383
34384
34385
34386
34387
34388
34389
34390
34391
34392
.....
34406
34407
34408
34409
34410
34411
34412
34413
34414
34415
34416
34417
34418
34419
34420

34421

34422
34423
34424
34425
34426
34427
34428
.....
35403
35404
35405
35406
35407
35408
35409

35410
35411
35412
35413
35414
35415
35416
35417
.....
35448
35449
35450
35451
35452
35453
35454

35455
35456
35457
35458
35459
35460
35461
35462
.....
35485
35486
35487
35488
35489
35490
35491

35492
35493
35494
35495
35496
35497
35498
35499
    RawUnicodeToUtf8(VAny,length(WideString(VAny)),result);
  end;
  else
  if SetVariantUnRefSimpleValue(V,tmp) then
    VariantToUTF8(Variant(tmp),result,wasString) else
  if VType=varVariant or varByRef then // complex varByRef
    VariantToUTF8(PVariant(VPointer)^,result,wasString) else








  if VType=varByRef or varOleStr then begin
    wasString := true;
    RawUnicodeToUtf8(pointer(PWideString(VAny)^),length(PWideString(VAny)^),result);
  end else
  {$ifdef HASVARUSTRING}
  if VType=varByRef or varUString then begin
    wasString := true;
................................................................................
var ndx: integer;
begin
  if dvoCheckForDuplicatedNames in VOptions then begin
    ndx := GetValueIndex(aName);
    if ndx>=0 then
      raise EDocVariant.CreateUTF8('Duplicated "%" name',[aName]);
  end;
  SetVariantByValue(aValue,VValue[InternalAdd(aName)]);
  result := VCount-1;
end;

function TDocVariantData.AddValue(aName: PUTF8Char; aNameLen: integer; const aValue: variant): integer;
var tmp: RawUTF8;
begin
  SetString(tmp,PAnsiChar(aName),aNameLen);
  result := AddValue(tmp,aValue);
................................................................................
  VarClear(VValue[result]);
  if not GetNumericVariantFromJSON(pointer(aValue),TVarData(VValue[result])) then
    RawUTF8ToVariant(aValue,VValue[result]);
end;

function TDocVariantData.AddItem(const aValue: variant): integer;
begin
  SetVariantByValue(aValue,VValue[InternalAdd('')]);
  result := VCount-1;
end;

procedure TDocVariantData.AddItems(const aValue: array of const);
var ndx: integer;
begin
  for ndx := 0 to high(aValue) do

    VarRecToVariant(aValue[ndx],VValue[InternalAdd('')]);

end;

function TDocVariantData.SearchItemByProp(const aPropName,aPropValue: RawUTF8;
  aCaseSensitive: boolean): integer;
var ndx: integer;
    tmp: RawUTF8;
    wasString: boolean;
................................................................................

procedure TDocVariant.IntSet(const V, Value: TVarData; Name: PAnsiChar);
var ndx: Integer;
    aName: RawUTF8;
    Data: TDocVariantData absolute V;
begin
  if (Data.Kind=dvArray) and (PWord(Name)^=ord('_')) then begin

    SetVariantByValue(variant(Value),Data.VValue[Data.InternalAdd('')]);
    exit;
  end;
  SetString(aName,Name,StrLen(PUTF8Char(Name)));
  ndx := Data.GetValueIndex(aName);
  if ndx<0 then
    ndx := Data.InternalAdd(aName);
  SetVariantByValue(variant(Value),Data.VValue[ndx]);
................................................................................
  case length(Arguments) of
  0:if SameText(Name,'Clear') then begin
      PDocVariantData(@V)^.VCount := 0;
      PDocVariantData(@V)^.VKind := dvUndefined;
      exit;
    end;
  1:if SameText(Name,'Add') then begin

      SetVariantByValue(variant(Arguments[0]),Data.VValue[Data.InternalAdd('')]);
      exit;
    end else
    if SameText(Name,'Delete') then begin
      SetTempFromFirstArgument;
      Data.Delete(Data.GetValueIndex(temp));
      exit;
    end else
................................................................................
      SetTempFromFirstArgument;
      Data.RetrieveValueOrRaiseException(pointer(temp),length(temp),
        dvoNameCaseSensitive in Data.VOptions,variant(Dest),true);
      exit;
    end;
  2:if SameText(Name,'Add') then begin
      SetTempFromFirstArgument;

      SetVariantByValue(variant(Arguments[1]),Data.VValue[Data.InternalAdd(temp)]);
      exit;
    end;
  end;
  result := false;
end;

procedure TDocVariant.ToJSON(W: TTextWriter; const Value: variant;






>
>
>
>
>
>
>
>







 







|
|







 







|
|



|

|
>
|
>







 







>
|







 







>
|







 







>
|







17210
17211
17212
17213
17214
17215
17216
17217
17218
17219
17220
17221
17222
17223
17224
17225
17226
17227
17228
17229
17230
17231
.....
34385
34386
34387
34388
34389
34390
34391
34392
34393
34394
34395
34396
34397
34398
34399
34400
.....
34414
34415
34416
34417
34418
34419
34420
34421
34422
34423
34424
34425
34426
34427
34428
34429
34430
34431
34432
34433
34434
34435
34436
34437
34438
.....
35413
35414
35415
35416
35417
35418
35419
35420
35421
35422
35423
35424
35425
35426
35427
35428
.....
35459
35460
35461
35462
35463
35464
35465
35466
35467
35468
35469
35470
35471
35472
35473
35474
.....
35497
35498
35499
35500
35501
35502
35503
35504
35505
35506
35507
35508
35509
35510
35511
35512
    RawUnicodeToUtf8(VAny,length(WideString(VAny)),result);
  end;
  else
  if SetVariantUnRefSimpleValue(V,tmp) then
    VariantToUTF8(Variant(tmp),result,wasString) else
  if VType=varVariant or varByRef then // complex varByRef
    VariantToUTF8(PVariant(VPointer)^,result,wasString) else
  if VType=varByRef or varString then begin
    wasString := true;
    {$ifdef UNICODE}
      AnyAnsiToUTF8(PRawByteString(VString)^,result);
    {$else}
      result := PRawUTF8(VString)^;
    {$endif}
  end else
  if VType=varByRef or varOleStr then begin
    wasString := true;
    RawUnicodeToUtf8(pointer(PWideString(VAny)^),length(PWideString(VAny)^),result);
  end else
  {$ifdef HASVARUSTRING}
  if VType=varByRef or varUString then begin
    wasString := true;
................................................................................
var ndx: integer;
begin
  if dvoCheckForDuplicatedNames in VOptions then begin
    ndx := GetValueIndex(aName);
    if ndx>=0 then
      raise EDocVariant.CreateUTF8('Duplicated "%" name',[aName]);
  end;
  result := InternalAdd(aName); // FPC does not allow VValue[InternalAdd(aName)]
  SetVariantByValue(aValue,VValue[result]);
end;

function TDocVariantData.AddValue(aName: PUTF8Char; aNameLen: integer; const aValue: variant): integer;
var tmp: RawUTF8;
begin
  SetString(tmp,PAnsiChar(aName),aNameLen);
  result := AddValue(tmp,aValue);
................................................................................
  VarClear(VValue[result]);
  if not GetNumericVariantFromJSON(pointer(aValue),TVarData(VValue[result])) then
    RawUTF8ToVariant(aValue,VValue[result]);
end;

function TDocVariantData.AddItem(const aValue: variant): integer;
begin
  result := InternalAdd(''); // FPC does not allow VValue[InternalAdd(aName)]
  SetVariantByValue(aValue,VValue[result]);
end;

procedure TDocVariantData.AddItems(const aValue: array of const);
var ndx,added: integer;
begin
  for ndx := 0 to high(aValue) do begin
    added := InternalAdd(''); // FPC does not allow VValue[InternalAdd(aName)]
    VarRecToVariant(aValue[ndx],VValue[added]);
  end;
end;

function TDocVariantData.SearchItemByProp(const aPropName,aPropValue: RawUTF8;
  aCaseSensitive: boolean): integer;
var ndx: integer;
    tmp: RawUTF8;
    wasString: boolean;
................................................................................

procedure TDocVariant.IntSet(const V, Value: TVarData; Name: PAnsiChar);
var ndx: Integer;
    aName: RawUTF8;
    Data: TDocVariantData absolute V;
begin
  if (Data.Kind=dvArray) and (PWord(Name)^=ord('_')) then begin
    ndx := Data.InternalAdd(''); // FPC does not allow VValue[InternalAdd(aName)]
    SetVariantByValue(variant(Value),Data.VValue[ndx]);
    exit;
  end;
  SetString(aName,Name,StrLen(PUTF8Char(Name)));
  ndx := Data.GetValueIndex(aName);
  if ndx<0 then
    ndx := Data.InternalAdd(aName);
  SetVariantByValue(variant(Value),Data.VValue[ndx]);
................................................................................
  case length(Arguments) of
  0:if SameText(Name,'Clear') then begin
      PDocVariantData(@V)^.VCount := 0;
      PDocVariantData(@V)^.VKind := dvUndefined;
      exit;
    end;
  1:if SameText(Name,'Add') then begin
      ndx := Data.InternalAdd(''); // FPC does not allow VValue[InternalAdd(aName)]
      SetVariantByValue(variant(Arguments[0]),Data.VValue[ndx]);
      exit;
    end else
    if SameText(Name,'Delete') then begin
      SetTempFromFirstArgument;
      Data.Delete(Data.GetValueIndex(temp));
      exit;
    end else
................................................................................
      SetTempFromFirstArgument;
      Data.RetrieveValueOrRaiseException(pointer(temp),length(temp),
        dvoNameCaseSensitive in Data.VOptions,variant(Dest),true);
      exit;
    end;
  2:if SameText(Name,'Add') then begin
      SetTempFromFirstArgument;
      ndx := Data.InternalAdd(temp); // FPC does not allow VValue[InternalAdd(aName)]
      SetVariantByValue(variant(Arguments[1]),Data.VValue[ndx]);
      exit;
    end;
  end;
  result := false;
end;

procedure TDocVariant.ToJSON(W: TTextWriter; const Value: variant;

Changes to SynopseCommit.inc.

1
'1.18.2092'
|
1
'1.18.2093'