Browse Source

* Base indexes on AnsiCompareStr/AnsiCompareText and modified tests

git-svn-id: trunk@10763 -
joost 17 years ago
parent
commit
ecca8bdbaf
2 changed files with 41 additions and 59 deletions
  1. 4 26
      packages/fcl-db/src/base/bufdataset.pas
  2. 37 33
      packages/fcl-db/tests/testdbbasics.pas

+ 4 - 26
packages/fcl-db/src/base/bufdataset.pas

@@ -276,35 +276,13 @@ implementation
 
 uses variants, dbconst;
 
-function DBCompareTextLen(substr, astr: pchar; len : integer; options: TLocateOptions): int64;
-
-var
-  i : integer; Chr1, Chr2: byte;
-begin
-  result := 0;
-  i := 0;
-  chr1 := 1;
-  while (result=0) and (i<=len) and (chr1 <> 0) do
-    begin
-    Chr1 := byte(substr[i]);
-    Chr2 := byte(astr[i]);
-    inc(i);
-    if loCaseInsensitive in options then
-      begin
-      if Chr1 in [97..122] then
-        dec(Chr1,32);
-      if Chr2 in [97..122] then
-        dec(Chr2,32);
-      end;
-    result := Chr1 - Chr2;
-    end;
-  if (result <> 0) and (chr1 = 0) and (loPartialKey in options) then result := 0;
-end;
-
 function DBCompareText(subValue, aValue: pointer; options: TLocateOptions): LargeInt;
 
 begin
-  Result := DBCompareTextLen(subValue,aValue,Length(pchar(subValue)),options);
+  if loCaseInsensitive in options then
+    Result := AnsiCompareText(pchar(subValue),pchar(aValue))
+  else
+    Result := AnsiCompareStr(pchar(subValue),pchar(aValue));
 end;
 
 function DBCompareByte(subValue, aValue: pointer; options: TLocateOptions): LargeInt;

+ 37 - 33
packages/fcl-db/tests/testdbbasics.pas

@@ -905,6 +905,7 @@ procedure TTestDBBasics.TestAddIndexFieldType(AFieldType: TFieldType; ActiveDS :
 var ds : TBufDataset;
     FList : TStringList;
     LastValue : Variant;
+    StrValue : String;
 begin
   ds := DBConnector.GetFieldDataset as TBufDataset;
   with ds do
@@ -939,14 +940,20 @@ begin
     LastValue:=null;
     while not eof do
       begin
-      AssertTrue(LastValue<=FieldByName('F'+FieldTypeNames[AfieldType]).AsVariant);
+      if AFieldType=ftString then
+        AssertTrue(AnsiCompareStr(VarToStr(LastValue),VarToStr(FieldByName('F'+FieldTypeNames[AfieldType]).AsString))<=0)
+      else
+        AssertTrue(LastValue<=FieldByName('F'+FieldTypeNames[AfieldType]).AsVariant);
       LastValue:=FieldByName('F'+FieldTypeNames[AfieldType]).AsVariant;
       Next;
       end;
 
     while not bof do
       begin
-      AssertTrue(LastValue>=FieldByName('F'+FieldTypeNames[AfieldType]).AsVariant);
+      if AFieldType=ftString then
+        AssertTrue(AnsiCompareStr(VarToStr(LastValue),VarToStr(FieldByName('F'+FieldTypeNames[AfieldType]).AsString))>=0)
+      else
+        AssertTrue(LastValue>=FieldByName('F'+FieldTypeNames[AfieldType]).AsVariant);
       LastValue:=FieldByName('F'+FieldTypeNames[AfieldType]).AsVariant;
       Prior;
       end;
@@ -1187,7 +1194,7 @@ begin
     LastValue:=FieldByName('name').AsString;
     while not eof do
       begin
-      AssertTrue(LastValue<=FieldByName('name').AsString);
+      AssertTrue(AnsiCompareStr(LastValue,FieldByName('name').AsString)<=0);
       Next;
       end;
     end;
@@ -1314,48 +1321,45 @@ end;
 
 procedure TTestDBBasics.TestAddDblIndex;
 var ds : TBufDataset;
-    FList : TStringList;
-    i : integer;
+    LastInteger : Integer;
+    LastString : string;
 begin
   ds := DBConnector.GetFieldDataset as TBufDataset;
   with ds do
     begin
 
     AddIndex('testindex','F'+FieldTypeNames[ftString]+';F'+FieldTypeNames[ftInteger],[]);
-    FList := TStringList.Create;
-    FList.Sorted:=true;
-    FList.CaseSensitive:=True;
-    FList.Duplicates:=dupAccept;
     open;
 
-    while not eof do
-      begin
-      // If the first field of the index is null then the compound string in
-      // FList isn't sorted right...
-      if FieldByName('F'+FieldTypeNames[ftString]).IsNull then
-        flist.Add('         -'+ Format('%.12d',[FieldByName('F'+FieldTypeNames[ftInteger]).AsInteger]))
-      else
-        flist.Add(FieldByName('F'+FieldTypeNames[ftString]).AsString+'-'+ Format('%.12d',[FieldByName('F'+FieldTypeNames[ftInteger]).AsInteger]));
-      Next;
-      end;
-
     IndexName:='testindex';
     first;
-    i:=0;
 
+    LastString:='';
     while not eof do
       begin
-      if (not FieldByName('F'+FieldTypeNames[ftString]).IsNull) then
-        AssertEquals(flist[i],FieldByName('F'+FieldTypeNames[ftString]).AsString+'-'+ Format('%.12d',[FieldByName('F'+FieldTypeNames[ftInteger]).AsInteger]));
-      inc(i);
-      Next;
+      AssertTrue(AnsiCompareStr(FieldByName('F'+FieldTypeNames[ftString]).AsString,LastString)>=0);
+      LastString:= FieldByName('F'+FieldTypeNames[ftString]).AsString;
+
+      LastInteger:=-MaxInt;
+      while (FieldByName('F'+FieldTypeNames[ftString]).AsString=LastString) and not eof do
+        begin
+        AssertTrue(FieldByName('F'+FieldTypeNames[ftInteger]).AsInteger>=LastInteger);
+        LastInteger:=FieldByName('F'+FieldTypeNames[ftInteger]).AsInteger;
+        next;
+        end;
       end;
     while not bof do
       begin
-      dec(i);
-      if not FieldByName('F'+FieldTypeNames[ftString]).IsNull then
-        AssertEquals(flist[i],FieldByName('F'+FieldTypeNames[ftString]).AsString+'-'+ Format('%.12d',[FieldByName('F'+FieldTypeNames[ftInteger]).AsInteger]));
-      Prior;
+      AssertTrue(AnsiCompareStr(FieldByName('F'+FieldTypeNames[ftString]).AsString,LastString)<=0);
+      LastString:= FieldByName('F'+FieldTypeNames[ftString]).AsString;
+
+      LastInteger:=+MaxInt;
+      while (FieldByName('F'+FieldTypeNames[ftString]).AsString=LastString) and not bof do
+        begin
+        AssertTrue(FieldByName('F'+FieldTypeNames[ftInteger]).AsInteger<=LastInteger);
+        LastInteger:=FieldByName('F'+FieldTypeNames[ftInteger]).AsInteger;
+        prior;
+        end;
       end;
     end;
 end;
@@ -1379,17 +1383,17 @@ begin
     AssertTrue(OldStringValue<=FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
     OldStringValue:=FieldByName('F'+FieldTypeNames[AfieldType]).AsString;
     next;
-    AssertTrue(OldStringValue<=FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
+    AssertTrue(AnsiCompareStr(OldStringValue,FieldByName('F'+FieldTypeNames[AfieldType]).AsString)<=0);
     prior;
     
     edit;
     FieldByName('F'+FieldTypeNames[AfieldType]).AsString := 'ZZZ';
     post;
     prior;
-    AssertTrue('ZZZ'>=FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
+    AssertTrue(AnsiCompareStr('ZZZ',FieldByName('F'+FieldTypeNames[AfieldType]).AsString)>=0);
     next;
     next;
-    AssertTrue('ZZZ'<=FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
+    AssertTrue(AnsiCompareStr('ZZZ',FieldByName('F'+FieldTypeNames[AfieldType]).AsString)<=0);
     close;
     end;
 end;
@@ -1410,7 +1414,7 @@ begin
     PrevValue:='';
     while not eof do
       begin
-      AssertTrue(FieldByName('F'+FieldTypeNames[AfieldType]).AsString>=PrevValue);
+      AssertTrue(AnsiCompareStr(FieldByName('F'+FieldTypeNames[AfieldType]).AsString,PrevValue)>=0);
       PrevValue:=FieldByName('F'+FieldTypeNames[AfieldType]).AsString;
       Next;
       end;