📄 abslocalengine.pas
字号:
// set size of compressed stream
//------------------------------------------------------------------------------
function TABSLocalBLOBStream.Seek(Offset: Longint; Origin: Word): Longint;
begin
Result := FTemporaryStream.Seek(Offset,Origin);
end; // Seek
{$IFDEF D6H}
//------------------------------------------------------------------------------
// set size of compressed stream
//------------------------------------------------------------------------------
function TABSLocalBLOBStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
begin
Result := FTemporaryStream.Seek(Offset,Origin);
end; // Seek
{$ENDIF}
//------------------------------------------------------------------------------
// set size of compressed stream
//------------------------------------------------------------------------------
constructor TABSLocalBLOBStream.Create(
TemporaryStream: TABSStream;
Cursor: TABSCursor;
OpenMode: TABSBLOBOpenMode;
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 TABSLocalBLOBStream.Destroy;
begin
TABSCompressedBLOBStream(FTemporaryStream).CompressedStream.Free;
FTemporaryStream.Free;
inherited;
end; // Destroy
////////////////////////////////////////////////////////////////////////////////
//
// TABSLocalCursor
//
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
// create
//------------------------------------------------------------------------------
constructor TABSLocalCursor.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 := TABSIndexPositionCache.Create;
FTableLockedByCursor := False;
FBatchUpdate := False;
end; // Create
//------------------------------------------------------------------------------
// destroy
//------------------------------------------------------------------------------
destructor TABSLocalCursor.Destroy;
begin
CloseTable;
FIndexPositionCache.Free;
inherited;
end; // Destroy
//------------------------------------------------------------------------------
// create table
//------------------------------------------------------------------------------
procedure TABSLocalCursor.CreateTable
(
FieldDefs: TABSFieldDefs;
IndexDefs: TABSIndexDefs;
ConstraintDefs: TABSConstraintDefs
);
begin
FDatabaseData := TABSLocalSession(Session).DatabaseData;
FDatabaseData.Lock;
CloseTable;
try
if (FDatabaseData.TableExists(FTableName)) then
DeleteTable;
// raise EABSException.Create(10297,ErrorLTableExists,[FTableName]);
FTableData := FDatabaseData.FindOrCreateTableData(Self);
if (FTableData = nil) then
raise EABSException.Create(20151, ErrorANilPointer);
try
FTableData.CreateTable(Self,FieldDefs,IndexDefs,ConstraintDefs);
finally
CloseTable;
end;
finally
FDatabaseData.Unlock;
end;
end;// CreateTable
//------------------------------------------------------------------------------
// delete table
//------------------------------------------------------------------------------
procedure TABSLocalCursor.DeleteTable;
var
I: Integer;
begin
FDatabaseData := TABSLocalSession(Session).DatabaseData;
FDatabaseData.Lock;
try
CloseTable;
if (not FDatabaseData.TableExists(FTableName)) then
raise EABSException.Create(20132, ErrorATableNotFound, [TableName]);
FTableData := FDatabaseData.FindOrCreateTableData(Self);
if (FTableData = nil) then
raise EABSException.Create(10027,ErrorLTableDataNotFound,[TableName]);
try
// 5.11 delete TABSSessionNamedObjectSequenceValue 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 TABSDiskTableData)) then
begin
FTableData.DeleteTable(Self);
FTableData := nil;
end
else
FTableData.DeleteTable(Self);
finally
CloseTable;
end;
finally
FDatabaseData.Unlock;
end;
end; // DeleteTable;
//------------------------------------------------------------------------------
// empty table
//------------------------------------------------------------------------------
procedure TABSLocalCursor.EmptyTable;
begin
FDatabaseData := TABSLocalSession(Session).DatabaseData;
FDatabaseData.Lock;
try
CloseTable;
if (not FDatabaseData.TableExists(FTableName)) then
raise EABSException.Create(20133, ErrorATableNotFound, [TableName]);
FTableData := FDatabaseData.FindOrCreateTableData(Self);
if (FTableData = nil) then
raise EABSException.Create(10073,ErrorLTableDataNotFound,[TableName]);
try
FTableData.EmptyTable(Self);
finally
CloseTable;
end;
finally
FDatabaseData.Unlock;
end;
end; // EmptyTable
//------------------------------------------------------------------------------
// rename table
//------------------------------------------------------------------------------
procedure TABSLocalCursor.RenameTable(NewTableName: String);
begin
FDatabaseData := TABSLocalSession(Session).DatabaseData;
FDatabaseData.Lock;
try
CloseTable;
if (not FDatabaseData.TableExists(FTableName)) then
raise EABSException.Create(20134, ErrorATableNotFound, [TableName]);
if (AnsiUpperCase(NewTableName) <> AnsiUpperCase(TableName)) then
if (FDatabaseData.TableExists(NewTableName)) then
raise EABSException.Create(30451,ErrorLTableExists,[NewTableName]);
if (NewTableName = TableName) then
raise EABSException.Create(30452,ErrorGCannotRenameTableIntoItSelf,[NewTableName]);
FTableData := FDatabaseData.FindOrCreateTableData(Self);
if (FTableData = nil) then
raise EABSException.Create(10151,ErrorLTableDataNotFound,[TableName]);
try
FTableData.RenameTable(NewTableName, Self);
finally
CloseTable;
end;
FTableName := NewTableName;
finally
FDatabaseData.Unlock;
end;
end; // RenameTable
//------------------------------------------------------------------------------
// open table
//------------------------------------------------------------------------------
procedure TABSLocalCursor.InternalInitFieldDefs;
var
i: Integer;
begin
if (FFieldDefs <> nil) then
FFieldDefs.Free;
FFieldDefs := TABSFieldDefs.Create;
if (not FSettingProjection) then
begin
if (FVisibleFieldDefs <> nil) then
FVisibleFieldDefs.Free;
FVisibleFieldDefs := TABSFieldDefs.Create;
end;
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('TABSLocalCursor.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(TABSKeyBuffer);
RecordSize := BookmarkOffset + SizeOf(TABSBookmarkInfo);
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 := TABSConstraintDefs.Create;
FConstraintDefs.Assign(FTableData.ConstraintManager.ConstraintDefs);
end;
//------------------------------------------------------------------------------
// open table
//------------------------------------------------------------------------------
procedure TABSLocalCursor.OpenTableByFieldDefs(
FieldDefs: TABSFieldDefs;
IndexDefs: TABSIndexDefs;
ConstraintDefs: TABSConstraintDefs
);
begin
if (not IsOpen) then
begin
FDatabaseData := TABSLocalSession(Session).DatabaseData;
FDatabaseData.Lock;
try
FTableData := FDatabaseData.FindTableData(Self);
if (FTableData = nil) then
if (FDatabaseData is TABSDiskDatabaseData) then
FTableData := FDatabaseData.CreateTableData(Self)
else
if (IsDesignMode) then
begin
FTableData := FDatabaseData.CreateTableData(Self);
FTableData.CreateTable(Self,FieldDefs,IndexDefs, ConstraintDefs);
end
else
raise EABSException.Create(10028,ErrorLTableDataNotFound,[TableName]);
FTableData.IsRepairing := FIsRepairing;
FTableData.OpenTable(Self);
FirstPosition := True;
LastPosition := False;
if (FIndexDefs <> nil) then
FIndexDefs.Free;
FIndexDefs := TABSIndexDefs.Create;
FIndexDefs.Assign(FTableData.IndexManager.IndexDefs);
if (FBLOBStreams <> nil) then
FBLOBStreams.Free;
FBLOBStreams := TList.Create;
if (RecordBitmap <> nil) then
TABSRecordBitmap(RecordBitmap).Free;
RecordBitmap := TABSRecordBitmap.Create(FTableData);
IsOpen := True;
finally
FDatabaseData.Unlock;
end;
end;
end;// OpenTable
//------------------------------------------------------------------------------
// open table
//------------------------------------------------------------------------------
procedure TABSLocalCursor.OpenTable(aTableData: TABSTableData);
begin
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('TABSLocalCursor.OpenTable(aTableData) start');
{$ENDIF}
FDatabaseData := TABSLocalSession(Session).DatabaseData;
FDatabaseData.Lock;
try
FTableData := aTableData;
FTableData.OpenTable(Self);
FirstPosition := True;
LastPosition := False;
if (FIndexDefs <> nil) then
FIndexDefs.Free;
FIndexDefs := TABSIndexDefs.Create;
FIndexDefs.Assign(FTableData.IndexManager.IndexDefs);
if (FBLOBStreams <> nil) then
FBLOBStreams.Free;
FBLOBStreams := TList.Create;
InternalInitFieldDefs;
if (RecordBitmap <> nil) then
TABSRecordBitmap(RecordBitmap).Free;
RecordBitmap := TABSRecordBitmap.Create(FTableData);
IsOpen := True;
finally
FDatabaseData.Unlock;
end;
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('TABSLocalCursor.OpenTable(aTableData) finish');
{$ENDIF}
end; // OpenTable
//------------------------------------------------------------------------------
// close table
//------------------------------------------------------------------------------
procedure TABSLocalCursor.CloseTable;
begin
{$IFDEF DEBUG_TRACE_DATASET}
aaWriteToLog('TABSLocalCursor.CloseTable start');
{$ENDIF}
FDatabaseData := TABSLocalSession(Session).DatabaseData;
FDatabaseData.Lock;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -