?? myldbtempengine.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 EMYLDBException.Create(30482, ErrorGInvalidPointer);
FTempPageFile.Position := aPage.PageNo * FPageSize;
FTempPageFile.ReadBuffer(aPage.PageBuffer^, FPageSize);
end;
Result := True;
end;// InternalReadPage
//------------------------------------------------------------------------------
// InternalWritePage
//------------------------------------------------------------------------------
procedure TMYLDBTemporaryPageManager.InternalWritePage(aPage: TMYLDBPage);
begin
if (not FAllocatedPageMap.GetBit(aPage.PageNo)) then
raise EMYLDBException.Create(10397, ErrorANotReleasedPageIsAllocated);
if (FDisableTempFiles or (aPage.PageNo < FMaxMemoryPageCount)) then
FMemoryPageManager.InternalWritePage(aPage)
else
begin
if (FTempPageFile = nil) then
FTempPageFile := TMYLDBFileStream.Create(GetTempFileName,fmCreate, True);
FTempPageFile.Position := aPage.PageNo * FPageSize;
FTempPageFile.WriteBuffer(aPage.PageBuffer^, FPageSize);
end;
end;// InternalWritePage
//------------------------------------------------------------------------------
// create
//------------------------------------------------------------------------------
constructor TMYLDBTemporaryPageManager.Create(DisableTempFiles: Boolean);
begin
inherited Create;
FDisableTempFiles := DisableTempFiles;
FAllocatedPageMap := TMYLDBBitsArray.Create;
FAllocatedPageCount := 0;
FPageCount := 0;
FPageHeaderSize := 0;
FPageSize := 4096;
FPageDataSize := FPageSize;
FMaxMemoryPageCount := ((MemoryManager.GetFreeMemorySize div 10) div FPageSize);
//FTempPageFile := TMYLDBFileStream.Create(GetTempFileName,fmCreate, True);
FTempPageFile := nil;
FMemoryPageManager := TMYLDBMemoryPageManager.Create;
end;// Create
//------------------------------------------------------------------------------
// destroy
//------------------------------------------------------------------------------
destructor TMYLDBTemporaryPageManager.Destroy;
begin
// allow to free with not freed pages to speed up sql queries
// if (FPageCount > 0) then
// raise EMYLDBException.Create(20036, ErrorAIndexPagesNotReleased);
FAllocatedPageMap.Free;
if (FTempPageFile <> nil) then
FreeAndNil(FTempPageFile);
FMemoryPageManager.Free;
inherited Destroy;
end;// Destroy
////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBTemporaryDatabaseData
//
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
// create
//------------------------------------------------------------------------------
constructor TMYLDBTemporaryDatabaseData.Create;
begin
inherited Create;
DatabaseName := MYLDBTemporaryDatabaseName;
FLastObjectID := 0;
end;// Create
//------------------------------------------------------------------------------
// destroy
//------------------------------------------------------------------------------
destructor TMYLDBTemporaryDatabaseData.Destroy;
begin
while (FTableDataList.Count > 0) do
begin
if (FTableDataList.Items[0] = nil) then
raise EMYLDBException.Create(10379, ErrorLNilPointer);
TMYLDBTableData(FTableDataList.Items[0]).DeleteTable(nil);
end;
inherited Destroy;
end;// Destroy
//------------------------------------------------------------------------------
// create table data
//------------------------------------------------------------------------------
function TMYLDBTemporaryDatabaseData.CreateTableData(Cursor: TMYLDBCursor): TMYLDBTableData;
begin
Result := TMYLDBTemporaryTableData.Create(Self);
Result.TableName := Cursor.TableName;
FTableDataList.Add(Result);
end;// CreateTableData
//------------------------------------------------------------------------------
// GetNewObjectId
//------------------------------------------------------------------------------
function TMYLDBTemporaryDatabaseData.GetNewObjectId: TMYLDBObjectID;
begin
Lock;
try
Inc(FLastObjectID);
Result := FLastObjectID;
finally
Unlock;
end;
end;//GetNewObjectId
////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBTemporaryTableData
//
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
// create record manager
//------------------------------------------------------------------------------
procedure TMYLDBTemporaryTableData.CreateRecordManager;
begin
if (FRecordManager <> nil) then
FRecordManager.Free;
FRecordManager := TMYLDBTemporaryRecordManager.Create(GetRecordBufferSize,
FRecordsPerPage,FAllocRecordsBy, FDisableTempFiles);
end; // CreateRecordManager
//------------------------------------------------------------------------------
// create field manager
//------------------------------------------------------------------------------
procedure TMYLDBTemporaryTableData.CreateFieldManager(FieldDefs: TMYLDBFieldDefs);
begin
if (FFieldManager <> nil) then
FFieldManager.Free;
FFieldManager := TMYLDBBaseFieldManager.Create(Self);
inherited CreateFieldManager(FieldDefs);
end; // CreateFieldManager
//------------------------------------------------------------------------------
// create index manager
//------------------------------------------------------------------------------
procedure TMYLDBTemporaryTableData.CreateIndexManager(IndexDefs: TMYLDBIndexDefs);
begin
if (FIndexManager <> nil) then
FIndexManager.Free;
FIndexManager := TMYLDBBaseIndexManager.Create(Self, FPageManager);
inherited CreateIndexManager(IndexDefs);
end; // CreateIndexManager
//------------------------------------------------------------------------------
// create
//------------------------------------------------------------------------------
procedure TMYLDBTemporaryTableData.CreateConstraintManager(ConstraintDefs: TMYLDBConstraintDefs);
begin
if (FConstraintManager <> nil) then
FConstraintManager.Free;
// Create ConstraintManager
FConstraintManager := TMYLDBBaseConstraintManager.Create(Self);
inherited CreateConstraintManager(ConstraintDefs);
end; // CreateConstraintManager
//------------------------------------------------------------------------------
// create
//------------------------------------------------------------------------------
procedure TMYLDBTemporaryTableData.CreateBLOBFile;
begin
if (FFieldManager.BlobFieldsPresent) then
begin
DeleteBLOBFile;
if (FDisableTempFiles) then
begin
FBLOBFile := TMYLDBMemoryStream.Create(nil, DEFAULT_TABLE_MEMORY_BLOB_FILE_SIZE);
end
else
FBLOBFile := TMYLDBTemporaryStream.Create(FDisableTempFiles);
end;
end;
//------------------------------------------------------------------------------
// create
//------------------------------------------------------------------------------
procedure TMYLDBTemporaryTableData.DeleteBLOBFile;
begin
if (FBLOBFile <> nil) then
FreeAndNil(FBLOBFile);
end;
//------------------------------------------------------------------------------
// return filter bitmap rec count
//------------------------------------------------------------------------------
function TMYLDBTemporaryTableData.GetBitmapRecordCount(SessionID: TMYLDBSessionID): TMYLDBRecordNo;
begin
Result := FRecordManager.RecordCount;
end;// GetBitmapRecordCount
//------------------------------------------------------------------------------
// return filter bitmap rec no by record id
//------------------------------------------------------------------------------
function TMYLDBTemporaryTableData.GetBitmapRecNoByRecordID(RecordID: TMYLDBRecordID): TMYLDBRecordNo;
begin
Result := 0;
Move(RecordID,Result,sizeof(RecordID));
end; // GetBitmapRecNoByRecordID
//------------------------------------------------------------------------------
// return filter bitmap rec no by record id
//------------------------------------------------------------------------------
function TMYLDBTemporaryTableData.GetRecordIDByBitmapRecNo(RecordNo: TMYLDBRecordNo): TMYLDBRecordID;
begin
Move(RecordNo,Result,sizeof(Result));
end; // GetRecordIDByBitmapRecNo
//------------------------------------------------------------------------------
// constructor
//------------------------------------------------------------------------------
constructor TMYLDBTemporaryTableData.Create(
aDatabaseData: TMYLDBDatabaseData;
RecordsPerPage: Integer;
AllocRecordsBy: Integer
);
begin
inherited Create(aDatabaseData);
FPageManager := nil;
FRecordsPerPage := RecordsPerPage;
FAllocRecordsBy := AllocRecordsBy;
FBLOBFile := nil;
end; // Create
//------------------------------------------------------------------------------
// destructor
//------------------------------------------------------------------------------
destructor TMYLDBTemporaryTableData.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 TMYLDBTemporaryTableData.CreateTable(
Cursor: TMYLDBCursor;
FieldDefs: TMYLDBFieldDefs;
IndexDefs: TMYLDBIndexDefs;
ConstraintDefs: TMYLDBConstraintDefs
);
begin
if (FieldDefs.Count <= 0) then
raise EMYLDBException.Create(10132,ErrorLNoFields);
TableName := Cursor.TableName;
FDisableTempFiles := Cursor.FDisableTempFiles;
if (FPageManager <> nil) then
FPageManager.Free;
FPageManager := TMYLDBTemporaryPageManager.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 TMYLDBTemporaryTableData.DeleteTable(Cursor: TMYLDBCursor; DesignMode: Boolean);
begin
inherited DeleteTable(Cursor, DesignMode);
if ((not DesignMode) or (FCursorList.Count = 0)) then
Free;
end; // DeleteTable
//------------------------------------------------------------------------------
// empty table
//------------------------------------------------------------------------------
procedure TMYLDBTemporaryTableData.EmptyTable(Cursor: TMYLDBCursor);
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 TMYLDBTemporaryTableData.OpenTable(Cursor: TMYLDBCursor);
begin
TableName := Cursor.TableName;
inherited OpenTable(Cursor);
end;// OpenTable
//------------------------------------------------------------------------------
// close table
//------------------------------------------------------------------------------
procedure TMYLDBTemporaryTableData.CloseTable(Cursor: TMYLDBCursor);
begin
inherited CloseTable(Cursor);
end;// CloseTable
//------------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -