Различия оригинальной и бесплатной версий 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 позволяет организовать взаимодействие следующего вида:
Перекодировка применяется ко всем способам передачи и представлениям текстовых данных:
- Обычные колонки
- Массивы
- 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 г.
|