📄 myldblocalengine.pas
字号:
//------------------------------------------------------------------------------
// set size of compressed stream
//------------------------------------------------------------------------------
function TMYLDBLocalBLOBStream.Seek(Offset: Longint; Origin: Word): Longint;
begin
Result := FTemporaryStream.Seek(Offset,Origin);
end; // Seek
{$IFDEF D6H}
//------------------------------------------------------------------------------
// set size of compressed stream
//------------------------------------------------------------------------------
function TMYLDBLocalBLOBStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
begin
Result := FTemporaryStream.Seek(Offset,Origin);
end; // Seek
{$ENDIF}
//------------------------------------------------------------------------------
// set size of compressed stream
//------------------------------------------------------------------------------
constructor TMYLDBLocalBLOBStream.Create(
TemporaryStream: TMYLDBStream;
Cursor: TMYLDBCursor;
OpenMode: TMYLDBBLOBOpenMode;
FieldNo: Integer
);
begin
UserBLOBStream := nil;
FPosition := 0;
FTemporaryStream := TemporaryStream;
FCursor := Cursor;
FFieldNo := FieldNo;
FOpenMode := OpenMode;
inherited Create;
end; // Create
//------------------------------------------------------------------------------
// set size of compressed stream
//------------------------------------------------------------------------------
destructor TMYLDBLocalBLOBStream.Destroy;
begin
TMYLDBCompressedBLOBStream(FTemporaryStream).CompressedStream.Free;
FTemporaryStream.Free;
inherited;
end; // Destroy
////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBLocalCursor
//
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
// create
//------------------------------------------------------------------------------
constructor TMYLDBLocalCursor.Create;
begin
CurrentRecordBuffer := nil;
FDatabaseData := nil;
FTableData := nil;
FFieldDefs := nil;
FVisibleFieldDefs := nil;
FIndexDefs := nil;
IsOpen := False;
FBLOBStreams := nil;
FIndexName := '';
FIndexID := INVALID_OBJECT_ID;
FilterExpression := nil;
SQLFilterExpression := nil;
FilterRecord := nil;
FSettingProjection := False;
DistinctFieldCount := 0;
RecordBitmap := nil;
FIndexPositionCache := TMYLDBIndexPositionCache.Create;
FTableLockedByCursor := False;
FBatchUpdate := False;
end; // Create
//------------------------------------------------------------------------------
// destroy
//------------------------------------------------------------------------------
destructor TMYLDBLocalCursor.Destroy;
begin
CloseTable;
FIndexPositionCache.Free;
inherited;
end; // Destroy
//------------------------------------------------------------------------------
// create table
//------------------------------------------------------------------------------
procedure TMYLDBLocalCursor.CreateTable
(
FieldDefs: TMYLDBFieldDefs;
IndexDefs: TMYLDBIndexDefs;
ConstraintDefs: TMYLDBConstraintDefs
);
begin
FDatabaseData := TMYLDBLocalSession(Session).DatabaseData;
FDatabaseData.Lock;
CloseTable;
try
if (FDatabaseData.TableExists(FTableName)) then
DeleteTable;
// raise EMYLDBException.Create(10297,ErrorLTableExists,[FTableName]);
FTableData := FDatabaseData.FindOrCreateTableData(Self);
if (FTableData = nil) then
raise EMYLDBException.Create(20151, ErrorANilPointer);
try
FTableData.CreateTable(Self,FieldDefs,IndexDefs,ConstraintDefs);
finally
CloseTable;
end;
finally
FDatabaseData.Unlock;
end;
end;// CreateTable
//------------------------------------------------------------------------------
// delete table
//------------------------------------------------------------------------------
procedure TMYLDBLocalCursor.DeleteTable;
var
I: Integer;
begin
FDatabaseData := TMYLDBLocalSession(Session).DatabaseData;
FDatabaseData.Lock;
try
CloseTable;
if (not FDatabaseData.TableExists(FTableName)) then
raise EMYLDBException.Create(20132, ErrorATableNotFound, [TableName]);
FTableData := FDatabaseData.FindOrCreateTableData(Self);
if (FTableData = nil) then
raise EMYLDBException.Create(10027,ErrorLTableDataNotFound,[TableName]);
try
// 5.11 delete TMYLDBSessionNamedObjectSequenceValue objects from SessionNamedObjectList if any
if Assigned(FTableData.FieldManager) then
begin
for I := 0 to FTableData.FieldManager.FieldDefs.Count - 1 do
Session.DeleteObject(FTableData.FieldManager.FieldDefs[I].ObjectID);
end;
if (not (FTableData is TMYLDBDiskTableData)) then
begin
FTableData.DeleteTable(Self);
FTableData := nil;
end
else
FTableData.DeleteTable(Self);
finally
CloseTable;
end;
finally
FDatabaseData.Unlock;
end;
end; // DeleteTable;
//------------------------------------------------------------------------------
// empty table
//------------------------------------------------------------------------------
procedure TMYLDBLocalCursor.EmptyTable;
begin
FDatabaseData := TMYLDBLocalSession(Session).DatabaseData;
FDatabaseData.Lock;
try
CloseTable;
if (not FDatabaseData.TableExists(FTableName)) then
raise EMYLDBException.Create(20133, ErrorATableNotFound, [TableName]);
FTableData := FDatabaseData.FindOrCreateTableData(Self);
if (FTableData = nil) then
raise EMYLDBException.Create(10073,ErrorLTableDataNotFound,[TableName]);
try
FTableData.EmptyTable(Self);
finally
CloseTable;
end;
finally
FDatabaseData.Unlock;
end;
end; // EmptyTable
//------------------------------------------------------------------------------
// rename table
//------------------------------------------------------------------------------
procedure TMYLDBLocalCursor.RenameTable(NewTableName: String);
begin
FDatabaseData := TMYLDBLocalSession(Session).DatabaseData;
FDatabaseData.Lock;
try
CloseTable;
if (not FDatabaseData.TableExists(FTableName)) then
raise EMYLDBException.Create(20134, ErrorATableNotFound, [TableName]);
if (AnsiUpperCase(NewTableName) <> AnsiUpperCase(TableName)) then
if (FDatabaseData.TableExists(NewTableName)) then
raise EMYLDBException.Create(30451,ErrorLTableExists,[NewTableName]);
if (NewTableName = TableName) then
raise EMYLDBException.Create(30452,ErrorGCannotRenameTableIntoItSelf,[NewTableName]);
FTableData := FDatabaseData.FindOrCreateTableData(Self);
if (FTableData = nil) then
raise EMYLDBException.Create(10151,ErrorLTableDataNotFound,[TableName]);
try
FTableData.RenameTable(NewTableName, Self);
finally
CloseTable;
end;
FTableName := NewTableName;
finally
FDatabaseData.Unlock;
end;
end; // RenameTable
//------------------------------------------------------------------------------
// open table
//------------------------------------------------------------------------------
procedure TMYLDBLocalCursor.InternalInitFieldDefs;
var
i: Integer;
begin
if (FFieldDefs <> nil) then
FFieldDefs.Free;
FFieldDefs := TMYLDBFieldDefs.Create;
if (not FSettingProjection) then
begin
if (FVisibleFieldDefs <> nil) then
FVisibleFieldDefs.Free;
FVisibleFieldDefs := TMYLDBFieldDefs.Create;
end;
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('TMYLDBLocalCursor.InternalInitFieldDefs, TableData.FieldDefs.Count = '+
IntToStr(FTableData.FieldManager.FieldDefs.Count));
{$ENDIF}
FFieldDefs.Assign(FTableData.FieldManager.FieldDefs);
FFieldDefs.RecalcFieldOffsets;
if (FFieldDefs.Count > 0) then
FieldValuesOffset := FFieldDefs[0].MemoryOffset
else
FieldValuesOffset := 0;
if (FFieldDefs.Count > 0) then
BookmarkOffset := FFieldDefs[FFieldDefs.Count-1].MemoryOffset +
FFieldDefs[FFieldDefs.Count-1].MemoryDataSize
else
BookmarkOffset := 0;
KeyOffset := BookmarkOffset;
KeyBufferSize := BookmarkOffset + sizeof(TMYLDBKeyBuffer);
RecordSize := BookmarkOffset + SizeOf(TMYLDBBookmarkInfo);
RecordBufferSize := RecordSize;
CalculatedFieldsOffset := RecordSize;
if (not FSettingProjection) then
begin
FVisibleFieldDefs.Assign(FTableData.FieldManager.FieldDefs);
// create default fields order
for i := 0 to VisibleFieldDefs.Count-1 do
FVisibleFieldDefs[i].FieldNoReference := i;
end;
// Constraints...
if (FConstraintDefs <> nil) then
FConstraintDefs.Free;
FConstraintDefs := TMYLDBConstraintDefs.Create;
FConstraintDefs.Assign(FTableData.ConstraintManager.ConstraintDefs);
end;
//------------------------------------------------------------------------------
// open table
//------------------------------------------------------------------------------
procedure TMYLDBLocalCursor.OpenTableByFieldDefs(
FieldDefs: TMYLDBFieldDefs;
IndexDefs: TMYLDBIndexDefs;
ConstraintDefs: TMYLDBConstraintDefs
);
begin
if (not IsOpen) then
begin
FDatabaseData := TMYLDBLocalSession(Session).DatabaseData;
FDatabaseData.Lock;
try
FTableData := FDatabaseData.FindTableData(Self);
if (FTableData = nil) then
if (FDatabaseData is TMYLDBDiskDatabaseData) then
FTableData := FDatabaseData.CreateTableData(Self)
else
if (IsDesignMode) then
begin
FTableData := FDatabaseData.CreateTableData(Self);
FTableData.CreateTable(Self,FieldDefs,IndexDefs, ConstraintDefs);
end
else
raise EMYLDBException.Create(10028,ErrorLTableDataNotFound,[TableName]);
FTableData.IsRepairing := FIsRepairing;
FTableData.OpenTable(Self);
FirstPosition := True;
LastPosition := False;
if (FIndexDefs <> nil) then
FIndexDefs.Free;
FIndexDefs := TMYLDBIndexDefs.Create;
FIndexDefs.Assign(FTableData.IndexManager.IndexDefs);
if (FBLOBStreams <> nil) then
FBLOBStreams.Free;
FBLOBStreams := TList.Create;
if (RecordBitmap <> nil) then
TMYLDBRecordBitmap(RecordBitmap).Free;
RecordBitmap := TMYLDBRecordBitmap.Create(FTableData);
IsOpen := True;
finally
FDatabaseData.Unlock;
end;
end;
end;// OpenTable
//------------------------------------------------------------------------------
// open table
//------------------------------------------------------------------------------
procedure TMYLDBLocalCursor.OpenTable(aTableData: TMYLDBTableData);
begin
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('TMYLDBLocalCursor.OpenTable(aTableData) start');
{$ENDIF}
FDatabaseData := TMYLDBLocalSession(Session).DatabaseData;
FDatabaseData.Lock;
try
FTableData := aTableData;
FTableData.OpenTable(Self);
FirstPosition := True;
LastPosition := False;
if (FIndexDefs <> nil) then
FIndexDefs.Free;
FIndexDefs := TMYLDBIndexDefs.Create;
FIndexDefs.Assign(FTableData.IndexManager.IndexDefs);
if (FBLOBStreams <> nil) then
FBLOBStreams.Free;
FBLOBStreams := TList.Create;
InternalInitFieldDefs;
if (RecordBitmap <> nil) then
TMYLDBRecordBitmap(RecordBitmap).Free;
RecordBitmap := TMYLDBRecordBitmap.Create(FTableData);
IsOpen := True;
finally
FDatabaseData.Unlock;
end;
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('TMYLDBLocalCursor.OpenTable(aTableData) finish');
{$ENDIF}
end; // OpenTable
//------------------------------------------------------------------------------
// close table
//------------------------------------------------------------------------------
procedure TMYLDBLocalCursor.CloseTable;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -