⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abstempengine.pas

📁 Absolute Database 是来替代BDE[Borland数据库引擎]的用于Delphi 和 C++ Builder 开发用的数据库引擎. 它小巧, 高速, 健壮, 易于使用. 它能直接编译进
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  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 + -