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

📄 myldbbase.pas

📁 一个本地database引擎,支持中文T_Sql查询,兼容DELPHI标准数据库控件
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    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

⌨️ 快捷键说明

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