
|
 |
Различия оригинальной и бесплатной версий 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 г.
|