Browse Source

sync with tdbf svn rev 275

git-svn-id: trunk@6403 -
micha 18 years ago
parent
commit
258708e6d3
3 changed files with 30 additions and 450 deletions
  1. 0 432
      fcl/db/dbase/dbf_collate.pas
  2. 3 3
      fcl/db/dbase/dbf_idxfile.pas
  3. 27 15
      fcl/db/dbase/dbf_parser.pas

File diff suppressed because it is too large
+ 0 - 432
fcl/db/dbase/dbf_collate.pas


+ 3 - 3
fcl/db/dbase/dbf_idxfile.pas

@@ -628,12 +628,12 @@ var
 
 procedure IncWordLE(var AVariable: Word; Amount: Integer);
 begin
-  AVariable := SwapWordLE(SwapWordLE(AVariable + Amount));
+  AVariable := SwapWordLE(SwapWordLE(AVariable) + Amount);
 end;
 
 procedure IncIntLE(var AVariable: Integer; Amount: Integer);
 begin
-  AVariable := SwapIntLE(SwapIntLE(AVariable + Amount));
+  AVariable := SwapIntLE(SwapIntLE(AVariable) + Amount);
 end;
 
 //==========================================================
@@ -2106,7 +2106,7 @@ procedure TIndexFile.CalcKeyProperties;
 begin
   // now adjust keylen to align on DWORD boundaries
   PIndexHdr(FIndexHeader)^.KeyRecLen := SwapWordLE((SwapWordLE(
-    PIndexHdr(FIndexHeader)^.KeyLen) + FEntryHeaderSize + 3) and 3);
+    PIndexHdr(FIndexHeader)^.KeyLen) + FEntryHeaderSize + 3) and not 3);
   PIndexHdr(FIndexHeader)^.NumKeys := SwapWordLE((RecordSize - FPageHeaderSize) div 
     SwapWordLE(PIndexHdr(FIndexHeader)^.KeyRecLen));
 end;

+ 27 - 15
fcl/db/dbase/dbf_parser.pas

@@ -85,11 +85,10 @@ type
     FDbfFile: TDbfFile;
     FFieldName: string;
     FExprWord: TExprWord;
-
-    procedure SetExprWord(NewExprWord: TExprWord);
   protected
     function GetFieldVal: Pointer; virtual; abstract;
     function GetFieldType: TExpressionType; virtual; abstract;
+    procedure SetExprWord(NewExprWord: TExprWord); virtual;
 
     property ExprWord: TExprWord read FExprWord write SetExprWord;
   public
@@ -111,7 +110,9 @@ type
 
     function GetFieldVal: Pointer; override;
     function GetFieldType: TExpressionType; override;
+    procedure SetExprWord(NewExprWord: TExprWord); override;
     procedure SetRawStringField(NewRaw: boolean);
+    procedure UpdateExprWord;
   public
     constructor Create(UseFieldDef: TDbfFieldDef; ADbfFile: TDbfFile);
     destructor Destroy; override;
@@ -187,7 +188,7 @@ end;
 
 procedure TFieldVar.SetExprWord(NewExprWord: TExprWord);
 begin
-  FExprWord.FixedLen := FFieldDef.Size;
+  FExprWord := NewExprWord;
 end;
 
 { TStringFieldVar }
@@ -234,18 +235,29 @@ begin
     FFieldVal := Src;
 end;
 
+procedure TStringFieldVar.SetExprWord(NewExprWord: TExprWord);
+begin
+  inherited;
+  UpdateExprWord;
+end;
+
+procedure TStringFieldVar.UpdateExprWord;
+begin
+  if FRawStringField then
+    FExprWord.FixedLen := FieldDef.Size
+  else
+    FExprWord.FixedLen := -1;
+end;
+
 procedure TStringFieldVar.SetRawStringField(NewRaw: boolean);
 begin
   if NewRaw = FRawStringField then exit;
   FRawStringField := NewRaw;
   if NewRaw then
-  begin
-    FExprWord.FixedLen := FieldDef.Size;
-    FreeMem(FFieldVal);
-  end else begin
-    FExprWord.FixedLen := -1;
+    FreeMem(FFieldVal)
+  else
     GetMem(FFieldVal, FieldDef.Size*3+1);
-  end;
+  UpdateExprWord;
 end;
 
 //--TFloatFieldVar-----------------------------------------------------------
@@ -473,35 +485,35 @@ begin
     ftString:
       begin
         TempFieldVar := TStringFieldVar.Create(FieldInfo, TDbfFile(FDbfFile));
-        TempFieldVar.FExprWord := DefineStringVariable(VarName, TempFieldVar.FieldVal);
+        TempFieldVar.ExprWord := DefineStringVariable(VarName, TempFieldVar.FieldVal);
         TStringFieldVar(TempFieldVar).RawStringField := FRawStringFields;
       end;
     ftBoolean:
       begin
         TempFieldVar := TBooleanFieldVar.Create(FieldInfo, TDbfFile(FDbfFile));
-        TempFieldVar.FExprWord := DefineBooleanVariable(VarName, TempFieldVar.FieldVal);
+        TempFieldVar.ExprWord := DefineBooleanVariable(VarName, TempFieldVar.FieldVal);
       end;
     ftFloat:
       begin
         TempFieldVar := TFloatFieldVar.Create(FieldInfo, TDbfFile(FDbfFile));
-        TempFieldVar.FExprWord := DefineFloatVariable(VarName, TempFieldVar.FieldVal);
+        TempFieldVar.ExprWord := DefineFloatVariable(VarName, TempFieldVar.FieldVal);
       end;
     ftAutoInc, ftInteger, ftSmallInt:
       begin
         TempFieldVar := TIntegerFieldVar.Create(FieldInfo, TDbfFile(FDbfFile));
-        TempFieldVar.FExprWord := DefineIntegerVariable(VarName, TempFieldVar.FieldVal);
+        TempFieldVar.ExprWord := DefineIntegerVariable(VarName, TempFieldVar.FieldVal);
       end;
 {$ifdef SUPPORT_INT64}
     ftLargeInt:
       begin
         TempFieldVar := TLargeIntFieldVar.Create(FieldInfo, TDbfFile(FDbfFile));
-        TempFieldVar.FExprWord := DefineLargeIntVariable(VarName, TempFieldVar.FieldVal);
+        TempFieldVar.ExprWord := DefineLargeIntVariable(VarName, TempFieldVar.FieldVal);
       end;
 {$endif}
     ftDate, ftDateTime:
       begin
         TempFieldVar := TDateTimeFieldVar.Create(FieldInfo, TDbfFile(FDbfFile));
-        TempFieldVar.FExprWord := DefineDateTimeVariable(VarName, TempFieldVar.FieldVal);
+        TempFieldVar.ExprWord := DefineDateTimeVariable(VarName, TempFieldVar.FieldVal);
       end;
   else
     raise EDbfError.CreateFmt(STRING_INDEX_BASED_ON_INVALID_FIELD, [VarName]);

Some files were not shown because too many files changed in this diff