* Rest of fcl-db adapted to use TRecordBuffer.

git-svn-id: trunk@19998 -
This commit is contained in:
marco 2012-01-07 21:18:29 +00:00
parent eb2b836b06
commit e328c7c1cb
11 changed files with 290 additions and 283 deletions

View File

@ -1257,6 +1257,7 @@ type
Testing with TRecordBuffer=PByte will turn up typing problems. TRecordBuffer=pansichar is backwards
compatible, even if overriden with "pchar" variants.
}
TRecordBufferBaseType = AnsiChar; // must match TRecordBuffer.
TRecordBuffer = PAnsiChar;
PBufferList = ^TBufferList;
TBufferList = array[0..dsMaxBufferCount - 1] of TRecordBuffer; // Dynamic array in Delphi.

View File

@ -120,7 +120,7 @@ type
FOnMasterChange: TNotifyEvent;
FOnMasterDisable: TNotifyEvent;
function GetFieldsVal: PChar;
function GetFieldsVal: TRecordBuffer;
procedure SetFieldNames(const Value: string);
protected
@ -135,7 +135,7 @@ type
property FieldNames: string read FFieldNames write SetFieldNames;
property ValidExpression: Boolean read FValidExpression write FValidExpression;
property FieldsVal: PChar read GetFieldsVal;
property FieldsVal: TRecordBuffer read GetFieldsVal;
property Parser: TDbfParser read FParser;
property OnMasterChange: TNotifyEvent read FOnMasterChange write FOnMasterChange;
@ -160,8 +160,8 @@ type
FAbsolutePath: string;
FIndexName: string;
FReadOnly: Boolean;
FFilterBuffer: PChar;
FTempBuffer: PChar;
FFilterBuffer: TRecordBuffer;
FTempBuffer: TRecordBuffer;
FEditingRecNo: Integer;
{$ifdef SUPPORT_VARIANTS}
FLocateRecNo: Integer;
@ -221,18 +221,18 @@ type
function ParseIndexName(const AIndexName: string): string;
procedure ParseFilter(const AFilter: string);
function GetDbfFieldDefs: TDbfFieldDefs;
function ReadCurrentRecord(Buffer: PChar; var Acceptable: Boolean): TGetResult;
function ReadCurrentRecord(Buffer: TRecordBuffer; var Acceptable: Boolean): TGetResult;
function SearchKeyBuffer(Buffer: PChar; SearchType: TSearchKeyType): Boolean;
procedure SetRangeBuffer(LowRange: PChar; HighRange: PChar);
protected
{ abstract methods }
function AllocRecordBuffer: PChar; override; {virtual abstract}
procedure ClearCalcFields(Buffer: PChar); override;
procedure FreeRecordBuffer(var Buffer: PChar); override; {virtual abstract}
procedure GetBookmarkData(Buffer: PChar; Data: Pointer); override; {virtual abstract}
function GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; override; {virtual abstract}
function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override; {virtual abstract}
function AllocRecordBuffer: TRecordBuffer; override; {virtual abstract}
procedure ClearCalcFields(Buffer: TRecordBuffer); override;
procedure FreeRecordBuffer(var Buffer: TRecordBuffer); override; {virtual abstract}
procedure GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override; {virtual abstract}
function GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; override; {virtual abstract}
function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override; {virtual abstract}
function GetRecordSize: Word; override; {virtual abstract}
procedure InternalAddRecord(Buffer: Pointer; AAppend: Boolean); override; {virtual abstract}
procedure InternalClose; override; {virtual abstract}
@ -241,7 +241,7 @@ type
procedure InternalGotoBookmark(ABookmark: Pointer); override; {virtual abstract}
procedure InternalHandleException; override; {virtual abstract}
procedure InternalInitFieldDefs; override; {virtual abstract}
procedure InternalInitRecord(Buffer: PChar); override; {virtual abstract}
procedure InternalInitRecord(Buffer: TRecordBuffer); override; {virtual abstract}
procedure InternalLast; override; {virtual abstract}
procedure InternalOpen; override; {virtual abstract}
procedure InternalEdit; override; {virtual}
@ -252,11 +252,11 @@ type
{$endif}
{$endif}
procedure InternalPost; override; {virtual abstract}
procedure InternalSetToRecord(Buffer: PChar); override; {virtual abstract}
procedure InternalSetToRecord(Buffer: TRecordBuffer); override; {virtual abstract}
procedure InitFieldDefs; override;
function IsCursorOpen: Boolean; override; {virtual abstract}
procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); override; {virtual abstract}
procedure SetBookmarkData(Buffer: PChar; Data: Pointer); override; {virtual abstract}
procedure SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag); override; {virtual abstract}
procedure SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override; {virtual abstract}
procedure SetFieldData(Field: TField; Buffer: Pointer);
{$ifdef SUPPORT_OVERLOAD} overload; {$endif} override; {virtual abstract}
@ -338,7 +338,7 @@ type
{$ifdef SUPPORT_DEFAULT_PARAMS}= false{$endif}): Boolean;
procedure SetRangePChar(LowRange: PChar; HighRange: PChar; KeyIsANSI: boolean
{$ifdef SUPPORT_DEFAULT_PARAMS}= false{$endif});
function GetCurrentBuffer: PChar;
function GetCurrentBuffer: TRecordBuffer;
procedure ExtractKey(KeyBuffer: PChar);
procedure UpdateIndexDefs; override;
procedure GetFileNames(Strings: TStrings; Files: TDbfFileNames); {$ifdef SUPPORT_DEFAULT_PARAMS} overload; {$endif}
@ -667,27 +667,27 @@ begin
FMasterLink.Free;
end;
function TDbf.AllocRecordBuffer: PChar; {override virtual abstract from TDataset}
function TDbf.AllocRecordBuffer: TRecordBuffer; {override virtual abstract from TDataset}
begin
GetMem(Result, SizeOf(TDbfRecordHeader)+FDbfFile.RecordSize+CalcFieldsSize+1);
end;
procedure TDbf.FreeRecordBuffer(var Buffer: PChar); {override virtual abstract from TDataset}
procedure TDbf.FreeRecordBuffer(var Buffer: TRecordBuffer); {override virtual abstract from TDataset}
begin
FreeMemAndNil(Pointer(Buffer));
end;
procedure TDbf.GetBookmarkData(Buffer: PChar; Data: Pointer); {override virtual abstract from TDataset}
procedure TDbf.GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); {override virtual abstract from TDataset}
begin
pBookmarkData(Data)^ := pDbfRecord(Buffer)^.BookmarkData;
end;
function TDbf.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; {override virtual abstract from TDataset}
function TDbf.GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; {override virtual abstract from TDataset}
begin
Result := pDbfRecord(Buffer)^.BookmarkFlag;
end;
function TDbf.GetCurrentBuffer: PChar;
function TDbf.GetCurrentBuffer: TRecordBuffer;
begin
case State of
dsFilter: Result := FFilterBuffer;
@ -726,7 +726,7 @@ const
NativeFormat = true;
{$endif}
var
Src: PChar;
Src: TRecordBuffer;
begin
Src := GetCurrentBuffer;
if Src = nil then
@ -799,7 +799,7 @@ begin
OnFilterRecord(Self, Acceptable);
end;
function TDbf.ReadCurrentRecord(Buffer: PChar; var Acceptable: Boolean): TGetResult;
function TDbf.ReadCurrentRecord(Buffer: TRecordBuffer; var Acceptable: Boolean): TGetResult;
var
lPhysicalRecNo: Integer;
pRecord: pDbfRecord;
@ -817,7 +817,7 @@ begin
end;
end;
function TDbf.GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; {override virtual abstract from TDataset}
function TDbf.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; {override virtual abstract from TDataset}
var
pRecord: pDbfRecord;
acceptable: Boolean;
@ -1116,7 +1116,7 @@ begin
end;
end;
procedure TDbf.InternalInitRecord(Buffer: PChar); {override virtual abstract from TDataset}
procedure TDbf.InternalInitRecord(Buffer: TRecordBuffer); {override virtual abstract from TDataset}
var
pRecord: pDbfRecord;
begin
@ -2083,7 +2083,7 @@ end;
{$endif}
procedure TDbf.ClearCalcFields(Buffer: PChar);
procedure TDbf.ClearCalcFields(Buffer: TRecordBuffer);
var
lRealBuffer, lCalcBuffer: PChar;
begin
@ -2092,7 +2092,7 @@ begin
FillChar(lCalcBuffer^, CalcFieldsSize, 0);
end;
procedure TDbf.InternalSetToRecord(Buffer: PChar); {override virtual abstract from TDataset}
procedure TDbf.InternalSetToRecord(Buffer: TRecordBuffer); {override virtual abstract from TDataset}
var
pRecord: pDbfRecord;
begin
@ -2118,12 +2118,12 @@ begin
Result := StoreDefs and (FieldDefs.Count > 0);
end;
procedure TDbf.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); {override virtual abstract from TDataset}
procedure TDbf.SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag); {override virtual abstract from TDataset}
begin
pDbfRecord(Buffer)^.BookmarkFlag := Value;
end;
procedure TDbf.SetBookmarkData(Buffer: PChar; Data: Pointer); {override virtual abstract from TDataset}
procedure TDbf.SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); {override virtual abstract from TDataset}
begin
pDbfRecord(Buffer)^.BookmarkData := pBookmarkData(Data)^;
end;
@ -2616,26 +2616,26 @@ end;
function TDbf.IsDeleted: Boolean;
var
src: PChar;
src: TRecordBuffer;
begin
src := GetCurrentBuffer;
IsDeleted := (src=nil) or (src^ = '*')
IsDeleted := (src=nil) or (AnsiChar(src^) = '*')
end;
procedure TDbf.Undelete;
var
src: PChar;
src: TRecordBuffer;
begin
if State <> dsEdit then
inherited Edit;
// get active buffer
src := GetCurrentBuffer;
if (src <> nil) and (src^ = '*') then
if (src <> nil) and (AnsiChar(src^) = '*') then
begin
// notify indexes record is about to be recalled
FDbfFile.RecordRecalled(FCursor.PhysicalRecNo, src);
// recall record
src^ := ' ';
src^ := TRecordBufferBaseType(' ');
FDbfFile.WriteRecord(FCursor.PhysicalRecNo, src);
end;
end;
@ -2821,19 +2821,22 @@ end;
procedure TDbf.UpdateRange;
var
fieldsVal: PChar;
fieldsVal: TRecordBuffer;
tempBuffer: array[0..300] of char;
begin
fieldsVal := FMasterLink.FieldsVal;
if (TDbf(FMasterLink.DataSet).DbfFile.UseCodePage <> FDbfFile.UseCodePage)
and (FMasterLink.Parser.ResultType = etString) then
begin
FMasterLink.DataSet.Translate(fieldsVal, @tempBuffer[0], false);
FMasterLink.DataSet.Translate(pansichar(fieldsVal), @tempBuffer[0], false);
fieldsVal := @tempBuffer[0];
Translate(fieldsVal, fieldsVal, true);
Translate(pansichar(fieldsVal), pansichar(fieldsVal), true);
end;
fieldsVal := TIndexCursor(FCursor).IndexFile.PrepareKey(fieldsVal, FMasterLink.Parser.ResultType);
SetRangeBuffer(fieldsVal, fieldsVal);
// preparekey, setrangebuffer and updatekeyfrom* are functions which arguments
// are not entirely classified in pchar<>trecordbuffer terms.
// so we typecast for now.
fieldsVal := TRecordBuffer(TIndexCursor(FCursor).IndexFile.PrepareKey((fieldsVal), FMasterLink.Parser.ResultType));
SetRangeBuffer(pansichar(fieldsVal), pansichar(fieldsVal));
end;
procedure TDbf.MasterChanged(Sender: TObject);
@ -3018,9 +3021,9 @@ begin
end;
end;
function TDbfMasterLink.GetFieldsVal: PChar;
function TDbfMasterLink.GetFieldsVal: TRecordBuffer;
begin
Result := FParser.ExtractFromBuffer(@pDbfRecord(TDbf(DataSet).ActiveBuffer)^.DeletedFlag);
Result := TRecordBuffer(FParser.ExtractFromBuffer(@pDbfRecord(TDbf(DataSet).ActiveBuffer)^.DeletedFlag));
end;
////////////////////////////////////////////////////////////////////////////

View File

@ -48,8 +48,8 @@ type
FIndexNames: TStringList;
FIndexFiles: TList;
FDbfVersion: TXBaseVersion;
FPrevBuffer: PChar;
FDefaultBuffer: PChar;
FPrevBuffer: TRecordBuffer;
FDefaultBuffer: TRecordBuffer;
FRecordBufferSize: Integer;
FLockUserLen: DWORD;
FFileCodePage: Cardinal;
@ -76,7 +76,7 @@ type
procedure ConstructFieldDefs;
procedure InitDefaultBuffer;
procedure UpdateNullField(Buffer: Pointer; AFieldDef: TDbfFieldDef; Action: TUpdateNullField);
procedure WriteLockInfo(Buffer: PChar);
procedure WriteLockInfo(Buffer: TRecordBuffer);
public
constructor Create;
@ -97,9 +97,9 @@ type
procedure CloseIndex(AIndexName: string);
procedure RepageIndex(AIndexFile: string);
procedure CompactIndex(AIndexFile: string);
function Insert(Buffer: PChar): integer;
function Insert(Buffer: TRecordBuffer): integer;
procedure WriteHeader; override;
procedure ApplyAutoIncToBuffer(DestBuf: PChar); // dBase7 support. Writeback last next-autoinc value
procedure ApplyAutoIncToBuffer(DestBuf: TRecordBuffer); // dBase7 support. Writeback last next-autoinc value
procedure FastPackTable;
procedure RestructureTable(DbfFieldDefs: TDbfFieldDefs; Pack: Boolean);
procedure Rename(DestFileName: string; NewIndexFileNames: TStrings; DeleteFiles: boolean);
@ -109,13 +109,13 @@ type
function GetFieldDataFromDef(AFieldDef: TDbfFieldDef; DataType: TFieldType;
Src, Dst: Pointer; NativeFormat: boolean): Boolean;
procedure SetFieldData(Column: Integer; DataType: TFieldType; Src,Dst: Pointer; NativeFormat: boolean);
procedure InitRecord(DestBuf: PChar);
procedure InitRecord(DestBuf: TRecordBuffer);
procedure PackIndex(lIndexFile: TIndexFile; AIndexName: string);
procedure RegenerateIndexes;
procedure LockRecord(RecNo: Integer; Buffer: PChar);
procedure UnlockRecord(RecNo: Integer; Buffer: PChar);
procedure RecordDeleted(RecNo: Integer; Buffer: PChar);
procedure RecordRecalled(RecNo: Integer; Buffer: PChar);
procedure LockRecord(RecNo: Integer; Buffer: TRecordBuffer);
procedure UnlockRecord(RecNo: Integer; Buffer: TRecordBuffer);
procedure RecordDeleted(RecNo: Integer; Buffer: TRecordBuffer);
procedure RecordRecalled(RecNo: Integer; Buffer: TRecordBuffer);
property MemoFile: TMemoFile read FMemoFile;
property FieldDefs: TDbfFieldDefs read FFieldDefs;
@ -128,7 +128,7 @@ type
property UseCodePage: Cardinal read FUseCodePage write FUseCodePage;
property FileLangId: Byte read FFileLangId write FFileLangId;
property DbfVersion: TXBaseVersion read FDbfVersion write FDbfVersion;
property PrevBuffer: PChar read FPrevBuffer;
property PrevBuffer: TRecordBuffer read FPrevBuffer;
property ForceClose: Boolean read FForceClose;
property CopyDateTimeAsString: Boolean read FCopyDateTimeAsString write FCopyDateTimeAsString;
property DateTimeHandling: TDateTimeHandling read FDateTimeHandling write FDateTimeHandling;
@ -1133,7 +1133,7 @@ var
OldIndexFiles: TStrings;
IndexName, NewBaseName: string;
I, lRecNo, lFieldNo, lFieldSize, lBlobPageNo, lWRecNo, srcOffset, dstOffset: Integer;
pBuff, pDestBuff: PChar;
pBuff, pDestBuff: TRecordBuffer;
RestructFieldInfo: PRestructFieldInfo;
BlobStream: TMemoryStream;
begin
@ -1264,7 +1264,7 @@ begin
// read record from original dbf
ReadRecord(lRecNo, pBuff);
// copy record?
if (pBuff^ <> '*') or not Pack then
if (ansichar(pBuff^) <> '*') or not Pack then
begin
// if restructure, initialize dest
if DbfFieldDefs <> nil then
@ -1940,14 +1940,14 @@ begin
end;
end;
procedure TDbfFile.InitRecord(DestBuf: PChar);
procedure TDbfFile.InitRecord(DestBuf: TRecordBuffer);
begin
if FDefaultBuffer = nil then
InitDefaultBuffer;
Move(FDefaultBuffer^, DestBuf^, RecordSize);
end;
procedure TDbfFile.ApplyAutoIncToBuffer(DestBuf: PChar);
procedure TDbfFile.ApplyAutoIncToBuffer(DestBuf: TRecordBuffer);
var
TempFieldDef: TDbfFieldDef;
I, NextVal, lAutoIncOffset: {LongWord} Cardinal; {Delphi 3 does not know LongWord?}
@ -2358,7 +2358,7 @@ begin
end;
end;
function TDbfFile.Insert(Buffer: PChar): integer;
function TDbfFile.Insert(Buffer: TRecordBuffer): integer;
type
TErrorContext = (ecNone, ecInsert, ecWriteIndex, ecWriteDbf);
var
@ -2472,7 +2472,7 @@ begin
Result := newRecord;
end;
procedure TDbfFile.WriteLockInfo(Buffer: PChar);
procedure TDbfFile.WriteLockInfo(Buffer: TRecordBuffer);
//
// *) assumes FHasLockField = true
//
@ -2486,19 +2486,19 @@ begin
// set time
DecodeDate(Now(), year, month, day);
DecodeTime(Now(), hour, minute, sec, msec);
Buffer[lockoffset+2] := Char(hour);
Buffer[lockoffset+3] := Char(minute);
Buffer[lockoffset+4] := Char(sec);
Buffer[lockoffset+2] := TRecordBufferBaseType(hour);
Buffer[lockoffset+3] := TRecordBufferBaseType(minute);
Buffer[lockoffset+4] := TRecordBufferBaseType(sec);
// set date
Buffer[lockoffset+5] := Char(year - 1900);
Buffer[lockoffset+6] := Char(month);
Buffer[lockoffset+7] := Char(day);
Buffer[lockoffset+5] := TRecordBufferBaseType(year - 1900);
Buffer[lockoffset+6] := TRecordBufferBaseType(month);
Buffer[lockoffset+7] := TRecordBufferBaseType(day);
// set name
FillChar(Buffer[lockoffset+8], FLockField.Size-8, ' ');
Move(DbfGlobals.UserName[1], Buffer[lockoffset+8], FLockUserLen);
end;
procedure TDbfFile.LockRecord(RecNo: Integer; Buffer: PChar);
procedure TDbfFile.LockRecord(RecNo: Integer; Buffer: TRecordBuffer);
begin
if LockPage(RecNo, false) then
begin
@ -2518,7 +2518,7 @@ begin
raise EDbfError.Create(STRING_RECORD_LOCKED);
end;
procedure TDbfFile.UnlockRecord(RecNo: Integer; Buffer: PChar);
procedure TDbfFile.UnlockRecord(RecNo: Integer; Buffer: TRecordBuffer);
var
I: Integer;
lIndex, lErrorIndex: TIndexFile;
@ -2548,7 +2548,7 @@ begin
UnlockPage(RecNo);
end;
procedure TDbfFile.RecordDeleted(RecNo: Integer; Buffer: PChar);
procedure TDbfFile.RecordDeleted(RecNo: Integer; Buffer: TRecordBuffer);
var
I: Integer;
lIndex: TIndexFile;
@ -2561,7 +2561,7 @@ begin
end;
end;
procedure TDbfFile.RecordRecalled(RecNo: Integer; Buffer: PChar);
procedure TDbfFile.RecordRecalled(RecNo: Integer; Buffer: TRecordBuffer);
var
I: Integer;
lIndex, lErrorIndex: TIndexFile;

View File

@ -7,6 +7,7 @@ interface
uses
SysUtils,
Classes,
db,
dbf_cursor,
dbf_idxfile,
dbf_prsdef,
@ -30,7 +31,7 @@ type
procedure SetPhysicalRecNo(RecNo: Integer); override;
procedure SetSequentialRecNo(RecNo: Integer); override;
procedure VariantStrToBuffer(Key: Variant; ABuffer: PChar);
procedure VariantStrToBuffer(Key: Variant; ABuffer: TRecordBuffer);
public
constructor Create(DbfIndexFile: TIndexFile);
destructor Destroy; override;
@ -40,11 +41,11 @@ type
procedure First; override;
procedure Last; override;
procedure Insert(RecNo: Integer; Buffer: PChar);
procedure Update(RecNo: Integer; PrevBuffer, NewBuffer: PChar);
procedure Insert(RecNo: Integer; Buffer: TRecordBuffer);
procedure Update(RecNo: Integer; PrevBuffer, NewBuffer: TRecordBuffer);
{$ifdef SUPPORT_VARIANTS}
function VariantToBuffer(Key: Variant; ABuffer: PChar): TExpressionType;
function VariantToBuffer(Key: Variant; ABuffer: TRecordBuffer): TExpressionType;
{$endif}
function CheckUserKey(Key: PChar; StringBuf: PChar): PChar;
@ -79,13 +80,13 @@ begin
inherited Destroy;
end;
procedure TIndexCursor.Insert(RecNo: Integer; Buffer: PChar);
procedure TIndexCursor.Insert(RecNo: Integer; Buffer: TRecordBuffer);
begin
TIndexFile(PagedFile).Insert(RecNo,Buffer);
// TODO SET RecNo and Key
end;
procedure TIndexCursor.Update(RecNo: Integer; PrevBuffer, NewBuffer: PChar);
procedure TIndexCursor.Update(RecNo: Integer; PrevBuffer, NewBuffer: TRecordBuffer);
begin
TIndexFile(PagedFile).Update(RecNo, PrevBuffer, NewBuffer);
end;
@ -137,18 +138,18 @@ end;
{$ifdef SUPPORT_VARIANTS}
procedure TIndexCursor.VariantStrToBuffer(Key: Variant; ABuffer: PChar);
procedure TIndexCursor.VariantStrToBuffer(Key: Variant; ABuffer: TRecordBuffer);
var
currLen: Integer;
StrKey: string;
begin
StrKey := Key;
currLen := TranslateString(GetACP, FIndexFile.CodePage, PChar(StrKey), ABuffer, -1);
currLen := TranslateString(GetACP, FIndexFile.CodePage, PAnsiChar(StrKey), PAnsiChar(ABuffer), -1);
// we have null-terminated string, pad with spaces if string too short
FillChar(ABuffer[currLen], TIndexFile(PagedFile).KeyLen-currLen, ' ');
end;
function TIndexCursor.VariantToBuffer(Key: Variant; ABuffer: PChar): TExpressionType;
function TIndexCursor.VariantToBuffer(Key: Variant; ABuffer: TRecordBuffer): TExpressionType;
// assumes ABuffer is large enough ie. at least max key size
begin
if (TIndexFile(PagedFile).KeyType='N') then

View File

@ -285,12 +285,12 @@ type
function CalcTagOffset(AIndex: Integer): Pointer;
function FindKey(AInsert: boolean): Integer;
function InsertKey(Buffer: PChar): Boolean;
procedure DeleteKey(Buffer: PChar);
function InsertKey(Buffer: TRecordBuffer): Boolean;
procedure DeleteKey(Buffer: TRecordBuffer);
function InsertCurrent: Boolean;
procedure DeleteCurrent;
function UpdateCurrent(PrevBuffer, NewBuffer: PChar): Boolean;
function UpdateIndex(Index: Integer; PrevBuffer, NewBuffer: PChar): Boolean;
function UpdateCurrent(PrevBuffer, NewBuffer: TRecordBuffer): Boolean;
function UpdateIndex(Index: Integer; PrevBuffer, NewBuffer: TRecordBuffer): Boolean;
procedure ReadIndexes;
procedure Resync(Relative: boolean);
procedure ResyncRoot;
@ -337,19 +337,19 @@ type
procedure AddNewLevel;
procedure UnlockHeader;
procedure InsertError;
function Insert(RecNo: Integer; Buffer: PChar): Boolean;
function Update(RecNo: Integer; PrevBuffer, NewBuffer: PChar): Boolean;
procedure Delete(RecNo: Integer; Buffer: PChar);
function CheckKeyViolation(Buffer: PChar): Boolean;
procedure RecordDeleted(RecNo: Integer; Buffer: PChar);
function RecordRecalled(RecNo: Integer; Buffer: PChar): Boolean;
function Insert(RecNo: Integer; Buffer:TRecordBuffer ): Boolean;
function Update(RecNo: Integer; PrevBuffer, NewBuffer: TRecordBuffer): Boolean;
procedure Delete(RecNo: Integer; Buffer: TRecordBuffer);
function CheckKeyViolation(Buffer: TRecordBuffer): Boolean;
procedure RecordDeleted(RecNo: Integer; Buffer: TRecordBuffer);
function RecordRecalled(RecNo: Integer; Buffer: TRecordBuffer): Boolean;
procedure DeleteIndex(const AIndexName: string);
procedure RepageFile;
procedure CompactFile;
procedure PrepareRename(NewFileName: string);
procedure CreateIndex(FieldDesc, TagName: string; Options: TIndexOptions);
function ExtractKeyFromBuffer(Buffer: PChar): PChar;
function ExtractKeyFromBuffer(Buffer: TRecordBuffer): PChar;
function SearchKey(Key: PChar; SearchType: TSearchKeyType): Boolean;
function Find(RecNo: Integer; Buffer: PChar): Integer;
function IndexOf(const AIndexName: string): Integer;
@ -371,7 +371,7 @@ type
function MatchKey(UserKey: PChar): Integer;
function CompareKey(Key: PChar): Integer;
function CompareKeys(Key1, Key2: PChar): Integer;
function PrepareKey(Buffer: PChar; ResultType: TExpressionType): PChar;
function PrepareKey(Buffer: TRecordBuffer; ResultType: TExpressionType): PChar;
property KeyLen: Integer read GetKeyLen;
property IndexVersion: TXBaseVersion read FIndexVersion;
@ -1725,7 +1725,7 @@ const
AnsiFuncsToMode: array[boolean] of TStringFieldMode = (smRaw, smAnsi);
var
TempRec: PExpressionRec;
TempBuffer: pchar;
TempBuffer: TRecordBuffer;
I: integer;
hasAnsiFuncs: boolean;
begin
@ -2818,7 +2818,7 @@ begin
UnlockPage(0);
end;
function TIndexFile.Insert(RecNo: Integer; Buffer: PChar): Boolean; {override;}
function TIndexFile.Insert(RecNo: Integer; Buffer: TRecordBuffer): Boolean; {override;}
var
I, curSel, count: Integer;
begin
@ -2856,7 +2856,7 @@ begin
ResyncRange(true);
end;
function TIndexFile.CheckKeyViolation(Buffer: PChar): Boolean;
function TIndexFile.CheckKeyViolation(Buffer: TRecordBuffer): Boolean;
var
I, curSel: Integer;
begin
@ -2886,7 +2886,7 @@ begin
end;
end;
function TIndexFile.PrepareKey(Buffer: PChar; ResultType: TExpressionType): PChar;
function TIndexFile.PrepareKey(Buffer: TRecordBuffer; ResultType: TExpressionType): PChar;
var
FloatRec: TFloatRec;
I, IntSrc, NumDecimals: Integer;
@ -2898,7 +2898,7 @@ var
begin
// need to convert numeric?
Result := Buffer;
Result := PChar(Buffer);
if PIndexHdr(FIndexHeader)^.KeyType in ['N', 'F'] then
begin
if FIndexVersion = xBaseIII then
@ -3000,19 +3000,19 @@ begin
end;
end;
function TIndexFile.ExtractKeyFromBuffer(Buffer: PChar): PChar;
function TIndexFile.ExtractKeyFromBuffer(Buffer: TRecordBuffer): PChar;
begin
// execute expression to get key
Result := PrepareKey(FCurrentParser.ExtractFromBuffer(Buffer), FCurrentParser.ResultType);
Result := PrepareKey(TRecordBuffer(FCurrentParser.ExtractFromBuffer(Buffer)), FCurrentParser.ResultType);
if FCurrentParser.StringFieldMode <> smRaw then
TranslateString(GetACP, FCodePage, Result, Result, KeyLen);
end;
function TIndexFile.InsertKey(Buffer: PChar): boolean;
function TIndexFile.InsertKey(Buffer: TRecordBuffer): boolean;
begin
Result := true;
// ignore deleted records
if (FModifyMode = mmNormal) and (FUniqueMode = iuDistinct) and (Buffer^ = '*') then
if (FModifyMode = mmNormal) and (FUniqueMode = iuDistinct) and (AnsiChar(Buffer^) = '*') then
exit;
// check proper index and modifiability
if FCanEdit and (PIndexHdr(FIndexHeader)^.KeyLen <> 0) then
@ -3077,7 +3077,7 @@ begin
raise EDbfError.Create(errorStr);
end;
procedure TIndexFile.Delete(RecNo: Integer; Buffer: PChar);
procedure TIndexFile.Delete(RecNo: Integer; Buffer: TRecordBuffer);
var
I, curSel: Integer;
begin
@ -3101,7 +3101,7 @@ begin
ResyncRange(true);
end;
procedure TIndexFile.DeleteKey(Buffer: PChar);
procedure TIndexFile.DeleteKey(Buffer: TRecordBuffer);
begin
if FCanEdit and (PIndexHdr(FIndexHeader)^.KeyLen <> 0) then
begin
@ -3131,13 +3131,13 @@ begin
end;
end;
function TIndexFile.UpdateIndex(Index: Integer; PrevBuffer, NewBuffer: PChar): Boolean;
function TIndexFile.UpdateIndex(Index: Integer; PrevBuffer, NewBuffer: TRecordBuffer): Boolean;
begin
SelectIndexVars(Index);
Result := UpdateCurrent(PrevBuffer, NewBuffer);
end;
function TIndexFile.Update(RecNo: Integer; PrevBuffer, NewBuffer: PChar): Boolean;
function TIndexFile.Update(RecNo: Integer; PrevBuffer, NewBuffer: TRecordBuffer): Boolean;
var
I, curSel, count: Integer;
begin
@ -3175,7 +3175,7 @@ begin
ResyncRange(true);
end;
function TIndexFile.UpdateCurrent(PrevBuffer, NewBuffer: PChar): boolean;
function TIndexFile.UpdateCurrent(PrevBuffer, NewBuffer: TRecordBuffer): boolean;
var
InsertKey, DeleteKey: PChar;
TempBuffer: array [0..100] of Char;
@ -3421,7 +3421,7 @@ begin
ResyncRange(true);
end;
procedure TIndexFile.RecordDeleted(RecNo: Integer; Buffer: PChar);
procedure TIndexFile.RecordDeleted(RecNo: Integer; Buffer: TRecordBuffer);
begin
// are we distinct -> then delete record from index
FModifyMode := mmDeleteRecall;
@ -3429,7 +3429,7 @@ begin
FModifyMode := mmNormal;
end;
function TIndexFile.RecordRecalled(RecNo: Integer; Buffer: PChar): Boolean;
function TIndexFile.RecordRecalled(RecNo: Integer; Buffer: TRecordBuffer): Boolean;
begin
// are we distinct -> then reinsert record in index
FModifyMode := mmDeleteRecall;

View File

@ -55,7 +55,7 @@ type
procedure ClearExpressions; override;
procedure ParseExpression(AExpression: string); virtual;
function ExtractFromBuffer(Buffer: PChar): PChar; virtual;
function ExtractFromBuffer(Buffer: TRecordBuffer): PChar; virtual;
property DbfFile: Pointer read FDbfFile write FDbfFile;
property Expression: string read FCurrentExpression;
@ -96,7 +96,7 @@ type
public
constructor Create(UseFieldDef: TDbfFieldDef; ADbfFile: TDbfFile);
procedure Refresh(Buffer: PChar); virtual; abstract;
procedure Refresh(Buffer: TRecordBuffer); virtual; abstract;
property FieldVal: Pointer read GetFieldVal;
property FieldDef: TDbfFieldDef read FFieldDef;
@ -118,7 +118,7 @@ type
public
destructor Destroy; override;
procedure Refresh(Buffer: PChar); override;
procedure Refresh(Buffer: TRecordBuffer); override;
property Mode: TStringFieldMode read FMode write SetMode;
end;
@ -130,7 +130,7 @@ type
function GetFieldVal: Pointer; override;
function GetFieldType: TExpressionType; override;
public
procedure Refresh(Buffer: PChar); override;
procedure Refresh(Buffer: TRecordBuffer); override;
end;
TIntegerFieldVar = class(TFieldVar)
@ -140,7 +140,7 @@ type
function GetFieldVal: Pointer; override;
function GetFieldType: TExpressionType; override;
public
procedure Refresh(Buffer: PChar); override;
procedure Refresh(Buffer: TRecordBuffer); override;
end;
{$ifdef SUPPORT_INT64}
@ -151,7 +151,7 @@ type
function GetFieldVal: Pointer; override;
function GetFieldType: TExpressionType; override;
public
procedure Refresh(Buffer: PChar); override;
procedure Refresh(Buffer: TRecordBuffer); override;
end;
{$endif}
@ -162,7 +162,7 @@ type
protected
function GetFieldVal: Pointer; override;
public
procedure Refresh(Buffer: PChar); override;
procedure Refresh(Buffer: TRecordBuffer); override;
end;
TBooleanFieldVar = class(TFieldVar)
@ -172,7 +172,7 @@ type
protected
function GetFieldVal: Pointer; override;
public
procedure Refresh(Buffer: PChar); override;
procedure Refresh(Buffer: TRecordBuffer); override;
end;
{ TFieldVar }
@ -212,10 +212,10 @@ begin
Result := etString;
end;
procedure TStringFieldVar.Refresh(Buffer: PChar);
procedure TStringFieldVar.Refresh(Buffer: TRecordBuffer);
var
Len: Integer;
Src: PChar;
Src: TRecordBuffer;
begin
Src := Buffer+FieldDef.Offset;
if FMode <> smRaw then
@ -223,12 +223,12 @@ begin
// copy field data
Len := FieldDef.Size;
if FMode = smAnsiTrim then
while (Len >= 1) and (Src[Len-1] = ' ') do Dec(Len);
while (Len >= 1) and (Src[Len-1] = TRecordbufferbasetype(' ')) do Dec(Len);
// translate to ANSI
Len := TranslateString(DbfFile.UseCodePage, GetACP, Src, FFieldVal, Len);
Len := TranslateString(DbfFile.UseCodePage, GetACP, pansichar(Src), FFieldVal, Len);
FFieldVal[Len] := #0;
end else
FFieldVal := Src;
FFieldVal := pansichar(Src);
end;
procedure TStringFieldVar.SetExprWord(NewExprWord: TExprWord);
@ -269,7 +269,7 @@ begin
Result := etFloat;
end;
procedure TFloatFieldVar.Refresh(Buffer: PChar);
procedure TFloatFieldVar.Refresh(Buffer: TRecordBuffer);
begin
// database width is default 64-bit double
if not FDbfFile.GetFieldDataFromDef(FieldDef, FieldDef.FieldType, Buffer, @FFieldVal, false) then
@ -287,7 +287,7 @@ begin
Result := etInteger;
end;
procedure TIntegerFieldVar.Refresh(Buffer: PChar);
procedure TIntegerFieldVar.Refresh(Buffer: TRecordBuffer);
begin
FFieldVal := 0;
FDbfFile.GetFieldDataFromDef(FieldDef, FieldDef.FieldType, Buffer, @FFieldVal, false);
@ -306,7 +306,7 @@ begin
Result := etLargeInt;
end;
procedure TLargeIntFieldVar.Refresh(Buffer: PChar);
procedure TLargeIntFieldVar.Refresh(Buffer: TRecordBuffer);
begin
if not FDbfFile.GetFieldDataFromDef(FieldDef, FieldDef.FieldType, Buffer, @FFieldVal, false) then
FFieldVal := 0;
@ -325,7 +325,7 @@ begin
Result := etDateTime;
end;
procedure TDateTimeFieldVar.Refresh(Buffer: PChar);
procedure TDateTimeFieldVar.Refresh(Buffer: TRecordBuffer);
begin
if not FDbfFile.GetFieldDataFromDef(FieldDef, ftDateTime, Buffer, @FFieldVal, false) then
FFieldVal.DateTime := 0.0;
@ -342,7 +342,7 @@ begin
Result := etBoolean;
end;
procedure TBooleanFieldVar.Refresh(Buffer: PChar);
procedure TBooleanFieldVar.Refresh(Buffer: TRecordBuffer);
var
lFieldVal: word;
begin
@ -575,7 +575,7 @@ begin
FCurrentExpression := AExpression;
end;
function TDbfParser.ExtractFromBuffer(Buffer: PChar): PChar;
function TDbfParser.ExtractFromBuffer(Buffer: TRecordBuffer): PChar;
var
I: Integer;
begin

View File

@ -76,12 +76,12 @@ type
procedure SetRows(AValue: TJSONArray);
protected
// dataset virtual methods
function AllocRecordBuffer: PChar; override;
procedure FreeRecordBuffer(var Buffer: PChar); override;
procedure InternalInitRecord(Buffer: PChar); override;
procedure GetBookmarkData(Buffer: PChar; Data: Pointer); override;
function GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; override;
function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
function AllocRecordBuffer: TRecordBuffer; override;
procedure FreeRecordBuffer(var Buffer: TRecordBuffer); override;
procedure InternalInitRecord(Buffer: TRecordBuffer); override;
procedure GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
function GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; override;
function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
function GetRecordSize: Word; override;
procedure InternalClose; override;
procedure InternalDelete; override;
@ -94,11 +94,11 @@ type
procedure InternalEdit; override;
procedure InternalCancel; override;
procedure InternalInitFieldDefs; override;
procedure InternalSetToRecord(Buffer: PChar); override;
procedure InternalSetToRecord(Buffer: TRecordBuffer); override;
function GetFieldClass(FieldType: TFieldType): TFieldClass; override;
function IsCursorOpen: Boolean; override;
procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); override;
procedure SetBookmarkData(Buffer: PChar; Data: Pointer); override;
procedure SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag); override;
procedure SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
function GetFieldData(Field: TField; Buffer: Pointer; NativeFormat : Boolean): Boolean; override;
procedure SetFieldData(Field: TField; Buffer: Pointer; NativeFormat : Boolean); override;
function GetRecordCount: Integer; override;
@ -319,27 +319,28 @@ begin
FRows:=AValue;
end;
function TBaseJSONDataSet.AllocRecordBuffer: PChar;
function TBaseJSONDataSet.AllocRecordBuffer: TRecordBuffer;
begin
Result := StrAlloc(fRecordSize);
Result := TRecordBuffer(StrAlloc(fRecordSize));
end;
procedure TBaseJSONDataSet.InternalInitRecord(Buffer: PChar);
// the next two are particularly ugly.
procedure TBaseJSONDataSet.InternalInitRecord(Buffer: TRecordBuffer);
begin
FillChar(Buffer^, FRecordSize, 0);
end;
procedure TBaseJSONDataSet.FreeRecordBuffer (var Buffer: PChar);
procedure TBaseJSONDataSet.FreeRecordBuffer (var Buffer: TRecordBuffer);
begin
StrDispose(Buffer);
StrDispose(pansichar(Buffer));
end;
procedure TBaseJSONDataSet.GetBookmarkData(Buffer: PChar; Data: Pointer);
procedure TBaseJSONDataSet.GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
begin
PInteger(Data)^ := PRecInfo(Buffer)^.Bookmark;
end;
function TBaseJSONDataSet.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
function TBaseJSONDataSet.GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag;
begin
Result := PRecInfo(Buffer)^.BookmarkFlag;
end;
@ -706,7 +707,7 @@ begin
end;
end;
function TBaseJSONDataSet.GetRecord(Buffer: PChar; GetMode: TGetMode;
function TBaseJSONDataSet.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode;
DoCheck: Boolean): TGetResult;
begin
Result := grOK; // default
@ -869,7 +870,7 @@ begin
FEditRow:=Nil;
end;
procedure TBaseJSONDataSet.InternalSetToRecord(Buffer: PChar);
procedure TBaseJSONDataSet.InternalSetToRecord(Buffer: TRecordBuffer);
begin
FCurrent := PRecInfo(Buffer)^.Index;
end;
@ -890,7 +891,7 @@ begin
Result := Assigned(FDefaultList);
end;
procedure TBaseJSONDataSet.SetBookmarkData(Buffer: PChar; Data: Pointer);
procedure TBaseJSONDataSet.SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
begin
PRecInfo(Buffer)^.Bookmark := PInteger(Data)^;
end;
@ -1074,7 +1075,7 @@ begin
// Writeln('Field data is set : ',FEditRow.AsJSON);
end;
procedure TBaseJSONDataSet.SetBookmarkFlag(Buffer: PChar;
procedure TBaseJSONDataSet.SetBookmarkFlag(Buffer: TRecordBuffer;
Value: TBookmarkFlag);
begin
PRecInfo(Buffer)^.BookmarkFlag := Value;

View File

@ -66,29 +66,29 @@ type
FCurrRecNo: integer;
FIsOpen: boolean;
FTableIsCreated: boolean;
FFilterBuffer: PChar;
FFilterBuffer: TRecordBuffer;
ffieldoffsets: PInteger;
ffieldsizes: PInteger;
function GetCharPointer(p:PChar; Pos:Integer):PChar;
function GetRecordBufferPointer(p:TRecordBuffer; Pos:Integer):TRecordBuffer;
function GetIntegerPointer(p:PInteger; Pos:Integer):PInteger;
procedure calcrecordlayout;
function MDSGetRecordOffset(ARecNo: integer): longint;
function MDSGetFieldOffset(FieldNo: integer): integer;
function MDSGetBufferSize(FieldNo: integer): integer;
function MDSGetActiveBuffer(var Buffer: PChar): Boolean;
procedure MDSReadRecord(Buffer:PChar;ARecNo:Integer);
procedure MDSWriteRecord(Buffer:PChar;ARecNo:Integer);
procedure MDSAppendRecord(Buffer:PChar);
function MDSFilterRecord(Buffer: PChar): Boolean;
function MDSGetActiveBuffer(var Buffer: TRecordBuffer): Boolean;
procedure MDSReadRecord(Buffer:TRecordBuffer;ARecNo:Integer);
procedure MDSWriteRecord(Buffer:TRecordBuffer;ARecNo:Integer);
procedure MDSAppendRecord(Buffer:TRecordBuffer);
function MDSFilterRecord(Buffer:TRecordBuffer): Boolean;
protected
// Mandatory
function AllocRecordBuffer: PChar; override;
procedure FreeRecordBuffer(var Buffer: PChar); override;
procedure GetBookmarkData(Buffer: PChar; Data: Pointer); override;
function GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; override;
function AllocRecordBuffer: TRecordBuffer; override;
procedure FreeRecordBuffer(var Buffer: TRecordBuffer); override;
procedure GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
function GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; override;
function GetFieldData(Field: TField; Buffer: Pointer): Boolean; override;
function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
function GetRecordSize: Word; override;
procedure InternalAddRecord(Buffer: Pointer; DoAppend: Boolean); override;
procedure InternalClose; override;
@ -96,14 +96,14 @@ type
procedure InternalFirst; override;
procedure InternalGotoBookmark(ABookmark: Pointer); override;
procedure InternalInitFieldDefs; override;
procedure InternalInitRecord(Buffer: PChar); override;
procedure InternalInitRecord(Buffer: TRecordBuffer); override;
procedure InternalLast; override;
procedure InternalOpen; override;
procedure InternalPost; override;
procedure InternalSetToRecord(Buffer: PChar); override;
procedure InternalSetToRecord(Buffer: TRecordBuffer); override;
function IsCursorOpen: Boolean; override;
procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); override;
procedure SetBookmarkData(Buffer: PChar; Data: Pointer); override;
procedure SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag); override;
procedure SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
procedure SetFieldData(Field: TField; Buffer: Pointer); override;
// Optional.
@ -328,7 +328,7 @@ begin
{$ENDIF}
end;
function TMemDataset.MDSGetActiveBuffer(var Buffer: PChar): Boolean;
function TMemDataset.MDSGetActiveBuffer(var Buffer: TRecordBuffer): Boolean;
begin
case State of
@ -348,20 +348,20 @@ begin
Result:=(Buffer<>nil);
end;
procedure TMemDataset.MDSReadRecord(Buffer:PChar;ARecNo:Integer); //Reads a Rec from Stream in Buffer
procedure TMemDataset.MDSReadRecord(Buffer:TRecordBuffer;ARecNo:Integer); //Reads a Rec from Stream in Buffer
begin
FStream.Position:=MDSGetRecordOffset(ARecNo);
FStream.ReadBuffer(Buffer^, FRecSize);
end;
procedure TMemDataset.MDSWriteRecord(Buffer:PChar;ARecNo:Integer); //Writes a Rec from Buffer to Stream
procedure TMemDataset.MDSWriteRecord(Buffer:TRecordBuffer;ARecNo:Integer); //Writes a Rec from Buffer to Stream
begin
FStream.Position:=MDSGetRecordOffset(ARecNo);
FStream.WriteBuffer(Buffer^, FRecSize);
FFileModified:=True;
end;
procedure TMemDataset.MDSAppendRecord(Buffer:PChar); //Appends a Rec (from Buffer) to Stream
procedure TMemDataset.MDSAppendRecord(Buffer:TRecordBuffer); //Appends a Rec (from Buffer) to Stream
begin
FStream.Position:=MDSGetRecordOffset(FRecCount);
FStream.WriteBuffer(Buffer^, FRecSize);
@ -369,17 +369,17 @@ begin
end;
//Abstract Overrides
function TMemDataset.AllocRecordBuffer: PChar;
function TMemDataset.AllocRecordBuffer: TRecordBuffer;
begin
GetMem(Result,FRecBufferSize);
end;
procedure TMemDataset.FreeRecordBuffer (var Buffer: PChar);
procedure TMemDataset.FreeRecordBuffer (var Buffer: TRecordBuffer);
begin
FreeMem(Buffer);
end;
procedure TMemDataset.InternalInitRecord(Buffer: PChar);
procedure TMemDataset.InternalInitRecord(Buffer: TRecordBuffer);
var
I : integer;
@ -663,7 +663,7 @@ begin
Result:=FIsOpen;
end;
function TMemDataset.GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
function TMemDataset.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
var
Accepted: Boolean;
@ -709,7 +709,7 @@ end;
function TMemDataset.GetFieldData(Field: TField; Buffer: Pointer): Boolean;
var
SrcBuffer: PChar;
SrcBuffer: TRecordBuffer;
I: integer;
begin
I:= Field.FieldNo - 1;
@ -717,13 +717,13 @@ begin
not getfieldisnull(pointer(srcbuffer),I);
if result and (buffer <> nil) then
begin
Move(getcharpointer(SrcBuffer,getintegerpointer(ffieldoffsets,I)^)^, Buffer^,GetIntegerPointer(FFieldSizes, I)^);
Move(GetRecordBufferPointer((SrcBuffer),getintegerpointer(ffieldoffsets,I)^)^, Buffer^,GetIntegerPointer(FFieldSizes, I)^);
end;
end;
procedure TMemDataset.SetFieldData(Field: TField; Buffer: Pointer);
var
DestBuffer: PChar;
DestBuffer: TRecordBuffer;
I,J: integer;
begin
@ -740,7 +740,7 @@ begin
J:=GetIntegerPointer(FFieldSizes, I)^;
if Field.DataType=ftString then
Dec(J); // Do not move terminating 0, which is in the size.
Move(Buffer^,GetCharPointer(DestBuffer, getIntegerPointer(FFieldOffsets, I)^)^,J);
Move(Buffer^,GetRecordBufferPointer((DestBuffer), getIntegerPointer(FFieldOffsets, I)^)^,J);
dataevent(defieldchange,ptrint(field));
end;
end;
@ -765,7 +765,7 @@ begin
RaiseError(SErrBookMarkNotFound,[ReqBookmark]);
end;
procedure TMemDataset.InternalSetToRecord(Buffer: PChar);
procedure TMemDataset.InternalSetToRecord(Buffer: TRecordBuffer);
var
ReqBookmark: integer;
@ -775,26 +775,26 @@ begin
InternalGotoBookmark (@ReqBookmark);
end;
function TMemDataset.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
function TMemDataset.GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag;
begin
Result:=PRecInfo(Buffer+FRecInfoOffset)^.BookmarkFlag;
end;
procedure TMemDataset.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag);
procedure TMemDataset.SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag);
begin
PRecInfo(Buffer+FRecInfoOffset)^.BookmarkFlag := Value;
end;
procedure TMemDataset.GetBookmarkData(Buffer: PChar; Data: Pointer);
procedure TMemDataset.GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
begin
if Data<>nil then
PInteger(Data)^:=PRecInfo(Buffer+FRecInfoOffset)^.Bookmark;
end;
procedure TMemDataset.SetBookmarkData(Buffer: PChar; Data: Pointer);
procedure TMemDataset.SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
begin
if Data<>nil then
@ -803,7 +803,7 @@ begin
PRecInfo(Buffer+FRecInfoOffset)^.Bookmark:=0;
end;
function TMemDataset.MDSFilterRecord(Buffer: PChar): Boolean;
function TMemDataset.MDSFilterRecord(Buffer: TRecordBuffer): Boolean;
var
SaveState: TDatasetState;
@ -1007,7 +1007,7 @@ begin
end;
end;
function TMemDataset.GetCharPointer(p:PChar; Pos:Integer):PChar;
function TMemDataset.GetRecordBufferPointer(p:TRecordBuffer; Pos:Integer):TRecordBuffer;
begin
Result:=p;
inc(Result, Pos);

View File

@ -43,7 +43,7 @@ type
FPXLibrary : String;
FCurrRecNo : Integer;
FDoc : PPX_Doc;
FFilterBuffer : PChar;
FFilterBuffer : TRecordBuffer;
FOffsets : PInteger;
FTableName : String;
FInputEncoding : String;
@ -54,8 +54,8 @@ type
function GetTargetEncoding: String;
procedure OpenBlobFile;
procedure PXAppendRecord(Buffer: Pointer);
function PXFilterRecord(Buffer: PChar): Boolean;
function PXGetActiveBuffer(var Buffer: PChar): Boolean;
function PXFilterRecord(Buffer: TRecordBuffer): Boolean;
function PXGetActiveBuffer(var Buffer: TRecordBuffer): Boolean;
procedure RaiseError(Fmt: String; Args: array of const);
procedure SetBlobFileName(const AValue: String);
procedure SetFileName(const AValue: String);
@ -70,12 +70,12 @@ type
procedure SetFiltered(Value: Boolean); override; {virtual;}
procedure ParseFilter(const AFilter: string);
function AllocRecordBuffer: PChar; override;
procedure FreeRecordBuffer(var Buffer: PChar); override;
procedure GetBookmarkData(Buffer: PChar; Data: Pointer); override;
function GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; override;
function AllocRecordBuffer: TRecordBuffer; override;
procedure FreeRecordBuffer(var Buffer: TRecordBuffer); override;
procedure GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
function GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; override;
function GetFieldData(Field: TField; Buffer: Pointer): Boolean; override;
function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
function GetRecordSize: Word; override;
procedure InternalAddRecord(Buffer: Pointer; DoAppend: Boolean); override;
procedure InternalClose; override;
@ -83,14 +83,14 @@ type
procedure InternalFirst; override;
procedure InternalGotoBookmark(ABookmark: Pointer); override;
procedure InternalInitFieldDefs; override;
procedure InternalInitRecord(Buffer: PChar); override;
procedure InternalInitRecord(Buffer: TRecordBuffer); override;
procedure InternalLast; override;
procedure InternalOpen; override;
procedure InternalPost; override;
procedure InternalSetToRecord(Buffer: PChar); override;
procedure InternalSetToRecord(Buffer: TRecordBuffer); override;
function IsCursorOpen: Boolean; override;
procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); override;
procedure SetBookmarkData(Buffer: PChar; Data: Pointer); override;
procedure SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag); override;
procedure SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
procedure SetFieldData(Field: TField; Buffer: Pointer); override;
procedure DataConvert(aField: TField; aSource, aDest: Pointer; aToNative: Boolean); override;
function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override;
@ -276,7 +276,7 @@ begin
FBlobFileName:=AValue;
end;
function TParadox.PXFilterRecord(Buffer: PChar): Boolean;
function TParadox.PXFilterRecord(Buffer: TRecordBuffer): Boolean;
var
SaveState: TDatasetState;
@ -299,20 +299,20 @@ end;
{
procedure TParadox.MDSReadRecord(Buffer:PChar;ARecNo:Integer); //Reads a Rec from Stream in Buffer
procedure TParadox.MDSReadRecord(Buffer:TRecordBuffer;ARecNo:Integer); //Reads a Rec from Stream in Buffer
begin
FStream.Position:=MDSGetRecordOffset(ARecNo);
FStream.ReadBuffer(Buffer^, FRecSize);
end;
procedure TParadox.MDSWriteRecord(Buffer:PChar;ARecNo:Integer); //Writes a Rec from Buffer to Stream
procedure TParadox.MDSWriteRecord(Buffer:TRecordBuffer;ARecNo:Integer); //Writes a Rec from Buffer to Stream
begin
FStream.Position:=MDSGetRecordOffset(ARecNo);
FStream.WriteBuffer(Buffer^, FRecSize);
FFileModified:=True;
end;
procedure TParadox.MDSAppendRecord(Buffer:PChar); //Appends a Rec (from Buffer) to Stream
procedure TParadox.MDSAppendRecord(Buffer:TRecordBuffer); //Appends a Rec (from Buffer) to Stream
begin
FStream.Position:=MDSGetRecordOffset(FRecCount);
FStream.WriteBuffer(Buffer^, FRecSize);
@ -320,7 +320,7 @@ begin
end;
}
function TParadox.PXGetActiveBuffer(var Buffer: PChar): Boolean;
function TParadox.PXGetActiveBuffer(var Buffer: TRecordBuffer): Boolean;
begin
case State of
@ -390,18 +390,18 @@ end;
//Abstract Overrides
function TParadox.AllocRecordBuffer: PChar;
function TParadox.AllocRecordBuffer: TRecordBuffer;
begin
Result:=Nil;
GetMem(Result,SizeOf(TPXRecInfo)+GetRecordSize);
end;
procedure TParadox.FreeRecordBuffer (var Buffer: PChar);
procedure TParadox.FreeRecordBuffer (var Buffer: TRecordBuffer);
begin
FreeMem(Buffer);
end;
procedure TParadox.InternalInitRecord(Buffer: PChar);
procedure TParadox.InternalInitRecord(Buffer: TRecordBuffer);
begin
fillchar((Buffer+DataOffSet)^,GetRecordSize,0);
@ -579,7 +579,7 @@ begin
if ((State<>dsEdit) and (State<>dsInsert)) then
Exit;
if (State=dsEdit) then
PX_put_recordn(FDoc,ActiveBuffer, FCurrRecNo)
PX_put_recordn(FDoc,pansichar(ActiveBuffer), FCurrRecNo)
else
InternalAddRecord(ActiveBuffer,True);
end;
@ -590,7 +590,7 @@ begin
Result:=(FDoc<>Nil);
end;
function TParadox.GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
function TParadox.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
var
Accepted: Boolean;
@ -621,7 +621,7 @@ begin
end;
if result=grOK then
begin
PX_get_record(Doc,FCurrRecNo,Buffer+DataOffset);
PX_get_record(Doc,FCurrRecNo,pansichar(Buffer+DataOffset));
PPXRecInfo(Buffer)^.Bookmark:=FCurrRecNo;
PPXRecInfo(Buffer)^.BookmarkFlag:=bfCurrent;
if (Filtered) then
@ -637,7 +637,7 @@ end;
function TParadox.GetFieldData(Field: TField; Buffer: Pointer): Boolean;
var
Buf : PChar;
Buf : TRecordbuffer;
No,pft,flen : integer;
pxf : PPx_field;
Value : Pchar;
@ -660,7 +660,7 @@ begin
Case pft of
pxfAlpha:
begin
Result:=PX_get_data_alpha(FDoc,Buf,flen,@value)>0;
Result:=PX_get_data_alpha(FDoc,pansichar(Buf),flen,@value)>0;
If result then
begin
Move(Value^,Buffer^,flen);
@ -671,7 +671,7 @@ begin
end;
pxfDate:
begin
Result:=PX_get_data_long(FDoc,Buf,flen,@longv)>0;
Result:=PX_get_data_long(FDoc,pansichar(Buf),flen,@longv)>0;
If Result then
begin
// 1721425 is the number of the days between the start of the
@ -683,33 +683,33 @@ begin
end;
pxfShort:
begin
Result:=PX_get_data_short(FDoc,Buf, flen, @D)>0;
Result:=PX_get_data_short(FDoc,pansichar(Buf), flen, @D)>0;
If result then
PSmallInt(Buffer)^:=D;
end;
pxfAutoInc,
pxfLong:
begin
Result:=(PX_get_data_long(FDoc,buf,flen,@longv)>0);
Result:=(PX_get_data_long(FDoc,pansichar(buf),flen,@longv)>0);
If Result then
PInteger(Buffer)^:=Longv;
end;
pxfCurrency,
pxfNumber:
begin
Result:=(PX_get_data_double(FDoc,Buf,Flen,@R)>0);
Result:=(PX_get_data_double(FDoc,pansichar(Buf),Flen,@R)>0);
If Result then
PDouble(Buffer)^:=R;
end;
pxfLogical:
begin
Result:=(PX_get_data_byte(FDoc,Buf,flen,@C)>0);
Result:=(PX_get_data_byte(FDoc,pansichar(Buf),flen,@C)>0);
If result then
PWordBool(Buffer)^:=(C<>#0);
end;
pxfBytes:
begin
Result:=PX_get_data_bytes(FDoc,Buf,FLen,@Value)>0;
Result:=PX_get_data_bytes(FDoc,pansichar(Buf),FLen,@Value)>0;
If Result then
begin
Move(Value^,Buffer^,FLen);
@ -727,13 +727,13 @@ begin
end;
pxfTime:
begin
Result:=(PX_get_data_long(FDoc,Buf,flen,@longv)>0);
Result:=(PX_get_data_long(FDoc,pansichar(Buf),flen,@longv)>0);
If result then
PDateTime(Buffer)^:=longv/MSecsPerDay;
end;
pxfTimestamp:
begin
Result:=(PX_get_data_double(FDoc,buf,flen,@R)>0);
Result:=(PX_get_data_double(FDoc,pansichar(buf),flen,@R)>0);
if Result then
begin
R:=R/1000.0;
@ -761,7 +761,7 @@ end;
procedure TParadox.SetFieldData(Field: TField; Buffer: Pointer);
var
DestBuffer: PChar;
DestBuffer: TRecordBuffer;
I: integer;
begin
@ -848,7 +848,7 @@ begin
RaiseError(SErrBookMarkNotFound,[ReqBookmark]);
end;
procedure TParadox.InternalSetToRecord(Buffer: PChar);
procedure TParadox.InternalSetToRecord(Buffer: TRecordBuffer);
var
ReqBookmark: integer;
@ -858,26 +858,26 @@ begin
InternalGotoBookmark (@ReqBookmark);
end;
function TParadox.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
function TParadox.GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag;
begin
Result:=PPXRecInfo(Buffer)^.BookmarkFlag;
end;
procedure TParadox.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag);
procedure TParadox.SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag);
begin
PPXRecInfo(Buffer)^.BookmarkFlag := Value;
end;
procedure TParadox.GetBookmarkData(Buffer: PChar; Data: Pointer);
procedure TParadox.GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
begin
if Data<>nil then
PInteger(Data)^:=PPXRecInfo(Buffer)^.Bookmark;
end;
procedure TParadox.SetBookmarkData(Buffer: PChar; Data: Pointer);
procedure TParadox.SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
begin
if Data<>nil then

View File

@ -144,7 +144,7 @@ type
private
FSchema :TStringList;
FFileName :TFileName;
FFilterBuffer :PChar;
FFilterBuffer :TRecordBuffer;
FFileMustExist :Boolean;
FReadOnly :Boolean;
FLoadfromStream :Boolean;
@ -156,8 +156,8 @@ type
procedure SetReadOnly(Value : Boolean);
procedure RemoveWhiteLines(List : TStrings; IsFileRecord : Boolean);
procedure LoadFieldScheme(List : TStrings; MaxSize : Integer);
function GetActiveRecBuf(var RecBuf: PChar): Boolean;
procedure SetFieldPos(var Buffer : PChar; FieldNo : Integer);
function GetActiveRecBuf(var RecBuf: TRecordBuffer): Boolean;
procedure SetFieldPos(var Buffer : TRecordBuffer; FieldNo : Integer);
protected
FData :TStringlist;
FCurRec :Integer;
@ -170,8 +170,8 @@ type
FDefaultRecordLength:Cardinal;
FDataOffset : Integer;
protected
function AllocRecordBuffer: PChar; override;
procedure FreeRecordBuffer(var Buffer: PChar); override;
function AllocRecordBuffer: TRecordBuffer; override;
procedure FreeRecordBuffer(var Buffer: TRecordBuffer); override;
procedure InternalAddRecord(Buffer: Pointer; DoAppend: Boolean); override;
procedure InternalClose; override;
procedure InternalDelete; override;
@ -179,28 +179,28 @@ type
procedure InternalGotoBookmark(ABookmark: Pointer); override;
procedure InternalHandleException; override;
procedure InternalInitFieldDefs; override;
procedure InternalInitRecord(Buffer: PChar); override;
procedure InternalInitRecord(Buffer: TRecordBuffer); override;
procedure InternalLast; override;
procedure InternalOpen; override;
procedure InternalPost; override;
procedure InternalEdit; override;
procedure InternalSetToRecord(Buffer: PChar); override;
procedure InternalSetToRecord(Buffer: TRecordBuffer); override;
function IsCursorOpen: Boolean; override;
procedure GetBookmarkData(Buffer: PChar; Data: Pointer); override;
function GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; override;
function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
procedure GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
function GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; override;
function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
function GetRecordSize: Word; override;
procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); override;
procedure SetBookmarkData(Buffer: PChar; Data: Pointer); override;
procedure SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag); override;
procedure SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
procedure SetFieldData(Field: TField; Buffer: Pointer); override;
procedure ClearCalcFields(Buffer: PChar); override;
procedure ClearCalcFields(Buffer: TRecordBuffer); override;
function GetRecordCount: Integer; override;
function GetRecNo: Integer; override;
procedure SetRecNo(Value: Integer); override;
function GetCanModify: boolean; override;
function TxtGetRecord(Buffer : PChar; GetMode: TGetMode): TGetResult;
function TxtGetRecord(Buffer : TRecordBuffer; GetMode: TGetMode): TGetResult;
function RecordFilter(RecBuf: Pointer; ARecNo: Integer): Boolean;
function BufToStore(Buffer: PChar): String; virtual;
function BufToStore(Buffer: TRecordBuffer): String; virtual;
function StoreToBuf(Source: String): String; virtual;
public
property DefaultRecordLength: Cardinal read FDefaultRecordLength
@ -262,9 +262,9 @@ type
procedure SetDelimiter(Value : Char);
protected
procedure InternalInitFieldDefs; override;
function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean)
function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean)
: TGetResult; override;
function BufToStore(Buffer: PChar): String; override;
function BufToStore(Buffer: TRecordBuffer): String; override;
function StoreToBuf(Source: String): String; override;
public
constructor Create(AOwner: TComponent); override;
@ -447,7 +447,7 @@ begin
end;
// Record Functions
function TFixedFormatDataSet.AllocRecordBuffer: PChar;
function TFixedFormatDataSet.AllocRecordBuffer: TRecordBuffer;
begin
if FRecBufSize > 0 then
Result := AllocMem(FRecBufSize)
@ -455,23 +455,23 @@ begin
Result := nil;
end;
procedure TFixedFormatDataSet.FreeRecordBuffer(var Buffer: PChar);
procedure TFixedFormatDataSet.FreeRecordBuffer(var Buffer: TRecordBuffer);
begin
if Buffer <> nil then
FreeMem(Buffer);
end;
procedure TFixedFormatDataSet.InternalInitRecord(Buffer: PChar);
procedure TFixedFormatDataSet.InternalInitRecord(Buffer: TRecordBuffer);
begin
FillChar(Buffer[0], FRecordSize, 0);
end;
procedure TFixedFormatDataSet.ClearCalcFields(Buffer: PChar);
procedure TFixedFormatDataSet.ClearCalcFields(Buffer: TRecordBuffer);
begin
FillChar(Buffer[RecordSize], CalcFieldsSize, 0);
end;
function TFixedFormatDataSet.GetRecord(Buffer: PChar; GetMode: TGetMode;
function TFixedFormatDataSet.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode;
DoCheck: Boolean): TGetResult;
begin
if (FData.Count < (1+FDataOffset)) then
@ -500,7 +500,7 @@ end;
function TFixedFormatDataSet.GetRecNo: Longint;
var
BufPtr: PChar;
BufPtr: TRecordBuffer;
begin
Result := -1;
if GetActiveRecBuf(BufPtr) then
@ -524,7 +524,7 @@ begin
Result := FRecordSize;
end;
function TFixedFormatDataSet.GetActiveRecBuf(var RecBuf: PChar): Boolean;
function TFixedFormatDataSet.GetActiveRecBuf(var RecBuf: TRecordBuffer): Boolean;
begin
case State of
dsBrowse: if IsEmpty then RecBuf := nil else RecBuf := ActiveBuffer;
@ -537,7 +537,7 @@ begin
Result := RecBuf <> nil;
end;
function TFixedFormatDataSet.TxtGetRecord(Buffer : PChar; GetMode: TGetMode): TGetResult;
function TFixedFormatDataSet.TxtGetRecord(Buffer : TRecordBuffer; GetMode: TGetMode): TGetResult;
var
Accepted : Boolean;
begin
@ -624,15 +624,15 @@ end;
function TFixedFormatDataSet.GetFieldData(Field: TField; Buffer: Pointer): Boolean;
var
TempPos, RecBuf: PChar;
TempPos, recbuf : PChar;
begin
Result := GetActiveRecBuf(RecBuf);
Result := GetActiveRecBuf(TRecordBuffer(RecBuf));
if Result then
begin
if Field.FieldNo > 0 then
begin
TempPos := RecBuf;
SetFieldPos(RecBuf, Field.FieldNo);
SetFieldPos(TRecordBuffer(RecBuf), Field.FieldNo);
Result := (RecBuf < StrEnd(TempPos));
end
else
@ -661,12 +661,13 @@ end;
procedure TFixedFormatDataSet.SetFieldData(Field: TField; Buffer: Pointer);
var
RecBuf, BufEnd: PChar;
RecBuf: PChar;
BufEnd: PChar;
p : Integer;
begin
if not (State in dsWriteModes) then
DatabaseError(SNotEditing, Self);
GetActiveRecBuf(RecBuf);
GetActiveRecBuf(TRecordBuffer(RecBuf));
if Field.FieldNo > 0 then
begin
if State = dsCalcFields then
@ -677,8 +678,8 @@ begin
Field.Validate(Buffer);
if Field.FieldKind <> fkInternalCalc then
begin
SetFieldPos(RecBuf, Field.FieldNo);
BufEnd := StrEnd(ActiveBuffer); // Fill with blanks when necessary
SetFieldPos(TRecordBuffer(RecBuf), Field.FieldNo);
BufEnd := StrEnd(pansichar(ActiveBuffer)); // Fill with blanks when necessary
if BufEnd > RecBuf then
BufEnd := RecBuf;
FillChar(BufEnd[0], Field.Size + PtrInt(RecBuf) - PtrInt(BufEnd), Ord(' '));
@ -697,7 +698,7 @@ begin
DataEvent(deFieldChange, Ptrint(Field));
end;
procedure TFixedFormatDataSet.SetFieldPos(var Buffer : PChar; FieldNo : Integer);
procedure TFixedFormatDataSet.SetFieldPos(var Buffer : TRecordBuffer; FieldNo : Integer);
var
i : Integer;
begin
@ -770,28 +771,28 @@ begin
DatabaseError('Bookmark not found');
end;
procedure TFixedFormatDataSet.InternalSetToRecord(Buffer: PChar);
procedure TFixedFormatDataSet.InternalSetToRecord(Buffer: TRecordBuffer);
begin
if (State <> dsInsert) then
InternalGotoBookmark(@PRecInfo(Buffer + FRecInfoOfs)^.RecordNumber);
end;
function TFixedFormatDataSet.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
function TFixedFormatDataSet.GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag;
begin
Result := PRecInfo(Buffer + FRecInfoOfs)^.BookmarkFlag;
end;
procedure TFixedFormatDataSet.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag);
procedure TFixedFormatDataSet.SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag);
begin
PRecInfo(Buffer + FRecInfoOfs)^.BookmarkFlag := Value;
end;
procedure TFixedFormatDataSet.GetBookmarkData(Buffer: PChar; Data: Pointer);
procedure TFixedFormatDataSet.GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
begin
Move(Buffer[FRecInfoOfs], Data^, BookmarkSize);
end;
procedure TFixedFormatDataSet.SetBookmarkData(Buffer: PChar; Data: Pointer);
procedure TFixedFormatDataSet.SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
begin
Move(Data^, Buffer[FRecInfoOfs], BookmarkSize);
end;
@ -823,7 +824,7 @@ var
i : Integer;
begin
for i := FData.Count -1 downto 0 do
FData[i] := BufToStore(PChar(StoreToBuf(FData[i])));
FData[i] := BufToStore(trecordbuffer(StoreToBuf(FData[i])));
FData.SaveToFile(FileName);
end;
@ -839,9 +840,9 @@ begin
Result := Source;
end;
function TFixedFormatDataSet.BufToStore(Buffer: PChar): String;
function TFixedFormatDataSet.BufToStore(Buffer: TRecordBuffer): String;
begin
Result := Copy(Buffer, 1, FRecordSize);
Result := Copy(pansichar(Buffer), 1, FRecordSize);
end;
//-----------------------------------------------------------------------------
@ -910,7 +911,7 @@ begin
inherited;
end;
function TSdfDataSet.GetRecord(Buffer: PChar; GetMode: TGetMode;
function TSdfDataSet.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode;
DoCheck: Boolean): TGetResult;
begin
if FirstLineAsSchema then
@ -1020,7 +1021,7 @@ begin
Result := Ret;
end;
function TSdfDataSet.BufToStore(Buffer: PChar): String;
function TSdfDataSet.BufToStore(Buffer: TRecordBuffer): String;
const
QuoteDelimiter='"';
var
@ -1033,7 +1034,7 @@ begin
QuoteMe:=false;
for i := 0 to FieldDefs.Count - 1 do
begin
Str := Trim(Copy(Buffer, p, FieldDefs[i].Size));
Str := Trim(Copy(pansichar(Buffer), p, FieldDefs[i].Size));
Inc(p, FieldDefs[i].Size);
if FFMultiLine=true then
begin

View File

@ -169,15 +169,15 @@ type
function GetRowsAffected: Integer; virtual; abstract;
procedure RetrieveFieldDefs; virtual; abstract;
//TDataSet overrides
function AllocRecordBuffer: PChar; override;
procedure ClearCalcFields(Buffer: PChar); override;
function AllocRecordBuffer: TRecordBuffer; override;
procedure ClearCalcFields(Buffer: TRecordBuffer); override;
procedure DoBeforeClose; override;
procedure DoAfterInsert; override;
procedure DoBeforeInsert; override;
procedure FreeRecordBuffer(var Buffer: PChar); override;
procedure GetBookmarkData(Buffer: PChar; Data: Pointer); override;
function GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; override;
function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
procedure FreeRecordBuffer(var Buffer: TRecordBuffer); override;
procedure GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
function GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; override;
function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
function GetRecordCount: Integer; override;
function GetRecNo: Integer; override;
function GetRecordSize: Word; override;
@ -189,14 +189,14 @@ type
procedure InternalFirst; override;
procedure InternalGotoBookmark(ABookmark: Pointer); override;
procedure InternalInitFieldDefs; override;
procedure InternalInitRecord(Buffer: PChar); override;
procedure InternalInitRecord(Buffer: TRecordBuffer); override;
procedure InternalLast; override;
procedure InternalOpen; override;
procedure InternalPost; override;
procedure InternalSetToRecord(Buffer: PChar); override;
procedure InternalSetToRecord(Buffer: TRecordBuffer); override;
function IsCursorOpen: Boolean; override;
procedure SetBookmarkData(Buffer: PChar; Data: Pointer); override;
procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); override;
procedure SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
procedure SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag); override;
procedure SetExpectedAppends(AValue: Integer);
procedure SetExpectedUpdates(AValue: Integer);
procedure SetExpectedDeletes(AValue: Integer);
@ -428,13 +428,13 @@ end;
// TCustomSqliteDataset override methods
function TCustomSqliteDataset.AllocRecordBuffer: PChar;
function TCustomSqliteDataset.AllocRecordBuffer: TRecordBuffer;
begin
Result := AllocMem(SizeOf(PPDataRecord));
PDataRecord(Pointer(Result)^) := FBeginItem;
end;
procedure TCustomSqliteDataset.ClearCalcFields(Buffer: PChar);
procedure TCustomSqliteDataset.ClearCalcFields(Buffer: TRecordBuffer);
var
i: Integer;
RecordItem: PDataRecord;
@ -668,17 +668,17 @@ begin
FreeMem(FCacheItem^.Row, FRowBufferSize);
end;
procedure TCustomSqliteDataset.FreeRecordBuffer(var Buffer: PChar);
procedure TCustomSqliteDataset.FreeRecordBuffer(var Buffer: TRecordBuffer);
begin
FreeMem(Buffer);
end;
procedure TCustomSqliteDataset.GetBookmarkData(Buffer: PChar; Data: Pointer);
procedure TCustomSqliteDataset.GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
begin
Pointer(Data^) := PPDataRecord(Buffer)^;
end;
function TCustomSqliteDataset.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
function TCustomSqliteDataset.GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag;
begin
Result := PPDataRecord(Buffer)^^.BookmarkFlag;
end;
@ -737,7 +737,7 @@ begin
Result := GetFieldData(Field, Buffer, False);
end;
function TCustomSqliteDataset.GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
function TCustomSqliteDataset.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
begin
Result := grOk;
case GetMode of
@ -936,7 +936,7 @@ begin
RetrieveFieldDefs;
end;
procedure TCustomSqliteDataset.InternalInitRecord(Buffer: PChar);
procedure TCustomSqliteDataset.InternalInitRecord(Buffer: TRecordBuffer);
var
TempStr: String;
begin
@ -996,7 +996,7 @@ begin
end;
end;
procedure TCustomSqliteDataset.InternalSetToRecord(Buffer: PChar);
procedure TCustomSqliteDataset.InternalSetToRecord(Buffer: TRecordBuffer);
begin
FCurrentItem := PPDataRecord(Buffer)^;
end;
@ -1283,7 +1283,7 @@ begin
begin
SaveState := SetTempState(dsInternalCalc);
try
CalculateFields(PChar(@TempItem));
CalculateFields(TRecordBuffer(@TempItem));
Result := FieldByName(ResultFields).Value;
finally
RestoreState(SaveState);
@ -1293,12 +1293,12 @@ begin
Result := Null;
end;
procedure TCustomSqliteDataset.SetBookmarkData(Buffer: PChar; Data: Pointer);
procedure TCustomSqliteDataset.SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
begin
//The BookMarkData is the Buffer itself: no need to set nothing;
end;
procedure TCustomSqliteDataset.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag);
procedure TCustomSqliteDataset.SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag);
begin
PPDataRecord(Buffer)^^.BookmarkFlag := Value;
end;