sync with tdbf svn rev 275

git-svn-id: trunk@6403 -
This commit is contained in:
micha 2007-02-10 21:55:07 +00:00
parent 38dabf82da
commit 258708e6d3
3 changed files with 30 additions and 1508 deletions

File diff suppressed because it is too large Load Diff

View File

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

View File

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