From 809d16257bfb497a83de0c2050875dadb8ae3888 Mon Sep 17 00:00:00 2001 From: joost Date: Sun, 13 Apr 2008 18:35:03 +0000 Subject: [PATCH] * Case-insensitive indexes support git-svn-id: trunk@10657 - --- packages/fcl-db/src/base/bufdataset.pas | 11 ++++++- packages/fcl-db/tests/testdbbasics.pas | 44 +++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/packages/fcl-db/src/base/bufdataset.pas b/packages/fcl-db/src/base/bufdataset.pas index 2f4fd327b3..7c4ed7db37 100644 --- a/packages/fcl-db/src/base/bufdataset.pas +++ b/packages/fcl-db/src/base/bufdataset.pas @@ -110,6 +110,7 @@ type TDBCompareRec = record Comparefunc : TCompareFunc; Off1,Off2 : PtrInt; + Options : TLocateOptions; Desc : Boolean; end; TDBCompareStruct = array of TDBCompareRec; @@ -355,7 +356,7 @@ var IndexFieldNr : Integer; begin for IndexFieldNr:=0 to length(ADBCompareRecs)-1 do with ADBCompareRecs[IndexFieldNr] do begin - Result := Comparefunc(Rec1+Off1,Rec2+Off2,[]); + Result := Comparefunc(Rec1+Off1,Rec2+Off2,Options); if Result <> 0 then begin if Desc then @@ -421,6 +422,7 @@ var PCurRecLinkItem : PBufRecLinkItem; IndexFields : TList; DescIndexFields : TList; + CInsIndexFields : TList; FieldsAmount : Integer; FieldNr : integer; AField : TField; @@ -449,10 +451,12 @@ begin begin IndexFields := TList.Create; DescIndexFields := TList.Create; + CInsIndexFields := TList.Create; try GetFieldList(IndexFields,FieldsName); FieldsAmount:=IndexFields.Count; GetFieldList(DescIndexFields,DescFields); + GetFieldList(CInsIndexFields,CaseinsFields); if FieldsAmount=0 then DatabaseError(SNoIndexFieldNameGiven); SetLength(DBCompareStruct,FieldsAmount); @@ -474,12 +478,17 @@ begin end; DBCompareStruct[FieldNr].Desc := (DescIndexFields.IndexOf(AField)>-1); + if (CInsIndexFields.IndexOf(AField)>-1) then + DBCompareStruct[FieldNr].Options := [loCaseInsensitive] + else + DBCompareStruct[FieldNr].Options := []; DBCompareStruct[FieldNr].Off1:=sizeof(TBufRecLinkItem)*FMaxIndexesCount+FFieldBufPositions[AField.FieldNo-1]; DBCompareStruct[FieldNr].Off2:=DBCompareStruct[FieldNr].Off1; end; finally + CInsIndexFields.Free; DescIndexFields.Free; IndexFields.Free; end; diff --git a/packages/fcl-db/tests/testdbbasics.pas b/packages/fcl-db/tests/testdbbasics.pas index c113f45046..2efcf11c79 100644 --- a/packages/fcl-db/tests/testdbbasics.pas +++ b/packages/fcl-db/tests/testdbbasics.pas @@ -43,6 +43,7 @@ type procedure TestAddIndex; procedure TestAddDescIndex; + procedure TestAddCaseInsIndex; procedure TestInactSwitchIndex; procedure TestAddIndexInteger; @@ -1056,6 +1057,49 @@ begin end; end; +procedure TTestDBBasics.TestAddCaseInsIndex; +var ds : TBufDataset; + AFieldType : TFieldType; + FList : TStringList; + i : integer; +begin + ds := DBConnector.GetFieldDataset as TBufDataset; + with ds do + begin + + AFieldType:=ftString; + AddIndex('testindex','F'+FieldTypeNames[AfieldType],[],'','F'+FieldTypeNames[AfieldType]); + FList := TStringList.Create; + FList.Sorted:=true; + FList.Duplicates:=dupAccept; + open; + + while not eof do + begin + flist.Add(FieldByName('F'+FieldTypeNames[AfieldType]).AsString); + Next; + end; + + IndexName:='testindex'; + first; + i:=0; + + while not eof do + begin + AssertEquals(flist[i],FieldByName('F'+FieldTypeNames[AfieldType]).AsString); + inc(i); + Next; + end; + + while not bof do + begin + dec(i); + AssertEquals(flist[i],FieldByName('F'+FieldTypeNames[AfieldType]).AsString); + Prior; + end; + end; +end; + procedure TTestDBBasics.TestInactSwitchIndex; // Test if the default-index is properly build when the active index is not // the default-index while opening then dataset