?? myldbbase.pas
字號:
property IndexObjectID: TMYLDBObjectID read FIndexObjectID write FIndexObjectID;
end;//TMYLDBConstraintDefUnique
TMYLDBConstraintDefPrimary = class (TMYLDBConstraintDefUnique)
public
constructor Create;
end;//TMYLDBConstraintDefPrimary
////////////////////////////////////////////////////////////////////////////////
//
// Meta Objects Defs
//
////////////////////////////////////////////////////////////////////////////////
TMYLDBMetaObjectDefs = class(TObject)
protected
FDefsList: TMYLDBSortedStringPtrArray;
FLoadedItemCount: Integer;
private
function GetCount: Integer; virtual;
function GetDef(Index: Integer): TMYLDBMetaObjectDef;
procedure SetDef(Index: Integer; Value: TMYLDBMetaObjectDef);
procedure Add(MetaObjectDef: TMYLDBMetaObjectDef); virtual;
function InternalAddCreated: TMYLDBMetaObjectDef; virtual;
public
procedure LoadFromStream(Stream: TStream); virtual;
procedure SaveToStream(Stream: TStream); virtual;
constructor Create;
destructor Destroy; override;
procedure Assign(Source: TMYLDBMetaObjectDefs); virtual;
procedure Delete(Index: Integer); virtual;
procedure Insert(Index: Integer; MetaObjectDef: TMYLDBMetaObjectDef); virtual;
procedure Move(CurIndex, NewIndex: Integer); virtual;
procedure Clear; virtual;
function GetDefNumberByName(Name: String): Integer;
function GetDefByName(Name: String): TMYLDBMetaObjectDef;
function GetDefNumberByObjectId(id: TMYLDBObjectID): Integer;
function GetDefByObjectId(id: TMYLDBObjectID): TMYLDBMetaObjectDef;
public
property Count: Integer read GetCount;
property Items[Index: Integer]: TMYLDBMetaObjectDef read GetDef write SetDef; default;
end;
////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBIndexDefs
//
////////////////////////////////////////////////////////////////////////////////
TMYLDBIndexDefs = class(TMYLDBMetaObjectDefs)
private
function GetIndexDef(Index: Integer): TMYLDBIndexDef; virtual;
procedure SetIndexDef(Index: Integer; Value: TMYLDBIndexDef); virtual;
function InternalAddCreated: TMYLDBMetaObjectDef; override;
public
// AscDesc and CaseSensitivity lists should contain constants MYLDB_ASC, MYLDB_DESC, MYLDB_NO_CASE, MYLDB_CASE
function IsIndexExists(FieldNames, AscDescList, CaseSensitivityList: TStringList;
SessionID: TMYLDBSessionID;
FieldDefs: TMYLDBFieldDefs): Boolean;
function FindIndex(FieldNames, AscDescList, CaseSensitivityList: TStringList;
SessionID: TMYLDBSessionID; FieldDefs: TMYLDBFieldDefs): TMYLDBObjectID;
function AddCreated: TMYLDBIndexDef;
function GetIndexDefByName(Name: String): TMYLDBIndexDef;
procedure LoadFromStream(Stream: TStream); override;
procedure SaveToStream(Stream: TStream); override;
public
property Items[Index: Integer]: TMYLDBIndexDef read GetIndexDef write SetIndexDef; default;
end;
////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBFieldDefs
//
////////////////////////////////////////////////////////////////////////////////
TMYLDBFieldDefs = class(TMYLDBMetaObjectDefs)
private
function GetDef(Index: Integer): TMYLDBFieldDef;
procedure SetDef(Index: Integer; Value: TMYLDBFieldDef);
function InternalAddCreated: TMYLDBMetaObjectDef; override;
public
function AddCreated: TMYLDBFieldDef;
function GetFieldDefByName(Name: String): TMYLDBFieldDef;
procedure RecalcFieldOffsets; virtual;
function GetMemoryRecordBufferSize: Integer;
function GetDiskRecordBufferSize: Integer;
procedure LoadFromStream(Stream: TStream); override;
procedure SaveToStream(Stream: TStream); override;
public
property Items[Index: Integer]: TMYLDBFieldDef read GetDef write SetDef; default;
end;//TMYLDBFieldDefs
////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBConstraintDefs
//
////////////////////////////////////////////////////////////////////////////////
TMYLDBConstraintDefs = class(TMYLDBMetaObjectDefs)
private
function GetDef(Index: Integer): TMYLDBConstraintDef;
procedure SetDef(Index: Integer; Value: TMYLDBConstraintDef);
public
procedure Assign(Source: TMYLDBMetaObjectDefs); override;
// Create TMYLDBConstraintDefNotNull and add it into list
function AddNotNull: TMYLDBConstraintDefNotNull;
// Create TMYLDBConstraintDefCheck and add it into list
function AddCheck: TMYLDBConstraintDefCheck;
function AddPK: TMYLDBConstraintDefPrimary;
function AddUnique: TMYLDBConstraintDefUnique;
procedure LoadFromStream(Stream: TStream); override;
procedure SaveToStream(Stream: TStream); override;
public
property Items[Index: Integer]: TMYLDBConstraintDef read GetDef write SetDef; default;
end;//TMYLDBConstraintDefs
TMYLDBRestructureInfo = record
FRestructureBLOBCompression: TMYLDBCompression;
//FRestructurePassword: TMYLDBPassword;
FRestructureFieldDefs: TMYLDBFieldDefs;
FRestructureIndexDefs: TMYLDBIndexDefs;
FRestructureConstraintDefs: TMYLDBConstraintDefs;
end;
////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBCursor
//
////////////////////////////////////////////////////////////////////////////////
TMYLDBCursor = class (TObject)
public
FSettingProjection: Boolean;
FTableName: String;
FIndexName: String;
FIndexID: TMYLDBObjectID;
FReadOnly: Boolean;
FExclusive: Boolean;
FInMemory: Boolean;
FTemporary: Boolean;
FSession: TMYLDBBaseSession;
FIsOpen: Boolean;
FPhysicalOrder: Boolean;
FCurrentRecordPositionInIndex: TMYLDBIndexPosition;
// current record buffer
FCurrentRecordBuffer: TMYLDBRecordBuffer;
// distinct
FDistinctRecordBuffer: TMYLDBRecordBuffer;
// buffer with original record, stored on InternalEdit by TMYLDBDataset
FEditRecordBuffer: TMYLDBRecordBuffer;
FPassword: TMYLDBPassword;
FConstraintDefs: TMYLDBConstraintDefs;
FBLOBCompression: TMYLDBCompression;
FFieldDefs: TMYLDBFieldDefs;
FVisibleFieldDefs: TMYLDBFieldDefs; // visible fields (projection)
FIndexDefs: TMYLDBIndexDefs;
FBLOBStreams: TList;
FRecordBitmap: Pointer;
FIndexPositionCache: TMYLDBIndexPositionCache;
FTableLockedByCursor: Boolean;
FBatchUpdate: Boolean;
FDisableTempFiles: Boolean;
FIsRepairing: Boolean;
private
// BLOBS will be stored as 6 bytes reference:
// DiskEngine: 4 bytes PAGEID, 2 bytes ObjectID
// TemporaryEngine: 4 bytes pointer to BLOBDescriptor record, 2 bytes not used
// MemoryEngine: 4 bytes pointer to BLOBCompressedStream, 2 bytes not used
// Record Buffer sizes and offsets:
// + FieldValuesOffset
// + BookmarOffset
// + CalculatedFieldsOffset
// +------------+--------------------+----------+-----------------+
// | Null Flags | Field Values, | Bookmark | Calculated and |
// | | References To BLOB | Bookmark | Lookup Fields |
// +------------+--------------------+----------+-----------------+
// + RecordSize
// + RecordBufferSize
// Key buffer:
// + KeyBufferSize
// + KeyOffset
// +------------+--------------------+---------------+
// | Null Flags | Field Values, | TMYLDBKeyBuffer |
// | | References To BLOB | |
// +------------+--------------------+---------------+
FErrorCode: TMYLDBErrorCode;
FErrorMessage: String;
FIsDesignMode: Boolean;
FRecordBufferSize: Integer;
FRecordSize: Integer;
FKeyBufferSize: Integer;
FKeyOffset: Integer;
FKeyFieldCount: Integer;
FFieldValuesOffset: Integer;
FCalculatedFieldsOffset: Integer;
FBookmarkOffset: Integer;
FFilterExpression: Pointer;
FSQLFilterExpression: Pointer;
FKeyBuffer: TMYLDBRecordBuffer;
FRangeStartBuffer: TMYLDBRecordBuffer;
FRangeEndBuffer: TMYLDBRecordBuffer;
FRangeStartExclusive: Boolean;
FRangeEndExclusive: Boolean;
FRangeStartKeyFieldCount: Integer;
FRangeEndKeyFieldCount: Integer;
FDistinctFieldCount: Integer;
protected
procedure SetIndexName(Value: String);
public
property RecordBufferSize: Integer read FRecordBufferSize write FRecordBufferSize;
property RecordSize: Integer read FRecordSize write FRecordSize;
property FieldValuesOffset: Integer read FFieldValuesOffset write FFieldValuesOffset;
property CalculatedFieldsOffset: Integer read FCalculatedFieldsOffset write FCalculatedFieldsOffset;
property BookmarkOffset: Integer read FBookmarkOffset write FBookmarkOffset;
property KeyOffset: Integer read FKeyOffset write FKeyOffset;
property KeyBufferSize: Integer read FKeyBufferSize write FKeyBufferSize;
public
// table operations
procedure CreateTable(
FieldDefs: TMYLDBFieldDefs;
IndexDefs: TMYLDBIndexDefs;
ConstraintDefs: TMYLDBConstraintDefs
); virtual; abstract;
procedure DeleteTable; virtual; abstract;
procedure EmptyTable; virtual; abstract;
procedure RenameTable(NewTableName: String); virtual; abstract;
procedure InternalInitFieldDefs; virtual; abstract;
procedure OpenTableByFieldDefs(
FieldDefs: TMYLDBFieldDefs;
IndexDefs: TMYLDBIndexDefs;
ConstraintDefs: TMYLDBConstraintDefs
); virtual; abstract;
procedure CloseTable; virtual; abstract;
procedure LockTableData; virtual; abstract;
procedure UnlockTableData; virtual; abstract;
function LockTable(LockType: TMYLDBLockType; TryCount, Delay: Integer; AllowXIRWAfterSIRW: Boolean = True): Boolean; virtual; abstract;
function UnlockTable(LockType: TMYLDBLockType; IgnoreIfNoLock: Boolean=False): Boolean; virtual; abstract;
// Rename Field by Field Index in FieldDefs
procedure RenameField(FieldName, NewFieldName: String); virtual;
// index operations
function GetIndexDefs: TMYLDBIndexDefs; virtual;
procedure AddIndex(IndexDef: TMYLDBIndexDef); virtual; abstract;
procedure DeleteIndex(Name: String); virtual; abstract;
procedure DeleteAllIndexes; virtual; abstract;
// return index name
function FindOrCreateIndex(FieldNamesList,
AscDescList, CaseSensitivityList: TStringList; var IsCreated: Boolean): String; virtual; abstract;
function IndexExists(FieldNamesList, AscDescList, CaseSensitivityList: TStringList): Boolean; virtual; abstract;
// check field value and if not null move data from RecordBuffer to Buffer
function GetFieldData(
FieldNo: Integer; // field no
Buffer: Pointer; // buffer
RecordBuffer: TMYLDBRecordBuffer // record buffer
): Boolean;
// set field data from Buffer to RecordBuffer
procedure SetFieldData(
FieldNo: Integer;
Buffer: Pointer;
RecordBuffer: TMYLDBRecordBuffer // record buffer
);
// clear garbage after the end of strings in record buffer
procedure ClearStringFieldsGarbage(RecordBuffer: TMYLDBRecordBuffer);
procedure GetFieldValue(Value: TMYLDBVariant; FieldNo: Integer; DirectAccess: Boolean);
procedure SetFieldValue(
Value: TMYLDBVariant;
FieldNo: Integer;
DirectAccess: Boolean;
RecordBuffer: TMYLDBRecordBuffer = nil
);
procedure CopyFieldValue(SrcFieldNo: Integer;
DirectAccess: Boolean;
DestFieldNo: Integer;
DestCursor: TMYLDBCursor); virtual; abstract;
// allocate record buffer and set null flags
function AllocateRecordBuffer: TMYLDBRecordBuffer;
// initialize record buffer
procedure InternalInitRecord(RecordBuffer: TMYLDBRecordBuffer; InsertMode: Boolean); virtual; abstract;
// free record buffer
procedure FreeRecordBuffer(var Buffer: TMYLDBRecordBuffer); virtual;
// allocate record buffer and set null flags
function AllocateKeyRecordBuffer: TMYLDBRecordBuffer;
// initialize record buffer
procedure InternalInitKeyBuffer(RecordBuffer: TMYLDBRecordBuffer);
//---------------------------------------------------------------------------
// navigation & bookmark methods
//---------------------------------------------------------------------------
function GetRecordCount: TMYLDBRecordNo; virtual; abstract;
// get record
function GetRecordBuffer(
GetRecordMode: TMYLDBGetRecordMode
): TMYLDBGetRecordResult; virtual; abstract;
// go to record
procedure SetRecNo(Value: Int64); virtual; abstract;
// return current record number
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -