English version Russian version




Различия оригинальной и бесплатной версий IBProvider'a

Последние полгода каждый месяц приходят письма, которые содержат вопрос о различии оригинальной версии IBProvider'a и его бесплатной версией - Free IBProvider. Поскольку не все догадываются почитать новости после 24 декабря 2001 года, мы решили обобщить здесь все принципиальные технические особенности между двумя этими версиями.

Нетехнические особенности:

  • вся текущая функциональность коммерческой версии в той или иной мере оплачена частными и корпоративными пользователями InterBase;
  • бесплатная версия была создана за счет другого промышленного программного проекта, в рамках которого было принято решение о написании OLEDB провайдера для InterBase, и личного времени разработчиков ЛЦПИ.

Поддержка InterBase

Тип данных Numeric (Новости)

  • В Free NUMERIC типы данных представляются в виде double. Из-за этого Free не в состоянии корректно обрабатывать такие колонки более чем с 15 значащими цифрами. Например, NUMERIC(17,1).
  • В коммерческой версии для представления NUMERIC используется 16-байтное представление - 39 значащих цифр, которое полностью перекрывает диапазон NUMERIC значение InterBase. Для внутренних преобразований используется представление данных в виде десятичных чисел с 128 значащими цифрами. Таким образом, потеря значащих цифр исключена полностью. Этот провайдер корректно обрабатывает NUMERIC данные как в обычных колонках, так и в колонках с массивами.

Тип данных TimeStamp (Новости)

  • В коммерческой версии исключена потеря дробных частей секунд. Распространяется как на обычные колонки так и на колонки с массивами.

Текстовые типы данных (Новости)

  • В Free отсутствует явная поддержка для этих типов данных. Это означает, что кодовая страница операционной системы должна совпадать с кодировкой подключения к базе данных. Таким образом, нельзя организовать прозрачную работу, например, из Windows с кодовой страницей win1251 с базой данных, созданной с использованием кодовой страницы UNICODE_FSS.
  • В коммерческой версии провайдера определен параметр подключения " unicode_mode", который определяет режим получения текстовых данных. По умолчанию он установлен в true. Это означает, что все текстовые данные принудительно конвертируются в UNICODE представление с использованием кодировки подключения к базе. При передаче текстовой информации в базу данных, провайдер принудительно перекодирует текст с использованием кодовой страницы подключения к базе данных. Таким образом, IBProvider позволяет организовать взаимодействие следующего вида:
    unicode_schema
    Перекодировка применяется ко всем способам передачи и представлениям текстовых данных:
    • Обычные колонки
    • Массивы
    • BLOB-поля. Прямая передача данных (весь BLOB загружается в память) и передача в виде storage-объектов (данные возвращаются в виде COM-объекта)
    • Непосредственно в тексте запроса. То есть при подготовке запроса он предварительно перекодируется с использованием кодировки подключения к базе данных.
    Обратите внимание, что кодировка подключения к базе данных должна совпадать с кодовой страницей базы данных.
    • InterBase не перекодирует данные BLOB-полей, поэтому даже установив ctype=win1251 для базы данных с UNICODE_FSS, вы будет получать BLOB-поля в кодировке UNICODE_FSS.
    Если вы не хотите получать текстовые данные в виде UNICODE символов, или провайдер не имеет поддержки для кодовой страницы базы данных, достаточно определить в строке подключения " unicode_mode=false".

BLOB-данные (Новости)

  • В Free реализована достаточно примитивная схема преобразования текстовых BLOB полей в UNICODE и обратно, которая основана на полной загрузке данных в оперативную память.
  • В коммерческой версии реализован поточный механизм преобразования BLOB полей, что практически полностью исключает создание промежуточных копий.

Массивы (Новости)

  • Free версия неправильно формирует массивы для не VARIANT-совместимых типов данных в режиме " array_vt_type=false"

Различия во внутренней реализации

Конвертор данных (Новости)

  • Free версия поддерживает преобразование с использованием бинарного представления и storage-объектов только для BLOB-полей. То есть, вы не можете запрашивать в таком формате данные обычных колонок - текстовых, числовых и т.д.
  • Коммерческая версия поддерживает такие преобразования в полном объеме. То есть, например, вы можете запросить любую колонку в бинарном виде или в виде COM-объекта. Наличие этой поддержки обязательна для взаимодействия с Microsoft Client Cursor Engine, которая реализует так называемые ClientCursor.

Параметры запросов (Новости)

  • В Free версии реализован прямолинейный механизм обработки параметров запросов, который не способен обрабатывать такие ситуации:
    • отсутствие описаний параметров. Коммерческая версия, в этом случае, самостоятельно запросит описание параметров запроса у сервера базы данных. См. свойство инициализации провайдера auto_param_describe.
    • несоответствие реального типа параметра и типа параметра, который указал пользователь. В этом случае, нагрузка ложится на конвертор типов самого сервера баз данных. Однако в некоторых случаях конвертор сервера не способен справиться с преобразованием. Например, при записи BLOB поля в обычную текстовую колонку и наоборот. Коммерческая версия принудительно приводит данные параметра к типу, который ожидает сервер баз данных. См. свойство инициализации провайдера force_param_describe. За счет этого упрощается программирование запросов к базе данных.

Обмен данными между провайдером и клиентом (Новости)

  • В коммерческой версии полностью перестроен механизм обмена данными для исключения какого-либо поиска. Для этого все алгоритмы и служебные таблицы были перестроены для использования идентификатора OLEDB-типа данных в качестве прямого индекса.

Обработка ошибок (Новости)

  • В Free обработка ошибок основана на анализе кодов возврата между внутренними слоями провайдера. Ловушки исключений используются, но только для обработки нештатных ситуаций - типа нехватки памяти. Для передачи описания ошибки из провайдера используется OLE Automation, что позволяет возвращать ошибки только в виде текста.
  • В коммерческой версии реализован абсолютно другой механизм обработки ошибок, основанный на C++ исключениях. Это радикально упростило внутреннюю реализацию провайдера и позволило организовать гораздо более сильный контроль над внутренней работой. Для передачи описания из провайдера может использоваться как OLE Automation так и сервисы OLEDB. В последнем случае провайдер может возвращать коллекции ошибок и предоставлять доступ к параметрам ошибок.

Только в коммерческой версии IBProvider

  • Доступ к описанию метаданных базы данных.
  • Реализация обновляемых множеств.
  • Поддержка ODBC расширений SQL запросов. Используется в Crystal Report.
  • Поддержка Client Cursor Engine.
  • Возможность использования IBProvider'a как связанного сервера MS SQL для выполнения распределенных запросов к разнородным базам данных.

Выводы

Достаточно большая популярность нашей бесплатной версии Free IBProvider определяется следующими факторами:

  • на момент её выпуска были устранены все самые серьезные ошибки, которые могут повлиять на стабильность работы;
  • в ней реализовано достаточно функциональности для её использования в более-менее серьезных проектах;
  • Free до сих пор единственная альтернатива нашей же коммерческой версии. К тому же, абсолютно бесплатная.

Кодовая база Free взята из коммерческой версии 1.6, на разработку которой к концу 2001 года было потрачено 2 года. И, пожалуй, Free это максимум, который можно было выжать из архитектуры с тривиальным транслированием запросов в IB API. Тем не менее, уже в Free была реализована схема хранения данных, снимающей ограничение на размер множества, которое нужно целиком выбрать на клиента. Это ограничение до сих пор присутствует в других популярных компонентах доступа.

Для дальнейшего развития продукта, в оригинальной версии потребовалось полностью изменить весь внутренний дизайн. Кроме того, пришлось пересмотреть рамки использования C++ при создании проекта - бесплатный компилятор от BCB5 оказался на порядок надежнее своих предшественников. В результате принятия всех этих решений, та функциональность, которая есть в Free, в оригинальной версии реализована на порядок качественнее и обеспечивает более высокий уровень устойчивости к нештатным ситуациям.

А если вы подробно рассмотрите техническую сторону функциональности, которая есть в оригинальной версии, но отсутствует в Free, то поймете следующее. За год, который прошел между выпуском Free 1.5.2 и версией 2.x, мы не только полностью разорвали какую-либо связь между этими двумя продуктами, но и преодолели тот рубеж сложности, к которому, на наш взгляд, разработчики других компонент доступа для IB пока даже и не приблизились.


   2 марта 2003 г.



Сборка сайта № 3.0.0.1682