?? myldbbaseengine.pas
字號:
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 + -