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

📄 myldbbaseengine.pas

📁 一个本地database引擎,支持中文T_Sql查询,兼容DELPHI标准数据库控件
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    procedure CreateDatabase; virtual;
    // create table data
    function CreateTableData(Cursor: TMYLDBCursor): TMYLDBTableData; virtual; abstract;
    // find table data
    function FindTableData(Cursor: TMYLDBCursor): TMYLDBTableData; virtual;
    // find or create table data
    function FindOrCreateTableData(Cursor: TMYLDBCursor): TMYLDBTableData; virtual;
    // get new ObjectId
    function GetNewObjectId: TMYLDBObjectID; virtual; abstract;

    procedure Commit(SessionID: TMYLDBSessionID; DoFlushBuffers: Boolean=True); virtual;
    procedure Rollback(SessionID: TMYLDBSessionID); virtual;
    procedure FlushBuffers; virtual;

   public
    property DatabaseName: String read FDatabaseName write FDatabaseName;
    property PageManager: TMYLDBPageManager read FPageManager write FPageManager;
    property ReadOnly: Boolean read FReadOnly write FReadOnly;
    property SessionList: TList read FSessionList;
    property MultiUser: Boolean read FMultiUser write FMultiUser;
    // 5.12
    property SessionName: string read FSessionName write FSessionName;
  end; // TMYLDBDatabaseData




////////////////////////////////////////////////////////////////////////////////
//
// General functions and procedures
//
////////////////////////////////////////////////////////////////////////////////


  procedure ShowErrorMessage(ErrorMessage: String);
  procedure ShowWarningMessage(WarningMessage: String);


  // return false if field value is null
  function GetFieldData(
            // field number in FieldDefs
            FieldNo: Integer;
            // field definitions
            FieldDefs: TMYLDBFieldDefs;
            // pointer to allocated buffer for storing field value
            Buffer: Pointer;
            // record buffer
            RecordBuffer: TMYLDBRecordBuffer
                       ): Boolean;

  // returns false if field value is null
  procedure SetFieldData(
            // physical field No
            FieldNo: Integer;
            // field definitions
            FieldDefs: TMYLDBFieldDefs;
            // pointer to allocated buffer with new field value
            Buffer: Pointer;
            // record buffer
            RecordBuffer: TMYLDBRecordBuffer
                        );

 // return true if record buffers are binary identical
 function CompareRecordBuffers(RecordBuffer1,RecordBuffer2: TMYLDBRecordBuffer;
                              RecordBufferSize: Integer): Boolean;


 var
  IsDesignMode:          Boolean;

implementation

uses

// MYLDBoluteDatabase units
     MYLDBMain,
     MYLDBBTree,
     MYLDBLocalEngine,
     MYLDBDiskEngine;



////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBBaseFieldManager
//
////////////////////////////////////////////////////////////////////////////////


//------------------------------------------------------------------------------
// GetNextAutoincVal
//------------------------------------------------------------------------------
function TMYLDBBaseFieldManager.GetNextAutoincVal(FieldNo: Integer): TMYLDBSequenceValue;
begin
  if (FieldNo >= FieldDefs.Count) then
    raise EMYLDBException.Create(30402, ErrorGFieldWithObjectIdNotFound, [FieldNo]);
  if (FieldNo >= Length(FLastAutoIncValues)) then
    raise EMYLDBException.Create(30403, ErrorGFieldWithObjectIdNotFound, [FieldNo]);

  if (FFieldDefs.Items[FieldNo].AutoincIncrement <> 0) then
    Inc(FLastAutoIncValues[FieldNo], FFieldDefs.Items[FieldNo].AutoincIncrement)
  else
    Inc(FLastAutoIncValues[FieldNo]);
  if ((FFieldDefs.Items[FieldNo].AutoincMaxValue <> 0) and
      (FLastAutoIncValues[FieldNo] > FFieldDefs.Items[FieldNo].AutoincMaxValue)) then
    if (FFieldDefs.Items[FieldNo].AutoincCycled) then
      FLastAutoIncValues[FieldNo] := FFieldDefs.Items[FieldNo].AutoincMinValue
    else
      raise EMYLDBException.Create(20160, ErrorAAutoincMaxValueExceeded, [FFieldDefs.Items[FieldNo].Name]);

  Result := FLastAutoIncValues[FieldNo];
end;//GetNextAutoincVal


//------------------------------------------------------------------------------
// Constructor
//------------------------------------------------------------------------------
constructor TMYLDBBaseFieldManager.Create(TableData: TMYLDBTableData);
begin
  FTableData := TableData;
  FFieldDefs := TMYLDBFieldDefs.Create;
end;//Create


//------------------------------------------------------------------------------
// Destructor
//------------------------------------------------------------------------------
destructor TMYLDBBaseFieldManager.Destroy;
begin
  FFieldDefs.Free;
end;//Destroy


//------------------------------------------------------------------------------
// load from stream
//------------------------------------------------------------------------------
procedure TMYLDBBaseFieldManager.LoadMetadata(Stream: TStream);
begin
 FieldDefs.LoadFromStream(Stream);
 RecalcFieldOffsets;
 InitLastAutoIncValues;
end; // LoadMetadata


//------------------------------------------------------------------------------
// save to stream
//------------------------------------------------------------------------------
procedure TMYLDBBaseFieldManager.SaveMetadata(Stream: TStream);
begin
 FieldDefs.SaveToStream(Stream);
end; // SaveMetadata


//------------------------------------------------------------------------------
// LoadMostUpdated
//------------------------------------------------------------------------------
procedure TMYLDBBaseFieldManager.LoadMostUpdated(Buf: PChar; var Offset: Integer);
var cnt,i: Integer;
begin
 cnt := PInteger(Buf+Offset)^;
 Inc(Offset, sizeof(Integer));
 SetLength(FLastAutoIncValues, cnt);
 for i:=0 to cnt-1 do
   begin
     FLastAutoIncValues[i] := PInt64(Buf+Offset)^;
     Inc(Offset, sizeof(Int64));
   end;
end;// LoadMostUpdated


//------------------------------------------------------------------------------
// SaveMostUpdated
//------------------------------------------------------------------------------
procedure TMYLDBBaseFieldManager.SaveMostUpdated(Buf: PChar; var Offset: Integer);
var cnt,i: Integer;
begin
 cnt := Length(FLastAutoIncValues);
 PInteger(Buf+Offset)^ := cnt;
 Inc(Offset, sizeof(Integer));
 for i:=0 to cnt-1 do
   begin
     PInt64(Buf+Offset)^ := FLastAutoIncValues[i];
     Inc(Offset, sizeof(Int64));
   end;
end;// SaveMostUpdated


//------------------------------------------------------------------------------
// RecalcFieldOffsets
//------------------------------------------------------------------------------
procedure TMYLDBBaseFieldManager.RecalcFieldOffsets;
begin
 FFieldDefs.RecalcFieldOffsets;
end;//RecalcFieldOffsets


//------------------------------------------------------------------------------
// InitLastAutoIncValues
//------------------------------------------------------------------------------
procedure TMYLDBBaseFieldManager.InitLastAutoIncValues;
var
  i: Integer;
begin
  SetLength(FLastAutoIncValues, FieldDefs.Count);
  for i:=0 to Length(FLastAutoIncValues)-1 do
    if (IsAutoincFieldType(FieldDefs.Items[i].AdvancedFieldType)) then
      FLastAutoIncValues[i] := FieldDefs.Items[i].AutoincInitialValue
    else
      FLastAutoIncValues[i] := 0;
end;// InitLastAutoIncValues


//------------------------------------------------------------------------------
// DiskRecordBufferToMemRecordBuffer
//------------------------------------------------------------------------------
procedure TMYLDBBaseFieldManager.DiskRecordBufferToMemRecordBuffer(DiskRecordBuffer, MemRecordBuffer: PChar);
var
  i: Integer;
  NullFlagsSize: Integer;
begin
  FillChar(MemRecordBuffer^, FFieldDefs.GetMemoryRecordBufferSize, #0);

  // move NULL flags
  NullFlagsSize := FFieldDefs.Count div 8;
  if ((FFieldDefs.Count mod 8) > 0) then
   Inc(NullFlagsSize);
  Move(DiskRecordBuffer^, MemRecordBuffer^, NullFlagsSize);

  // move fields
  for i:=0 to FFieldDefs.Count-1 do
    Move((DiskRecordBuffer+FFieldDefs[i].DiskOffset)^,
         (MemRecordBuffer+FFieldDefs[i].MemoryOffset)^,
         FFieldDefs[i].DiskDataSize);
end;// DiskRecordBufferToMemRecordBuffer


//------------------------------------------------------------------------------
// MemRecordBufferToDiskRecordBuffer
//------------------------------------------------------------------------------
procedure TMYLDBBaseFieldManager.MemRecordBufferToDiskRecordBuffer(MemRecordBuffer, DiskRecordBuffer: PChar);
var
  i: Integer;
  NullFlagsSize: Integer;
begin
  FillChar(DiskRecordBuffer^, FFieldDefs.GetDiskRecordBufferSize, #0);

  // move NULL flags
  NullFlagsSize := FFieldDefs.Count div 8;
  if ((FFieldDefs.Count mod 8) > 0) then
   Inc(NullFlagsSize);
  Move(MemRecordBuffer^, DiskRecordBuffer^, NullFlagsSize);

  // move fields
  for i:=0 to FFieldDefs.Count-1 do
    Move((MemRecordBuffer+FFieldDefs[i].MemoryOffset)^,
         (DiskRecordBuffer+FFieldDefs[i].DiskOffset)^,
         FFieldDefs[i].DiskDataSize);
end;// MemRecordBufferToDiskRecordBuffer


//------------------------------------------------------------------------------
// CompareRecordBuffers
//------------------------------------------------------------------------------
function TMYLDBBaseFieldManager.CompareRecordBuffers(RecordBuffer1,
                                     RecordBuffer2: TMYLDBRecordBuffer): Boolean;
var
  i: Integer;
  NullFlagsSize: Integer;
begin
  // compare NULL flags
  NullFlagsSize := FFieldDefs.Count div 8;
  if ((FFieldDefs.Count mod 8) > 0) then
   Inc(NullFlagsSize);
  Result := (StrLComp(RecordBuffer1, RecordBuffer2, NullFlagsSize) = 0);
  // compare fields?
  if (Result) then
    for i:=0 to FFieldDefs.Count-1 do
      begin
        Result := (StrLComp(RecordBuffer1+FFieldDefs[i].MemoryOffset,
                            RecordBuffer2+FFieldDefs[i].MemoryOffset,
                            FFieldDefs[i].DiskDataSize) = 0);
        if (not Result) then
          break;
      end;
end;// CompareRecordBuffers


⌨️ 快捷键说明

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