|
@@ -74,7 +74,7 @@ type
|
|
PBufBookmark = ^TBufBookmark;
|
|
PBufBookmark = ^TBufBookmark;
|
|
TBufBookmark = record
|
|
TBufBookmark = record
|
|
BookmarkData : PBufRecLinkItem;
|
|
BookmarkData : PBufRecLinkItem;
|
|
- BookmarkInt : integer;
|
|
|
|
|
|
+ BookmarkInt : integer; // was used by TArrayBufIndex
|
|
BookmarkFlag : TBookmarkFlag;
|
|
BookmarkFlag : TBookmarkFlag;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -473,31 +473,32 @@ type
|
|
FBlobBuffers : array of PBlobBuffer;
|
|
FBlobBuffers : array of PBlobBuffer;
|
|
FUpdateBlobBuffers: array of PBlobBuffer;
|
|
FUpdateBlobBuffers: array of PBlobBuffer;
|
|
|
|
|
|
- procedure FetchAll;
|
|
|
|
procedure ProcessFieldsToCompareStruct(const AFields, ADescFields, ACInsFields: TList;
|
|
procedure ProcessFieldsToCompareStruct(const AFields, ADescFields, ACInsFields: TList;
|
|
const AIndexOptions: TIndexOptions; const ALocateOptions: TLocateOptions; out ACompareStruct: TDBCompareStruct);
|
|
const AIndexOptions: TIndexOptions; const ALocateOptions: TLocateOptions; out ACompareStruct: TDBCompareStruct);
|
|
function BufferOffset: integer;
|
|
function BufferOffset: integer;
|
|
- function GetIndexDefs : TIndexDefs;
|
|
|
|
- function GetCurrentBuffer: TRecordBuffer;
|
|
|
|
|
|
+ function GetFieldSize(FieldDef : TFieldDef) : longint;
|
|
procedure CalcRecordSize;
|
|
procedure CalcRecordSize;
|
|
- function GetIndexFieldNames: String;
|
|
|
|
- function GetIndexName: String;
|
|
|
|
- function GetBufUniDirectional: boolean;
|
|
|
|
- function GetPacketReader(const Format: TDataPacketFormat; const AStream: TStream): TDataPacketReader;
|
|
|
|
|
|
+ function IntAllocRecordBuffer: TRecordBuffer;
|
|
|
|
+ procedure IntLoadFieldDefsFromFile;
|
|
|
|
+ procedure IntLoadRecordsFromFile;
|
|
|
|
+ function GetCurrentBuffer: TRecordBuffer;
|
|
|
|
+ procedure CurrentRecordToBuffer(Buffer: TRecordBuffer);
|
|
function LoadBuffer(Buffer : TRecordBuffer): TGetResult;
|
|
function LoadBuffer(Buffer : TRecordBuffer): TGetResult;
|
|
- function GetFieldSize(FieldDef : TFieldDef) : longint;
|
|
|
|
|
|
+ procedure FetchAll;
|
|
function GetRecordUpdateBuffer(const ABookmark : TBufBookmark; IncludePrior : boolean = false; AFindNext : boolean = false) : boolean;
|
|
function GetRecordUpdateBuffer(const ABookmark : TBufBookmark; IncludePrior : boolean = false; AFindNext : boolean = false) : boolean;
|
|
function GetRecordUpdateBufferCached(const ABookmark : TBufBookmark; IncludePrior : boolean = false) : boolean;
|
|
function GetRecordUpdateBufferCached(const ABookmark : TBufBookmark; IncludePrior : boolean = false) : boolean;
|
|
function GetActiveRecordUpdateBuffer : boolean;
|
|
function GetActiveRecordUpdateBuffer : boolean;
|
|
|
|
+ procedure ParseFilter(const AFilter: string);
|
|
|
|
+ function GetPacketReader(const Format: TDataPacketFormat; const AStream: TStream): TDataPacketReader;
|
|
|
|
+
|
|
|
|
+ function GetIndexDefs : TIndexDefs;
|
|
|
|
+ function GetIndexFieldNames: String;
|
|
|
|
+ function GetIndexName: String;
|
|
|
|
+ function GetBufUniDirectional: boolean;
|
|
procedure SetIndexFieldNames(const AValue: String);
|
|
procedure SetIndexFieldNames(const AValue: String);
|
|
procedure SetIndexName(AValue: String);
|
|
procedure SetIndexName(AValue: String);
|
|
procedure SetMaxIndexesCount(const AValue: Integer);
|
|
procedure SetMaxIndexesCount(const AValue: Integer);
|
|
procedure SetPacketRecords(aValue : integer);
|
|
procedure SetPacketRecords(aValue : integer);
|
|
- function IntAllocRecordBuffer: TRecordBuffer;
|
|
|
|
- procedure ParseFilter(const AFilter: string);
|
|
|
|
- procedure IntLoadFielddefsFromFile;
|
|
|
|
- procedure IntLoadRecordsFromFile;
|
|
|
|
- procedure CurrentRecordToBuffer(Buffer: TRecordBuffer);
|
|
|
|
procedure SetBufUniDirectional(const AValue: boolean);
|
|
procedure SetBufUniDirectional(const AValue: boolean);
|
|
// indexes handling
|
|
// indexes handling
|
|
procedure InitDefaultIndexes;
|
|
procedure InitDefaultIndexes;
|
|
@@ -505,9 +506,7 @@ type
|
|
procedure BuildIndexes;
|
|
procedure BuildIndexes;
|
|
procedure RemoveRecordFromIndexes(const ABookmark : TBufBookmark);
|
|
procedure RemoveRecordFromIndexes(const ABookmark : TBufBookmark);
|
|
protected
|
|
protected
|
|
- function GetNewBlobBuffer : PBlobBuffer;
|
|
|
|
- function GetNewWriteBlobBuffer : PBlobBuffer;
|
|
|
|
- procedure FreeBlobBuffer(var ABlobBuffer: PBlobBuffer);
|
|
|
|
|
|
+ // abstract & virtual methods of TDataset
|
|
procedure UpdateIndexDefs; override;
|
|
procedure UpdateIndexDefs; override;
|
|
procedure SetRecNo(Value: Longint); override;
|
|
procedure SetRecNo(Value: Longint); override;
|
|
function GetRecNo: Longint; override;
|
|
function GetRecNo: Longint; override;
|
|
@@ -521,10 +520,7 @@ type
|
|
procedure DoBeforeClose; override;
|
|
procedure DoBeforeClose; override;
|
|
procedure InternalOpen; override;
|
|
procedure InternalOpen; override;
|
|
procedure InternalClose; override;
|
|
procedure InternalClose; override;
|
|
- function getnextpacket : integer;
|
|
|
|
function GetRecordSize: Word; override;
|
|
function GetRecordSize: Word; override;
|
|
- procedure InternalAddIndex(const AName, AFields : string; AOptions : TIndexOptions; const ADescFields: string;
|
|
|
|
- const ACaseInsFields: string); virtual;
|
|
|
|
procedure InternalPost; override;
|
|
procedure InternalPost; override;
|
|
procedure InternalCancel; Override;
|
|
procedure InternalCancel; Override;
|
|
procedure InternalDelete; override;
|
|
procedure InternalDelete; override;
|
|
@@ -544,14 +540,21 @@ type
|
|
procedure SetFiltered(Value: Boolean); override; {virtual;}
|
|
procedure SetFiltered(Value: Boolean); override; {virtual;}
|
|
procedure InternalRefresh; override;
|
|
procedure InternalRefresh; override;
|
|
procedure DataEvent(Event: TDataEvent; Info: Ptrint); override;
|
|
procedure DataEvent(Event: TDataEvent; Info: Ptrint); override;
|
|
|
|
+ // virtual or methods, which can be used by descendants
|
|
|
|
+ function GetNewBlobBuffer : PBlobBuffer;
|
|
|
|
+ function GetNewWriteBlobBuffer : PBlobBuffer;
|
|
|
|
+ procedure FreeBlobBuffer(var ABlobBuffer: PBlobBuffer);
|
|
|
|
+ procedure InternalAddIndex(const AName, AFields : string; AOptions : TIndexOptions; const ADescFields: string;
|
|
|
|
+ const ACaseInsFields: string); virtual;
|
|
procedure BeforeRefreshOpenCursor; virtual;
|
|
procedure BeforeRefreshOpenCursor; virtual;
|
|
procedure DoFilterRecord(out Acceptable: Boolean); virtual;
|
|
procedure DoFilterRecord(out Acceptable: Boolean); virtual;
|
|
procedure SetReadOnly(AValue: Boolean); virtual;
|
|
procedure SetReadOnly(AValue: Boolean); virtual;
|
|
- {abstracts, must be overidden by descendents}
|
|
|
|
|
|
+ function IsReadFromPacket : Boolean;
|
|
|
|
+ function getnextpacket : integer;
|
|
|
|
+ // abstracts, must be overidden by descendents
|
|
function Fetch : boolean; virtual;
|
|
function Fetch : boolean; virtual;
|
|
function LoadField(FieldDef : TFieldDef;buffer : pointer; out CreateBlob : boolean) : boolean; virtual;
|
|
function LoadField(FieldDef : TFieldDef;buffer : pointer; out CreateBlob : boolean) : boolean; virtual;
|
|
procedure LoadBlobIntoBuffer(FieldDef: TFieldDef;ABlobBuf: PBufBlobField); virtual; abstract;
|
|
procedure LoadBlobIntoBuffer(FieldDef: TFieldDef;ABlobBuf: PBufBlobField); virtual; abstract;
|
|
- function IsReadFromPacket : Boolean;
|
|
|
|
public
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
constructor Create(AOwner: TComponent); override;
|
|
function GetFieldData(Field: TField; Buffer: Pointer;
|
|
function GetFieldData(Field: TField; Buffer: Pointer;
|
|
@@ -1605,7 +1608,7 @@ end;
|
|
function TCustomBufDataset.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
|
|
function TCustomBufDataset.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
|
|
|
|
|
|
var Acceptable : Boolean;
|
|
var Acceptable : Boolean;
|
|
- SaveState : TDataSetState;
|
|
|
|
|
|
+ SavedState : TDataSetState;
|
|
|
|
|
|
begin
|
|
begin
|
|
Result := grOK;
|
|
Result := grOK;
|
|
@@ -1633,17 +1636,17 @@ begin
|
|
if Filtered then
|
|
if Filtered then
|
|
begin
|
|
begin
|
|
FFilterBuffer := Buffer;
|
|
FFilterBuffer := Buffer;
|
|
- SaveState := SetTempState(dsFilter);
|
|
|
|
|
|
+ SavedState := SetTempState(dsFilter);
|
|
DoFilterRecord(Acceptable);
|
|
DoFilterRecord(Acceptable);
|
|
if (GetMode = gmCurrent) and not Acceptable then
|
|
if (GetMode = gmCurrent) and not Acceptable then
|
|
begin
|
|
begin
|
|
Acceptable := True;
|
|
Acceptable := True;
|
|
Result := grError;
|
|
Result := grError;
|
|
end;
|
|
end;
|
|
- RestoreState(SaveState);
|
|
|
|
|
|
+ RestoreState(SavedState);
|
|
end;
|
|
end;
|
|
end
|
|
end
|
|
- else if (Result = grError) and doCheck then
|
|
|
|
|
|
+ else if (Result = grError) and DoCheck then
|
|
DatabaseError('No record');
|
|
DatabaseError('No record');
|
|
until Acceptable;
|
|
until Acceptable;
|
|
end;
|
|
end;
|
|
@@ -2550,9 +2553,9 @@ var
|
|
|
|
|
|
begin
|
|
begin
|
|
CheckBrowseMode;
|
|
CheckBrowseMode;
|
|
- if value > RecordCount then
|
|
|
|
|
|
+ if Value > RecordCount then
|
|
begin
|
|
begin
|
|
- repeat until (getnextpacket < FPacketRecords) or (value <= RecordCount) or (FPacketRecords = -1);
|
|
|
|
|
|
+ repeat until (getnextpacket < FPacketRecords) or (Value <= RecordCount) or (FPacketRecords = -1);
|
|
if value > RecordCount then
|
|
if value > RecordCount then
|
|
begin
|
|
begin
|
|
DatabaseError(SNoSuchRecord,self);
|
|
DatabaseError(SNoSuchRecord,self);
|
|
@@ -2560,22 +2563,22 @@ begin
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
TmpRecBuffer := (FCurrentIndex as TDoubleLinkedBufIndex).FFirstRecBuf;
|
|
TmpRecBuffer := (FCurrentIndex as TDoubleLinkedBufIndex).FFirstRecBuf;
|
|
- for recnr := 1 to value-1 do
|
|
|
|
|
|
+ for recnr := 1 to Value-1 do
|
|
TmpRecBuffer := TmpRecBuffer[FCurrentIndex.IndNr].next;
|
|
TmpRecBuffer := TmpRecBuffer[FCurrentIndex.IndNr].next;
|
|
GotoBookmark(@TmpRecBuffer);
|
|
GotoBookmark(@TmpRecBuffer);
|
|
end;
|
|
end;
|
|
|
|
|
|
function TCustomBufDataset.GetRecNo: Longint;
|
|
function TCustomBufDataset.GetRecNo: Longint;
|
|
|
|
|
|
-Var abuf : TRecordBuffer;
|
|
|
|
|
|
+Var CurrBuff : TRecordBuffer;
|
|
|
|
|
|
begin
|
|
begin
|
|
- abuf := GetCurrentBuffer;
|
|
|
|
- // If abuf isn't assigned, the recordset probably isn't opened.
|
|
|
|
- if assigned(abuf) and (FBRecordCount>0) and (State <> dsInsert) then
|
|
|
|
- Result:=FCurrentIndex.GetRecNo(PBufBookmark(abuf+FRecordSize))
|
|
|
|
|
|
+ CurrBuff := GetCurrentBuffer;
|
|
|
|
+ // If CurrBuff isn't assigned, the recordset probably isn't opened.
|
|
|
|
+ if assigned(CurrBuff) and (FBRecordCount>0) and (State <> dsInsert) then
|
|
|
|
+ Result:=FCurrentIndex.GetRecNo(PBufBookmark(CurrBuff+FRecordSize))
|
|
else
|
|
else
|
|
- result := 0;
|
|
|
|
|
|
+ Result := 0;
|
|
end;
|
|
end;
|
|
|
|
|
|
function TCustomBufDataset.IsCursorOpen: Boolean;
|
|
function TCustomBufDataset.IsCursorOpen: Boolean;
|
|
@@ -2819,7 +2822,7 @@ procedure TCustomBufDataset.GetDatasetPacket(AWriter: TDataPacketReader);
|
|
end;
|
|
end;
|
|
|
|
|
|
var ScrollResult : TGetResult;
|
|
var ScrollResult : TGetResult;
|
|
- StoreDSState : TDataSetState;
|
|
|
|
|
|
+ SavedState : TDataSetState;
|
|
ABookMark : PBufBookmark;
|
|
ABookMark : PBufBookmark;
|
|
ATBookmark : TBufBookmark;
|
|
ATBookmark : TBufBookmark;
|
|
RowState : TRowState;
|
|
RowState : TRowState;
|
|
@@ -2831,7 +2834,7 @@ begin
|
|
ABookMark:=@ATBookmark;
|
|
ABookMark:=@ATBookmark;
|
|
FDatasetReader.StoreFieldDefs(FAutoIncValue);
|
|
FDatasetReader.StoreFieldDefs(FAutoIncValue);
|
|
|
|
|
|
- StoreDSState:=SetTempState(dsFilter);
|
|
|
|
|
|
+ SavedState:=SetTempState(dsFilter);
|
|
ScrollResult:=FCurrentIndex.ScrollFirst;
|
|
ScrollResult:=FCurrentIndex.ScrollFirst;
|
|
while ScrollResult=grOK do
|
|
while ScrollResult=grOK do
|
|
begin
|
|
begin
|
|
@@ -2855,7 +2858,7 @@ begin
|
|
FCurrentIndex.StoreSpareRecIntoBookmark(ABookmark);
|
|
FCurrentIndex.StoreSpareRecIntoBookmark(ABookmark);
|
|
HandleUpdateBuffersFromRecord(True,ABookmark^,RowState);
|
|
HandleUpdateBuffersFromRecord(True,ABookmark^,RowState);
|
|
|
|
|
|
- RestoreState(StoreDSState);
|
|
|
|
|
|
+ RestoreState(SavedState);
|
|
|
|
|
|
FDatasetReader.FinalizeStoreRecords;
|
|
FDatasetReader.FinalizeStoreRecords;
|
|
finally
|
|
finally
|
|
@@ -2972,7 +2975,7 @@ end;
|
|
|
|
|
|
procedure TCustomBufDataset.IntLoadRecordsFromFile;
|
|
procedure TCustomBufDataset.IntLoadRecordsFromFile;
|
|
|
|
|
|
-var StoreState : TDataSetState;
|
|
|
|
|
|
+var SavedState : TDataSetState;
|
|
AddRecordBuffer : boolean;
|
|
AddRecordBuffer : boolean;
|
|
ARowState : TRowState;
|
|
ARowState : TRowState;
|
|
AUpdOrder : integer;
|
|
AUpdOrder : integer;
|
|
@@ -2981,7 +2984,7 @@ var StoreState : TDataSetState;
|
|
begin
|
|
begin
|
|
CheckBiDirectional;
|
|
CheckBiDirectional;
|
|
FDatasetReader.InitLoadRecords;
|
|
FDatasetReader.InitLoadRecords;
|
|
- StoreState:=SetTempState(dsFilter);
|
|
|
|
|
|
+ SavedState:=SetTempState(dsFilter);
|
|
|
|
|
|
while FDatasetReader.GetCurrentRecord do
|
|
while FDatasetReader.GetCurrentRecord do
|
|
begin
|
|
begin
|
|
@@ -3069,7 +3072,7 @@ begin
|
|
FDatasetReader.GotoNextRecord;
|
|
FDatasetReader.GotoNextRecord;
|
|
end;
|
|
end;
|
|
|
|
|
|
- RestoreState(StoreState);
|
|
|
|
|
|
+ RestoreState(SavedState);
|
|
FIndexes[0].SetToFirstRecord;
|
|
FIndexes[0].SetToFirstRecord;
|
|
FAllPacketsFetched:=True;
|
|
FAllPacketsFetched:=True;
|
|
if assigned(FFileStream) then
|
|
if assigned(FFileStream) then
|
|
@@ -3197,7 +3200,7 @@ var CurrLinkItem : PBufRecLinkItem;
|
|
bm : TBufBookmark;
|
|
bm : TBufBookmark;
|
|
SearchFields : TList;
|
|
SearchFields : TList;
|
|
DBCompareStruct : TDBCompareStruct;
|
|
DBCompareStruct : TDBCompareStruct;
|
|
- StoreDSState : TDataSetState;
|
|
|
|
|
|
+ SavedState : TDataSetState;
|
|
FilterRecord : TRecordBuffer;
|
|
FilterRecord : TRecordBuffer;
|
|
FiltAcceptable : boolean;
|
|
FiltAcceptable : boolean;
|
|
|
|
|
|
@@ -3218,7 +3221,7 @@ begin
|
|
end;
|
|
end;
|
|
|
|
|
|
// Set the filter buffer
|
|
// Set the filter buffer
|
|
- StoreDSState:=SetTempState(dsFilter);
|
|
|
|
|
|
+ SavedState:=SetTempState(dsFilter);
|
|
FFilterBuffer:=FCurrentIndex.SpareBuffer;
|
|
FFilterBuffer:=FCurrentIndex.SpareBuffer;
|
|
SetFieldValues(KeyFields,KeyValues);
|
|
SetFieldValues(KeyFields,KeyValues);
|
|
FilterRecord:=IntAllocRecordBuffer;
|
|
FilterRecord:=IntAllocRecordBuffer;
|
|
@@ -3252,7 +3255,7 @@ begin
|
|
getnextpacket;
|
|
getnextpacket;
|
|
end;
|
|
end;
|
|
|
|
|
|
- RestoreState(StoreDSState);
|
|
|
|
|
|
+ RestoreState(SavedState);
|
|
FreeRecordBuffer(FilterRecord);
|
|
FreeRecordBuffer(FilterRecord);
|
|
|
|
|
|
// If a match is found, jump to the found record
|
|
// If a match is found, jump to the found record
|