📄 myldbdiskengine.pas
字号:
constructor Create(MaxSessionCount: Integer; PageManager: TMYLDBPageManager);
destructor Destroy; override;
function LockTable(SessionID: TMYLDBSessionID; LockType: TMYLDBLockType;
TableLocksFile: TMYLDBTableLocksFile;
aTryCount: Integer;
aDelayMS: Integer;
NoThreadLock: Boolean = False;
AllowXIRWAfterSIRW: Boolean = True): Boolean;
function UnlockTable(SessionID: TMYLDBSessionID; LockType: TMYLDBLockType;
TableLocksFile: TMYLDBTableLocksFile;
IgnoreIfNoLock: Boolean=False; IgnoreCount: Boolean=False): Boolean;
function LockRecord(SessionID: TMYLDBSessionID;
TableLocksFile: TMYLDBTableLocksFile;
RecordID: TMYLDBRecordID;
aTryCount: Integer;
aDelayMS: Integer): Boolean;
function UnlockRecord(SessionID: TMYLDBSessionID;
TableLocksFile: TMYLDBTableLocksFile;
RecordID: TMYLDBRecordID): Boolean;
function AddRWLocksBeforeCommit(SessionID: TMYLDBSessionID): Boolean;
function ClearTransactionLocks(SessionID: TMYLDBSessionID): Boolean;
end;// TMYLDBDatabaseTableLockManager
type
TBooleanFunctionForTimeOutCall = function: Boolean of object;
// convert PageTypeID to String (for exceptions messages)
function PageTypeToStr(PageType: TMYLDBPageTypeID): String;
function TryUsingTimeOut(Func: TBooleanFunctionForTimeOutCall; TryCount: Integer; DelayMS: Integer): Boolean;
procedure CheckPageType(FoundType, WantedType: TMYLDBPageTypeID; ErrorCode: Integer);
// encrypts specified buffer
function MYLDBInternalEncryptBuffer(
CryptoAlg: TMYLDBCryptoAlgorithm;
inBuf: pChar;
Size: Integer;
Password: string
): Boolean;
// decrypts specified buffer
function MYLDBInternalDecryptBuffer(
CryptoAlg: TMYLDBCryptoAlgorithm;
inBuf: pChar;
Size: Integer;
Password: string
): Boolean;
function IsOSCriticalError: Boolean;
implementation
uses MYLDBLocalEngine, MYLDBTempEngine;
{$IFNDEF D6H}
function RandomRange(const AFrom, ATo: Integer): Integer;
begin
if AFrom > ATo then
Result := Random(AFrom - ATo) + ATo
else
Result := Random(ATo - AFrom) + AFrom;
end;
{$ENDIF}
////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBDiskDatabaseData
//
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
// OpenDatabase
//------------------------------------------------------------------------------
procedure TMYLDBDiskDatabaseData.OpenDatabase(Session: TMYLDBBaseSession; Exclusive: Boolean;
var RepairNeeded: Boolean);
begin
Lock;
try
FPageManager := TMYLDBDiskPageManager.Create;
try
FMultiUser := Session.MultiUser;
TMYLDBDiskPageManager(FPageManager).OpenDatabase(DatabaseName, FPassword,
FReadOnly, RepairNeeded, Exclusive, FMultiUser);
FPassword := TMYLDBDiskPageManager(FPageManager).Password^;
FPageSize := TMYLDBDiskPageManager(FPageManager).PageSize;
FPageCountInExtent := TMYLDBDiskPageManager(FPageManager).DBHeader.PageCountInExtent;
FSystemDir := TMYLDBSystemDirectory.Create(TMYLDBDiskPageManager(FPageManager));
FSystemDir.LoadDirectory;
FActiveSessionsFile := TMYLDBActiveSessionsFile.Create(FPageManager);
FActiveSessionsFile.OpenFile(FSystemDir.GetFileFirstPageNo(dbftActiveSessionsList));
FMaxSessionCount := FActiveSessionsFile.MaxSessionCount;
FTableListFile := TMYLDBTableListFile.Create(TMYLDBDiskPageManager(FPageManager));
FTableListFile.OpenFile(FSystemDir.GetFileFirstPageNo(dbftTablesList));
FTableListFile.Load;
FTableLockManager := TMYLDBDatabaseTableLockManager.Create(FMaxSessionCount, FPageManager);
except
CloseDatabase;
raise;
end;
finally
Unlock;
end;
end;// OpenDatabase
//------------------------------------------------------------------------------
// CloseDatabase
//------------------------------------------------------------------------------
procedure TMYLDBDiskDatabaseData.CloseDatabase;
begin
Lock;
try
if (FSystemDir <> nil) then
FreeAndNil(FSystemDir);
if (FTableListFile <> nil) then
FreeAndNil(FTableListFile);
if (FActiveSessionsFile <> nil) then
FreeAndNil(FActiveSessionsFile);
if (FTableLockManager <> nil) then
FreeAndNil(FTableLockManager);
if (FPageManager <> nil) then
begin
TMYLDBDiskPageManager(FPageManager).CloseDatabase;
FreeAndNil(FPageManager);
end;
finally
Unlock;
end;
end;// CloseDatabase
//------------------------------------------------------------------------------
// GetPassword
//------------------------------------------------------------------------------
function TMYLDBDiskDatabaseData.GetPassword: PMYLDBPassword;
begin
Result := @Fpassword;
end;//GetPassword
//------------------------------------------------------------------------------
// GetEncrypted
//------------------------------------------------------------------------------
function TMYLDBDiskDatabaseData.GetEncrypted: Boolean;
begin
Result := TMYLDBDiskPageManager(FPageManager).Encrypted;
end;// GetEncrypted
//------------------------------------------------------------------------------
// AddTable
//------------------------------------------------------------------------------
procedure TMYLDBDiskDatabaseData.AddTable(
TableID: TMYLDBTableID;
TableName: String;
MetadataFilePageNo, MostUpdatedFilePageNo, LocksFilePageNo: TMYLDBPageNo
);
begin
Lock;
try
FTableListFile.AddTable(TableID, TableName,
MetadataFilePageNo, MostUpdatedFilePageNo,
LocksFilePageNo);
FTableListFile.Save;
finally
Unlock;
end;
end;// AddTable
//------------------------------------------------------------------------------
// OpenTable
//------------------------------------------------------------------------------
procedure TMYLDBDiskDatabaseData.OpenTable(TableName: String;
out TableID: TMYLDBTableID; out MetadataFilePageNo, MostUpdatedFilePageNo,
LocksFilePageNo: TMYLDBPageNo);
begin
Lock;
try
if (FTableListFile = nil) then
raise EMYLDBException.Create(20129, ErrorANilPointer);
FTableListFile.OpenTable(TableName, TableID,
MetadataFilePageNo, MostUpdatedFilePageNo,
LocksFilePageNo);
finally
Unlock;
end;
end;// OpenTable
procedure TMYLDBDiskDatabaseData.RemoveTable(TableName: String);
begin
Lock;
try
if (FTableListFile = nil) then
raise EMYLDBException.Create(20130, ErrorANilPointer);
FTableListFile.RemoveTable(TableName);
FTableListFile.Save;
finally
Unlock;
end;
end;
procedure TMYLDBDiskDatabaseData.RenameTable(TableName,
NewTableName: String);
begin
Lock;
try
if (FTableListFile = nil) then
raise EMYLDBException.Create(20131, ErrorANilPointer);
FTableListFile.RenameTable(TableName, NewTableName);
FTableListFile.Save;
finally
Unlock;
end;
end;
//------------------------------------------------------------------------------
// Create
//------------------------------------------------------------------------------
constructor TMYLDBDiskDatabaseData.Create;
begin
inherited Create;
FPageManager := nil;
FSystemDir := nil;
FActiveSessionsFile := nil;
FTableListFile := nil;
FTableLockManager := nil;
FSingleUserConnected := False;
end;// Create
//------------------------------------------------------------------------------
// Destroy
//------------------------------------------------------------------------------
destructor TMYLDBDiskDatabaseData.Destroy;
begin
CloseDatabase;
inherited Destroy;
end;// Destroy
//------------------------------------------------------------------------------
// create table data
//------------------------------------------------------------------------------
function TMYLDBDiskDatabaseData.CreateTableData(Cursor: TMYLDBCursor): TMYLDBTableData;
begin
Lock;
try
Result := TMYLDBDiskTableData.Create(Self);
Result.TableName := Cursor.TableName;
FTableDataList.Add(Result);
finally
Unlock;
end;
end;// CreateTableData
//------------------------------------------------------------------------------
// CreateDatabase
//------------------------------------------------------------------------------
procedure TMYLDBDiskDatabaseData.CreateDatabase;
begin
Lock;
try
FPageManager := TMYLDBDiskPageManager.Create;
try
TMYLDBDiskPageManager(FPageManager).CreateAndOpenDatabase(DatabaseName,
FPassword,
FPageSize,
FPageCountInExtent);
FSystemDir := TMYLDBSystemDirectory.Create(TMYLDBDiskPageManager(FPageManager));
FActiveSessionsFile := TMYLDBActiveSessionsFile.Create(FPageManager);
FTableListFile := TMYLDBTableListFile.Create(TMYLDBDiskPageManager(FPageManager));
try
FSystemDir.CreateDirectory;
FSystemDir.CreateFile(dbftActiveSessionsList, FActiveSessionsFile.CreateFile(MaxSessionCount));
FSystemDir.CreateFile(dbftTablesList, FTableListFile.CreateFile);
FSystemDir.SaveDirectory;
FPageManager.ApplyChanges(SYSTEM_SESSION_ID);
finally
FreeAndNil(FTableListFile);
FreeAndNil(FActiveSessionsFile);
FreeAndNil(FSystemDir);
end;
finally
TMYLDBDiskPageManager(FPageManager).CloseDatabase;
FPageManager.Free;
FPageManager := nil;
end;
finally
Unlock;
end;
end;// CreateDatabase
//------------------------------------------------------------------------------
// ConnectSession
//------------------------------------------------------------------------------
procedure TMYLDBDiskDatabaseData.ConnectSession(Session: TMYLDBBaseSession);
var
RepairNeeded: Boolean;
begin
Lock;
try
if (FPageManager = nil) then
begin
OpenDatabase(Session, Session.Exclusive, RepairNeeded);
Session.RepairNeeded := RepairNeeded;
Session.MultiUser := FMultiUser;
end;
{$IFDEF FILE_SERVER_VERSION}
if (Session.MultiUser <> FMultiUser) then
raise EMYLDBException.Create(20235, ErrorAMultiUserOptionsConflict);
i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -