mORMot and Open Source friends
Check-in [47805bc15e]
Not logged in

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

Overview
Comment:added aDocVariant.Value(aName) and aDocVariant._(aName) pseudo methods, to be used with late-binding of method names which can't be written inline - e.g. {data:{"1000":"D1"}}
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 47805bc15e118637de996933a4ca1e70aaf7be71
User & Date: User 2014-07-04 10:31:06
Context
2014-07-04
11:43
for PostgreSQL, SynDB will create TEXT column instead of VARCHAR(%) http://www.postgresql.org/docs/devel/static/datatype-character.html check-in: a540a5fae8 user: User tags: trunk
10:31
added aDocVariant.Value(aName) and aDocVariant._(aName) pseudo methods, to be used with late-binding of method names which can't be written inline - e.g. {data:{"1000":"D1"}} check-in: 47805bc15e user: User tags: trunk
09:47
added function AnyTextFileToRawUTF8() check-in: 1968310b19 user: User tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to SynCommons.pas.

8868
8869
8870
8871
8872
8873
8874

8875
8876
8877
8878
8879
8880
8881
.....
28001
28002
28003
28004
28005
28006
28007

28008



28009
28010
28011
28012
28013
28014
28015
28016
28017
28018
28019
28020
28021
28022
28023
28024
28025
28026
28027
28028
28029
28030
28031
28032
28033
28034
28035
28036
28037
28038
28039
28040
28041
28042
28043
28044
28045







28046
28047

28048
28049
28050
28051
28052
28053
28054
  // instances of this kind of variants
  // - it also supports a small set of pseudo-properties or pseudo-methods:
  // ! aVariant._Count = DocVariantData(aVariant).Count
  // ! aVariant._Kind = ord(DocVariantData(aVariant).Kind)
  // ! aVariant._JSON = DocVariantData(aVariant).JSON
  // ! aVariant._(i) = DocVariantData(aVariant).Value[i]
  // ! aVariant.Value(i) = DocVariantData(aVariant).Value[i]

  // ! aVariant.Name(i) = DocVariantData(aVariant).Name[i]
  // ! aVariant.Add(aItem) = DocVariantData(aVariant).AddItem(aItem)
  // ! aVariant._ := aItem = DocVariantData(aVariant).AddItem(aItem)
  // ! aVariant.Add(aName,aValue) = DocVariantData(aVariant).AddValue(aName,aValue)
  // ! aVariant.Exists(aName) = DocVariantData(aVariant).GetValueIndex(aName)>=0
  // ! aVariant.Delete(i) = DocVariantData(aVariant).Delete(i)
  // ! aVariant.Delete(aName) = DocVariantData(aVariant).Delete(aName)
................................................................................
end;

function TDocVariant.DoFunction(var Dest: TVarData; const V: TVarData;
  const Name: string; const Arguments: TVarDataArray): boolean;
var ndx: integer;
    Data: TDocVariantData absolute V;
    temp: RawUTF8;

    wasString: boolean;



begin
  result := true;
  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
      Data.InternalAddValue('',variant(Arguments[0]));
      exit;
    end else
    if SameText(Name,'Delete') then begin
      VariantToUTF8(variant(Arguments[0]),temp,wasString);
      Data.Delete(Data.GetValueIndex(temp));
      exit;
    end else
    if SameText(Name,'Exists') then begin
      VariantToUTF8(variant(Arguments[0]),temp,wasString);
      variant(Dest) := Data.GetValueIndex(temp)>=0;
      exit;
    end else
    if SameText(Name,'NameIndex') then begin
      VariantToUTF8(variant(Arguments[0]),temp,wasString);
      variant(Dest) := Data.GetValueIndex(temp);
      exit;
    end else
    if VariantToInteger(variant(Arguments[0]),ndx) then
      if (Name='_') or SameText(Name,'Value') then begin
        Data.RetrieveValueOrRaiseException(ndx,variant(Dest),true);
        exit;
      end else
      if SameText(Name,'Name') then begin
        Data.RetrieveNameOrRaiseException(ndx,temp);
        RawUTF8ToVariant(temp,variant(Dest));
        exit;
      end;







  2:if SameText(Name,'Add') then begin
      VariantToUTF8(variant(Arguments[0]),temp,wasString);

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







>







 







>
|
>
>
>













|




|




|



|









>
>
>
>
>
>
>

<
>







8868
8869
8870
8871
8872
8873
8874
8875
8876
8877
8878
8879
8880
8881
8882
.....
28002
28003
28004
28005
28006
28007
28008
28009
28010
28011
28012
28013
28014
28015
28016
28017
28018
28019
28020
28021
28022
28023
28024
28025
28026
28027
28028
28029
28030
28031
28032
28033
28034
28035
28036
28037
28038
28039
28040
28041
28042
28043
28044
28045
28046
28047
28048
28049
28050
28051
28052
28053
28054
28055
28056
28057
28058

28059
28060
28061
28062
28063
28064
28065
28066
  // instances of this kind of variants
  // - it also supports a small set of pseudo-properties or pseudo-methods:
  // ! aVariant._Count = DocVariantData(aVariant).Count
  // ! aVariant._Kind = ord(DocVariantData(aVariant).Kind)
  // ! aVariant._JSON = DocVariantData(aVariant).JSON
  // ! aVariant._(i) = DocVariantData(aVariant).Value[i]
  // ! aVariant.Value(i) = DocVariantData(aVariant).Value[i]
  // ! aVariant.Value(aName) = DocVariantData(aVariant).Value[aName]
  // ! aVariant.Name(i) = DocVariantData(aVariant).Name[i]
  // ! aVariant.Add(aItem) = DocVariantData(aVariant).AddItem(aItem)
  // ! aVariant._ := aItem = DocVariantData(aVariant).AddItem(aItem)
  // ! aVariant.Add(aName,aValue) = DocVariantData(aVariant).AddValue(aName,aValue)
  // ! aVariant.Exists(aName) = DocVariantData(aVariant).GetValueIndex(aName)>=0
  // ! aVariant.Delete(i) = DocVariantData(aVariant).Delete(i)
  // ! aVariant.Delete(aName) = DocVariantData(aVariant).Delete(aName)
................................................................................
end;

function TDocVariant.DoFunction(var Dest: TVarData; const V: TVarData;
  const Name: string; const Arguments: TVarDataArray): boolean;
var ndx: integer;
    Data: TDocVariantData absolute V;
    temp: RawUTF8;
procedure SetTempFromFirstArgument;
var wasString: boolean;
begin
  VariantToUTF8(variant(Arguments[0]),temp,wasString);
end;
begin
  result := true;
  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
      Data.InternalAddValue('',variant(Arguments[0]));
      exit;
    end else
    if SameText(Name,'Delete') then begin
      SetTempFromFirstArgument;
      Data.Delete(Data.GetValueIndex(temp));
      exit;
    end else
    if SameText(Name,'Exists') then begin
      SetTempFromFirstArgument;
      variant(Dest) := Data.GetValueIndex(temp)>=0;
      exit;
    end else
    if SameText(Name,'NameIndex') then begin
      SetTempFromFirstArgument;
      variant(Dest) := Data.GetValueIndex(temp);
      exit;
    end else
    if VariantToInteger(variant(Arguments[0]),ndx) then begin
      if (Name='_') or SameText(Name,'Value') then begin
        Data.RetrieveValueOrRaiseException(ndx,variant(Dest),true);
        exit;
      end else
      if SameText(Name,'Name') then begin
        Data.RetrieveNameOrRaiseException(ndx,temp);
        RawUTF8ToVariant(temp,variant(Dest));
        exit;
      end;
    end else
    if (Name='_') or SameText(Name,'Value') then begin
      SetTempFromFirstArgument;
      Data.RetrieveValueOrRaiseException(pointer(temp),length(temp),
        dvoNameCaseSensitive in Data.VOptions,variant(Dest),true);
      exit;
    end;
  2:if SameText(Name,'Add') then begin

      SetTempFromFirstArgument;
      Data.InternalAddValue(temp,variant(Arguments[1]));
      exit;
    end;
  end;
  result := false;
end;

Changes to SynSelfTests.pas.

5594
5595
5596
5597
5598
5599
5600









5601
5602
5603
5604
5605
5606
5607
  DoChange(V2);
  Check(VariantSaveJSON(V1)=s);
  Check(Hash32(VariantSaveJSON(V2))=$92FEB37B);
  V2 := _copy(V1.Seasons);
  DoChange(V2);
  Check(VariantSaveJSON(V1)=s);
  Check(Hash32(VariantSaveJSON(V2))=$92FEB37B);









end;

{$endif LVCL}

{$ifndef FPC}
type TOrdTypeSet = set of TOrdType;







>
>
>
>
>
>
>
>
>







5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
  DoChange(V2);
  Check(VariantSaveJSON(V1)=s);
  Check(Hash32(VariantSaveJSON(V2))=$92FEB37B);
  V2 := _copy(V1.Seasons);
  DoChange(V2);
  Check(VariantSaveJSON(V1)=s);
  Check(Hash32(VariantSaveJSON(V2))=$92FEB37B);
  V := _Json('{result:{data:{"1000":"D1", "1001":"D2"}}}');
  Check(V.result='{"data":{"1000":"D1", "1001":"D2"}}');
  Check(V.result.data.Exists('1000'));
  Check(V.result.data.Exists('1001'));
  Check(not V.result.data.Exists('1002'));
  Check(DocVariantData(V.result.data).Value['1000']='D1');
  Check(V.result.data.Value(0)='D1');
  Check(V.result.data.Value('1000')='D1');
  Check(V.result.data.Value('1001')='D2');
end;

{$endif LVCL}

{$ifndef FPC}
type TOrdTypeSet = set of TOrdType;