Browse Source

* Patch and testcase from Luiz Americo to fix ExtractFieldName (bug 21777)

git-svn-id: trunk@20882 -
michael 13 years ago
parent
commit
86c8b19336
2 changed files with 51 additions and 12 deletions
  1. 9 12
      packages/fcl-db/src/base/db.pas
  2. 42 0
      packages/fcl-db/tests/testbasics.pas

+ 9 - 12
packages/fcl-db/src/base/db.pas

@@ -2140,20 +2140,17 @@ begin
     DatabaseErrorFmt(Fmt, Args);
 end;
 
-Function ExtractFieldName(Const Fields: String; var Pos: Integer): String;
-
+function ExtractFieldName(const Fields: string; var Pos: Integer): string;
 var
-  i: integer;
+  i: Integer;
+  FieldsLength: Integer;
 begin
-  for i := Pos to Length(Fields) do begin
-    if Fields[i] = ';' then begin
-      Result := Copy(Fields, Pos, i - Pos);
-      Pos := i + 1;
-      Exit;
-    end;
-  end;
-  Result := Copy(Fields, Pos, Length(Fields));
-  Pos := Length(Fields) + 1;
+  i:=Pos;
+  FieldsLength:=Length(Fields);
+  while (i<=FieldsLength) and (Fields[i]<>';') do Inc(i);
+  Result:=Trim(Copy(Fields,Pos,i-Pos));
+  if (i<=FieldsLength) and (Fields[i]=';') then Inc(i);
+  Pos:=i;
 end;
 
 { EUpdateError }

+ 42 - 0
packages/fcl-db/tests/testbasics.pas

@@ -22,6 +22,7 @@ type
     procedure TestInitFielddefsFromFields;
     procedure TestDoubleFieldDef;
     procedure TestFieldDefWithoutDS;
+    procedure TestExtractFieldName;
   end;
 
 implementation
@@ -188,6 +189,47 @@ begin
   FieldDefs.Free;
 end;
 
+
+procedure TTestBasics.TestExtractFieldName;
+var
+  i: Integer;
+  Fields: String;
+  FieldName: String;
+begin
+  Fields := '';
+  i := 1;
+  FieldName := ExtractFieldName(Fields, i);
+  AssertEquals(1, i);
+  AssertEquals('', FieldName);
+
+  Fields := 'test';
+  i := 1;
+  FieldName := ExtractFieldName(Fields, i);
+  AssertEquals(5, i);
+  AssertEquals('test', FieldName);
+
+  Fields := 'test;';
+  i := 1;
+  FieldName := ExtractFieldName(Fields, i);
+  AssertEquals(6, i);
+  AssertEquals('test', FieldName);
+
+  Fields := ' test ';
+  i := 1;
+  FieldName := ExtractFieldName(Fields, i);
+  AssertEquals(7, i);
+  AssertEquals('test', FieldName);
+
+  Fields := 'test;xxx';
+  i := 1;
+  FieldName := ExtractFieldName(Fields, i);
+  AssertEquals(6, i);
+  AssertEquals('test', FieldName);
+  FieldName := ExtractFieldName(Fields, i);
+  AssertEquals(9, i);
+  AssertEquals('xxx', FieldName);
+end;
+
 initialization
   RegisterTest(TTestBasics);
 end.