📄 absbase.pas
字号:
TABSConstraintDefPrimary = class (TABSConstraintDefUnique)
public
constructor Create;
end;//TABSConstraintDefPrimary
////////////////////////////////////////////////////////////////////////////////
//
// Meta Objects Defs
//
////////////////////////////////////////////////////////////////////////////////
TABSMetaObjectDefs = class(TObject)
protected
FDefsList: TABSSortedStringPtrArray;
FLoadedItemCount: Integer;
private
function GetCount: Integer; virtual;
function GetDef(Index: Integer): TABSMetaObjectDef;
procedure SetDef(Index: Integer; Value: TABSMetaObjectDef);
procedure Add(MetaObjectDef: TABSMetaObjectDef); virtual;
function InternalAddCreated: TABSMetaObjectDef; virtual;
public
procedure LoadFromStream(Stream: TStream); virtual;
procedure SaveToStream(Stream: TStream); virtual;
constructor Create;
destructor Destroy; override;
procedure Assign(Source: TABSMetaObjectDefs); virtual;
procedure Delete(Index: Integer); virtual;
procedure Insert(Index: Integer; MetaObjectDef: TABSMetaObjectDef); virtual;
procedure Move(CurIndex, NewIndex: Integer); virtual;
procedure Clear; virtual;
function GetDefNumberByName(Name: String): Integer;
function GetDefByName(Name: String): TABSMetaObjectDef;
function GetDefNumberByObjectId(id: TABSObjectID): Integer;
function GetDefByObjectId(id: TABSObjectID): TABSMetaObjectDef;
public
property Count: Integer read GetCount;
property Items[Index: Integer]: TABSMetaObjectDef read GetDef write SetDef; default;
end;
////////////////////////////////////////////////////////////////////////////////
//
// TABSIndexDefs
//
////////////////////////////////////////////////////////////////////////////////
TABSIndexDefs = class(TABSMetaObjectDefs)
private
function GetIndexDef(Index: Integer): TABSIndexDef; virtual;
procedure SetIndexDef(Index: Integer; Value: TABSIndexDef); virtual;
function InternalAddCreated: TABSMetaObjectDef; override;
public
// AscDesc and CaseSensitivity lists should contain constants ABS_ASC, ABS_DESC, ABS_NO_CASE, ABS_CASE
function IsIndexExists(FieldNames, AscDescList, CaseSensitivityList: TStringList;
SessionID: TABSSessionID;
FieldDefs: TABSFieldDefs): Boolean;
function FindIndex(FieldNames, AscDescList, CaseSensitivityList: TStringList;
SessionID: TABSSessionID; FieldDefs: TABSFieldDefs): TABSObjectID;
function AddCreated: TABSIndexDef;
function GetIndexDefByName(Name: String): TABSIndexDef;
procedure LoadFromStream(Stream: TStream); override;
procedure SaveToStream(Stream: TStream); override;
public
property Items[Index: Integer]: TABSIndexDef read GetIndexDef write SetIndexDef; default;
end;
////////////////////////////////////////////////////////////////////////////////
//
// TABSFieldDefs
//
////////////////////////////////////////////////////////////////////////////////
TABSFieldDefs = class(TABSMetaObjectDefs)
private
function GetDef(Index: Integer): TABSFieldDef;
procedure SetDef(Index: Integer; Value: TABSFieldDef);
function InternalAddCreated: TABSMetaObjectDef; override;
public
function AddCreated: TABSFieldDef;
function GetFieldDefByName(Name: String): TABSFieldDef;
procedure RecalcFieldOffsets; virtual;
function GetMemoryRecordBufferSize: Integer;
function GetDiskRecordBufferSize: Integer;
procedure LoadFromStream(Stream: TStream); override;
procedure SaveToStream(Stream: TStream); override;
public
property Items[Index: Integer]: TABSFieldDef read GetDef write SetDef; default;
end;//TABSFieldDefs
////////////////////////////////////////////////////////////////////////////////
//
// TABSConstraintDefs
//
////////////////////////////////////////////////////////////////////////////////
TABSConstraintDefs = class(TABSMetaObjectDefs)
private
function GetDef(Index: Integer): TABSConstraintDef;
procedure SetDef(Index: Integer; Value: TABSConstraintDef);
public
procedure Assign(Source: TABSMetaObjectDefs); override;
// Create TABSConstraintDefNotNull and add it into list
function AddNotNull: TABSConstraintDefNotNull;
// Create TABSConstraintDefCheck and add it into list
function AddCheck: TABSConstraintDefCheck;
function AddPK: TABSConstraintDefPrimary;
function AddUnique: TABSConstraintDefUnique;
procedure LoadFromStream(Stream: TStream); override;
procedure SaveToStream(Stream: TStream); override;
public
property Items[Index: Integer]: TABSConstraintDef read GetDef write SetDef; default;
end;//TABSConstraintDefs
TABSRestructureInfo = record
FRestructureBLOBCompression: TABSCompression;
//FRestructurePassword: TABSPassword;
FRestructureFieldDefs: TABSFieldDefs;
FRestructureIndexDefs: TABSIndexDefs;
FRestructureConstraintDefs: TABSConstraintDefs;
end;
////////////////////////////////////////////////////////////////////////////////
//
// TABSCursor
//
////////////////////////////////////////////////////////////////////////////////
TABSCursor = class (TObject)
public
FSettingProjection: Boolean;
FTableName: String;
FIndexName: String;
FIndexID: TABSObjectID;
FReadOnly: Boolean;
FExclusive: Boolean;
FInMemory: Boolean;
FTemporary: Boolean;
FSession: TABSBaseSession;
FIsOpen: Boolean;
FPhysicalOrder: Boolean;
FCurrentRecordPositionInIndex: TABSIndexPosition;
// current record buffer
FCurrentRecordBuffer: TABSRecordBuffer;
// distinct
FDistinctRecordBuffer: TABSRecordBuffer;
// buffer with original record, stored on InternalEdit by TABSDataset
FEditRecordBuffer: TABSRecordBuffer;
FPassword: TABSPassword;
FConstraintDefs: TABSConstraintDefs;
FBLOBCompression: TABSCompression;
FFieldDefs: TABSFieldDefs;
FVisibleFieldDefs: TABSFieldDefs; // visible fields (projection)
FIndexDefs: TABSIndexDefs;
FBLOBStreams: TList;
FRecordBitmap: Pointer;
FIndexPositionCache: TABSIndexPositionCache;
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, | TABSKeyBuffer |
// | | References To BLOB | |
// +------------+--------------------+---------------+
FErrorCode: TABSErrorCode;
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: TABSRecordBuffer;
FRangeStartBuffer: TABSRecordBuffer;
FRangeEndBuffer: TABSRecordBuffer;
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: TABSFieldDefs;
IndexDefs: TABSIndexDefs;
ConstraintDefs: TABSConstraintDefs
); virtual; abstract;
procedure DeleteTable; virtual; abstract;
procedure EmptyTable; virtual; abstract;
procedure RenameTable(NewTableName: String); virtual; abstract;
procedure InternalInitFieldDefs; virtual; abstract;
procedure OpenTableByFieldDefs(
FieldDefs: TABSFieldDefs;
IndexDefs: TABSIndexDefs;
ConstraintDefs: TABSConstraintDefs
); virtual; abstract;
procedure CloseTable; virtual; abstract;
procedure LockTableData; virtual; abstract;
procedure UnlockTableData; virtual; abstract;
function LockTable(LockType: TABSLockType; TryCount, Delay: Integer; AllowXIRWAfterSIRW: Boolean = True): Boolean; virtual; abstract;
function UnlockTable(LockType: TABSLockType; IgnoreIfNoLock: Boolean=False): Boolean; virtual; abstract;
// Rename Field by Field Index in FieldDefs
procedure RenameField(FieldName, NewFieldName: String); virtual;
// index operations
function GetIndexDefs: TABSIndexDefs; virtual;
procedure AddIndex(IndexDef: TABSIndexDef); 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: TABSRecordBuffer // record buffer
): Boolean;
// set field data from Buffer to RecordBuffer
procedure SetFieldData(
FieldNo: Integer;
Buffer: Pointer;
RecordBuffer: TABSRecordBuffer // record buffer
);
// clear garbage after the end of strings in record buffer
procedure ClearStringFieldsGarbage(RecordBuffer: TABSRecordBuffer);
procedure GetFieldValue(Value: TABSVariant; FieldNo: Integer; DirectAccess: Boolean);
procedure SetFieldValue(
Value: TABSVariant;
FieldNo: Integer;
DirectAccess: Boolean;
RecordBuffer: TABSRecordBuffer = nil
);
procedure CopyFieldValue(SrcFieldNo: Integer;
DirectAccess: Boolean;
DestFieldNo: Integer;
DestCursor: TABSCursor); virtual; abstract;
// allocate record buffer and set null flags
function AllocateRecordBuffer: TABSRecordBuffer;
// initialize record buffer
procedure InternalInitRecord(RecordBuffer: TABSRecordBuffer; InsertMode: Boolean); virtual; abstract;
// free record buffer
procedure FreeRecordBuffer(var Buffer: TABSRecordBuffer); virtual;
// allocate record buffer and set null flags
function AllocateKeyRecordBuffer: TABSRecordBuffer;
// initialize record buffer
procedure InternalInitKeyBuffer(RecordBuffer: TABSRecordBuffer);
//---------------------------------------------------------------------------
// navigation & bookmark methods
//---------------------------------------------------------------------------
function GetRecordCount: TABSRecordNo; virtual; abstract;
// get record
function GetRecordBuffer(
GetRecordMode: TABSGetRecordMode
): TABSGetRecordResult; virtual; abstract;
// go to record
procedure SetRecNo(Value: Int64); virtual; abstract;
// return current record number
function GetRecNo: Int64; virtual; abstract;
// go to first record
procedure InternalFirst; virtual; abstract;
// go to last record
procedure InternalLast; virtual; abstract;
function SavePosition: Pointer;
procedure RestorePosition(Pos: Pointer);
procedure FreePosition(Pos: Pointer);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -