Мельница данных- Требования к провайдеру  (раздел целиком)  (19.04.2024)
Требования к провайдеру

Интерфейсы провайдера описаны в библиотеке типов файла QueryBuilder.exe и в файле QueryBuilder_TLB.pas. Собственно, объект-провайдер реализует Интерфейс IInfoProvider. Каждый CoClass, реализующий указанный интерфейс, прописывается в ветке реестра HKLM\Software\QueryBuilder\Providers добавлением параметра, имя которого определяет наименование провайдера, а значение - CLSID провайдера.

Метаданные (информация о таблицах, полях и типах данных) предоставляются в виде именованных элементов, то есть каждый из них реализует интерфейс INamedItemInfo


1. Интерфейс IInfoProvider
Провайдер реализует интерфейс
01  IInfoProvider = interface(IUnknown)
02    ['{64F8072B-7250-4C57-BA8E-D018C7B72CC7}']
03    function Get_TableCount: Integer; safecall;
04    function Get_Table(Index: Integer): ITableInfo; safecall;
05    function Perform(const SQL: WideString): IDataSet; safecall;
06    procedure Connect(const DataBase: WideString; 
07      const UserName: WideString; 
08      const Password: WideString); safecall;
09    function Get_CLSID: TGUID; safecall;
10    function Get_DateLiteral: WideString; safecall;
11    function Get_TimeLiteral: WideString; safecall;
12    function Get_DateTimeLiteral: WideString; safecall;
13  end; 
  • функция Get_CLSID возвращает GUID класса-провайдера.
  • процедура Connect осуществляет соединение с БД.
  • функция Get_TableCount возвращает количество таблиц, доступ к которым предоставляется провайдером.
  • функция Get_Table возвращает ссылку на информацию о таблице с номером Index. Ссылка на интерфейс ITableInfo или интерфейс ITableInfo2
  • функция Perform принимает текст сформированного SQL-запроса и возвращает ссылку на набор данных. Набор данных реализует интерфейс IDataSet.
  • функция Get_DateLiteral возвращает строку, определяющую способ включения в запрос литерала типа "Дата".
  • функция Get_TimeLiteral возвращает строку, определяющую способ включения в запрос литерала типа "Время".
  • функция Get_DateTimeLiteralвозвращает строку, определяющую способ включения в запрос литерала типа "Дата со временем".

2. Интерфейс IDataSet
Набор данных реализует интерфейс
1   IDataSet = interface(IUnknown)
2    ['{3CED7395-8482-4EF6-8A15-7744348063C2}']
3    function Get_FieldCount: Integer; safecall;
4    function Get_FieldName(Index: Integer): WideString; safecall;
5    function Get_Field(FieldIndex: OleVariant): OleVariant; safecall;
6    procedure Next; safecall;
7    function Eof: WordBool; safecall;
8  end;
Набор данных представляет собой однонаправленный курсор, каждая строка которого является набором именованных и нумерованных полей.
  • процедура Next осуществляет переход к следующей записи курсора.
  • функция Eof возвращает True в случае достижения конца курсора.
  • функция Get_FieldCount возвращает количество полей в строке курсора.
  • функция Get_FieldName возвращает имя поля с номером Index.
  • функция Get_Field возвращает значение поля, имя или номер которого задан параметром (если строка, то имя, если число, то номер). Допустимо возвращать значение Null для пустых полей.

3. Интерфейс INamedItemInfo
Каждый элемент метаданных (таблица, поле, тип) обязательно реализует интерфейс
1  INamedItemInfo = interface(IUnknown)
2    ['{14894363-28DA-4E71-B0BC-9C5CE811BC8F}']
3    function Get_Name: WideString; safecall;
4    function Get_Caption: WideString; safecall;
5    function Get_ID: WideString; safecall;
6  end;

Именованный элемент имеет имя, наименование и идентификатор. Имя используется для именования сущности в сформированном SQL-запросе, идентификатор необходим для идентификации сущности в рамках провайдера, таблицы и типы данных имеют глобальное пространство идентификаторов, поля имеют уникальные идентификаторы в пределах последовательности наследуемых таблиц. Никаких ограничений на значения идентификаторов, кроме уникальности, не накладывается.

  • функция Get_Name возвращает имя сущности.
  • функция Get_Caption возвращает наименование сущности.
  • функция Get_ID возвращает идентификатор сущности.

4. Интерфейс ITableInfo
Информация о таблице представляется объектом через интерфейс (наследник INamedItemInfo )
1  ITableInfo = interface(INamedItemInfo)
2    ['{3FC1998A-9031-4936-82B5-8CAA2219085E}']
3    function Get_FieldCount: Integer; safecall;
4    function Get_Field(Index: Integer): IFieldInfo; safecall;
5    function Get_PrimaryKey: IFieldInfo; safecall;
6    function Get_Uplink: IFieldInfo; safecall;
7    function Get_Parent: ITableInfo; safecall;
8  end;
  • функция Get_FieldCount возвращает количество полей в таблице.
  • функция Get_Field возвращает ссылку на поле с номером Index. Ссылка на интерфейс IFieldInfo
  • функция Get_PrimaryKey возвращает ссылку на поле, являющееся первичным ключем. Это поле должно быть задано.
  • функция Get_Uplink возвращает ссылку на поле, осуществляющее иерархическую связь между записями таблицы. Если это поле задано, записи отображаются в виде иерархии.
  • функция Get_Parent возвращает ссылку на родительскую таблицу. Дочерняя таблица связана с родительской первичными ключами, т. е. соотношением 1:1. Если таблица не имеет родительской, возвращается nil.

4.1. Интерфейс ITableInfo2
Для таблиц, имеющих полиморфные ссылки, реализуется интерфейс (наследник ITableInfo )
1  ITableInfo2 = interface(ITableInfo)
2    ['{9DF4C8AC-1DA2-4E7B-BF44-7EDD7A269418}']
3    function Get_PolymorphCount: Integer; safecall;
4    function Get_PolymorphTable(Index: Integer): ITableInfo; safecall;
5    function Get_PolymorphField(Index: Integer): IFieldInfo; safecall;
6  end; 
Полиморфной ссылкой является, например, ссылка, физически размещенная в родительской таблице, указывающая на свою запись. Реализация этого интерфейса не является обязательной.
  • функция Get_PolymorphCount возвращает количество полиморфных ссылок.
  • функция Get_PolymorphTable возвращает ссылку на таблицу, на которую указывает полиморфная ссылка номер Index.
  • функция Get_PolymorphTable возвращает ссылку на поле, реализующее полиморфную ссылку номер Index. Это поле должно иметь тип dtReference, информация о его типе должна реализовать интерфейс IReferenceInfo. Значение, возвращаемое функцией Get_TargetTable этого интерфейса в данном случае не имеет значения и игнорируется.

4.2. Интерфейс ITableInfo3
Для таблиц, при запросах к которым требуется наложение дополнительных условий отбора, реализуется интерфейс (наследник ITableInfo )
01  ITableInfo3 = interface(ITableInfo)
02    ['{3FB73AA9-010C-48DA-81C7-E1DCFE2E6136}']
03    function GetPersistentClause(const Alias: WideString): WideString; safecall;
04    function GetPreConditionsCount: Integer; safecall;
05    function GetPreConditionCaption(Index: Integer): WideString; safecall;
06    function GetPreConditionCategory(Index: Integer): WideString; safecall;
07    function Get_ActivePreCondition(Index: Integer): WordBool; safecall;
08    procedure Set_ActivePreCondition(Index: Integer; Value: WordBool); safecall;
09    function GetPreConditionParamsCount(Index: Integer): Integer; safecall;
10    function GetPreConditionParam(Index: Integer; PreConditionIndex: Integer): IOptionInfo; safecall;
11  end;
  • функция GetPersistentClause возвращает выражение дополнительного условия отбора. Алиас таблицы передается в параметре Alias.

5. Интерфейс IFieldInfo
Информация о поле поставляется объектом, реализующим интерфейс (наследник INamedItemInfo )
1  IFieldInfo = interface(INamedItemInfo)
2    ['{19054DAD-8D35-4B39-8EB7-FD3254BD2934}']
3    function Get_TypeInfo: ITypeInfo; safecall;
4    function Get_DisplayMode: TDisplayMode; safecall;
5  end;
  • функция Get_DisplayMode возвращает роль поля при показе таблицы. Возможные значения (тип TDisplayMode):
    • dmAlways - поле является ключевым, всегда показывается
    • dmNever - поле является служебным (первичным ключем, например). Никогда не показывается.
    • dmOnDemand - поле является обычным информационным, показывается по требованию пользователя.
  • функция Get_TypeInfo возвращает ссылку на информацию о типе данных поля. Возвращаете ссылку на один из интерфейсов-наследников интерфейса ITypeInfo

6. Интерфейс ITypeInfo
Информация о типах полей поставляется в виде набора объектов, каждый из которых реализует интерфейс (наследник INamedItemInfo )
1  ITypeInfo = interface(INamedItemInfo)
2    ['{2B6A5E20-3C36-4574-89DB-7C873A5C4A00}']
3    function Get_Required: WordBool; safecall;
4    function Get_SimpleType: TSimpleType; safecall;
5  end;
Информация о конкретном типе передается при помощи реализации одного из наследников этого интерфейса.
  • функция Get_Required возвращает True, если значение поля обязательно для задания.
  • функция Get_SimpleType возвращает информацию о простом типе данных. В зависимости от возвращаемого значения объект должен также реализовывать один из интерфейсов конкретных типов (см. далее). Возможные значения (тип TSimpleType ):

6.1. Интерфейс ITypeInfo2
Информация о предоставляемых провайдером дополнительных возможностях фильтрации (наследник интерфейса ITypeInfo)
1  ITypeInfo2 = interface(ITypeInfo)
2    ['{77F58BDF-F01C-40F3-B193-1027AD8C4EDA}']
3    function GetSpecialFilterCount: Integer; safecall;
4    function GetSpecialFilterText(Index: Integer): WideString; safecall;
5    function EditSpecialFilter(Index: Integer; var Filter: WideString): WordBool; safecall;
6  end;
  • функция GetSpecialFilterCount возвращает количество дополнительных элементов списка, выпадающего при выборе фильтра по колонке.
  • функция GetSpecialFilterText возвращает текст дополнительного элемента списка, выпадающего при выборе фильтра по колонке, с номером Index.
  • функция EditSpecialFilter вызывается в момент выбора пользователем дополнительного элемента списка, выпадающего при выборе фильтра по колонке, с номером Index. Значение выражения фильтра передается и возвращается в параметре Filter. Функция возвращает True в случае, если выражение, возвращенное в параметре Filter нужно применить для фильтрации столбца запроса, False - в противном случае.

6.2. Интерфейс IStringInfo
Информация о строковом типе (наследник интерфейса ITypeInfo)
1  IStringInfo = interface(ITypeInfo)
2    ['{74AC4C03-E803-421B-B30D-1A2D2C49827F}']
3    function Get_Length: Integer; safecall;
4  end;
  • функция Get_Length возвращает максимальную длину строки.

6.3. Интерфейс IIntegerInfo
Информация о целочисленном типе (наследник интерфейса ITypeInfo)
1  IIntegerInfo = interface(ITypeInfo)
2    ['{9003B25E-926D-42AE-A907-813DF3A8343E}']
3    function Get_MaxValue: Integer; safecall;
4    function Get_MaxValueUsed: WordBool; safecall;
5    function Get_MinValue: Integer; safecall;
6    function Get_MinValueUsed: WordBool; safecall;
7  end;
  • функция Get_MaxValueUsed возвращает True, если значение имеет верхнюю границу.
  • функция Get_MaxValue возвращает верхнюю границу значения, если есть.
  • функция Get_MinValueUsed возвращает True, если значение имеет нижнюю границу.
  • функция Get_MinValue возвращает нижнюю границу значения, если есть.

6.4. Интерфейс IFloatInfo
Информация о вещественном типе (наследник интерфейса ITypeInfo )
1  IFloatInfo = interface(ITypeInfo)
2    ['{E9B56C6D-47DC-4AB9-9E80-6EEF77708704}']
3    function Get_MaxValue: Double; safecall;
4    function Get_MaxValueUsed: WordBool; safecall;
5    function Get_MinValue: Double; safecall;
6    function Get_MinValueUsed: WordBool; safecall;
7    function Get_Precision: Integer; safecall;
8    function Get_Scale: Integer; safecall;
9  end;
  • функция Get_MaxValueUsed возвращает True, если значение имеет верхнюю границу.
  • функция Get_MaxValue возвращает верхнюю границу значения, если есть.
  • функция Get_MinValueUsed возвращает True, если значение имеет нижнюю границу.
  • функция Get_MinValue возвращает нижнюю границу значения, если есть.
  • функция Get_Precision возвращает максимальное количество значащих десятичных цифр в значении.
  • функция Get_Scale возвращает максимальное количество десятичных цифр после запятой.

6.5. Интерфейс IDateInfo
Информация о типе "Дата" (без времени) (наследник интерфейса ITypeInfo )
1  IDateInfo = interface(ITypeInfo)
2    ['{DA392510-105F-4655-9A38-18ECA2FBEB97}']
3  end;
Не имеет методов.

6.6. Интерфейс ITimeInfo
Информация о типе "Время" (без даты) (наследник интерфейса ITypeInfo )
1  ITimeInfo = interface(ITypeInfo)
2    ['{D7067CAC-67A5-41DB-8D95-40409D8658AB}']
3  end;
Не имеет методов.

6.7. Интерфейс IDateTimeInfo
Информация о типе "Дата со времемем" (наследник интерфейса ITypeInfo )
1  IDateTimeInfo = interface(ITypeInfo)
2    ['{7F5CC8F9-8CE1-4DB7-8932-884EF3BAB538}']
3  end;
Не имеет методов.

6.8. Интерфейс IBooleanInfo
Информация о логическом типе (наследник интерфейса ITypeInfo )
1  IBooleanInfo = interface(ITypeInfo)
2    ['{8256EDF9-8613-4970-850C-50047839D6BF}']
3    function Get_TrueValue: WideString; safecall;
4    function Get_FalseValue: WideString; safecall;
5  end;
  • функция Get_TrueValue возвращает отображаемую строку для значения True (например, "Да").
  • функция Get_FalseValue возвращает отображаемую строку для значения False (например, "Нет").

6.9. Интерфейс IEnumerationInfo
Информация о перечислимом типе (наследник интерфейса ITypeInfo )
1  IEnumerationInfo = interface(ITypeInfo)
2    ['{B58A3F23-1AAC-4420-ADFF-B23B9938A994}']
3    function Get_ItemCount: Integer; safecall;
4    function Get_Item(Index: Integer): IEnumerationItem; safecall;
5  end;
Перечислимый тип определяет набор значений, которые может принимать поле. Значения в таблице трактуются как равные имени элемента перечисления.
  • функция Get_ItemCount возвращает количество элементов перечисления.
  • функция Get_Item возвращает ссылку на элемент перечисления с номером Index, реализующий интерфейс IEnumerationItem

6.10. Интерфейс IReferenceInfo
Информация о типе "ссылка" (наследник интерфейса ITypeInfo )
1  IReferenceInfo = interface(ITypeInfo)
2    ['{309C8CB1-4A1C-4E58-BC3F-D1AF27861A8F}']
3    function Get_TargetTable: ITableInfo; safecall;
4  end;
  • функция Get_TargetTable возвращает ссылку на таблицу, с которой осуществляется связь. Возвращается ссылка на интерфейс ITableInfo

6.11. Интерфейс IBlobInfo
Информация о типе "больших двоичных объектов" (наследник интерфейса ITypeInfo )
1  IBlobInfo = interface(ITypeInfo)
2    ['{3905C9C4-EAEB-4844-BB55-3F524F1F3FAC}']
3    function Get_SubType: TBlobSubType; safecall;
4  end;
  • функция Get_SubType возвращает подтип большого двоичного объекта. Одно из следующих значений (тип TBlobSubType ):
    • bsText - текст
    • bsImage - изображение
    • bsBinary - двоичные данные

7. Интерфейс IEnumerationItem
Информация об элементе перечисления (наследник INamedItemInfo )
1  IEnumerationItem = interface(INamedItemInfo)
2    ['{6953507C-D477-4B8D-9443-A9E5FE7137ED}']
3    function Get_Position: Integer; safecall;
4  end;
Значения в таблице трактуются как равные имени элемента перечисления.
  • функция Get_Position возвращает позицию элемента перечисления.