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

📄 myldbdiskengine.pas

📁 一个本地database引擎,支持中文T_Sql查询,兼容DELPHI标准数据库控件
💻 PAS
📖 第 1 页 / 共 5 页
字号:
                   var LastPageNo: TMYLDBPageNo; var LastPageOffset: Word;
                   BlobDataPageList: TMYLDBIntegerArray);
    procedure WriteBlobDataPageList(
                   // in
                   SessionID: TMYLDBSessionID;
                   PageItemID: TMYLDBPageItemID;
                   BlobHeader: TMYLDBDiskBlobHeader;
                   LastPageNo: TMYLDBPageNo; LastPageOffset: Word;
                   BlobDataPageList: TMYLDBIntegerArray;
                   // out
                   var PageListLink: TMYLDBPageListLink);
    procedure WriteLinkToBlobDataPageList(
                   SessionID: TMYLDBSessionID;
                   PageItemID: TMYLDBPageItemID;
                   PageListLink: TMYLDBPageListLink);

    procedure WriteMultiPagesBlob(SessionID: TMYLDBSessionID;
                      BlobCache: PMYLDBDiskBLOBCache; var PageItemID: TMYLDBPageItemID;
                      BlobHeader: TMYLDBDiskBlobHeader);

    procedure InternalReadSmallBlob(SessionID: TMYLDBSessionID;
            BlobCache: PMYLDBDiskBLOBCache; PageItemID: TMYLDBPageItemID);
    procedure InternalReadLargeBlob(SessionID: TMYLDBSessionID;
            BlobCache: PMYLDBDiskBLOBCache; PageItemID: TMYLDBPageItemID);
    function IsProbablyLargeBlob(SessionID: TMYLDBSessionID;
                                 PageItemID: TMYLDBPageItemID): Boolean;
    procedure InternalReadBlob(SessionID: TMYLDBSessionID;
            BlobCache: PMYLDBDiskBLOBCache; PageItemID: TMYLDBPageItemID);

    procedure InternalWriteSmallBlob(SessionID: TMYLDBSessionID;
            BlobCache: PMYLDBDiskBLOBCache; var PageItemID: TMYLDBPageItemID);
    procedure InternalWriteLargeBlob(SessionID: TMYLDBSessionID;
            BlobCache: PMYLDBDiskBLOBCache; var PageItemID: TMYLDBPageItemID);
    function IsSmallBlob(BlobSize: Int64): Boolean;
    procedure InternalWriteBlob(SessionID: TMYLDBSessionID;
            BlobCache: PMYLDBDiskBLOBCache; var PageItemID: TMYLDBPageItemID);

    procedure InternalDeleteSmallBlob(SessionID: TMYLDBSessionID;
                                 var PageItemID: TMYLDBPageItemID);
    procedure InternalDeleteLargeBlob(SessionID: TMYLDBSessionID;
                                 var PageItemID: TMYLDBPageItemID);
    procedure InternalDeleteBlob(SessionID: TMYLDBSessionID;
                                 var PageItemID: TMYLDBPageItemID);

   public
    constructor Create(PageManager: TMYLDBPageManager;
       FieldManager: TMYLDBBaseFieldManager; RecordManager: TMYLDBBaseRecordManager);
    destructor Destroy; override;
    procedure LoadMetadata(Stream: TStream);
    procedure SaveMetadata(Stream: TStream);
    procedure CreateBlobPageIndex;

    procedure Empty(SessionID: TMYLDBSessionID);
    procedure Delete(SessionID: TMYLDBSessionID);

    // RecordBuffer <-> disk pages
    procedure ReadBlob(SessionID: TMYLDBSessionID; RecordBuffer: TMYLDBRecordBuffer;
                       FieldNo: Integer);
    procedure WriteBlob(SessionID: TMYLDBSessionID; RecordBuffer: TMYLDBRecordBuffer;
                        FieldNo: Integer);
    procedure WriteBlobs(SessionID: TMYLDBSessionID; RecordBuffer: TMYLDBRecordBuffer);
    procedure DeleteBlob(SessionID: TMYLDBSessionID; RecordBuffer: TMYLDBRecordBuffer;
                        FieldNo: Integer);
    procedure DeleteBlobs(SessionID: TMYLDBSessionID; RecordBuffer: TMYLDBRecordBuffer);

    // Blob stream <-> RecordBuffer
    procedure CopyBlobFromRecordBufferToStream(SessionID: TMYLDBSessionID;
        RecordBuffer: TMYLDBRecordBuffer; FieldNo: Integer;
        var BLOBDescriptor: TMYLDBBLOBDescriptor; Stream: TStream);
    procedure CopyBlobFromStreamToRecordBuffer(RecordBuffer: TMYLDBRecordBuffer;
                        FieldNo: Integer; Stream: TMYLDBStream);
    procedure ClearBlobInRecordBuffer(RecordBuffer: TMYLDBRecordBuffer; FieldNo: Integer; ForceClear: Boolean = False);

    // RecordBuffer <-> Direct Blob Info (descriptor + binary data)
    procedure GetDirectBlobInfoFromRecordBuffer(SessionID: TMYLDBSessionID;
        RecordBuffer: TMYLDBRecordBuffer; FieldNo: Integer;
        var BLOBDescriptor: TMYLDBPartialTemporaryBLOBDescriptor;
        var pBlobData: PChar);
    procedure SetDirectBlobInfoFromRecordBuffer(SessionID: TMYLDBSessionID;
        RecordBuffer: TMYLDBRecordBuffer; FieldNo: Integer;
        var BLOBDescriptor: TMYLDBPartialTemporaryBLOBDescriptor;
        var pBlobData: PChar);


  end;// TMYLDBDiskBlobManager




////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBDiskTableData
//
////////////////////////////////////////////////////////////////////////////////


  TMYLDBDiskTableData = class (TMYLDBTableData)
   private
    FTableID:                TMYLDBTableID;
    FTableLocksFile:         TMYLDBTableLocksFile;
    FTableMetadataFile:      TMYLDBInternalDbTransactedAccessFile;
    FTableMostUpdatedFile:   TMYLDBInternalDbTransactedAccessFile;
    FBlobManager:            TMYLDBDiskBlobManager;
    FTemporaryPageManager:   TMYLDBPageManager;
    FExclusive:              Boolean;
    FIsChangingTableList:    Boolean;
    FLastUsedTableState:     Integer;

    procedure CreateTableFiles;
    procedure DeleteTableFiles;
    procedure OpenTableFiles(MetadataFilePageNo: TMYLDBPageNo;
                             MostUpdatedFilePageNo: TMYLDBPageNo;
                             LocksFilePageNo: TMYLDBPageNo);
    procedure FreeTableFiles;
    procedure LoadMetadataFile(SessionID: TMYLDBSessionID);
    procedure SaveMetadataFile(SessionID: TMYLDBSessionID);
    procedure SaveMostUpdated(SessionID: TMYLDBSessionID);
  public
    procedure LoadMostUpdated(SessionID: TMYLDBSessionID);
  private
    function GetDiskRecordBufferSize: Integer;
    procedure RebuildRecordPageIndex(SessionID: TMYLDBSessionID);
    procedure ValidateAndRepairMostUpdatedAndRecordPageIndex(Cursor: TMYLDBCursor);
    procedure ValidateRecordPageIndex(Cursor: TMYLDBCursor);

   protected
    // return filter bitmap rec count
    function GetBitmapRecordCount(SessionID: TMYLDBSessionID): TMYLDBRecordNo; override;
    // return filter bitmap rec no by record id
    function GetBitmapRecNoByRecordID(RecordID: TMYLDBRecordID): TMYLDBRecordNo; override;
    // return filter bitmap rec no by record id
    function GetRecordIDByBitmapRecNo(RecordNo: TMYLDBRecordNo): TMYLDBRecordID; override;

    procedure CreateRecordManager; override;
    procedure CreateBlobManager;
    procedure CreateFieldManager(FieldDefs: TMYLDBFieldDefs); override;
    procedure CreateIndexManager(IndexDefs: TMYLDBIndexDefs); override;
    procedure CreateConstraintManager(ConstraintDefs: TMYLDBConstraintDefs); override;


   public
    constructor Create(aDatabaseData: TMYLDBDatabaseData);
    destructor Destroy; override;
    procedure FreeIfNoCursorsConnected;

    procedure ApplyChanges(SessionID: TMYLDBSessionID; InTransaction: Boolean); override;
    procedure CancelChanges(SessionID: TMYLDBSessionID; InTransaction: Boolean); override;

    procedure CreateTable(
                          Cursor: TMYLDBCursor;
                          FieldDefs: TMYLDBFieldDefs;
                          IndexDefs: TMYLDBIndexDefs;
                          ConstraintDefs: TMYLDBConstraintDefs
                         ); override;
    procedure DeleteTable(Cursor: TMYLDBCursor; DesignMode: Boolean = False); override;
    procedure EmptyTable(Cursor: TMYLDBCursor); override;
    procedure RenameTable(NewTableName: String; Cursor: TMYLDBCursor); override;
    procedure OpenTable(Cursor: TMYLDBCursor); override;
    procedure CloseTable(Cursor: TMYLDBCursor); override;

    procedure RenameField(FieldName, NewFieldName: String); override;

    procedure AddIndex(IndexDef: TMYLDBIndexDef; Cursor: TMYLDBCursor); override;
    procedure DeleteIndex(IndexID: TMYLDBObjectID; Cursor: TMYLDBCursor); override;

    //---------------------------------------------------------------------------
    // BLOB methods
    //---------------------------------------------------------------------------
    procedure WriteBLOBFieldToRecordBuffer(
              Cursor:     TMYLDBCursor;
              FieldNo:    Integer;
              BLOBStream: TMYLDBStream
              ); override;

    procedure ClearBLOBFieldInRecordBuffer(
              RecordBuffer: TMYLDBRecordBuffer;
              FieldNo:    Integer
              ); override;

    procedure ClearModifiedBLOBFieldsInRecordBuffer(RecordBuffer: TMYLDBRecordBuffer);

    function InternalCreateBlobStream(
              Cursor:   TMYLDBCursor;
              ToInsert: Boolean;
              FieldNo:  Integer;
              OpenMode: TMYLDBBLOBOpenMode
              ): TMYLDBStream; override;

    procedure GetDirectBlobData(
              Cursor:     TMYLDBCursor;
              FieldNo:    Integer;
              RecordBuffer: TMYLDBRecordBuffer;
              var BLOBDescriptor: TMYLDBPartialTemporaryBLOBDescriptor;
              var pBlobData: PChar); override;

    procedure SetDirectBlobData(
              Cursor:     TMYLDBCursor;
              FieldNo:    Integer;
              RecordBuffer: TMYLDBRecordBuffer;
              var BLOBDescriptor: TMYLDBPartialTemporaryBLOBDescriptor;
              var pBlobData: PChar); override;

    procedure FreeDirectBlobData(
              Cursor:     TMYLDBCursor;
              FieldNo:    Integer;
              RecordBuffer: TMYLDBRecordBuffer;
              var BLOBDescriptor: TMYLDBPartialTemporaryBLOBDescriptor;
              var pBlobData: PChar); override;

    function InsertRecord(var Cursor: TMYLDBCursor): Boolean; override;
    function DeleteRecord(Cursor: TMYLDBCursor): Boolean; override;
    function UpdateRecord(Cursor: TMYLDBCursor): Boolean; override;

    procedure ClearBlobsCacheInRecordBuffer(Buffer: TMYLDBRecordBuffer); override;
    function GetRecordBuffer(
                              Cursor:         TMYLDBCursor;
                              GetRecordMode:  TMYLDBGetRecordMode
                            ): TMYLDBGetRecordResult; override;
    function Locate(Cursor: TMYLDBCursor; SearchExpression: TMYLDBExpression): Boolean; override;
    function FindKey(Cursor: TMYLDBCursor; SearchCondition: TMYLDBSearchCondition): Boolean; override;
    procedure SetRecNo(Cursor: TMYLDBCursor; RecNo: TMYLDBRecordNo); override;
    function GetRecNo(Cursor: TMYLDBCursor): TMYLDBRecordNo; override;
    function InternalGetRecordCount(Cursor: TMYLDBCursor): TMYLDBRecordNo; override;
    // move cursor to specified position and set current record id in cursor
    procedure InternalSetRecNo(Cursor: TMYLDBCursor; RecNo: TMYLDBRecordNo); override;
    // get current record position from cursor
    function InternalGetRecNo(Cursor: TMYLDBCursor): TMYLDBRecordNo; override;

    function LastAutoincValue(FieldNo: Integer; Session: TMYLDBBaseSession): Int64; override;

    procedure Rollback(SessionID: TMYLDBSessionID); override;

    // locking
    function LockTable(SessionID: TMYLDBSessionID; LockType: TMYLDBLockType;
                       TryCount, Delay: Integer;
                       AllowXIRWAfterSIRW: Boolean = True): Boolean;
    function UnlockTable(SessionID: TMYLDBSessionID; LockType: TMYLDBLockType; IgnoreIfNoLock: Boolean=False): Boolean;
    function LockRecord(SessionID: TMYLDBSessionID; RecordID: TMYLDBRecordID;
                        TryCount, Delay: Integer): Boolean;
    function UnlockRecord(SessionID: TMYLDBSessionID; RecordID: TMYLDBRecordID): Boolean;

  end; // TMYLDBDiskTableData


////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBDatabaseFile
//
////////////////////////////////////////////////////////////////////////////////

  TMYLDBDatabaseFile = class(TObject)
   private
    FFileName:  String;

    FAccessMode:  TMYLDBAccessMode;
    FShareMode:   TMYLDBShareMode;
    FAttrFlags:   DWORD;

    FHandle:      THandle;
    FIsOpened:  Boolean;
    DesignOpenCount:  Integer;
    FWasCriticalError: Boolean;
   private
    function AccessModeToWindowsMode(am: TMYLDBAccessMode): DWORD;
    function ShareModeToWindowsMode(sm: TMYLDBShareMode): DWORD;

    // if file closed then raise
    procedure CheckOpened(OperationName: String);
    // if file opened then raise
    procedure CheckClosed(OperationName: String);
    // Seek
    function InternalSeek(Offset: Int64): Boolean;
    procedure Seek(Offset: Int64; ErrorCode: Integer = 0);

    procedure SetPosition(Offset: Int64);
    function  GetPosition: Int64;

    procedure SetSize(NewSize: Int64);
    function  GetSize: Int64;
   public
    // Constructor
    constructor Create;
    // Destructor
    destructor Destroy; override;

    // Create and Open File
    procedure CreateAndOpenFile(FileName: String);
    // Delete File
    procedure DeleteFile(FileName: String);
    // Rename Closed File
    procedure RenameFile(OldFileName, NewFileName: String);

    // Open File
    procedure OpenFile(FileName: String; AccessMode: TMYLDBAccessMode; ShareMode: TMYLDBShareMode);
    // Close File
    procedure CloseFile;
    procedure OpenFileForDesignTime;
    procedure CloseFileForDesignTime;
    // if connection to the network file is lost, try to reopen it
    function ReopenDatabaseFile: Boolean;

    // Read Buffer
    procedure ReadBuffer(var Buffer; const Count: Int64; const Position: Int64; ErrorCode: Integer); overload;
    function ReadBuffer(var Buffer; const Count: Int64; const Position: Int64): Boolean; overload;
    // Write Buffer
    procedure WriteBuffer(const Buffer; const Count: Int64; const Position: Int64; ErrorCode: Integer);
    // Flush Buffers
    procedure FlushFileBuffers;

    // Lock Byte (return TRUE if success)
    function LockByte(Offset: Int64; Count: Integer = 1): Boolean;
    // Unlock Byte
    function UnlockByte(Offset: Int64; Count: Integer = 1): Boolean;
    // return TRUE if byte Locked
    function IsByteLocked(Offset: Int64): Boolean;
    // return FALSE if any byte of region is locked
    function IsRegionLocked(Offset: Int64; Count: Integer): Boolean;
    // find signature
    function FindSignature(var Offset: Int64): Boolean;
   public
    property FileName: String read FFileName;
    property Size: Int64 read GetSize write SetSize;
    property IsOpened: Boolean read FIsOpened;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -