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

📄 myldblocalengine.pas

📁 一个本地database引擎,支持中文T_Sql查询,兼容DELPHI标准数据库控件
💻 PAS
📖 第 1 页 / 共 5 页
字号:


//------------------------------------------------------------------------------
// 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 + -