?? myldbdiskengine.pas
字號:
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 + -