📄 abstempengine.pas
字号:
if (FDisableTempFiles or (aPage.PageNo < FMaxMemoryPageCount)) then
FMemoryPageManager.InternalReadPage(aPage)
else
begin
if ((not aPage.OwnBuffer) or (aPage.PageBuffer = nil)) then
begin
aPage.AllocPageBuffer;
aPage.OwnBuffer := True;
end;
if (FTempPageFile = nil) then
raise EABSException.Create(30482, ErrorGInvalidPointer);
FTempPageFile.Position := aPage.PageNo * FPageSize;
FTempPageFile.ReadBuffer(aPage.PageBuffer^, FPageSize);
end;
Result := True;
end;// InternalReadPage
//------------------------------------------------------------------------------
// InternalWritePage
//------------------------------------------------------------------------------
procedure TABSTemporaryPageManager.InternalWritePage(aPage: TABSPage);
begin
if (not FAllocatedPageMap.GetBit(aPage.PageNo)) then
raise EABSException.Create(10397, ErrorANotReleasedPageIsAllocated);
if (FDisableTempFiles or (aPage.PageNo < FMaxMemoryPageCount)) then
FMemoryPageManager.InternalWritePage(aPage)
else
begin
if (FTempPageFile = nil) then
FTempPageFile := TABSFileStream.Create(GetTempFileName,fmCreate, True);
FTempPageFile.Position := aPage.PageNo * FPageSize;
FTempPageFile.WriteBuffer(aPage.PageBuffer^, FPageSize);
end;
end;// InternalWritePage
//------------------------------------------------------------------------------
// create
//------------------------------------------------------------------------------
constructor TABSTemporaryPageManager.Create(DisableTempFiles: Boolean);
begin
inherited Create;
FDisableTempFiles := DisableTempFiles;
FAllocatedPageMap := TABSBitsArray.Create;
FAllocatedPageCount := 0;
FPageCount := 0;
FPageHeaderSize := 0;
FPageSize := 4096;
FPageDataSize := FPageSize;
FMaxMemoryPageCount := ((MemoryManager.GetFreeMemorySize div 10) div FPageSize);
//FTempPageFile := TABSFileStream.Create(GetTempFileName,fmCreate, True);
FTempPageFile := nil;
FMemoryPageManager := TABSMemoryPageManager.Create;
end;// Create
//------------------------------------------------------------------------------
// destroy
//------------------------------------------------------------------------------
destructor TABSTemporaryPageManager.Destroy;
begin
// allow to free with not freed pages to speed up sql queries
// if (FPageCount > 0) then
// raise EABSException.Create(20036, ErrorAIndexPagesNotReleased);
FAllocatedPageMap.Free;
if (FTempPageFile <> nil) then
FreeAndNil(FTempPageFile);
FMemoryPageManager.Free;
inherited Destroy;
end;// Destroy
////////////////////////////////////////////////////////////////////////////////
//
// TABSTemporaryDatabaseData
//
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
// create
//------------------------------------------------------------------------------
constructor TABSTemporaryDatabaseData.Create;
begin
inherited Create;
DatabaseName := ABSTemporaryDatabaseName;
FLastObjectID := 0;
end;// Create
//------------------------------------------------------------------------------
// destroy
//------------------------------------------------------------------------------
destructor TABSTemporaryDatabaseData.Destroy;
begin
while (FTableDataList.Count > 0) do
begin
if (FTableDataList.Items[0] = nil) then
raise EABSException.Create(10379, ErrorLNilPointer);
TABSTableData(FTableDataList.Items[0]).DeleteTable(nil);
end;
inherited Destroy;
end;// Destroy
//------------------------------------------------------------------------------
// create table data
//------------------------------------------------------------------------------
function TABSTemporaryDatabaseData.CreateTableData(Cursor: TABSCursor): TABSTableData;
begin
Result := TABSTemporaryTableData.Create(Self);
Result.TableName := Cursor.TableName;
FTableDataList.Add(Result);
end;// CreateTableData
//------------------------------------------------------------------------------
// GetNewObjectId
//------------------------------------------------------------------------------
function TABSTemporaryDatabaseData.GetNewObjectId: TABSObjectID;
begin
Lock;
try
Inc(FLastObjectID);
Result := FLastObjectID;
finally
Unlock;
end;
end;//GetNewObjectId
////////////////////////////////////////////////////////////////////////////////
//
// TABSTemporaryTableData
//
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
// create record manager
//------------------------------------------------------------------------------
procedure TABSTemporaryTableData.CreateRecordManager;
begin
if (FRecordManager <> nil) then
FRecordManager.Free;
FRecordManager := TABSTemporaryRecordManager.Create(GetRecordBufferSize,
FRecordsPerPage,FAllocRecordsBy, FDisableTempFiles);
end; // CreateRecordManager
//------------------------------------------------------------------------------
// create field manager
//------------------------------------------------------------------------------
procedure TABSTemporaryTableData.CreateFieldManager(FieldDefs: TABSFieldDefs);
begin
if (FFieldManager <> nil) then
FFieldManager.Free;
FFieldManager := TABSBaseFieldManager.Create(Self);
inherited CreateFieldManager(FieldDefs);
end; // CreateFieldManager
//------------------------------------------------------------------------------
// create index manager
//------------------------------------------------------------------------------
procedure TABSTemporaryTableData.CreateIndexManager(IndexDefs: TABSIndexDefs);
begin
if (FIndexManager <> nil) then
FIndexManager.Free;
FIndexManager := TABSBaseIndexManager.Create(Self, FPageManager);
inherited CreateIndexManager(IndexDefs);
end; // CreateIndexManager
//------------------------------------------------------------------------------
// create
//------------------------------------------------------------------------------
procedure TABSTemporaryTableData.CreateConstraintManager(ConstraintDefs: TABSConstraintDefs);
begin
if (FConstraintManager <> nil) then
FConstraintManager.Free;
// Create ConstraintManager
FConstraintManager := TABSBaseConstraintManager.Create(Self);
inherited CreateConstraintManager(ConstraintDefs);
end; // CreateConstraintManager
//------------------------------------------------------------------------------
// create
//------------------------------------------------------------------------------
procedure TABSTemporaryTableData.CreateBLOBFile;
begin
if (FFieldManager.BlobFieldsPresent) then
begin
DeleteBLOBFile;
if (FDisableTempFiles) then
begin
FBLOBFile := TABSMemoryStream.Create(nil, DEFAULT_TABLE_MEMORY_BLOB_FILE_SIZE);
end
else
FBLOBFile := TABSTemporaryStream.Create(FDisableTempFiles);
end;
end;
//------------------------------------------------------------------------------
// create
//------------------------------------------------------------------------------
procedure TABSTemporaryTableData.DeleteBLOBFile;
begin
if (FBLOBFile <> nil) then
FreeAndNil(FBLOBFile);
end;
//------------------------------------------------------------------------------
// return filter bitmap rec count
//------------------------------------------------------------------------------
function TABSTemporaryTableData.GetBitmapRecordCount(SessionID: TABSSessionID): TABSRecordNo;
begin
Result := FRecordManager.RecordCount;
end;// GetBitmapRecordCount
//------------------------------------------------------------------------------
// return filter bitmap rec no by record id
//------------------------------------------------------------------------------
function TABSTemporaryTableData.GetBitmapRecNoByRecordID(RecordID: TABSRecordID): TABSRecordNo;
begin
Result := 0;
Move(RecordID,Result,sizeof(RecordID));
end; // GetBitmapRecNoByRecordID
//------------------------------------------------------------------------------
// return filter bitmap rec no by record id
//------------------------------------------------------------------------------
function TABSTemporaryTableData.GetRecordIDByBitmapRecNo(RecordNo: TABSRecordNo): TABSRecordID;
begin
Move(RecordNo,Result,sizeof(Result));
end; // GetRecordIDByBitmapRecNo
//------------------------------------------------------------------------------
// constructor
//------------------------------------------------------------------------------
constructor TABSTemporaryTableData.Create(
aDatabaseData: TABSDatabaseData;
RecordsPerPage: Integer;
AllocRecordsBy: Integer
);
begin
inherited Create(aDatabaseData);
FPageManager := nil;
FRecordsPerPage := RecordsPerPage;
FAllocRecordsBy := AllocRecordsBy;
FBLOBFile := nil;
end; // Create
//------------------------------------------------------------------------------
// destructor
//------------------------------------------------------------------------------
destructor TABSTemporaryTableData.Destroy;
begin
EmptyTable(nil);
DeleteAllIndexes(nil);
if (FPageManager <> nil) then
begin
FPageManager.ApplyChanges(SYSTEM_SESSION_ID);
FPageManager.Free;
end;
inherited Destroy;
end; // Destroy
//------------------------------------------------------------------------------
// create table
//------------------------------------------------------------------------------
procedure TABSTemporaryTableData.CreateTable(
Cursor: TABSCursor;
FieldDefs: TABSFieldDefs;
IndexDefs: TABSIndexDefs;
ConstraintDefs: TABSConstraintDefs
);
begin
if (FieldDefs.Count <= 0) then
raise EABSException.Create(10132,ErrorLNoFields);
TableName := Cursor.TableName;
FDisableTempFiles := Cursor.FDisableTempFiles;
if (FPageManager <> nil) then
FPageManager.Free;
FPageManager := TABSTemporaryPageManager.Create(FDisableTempFiles);
CreateFieldManager(FieldDefs);
CreateIndexManager(IndexDefs);
CreateConstraintManager(ConstraintDefs);
CreateRecordManager;
InitCursor(Cursor);
CreateBLOBFile;
FIndexManager.CreateIndexesByIndexDefs(Cursor);
if (Cursor <> nil) then
if (not Cursor.Session.InTransaction) then
PageManager.ApplyChanges(Cursor.Session.SessionID);
end;// CreateTable
//------------------------------------------------------------------------------
// delete table
//------------------------------------------------------------------------------
procedure TABSTemporaryTableData.DeleteTable(Cursor: TABSCursor; DesignMode: Boolean);
begin
inherited DeleteTable(Cursor, DesignMode);
if ((not DesignMode) or (FCursorList.Count = 0)) then
Free;
end; // DeleteTable
//------------------------------------------------------------------------------
// empty table
//------------------------------------------------------------------------------
procedure TABSTemporaryTableData.EmptyTable(Cursor: TABSCursor);
begin
DeleteBLOBFile;
inherited EmptyTable(nil);
if (FRecordManager <> nil) then
begin
FRecordManager.Empty(SYSTEM_SESSION_ID);
end;
if (FPageManager <> nil) then
FPageManager.ApplyChanges(SYSTEM_SESSION_ID);
end; // EmptyTable
//------------------------------------------------------------------------------
// open table
//------------------------------------------------------------------------------
procedure TABSTemporaryTableData.OpenTable(Cursor: TABSCursor);
begin
TableName := Cursor.TableName;
inherited OpenTable(Cursor);
end;// OpenTable
//------------------------------------------------------------------------------
// close table
//------------------------------------------------------------------------------
procedure TABSTemporaryTableData.CloseTable(Cursor: TABSCursor);
begin
inherited CloseTable(Cursor);
end;// CloseTable
//------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -