{$IFNDEF CLR}
unit DBToolsIntf;
{$ENDIF}
interface

uses
{$IFDEF CLR}
  System.Runtime.InteropServices,
  Variants,
  CoreLab.DbTools;
{$ELSE}
  Windows, ActiveX;
{$ENDIF}

type
{$IFDEF WIN32}
  ParameterType = TOleEnum;
{$ELSE}
  TConnectionInfoArray = array of ConnectionInfo;
{$ENDIF}
// Constants for enum ParameterType
const
  ParameterType_Input = ParameterType(0);
  ParameterType_InputOutput = ParameterType(1);
  ParameterType_Output = ParameterType(2);
  ParameterType_ReturnValue = ParameterType(3);

  CoreLab_DbTools_InterfacesMajorVersion = 2;
  CoreLab_DbTools_InterfacesMinorVersion = 0;

// *********************************************************************//
// Declaration of structures, unions and aliases.
// *********************************************************************//
{$IFDEF WIN32}
type
  ConnectionInfo = packed record
    Name: WideString;
    ConnectionString: WideString;
  end;

  CommandParameterInfo = packed record
    Name: PWideChar;
    ParameterType: ParameterType;
    DataType: Integer;
    _slack_space: dword; // Align by 16 bytes
    Value: OleVariant;
  end;

  TConnectionInfoArray = PSafeArray;

// *********************************************************************//
// Interface: ISqlEditor
// Flags:     (256) OleAutomation
// GUID:      {471AE99C-AE21-491B-89E3-A2C717C81CA9}
// Simple interface of the SQL editor.
// *********************************************************************//
  ISqlEditor = interface(IUnknown)
    ['{471AE99C-AE21-491B-89E3-A2C717C81CA9}']
    function Get_Handle: integer; stdcall;
    function Get_text: PWideChar; stdcall;
    procedure Set_text(const Param1: PWideChar); stdcall;
    function Get_Modified: LongBool; stdcall;
    procedure Set_Modified(Param1: LongBool); stdcall;
    function Get_ReadOnly: LongBool; stdcall;
    procedure Set_ReadOnly(Param1: LongBool); stdcall;

    procedure SetConnection(const ConnectionString: WideString); stdcall;
    property Modified: LongBool read Get_Modified write Set_Modified;
    property Handle: integer read Get_Handle;
    property ReadOnly: LongBool read Get_ReadOnly write Set_ReadOnly;
    property Text: PWideChar read Get_text write Set_text;
  end;

// *********************************************************************//
// Interface: ISqlSource
// Flags:     (256) OleAutomation
// GUID:      {471AE99C-AE21-491B-89E3-A2C717C81CA8}
// Describes any component with editable SQL query on the designer. A 'Command' for example.
// *********************************************************************//
  ISqlSource = interface(IUnknown)
    ['{471AE99C-AE21-491B-89E3-A2C717C81CA8}']
    function Get_Name: PWideChar; stdcall;
    function Get_ConnectionString: PWideChar; stdcall;
    function Get_DesignerName: PWideChar; stdcall;
    function Get_ParameterCount: Integer; stdcall;
    procedure Set_ParameterCount(const Param1: Integer); stdcall;
    function Get_Sql: PWideChar; stdcall;
    procedure Set_Sql(const Param1: PWideChar); stdcall;
    procedure Close; stdcall;
    procedure GetParameter(const index: Integer; out Info: CommandParameterInfo); stdcall;
    procedure SetParameter(const index: Integer; Info: CommandParameterInfo); stdcall;
  end;

// *********************************************************************//
// Interface: ISqlSourceNotifier
// Flags:     (256) OleAutomation
// GUID:      {D4858B82-70FB-4E30-8BE5-30CF625A37E2}
// Feedback interface for the SQL service. Allows to notify about any componet changings.
// *********************************************************************//
  ISqlSourceNotifier = interface(IUnknown)
    ['{D4858B82-70FB-4E30-8BE5-30CF625A37E2}']
    procedure OnSqlSourceChanged; stdcall;
    procedure OnSqlSourceDeleted; stdcall;
    procedure OnSqlSourceRenamed(const prevName: WideString); stdcall;
  end;

// *********************************************************************//
// Interface: IDbToolsService
// Flags:     (256) OleAutomation
// GUID:      {7FB8EF3F-AB68-48D1-9DD5-F85C05DF4A90}
// An interface of the service, that provides basics functionalities of editing or executing an SQL query.
// *********************************************************************//
  IDbToolsService = interface(IUnknown)
    ['{7FB8EF3F-AB68-48D1-9DD5-F85C05DF4A90}']
    procedure CreateSqlEditor(out editor: ISqlEditor); stdcall;
    procedure DesignerClosing(const DesignerName: WideString); stdcall;
    procedure EditDatabaseObject(const ConnectionString: WideString; const objectType: WideString;
                                 const fullName: WideString); stdcall;
    procedure EditSql(const sqlSource: ISqlSource; asQuery: LongBool;
                      out notifier: ISqlSourceNotifier); stdcall;
    procedure ExecuteSql(const sqlSource: ISqlSource; debug: LongBool); stdcall;
    procedure FindInDatabaseExplorer(const ConnectionString: WideString;
                                     const objectType: WideString; const fullName: WideString); stdcall;
    function GetConnections: PSafeArray; stdcall;
    procedure RetrieveData(const sqlSource: ISqlSource; asDocument: LongBool); stdcall;
  end;
{$ENDIF}

implementation

end.
