?? myldbbaseengine.pas
字號:
//------------------------------------------------------------------------------
// BlobFieldsPresent
//------------------------------------------------------------------------------
function TMYLDBBaseFieldManager.BlobFieldsPresent: Boolean;
var
i: Integer;
begin
Result := False;
for i := 0 to FieldDefs.Count - 1 do
if (IsBLOBFieldType(FieldDefs[i].BaseFieldType)) then
begin
Result := True;
if (FieldDefs[i].BLOBBlockSize = 0) then
raise EMYLDBException.Create(10421,ErrorLZeroBlockSizeIsNotAllowedForField,[FieldDefs[i].Name]);
break;
end;
end;// BlobFieldsPresent
//------------------------------------------------------------------------------
// Set default values to fields
//------------------------------------------------------------------------------
procedure TMYLDBBaseFieldManager.ApplyDefaultValuesToRecordBuffer(Session: TMYLDBBaseSession;
RecordBuffer: TMYLDBRecordBuffer);
var
i: Integer;
value: TMYLDBVariant;
begin
for i:=0 to FFieldDefs.Count-1 do
if (not IsBLOBFieldType(FFieldDefs[i].BaseFieldType)) then
if (not FFieldDefs[i].DefaultValue.IsNull) then
begin
if (FFieldDefs[i].DefaultValueExpr <> nil) then
begin
value := TMYLDBExpression(FFieldDefs[i].DefaultValueExpr).GetValue;
value.Cast(FFieldDefs[i].BaseFieldType);
value.CopyDataToAddress(RecordBuffer + FFieldDefs[i].MemoryOffset);
end
else
FFieldDefs[i].DefaultValue.CopyDataToAddress(RecordBuffer + FFieldDefs[i].MemoryOffset);
SetNullFlag(false, i, RecordBuffer);
end;
end;//ApplyDefaultValuesToRecordBuffer
//------------------------------------------------------------------------------
// ApplyAutoincsToRecordBuffer
//------------------------------------------------------------------------------
procedure TMYLDBBaseFieldManager.ApplyAutoincsToRecordBuffer(Session: TMYLDBBaseSession;
RecordBuffer: TMYLDBRecordBuffer);
var
i: Integer;
SequenceValue: TMYLDBSequenceValue;
begin
for i:=0 to FFieldDefs.Count-1 do
if (IsAutoincFieldType(FFieldDefs[i].AdvancedFieldType)) then
if (CheckNullFlag(i, RecordBuffer)) then
begin
SequenceValue := GetNextAutoinc(Session, i);
Move(SequenceValue, (RecordBuffer + FFieldDefs[i].MemoryOffset)^,
FFieldDefs[i].MemoryDataSize);
SetNullFlag(false, i, RecordBuffer);
end
else
begin
SequenceValue := 0;
// update auto inc to the inserted value
Move((RecordBuffer + FFieldDefs[i].MemoryOffset)^, SequenceValue,
FFieldDefs[i].MemoryDataSize);
UpdateLastAutoInc(Session, i, SequenceValue);
end;
end;//ApplyAutoincsToRecordBuffer
//------------------------------------------------------------------------------
// GetNextAutoinc
//------------------------------------------------------------------------------
function TMYLDBBaseFieldManager.GetNextAutoinc(Session: TMYLDBBaseSession;
FieldNo: Integer): TMYLDBSequenceValue;
begin
// Get Next Value
Result := GetNextAutoincVal(FieldNo);
// Put Value to Session...
Session.SetObject(TMYLDBSessionNamedObjectSequenceValue.Create(
FFieldDefs[FieldNo].ObjectID,
Result));
end;//GetNextAutoinc
//------------------------------------------------------------------------------
// GetLastAutoinc
//------------------------------------------------------------------------------
function TMYLDBBaseFieldManager.GetLastAutoinc(Session: TMYLDBBaseSession;
FieldNo: Integer): TMYLDBSequenceValue;
var
Value: TMYLDBSessionNamedObjectSequenceValue;
begin
Value := TMYLDBSessionNamedObjectSequenceValue(
Session.GetObjectByID(FFieldDefs[FieldNo].ObjectID));
if Value = nil then
begin
// 5.08, improve GetLastAutoinc
if Session.MultiUser then
// end 5.08 fix
raise EMYLDBException.Create(30012, ErrorGSequenceLastValueFailed,
[FFieldDefs[FieldNo].Name])
// 5.08, improve GetLastAutoinc
else begin
if (IsAutoincFieldType(FieldDefs.Items[FieldNo].AdvancedFieldType)) then
Result := FLastAutoIncValues[FieldNo]
else
Result := 0;
// end 5.08 fix
end;
end
else
Result := Value.Value;
end;//GetLastAutoinc
//------------------------------------------------------------------------------
// UpdateAutoinc
//------------------------------------------------------------------------------
procedure TMYLDBBaseFieldManager.UpdateLastAutoinc(Session: TMYLDBBaseSession;
FieldNo: Integer; InsertedValue: Int64);
begin
if (InsertedValue > FLastAutoIncValues[FieldNo]) then
begin
FLastAutoIncValues[FieldNo] := InsertedValue;
// Put Value to Session...
Session.SetObject(TMYLDBSessionNamedObjectSequenceValue.Create(
FFieldDefs[FieldNo].ObjectID,
InsertedValue));
end;
end;// UpdateLastAutoinc
////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBBaseIndexManager
//
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
// load from stream
//------------------------------------------------------------------------------
procedure TMYLDBBaseIndexManager.LoadMetadata(Stream: TStream);
begin
FIndexDefs.LoadFromStream(Stream);
end; // SaveToStream
//------------------------------------------------------------------------------
// save to stream
//------------------------------------------------------------------------------
procedure TMYLDBBaseIndexManager.SaveMetadata(Stream: TStream);
begin
FIndexDefs.SaveToStream(Stream);
end; // SaveToStream
//------------------------------------------------------------------------------
// create
//------------------------------------------------------------------------------
constructor TMYLDBBaseIndexManager.Create(aTableData: TMYLDBTableData; TempPageManager: TMYLDBPageManager);
begin
FOpenIndexList := TList.Create; // list of TMYLDBIndex objects
FIndexDefs := TMYLDBIndexDefs.Create;
FTableData := aTableData;
FPageManager := FTableData.PageManager;
FTemporaryPageManager := TempPageManager;
FSynchronizingTemporaryIndexes := False;
end;// Create
//------------------------------------------------------------------------------
// destroy
//------------------------------------------------------------------------------
destructor TMYLDBBaseIndexManager.Destroy;
begin
while (FOpenIndexList.Count > 0) do
CloseIndex(TMYLDBIndex(FOpenIndexList.Items[0]).IndexDef.ObjectID);
FOpenIndexList.Free;
FIndexDefs.Free;
end;// Destroy
//------------------------------------------------------------------------------
// return PageManager for index
//------------------------------------------------------------------------------
function TMYLDBBaseIndexManager.GetPageManager(Index: TMYLDBIndex): TMYLDBPageManager;
begin
if (Index.IndexDef.Temporary) then
Result := FTemporaryPageManager
else
Result := FPageManager;
end; // GetPageManager
//------------------------------------------------------------------------------
// DropTemporaryIndexes
//------------------------------------------------------------------------------
procedure TMYLDBBaseIndexManager.DropTemporaryIndexes(SessionID: TMYLDBSessionID);
var i: Integer;
begin
i := 0;
while (i < IndexDefs.Count) do
begin
if (IndexDefs[i].Temporary) then
DropIndex(SessionID, IndexDefs[i].ObjectID)
else
Inc(i);
end;
end;// DropTemporaryIndexes
//------------------------------------------------------------------------------
// return true if coresponding index was found
//------------------------------------------------------------------------------
function TMYLDBBaseIndexManager.IsIndexExists(FieldNames, AscDescList, CaseSensitivityList: TStringList;
SessionID: TMYLDBSessionID; FieldDefs: TMYLDBFieldDefs): Boolean;
begin
Result := FIndexDefs.IsIndexExists(FieldNames,AscDescList,CaseSensitivityList,SessionID,FieldDefs);
end; // IsIndexExists
//------------------------------------------------------------------------------
// return IndexID if coresponding index was found
//------------------------------------------------------------------------------
function TMYLDBBaseIndexManager.FindIndex(FieldNames, AscDescList, CaseSensitivityList: TStringList;
SessionID: TMYLDBSessionID; FieldDefs: TMYLDBFieldDefs): TMYLDBObjectID;
begin
Result := FIndexDefs.FindIndex(FieldNames,AscDescList,CaseSensitivityList, SessionID, FieldDefs);
end; // FindIndex
//------------------------------------------------------------------------------
// create temporary index
//------------------------------------------------------------------------------
function TMYLDBBaseIndexManager.CreateTemporaryIndex(
Cursor: TMYLDBCursor;
FieldNamesList, AscDescList, CaseSensitivityList: TStringList
): TMYLDBObjectID;
var IndexDef: TMYLDBIndexDef;
begin
IndexDef := TMYLDBIndexDef.Create;
try
repeat
IndexDef.Name := GetTemporaryName('TEMPORARY_INDEX_');
until (IndexDefs.GetDefNumberByName(IndexDef.Name) = -1);
IndexDef.Temporary := True;
IndexDef.IndexType := itBTree;
IndexDef.Unique := False;
IndexDef.Primary := False;
IndexDef.AssignByNames(FieldNamesList,AscDescList,CaseSensitivityList);
IndexDef.SessionID := Cursor.Session.SessionID;
IndexDef.TableState := FTableData.RecordManager.TableState;
Result := CreateIndex(Cursor, IndexDef);
finally
IndexDef.Free;
end;
end; // CreateTemporaryIndex
//------------------------------------------------------------------------------
// find or create temporary index
//------------------------------------------------------------------------------
function TMYLDBBaseIndexManager.FindOrCreateIndex(Cursor: TMYLDBCursor;
FieldNamesList, AscDescList, CaseSensitivityList: TStringList; var IsCreated: Boolean): TMYLDBObjectID;
begin
Result := FindIndex(FieldNamesList,AscDescList,CaseSensitivityList,
Cursor.Session.SessionID, Cursor.FieldDefs);
if (Result = INVALID_OBJECT_ID) then
begin
Result := CreateTemporaryIndex(Cursor, FieldNamesList,AscDescList,CaseSensitivityList);
IsCreated := True;
end
else
IsCreated := False;
end; // FindOrCreateIndex
//---------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -