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

📄 absbase.pas

📁 Absolute Database 是来替代BDE[Borland数据库引擎]的用于Delphi 和 C++ Builder 开发用的数据库引擎. 它小巧, 高速, 健壮, 易于使用. 它能直接编译进
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  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 + -