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

📄 myldbdiskengine.pas

📁 一个本地database引擎,支持中文T_Sql查询,兼容DELPHI标准数据库控件
💻 PAS
📖 第 1 页 / 共 5 页
字号:
     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 + -