Новый триал IBProvider-a [сборка 15608]

Привет всем.

На сайт IBProvider-a загружены дистрибутивы нового триала — 3.18.0.15608. Основные изменения:

  • Улучшена работа в качестве MSSQL Linked Server-а.
  • Переезд на компилятор 2012 студии.

А теперь, об этих двух пунктах поподробнее.

Улучшена работа в качестве MSSQL Linked Server-а.

1. Поддерживается запуск хранимых процедур баз данных c первым диалектом.

В 2003(?), в процессе написания статьи о подключении IB/FB к MSSQL2000, обнаружилось что MSSQL всегда «квотирует» имена хранимых процедур связанного сервера. То есть запрос вида:

exec FB_LINKED_SERVER...SP ?,?,?;

всегда передается в OLEDB провайдер как:

{?=call "SP"(?,?,?)};

И это закавыченное имя «SP» приводило к проблемам в подключении с первым диалектом — IBProvider я честно считал что это не нормально. В подключении с третьим диалектом все работало.

Потребовалось 10 лет чтобы догнать — а кто собственно мне мешает в такого рода (нестандартных) запросах поддерживать квотированные имена? Все равно же я этот ODBC-вызов хранимой процедуры полностью разбираю и трансформирую в запрос, который понимает IB/FB.

Осознанно — сделано. До кучи я добавил аналогичную поддержку квотированных имен, которая не зависит от диалекта подключения, во все остальные нестандартные запросы, поддерживаемые IBProvider-ом.

2. Устранена проблема с CHECK-ограничениями

Вторая проблема, о которой (кстати) сообщали пользователи лет так 7 назад, связана с CHECK-ограничениями таблиц баз данных.

IBProvider их публикует через свои схемы метаданных. А MSSQL (зачем-то) пытается их прочитать и обработать. И «уходит в ступор» когда видит незнакомые функции или select-ы в выражениях. В частности, если на employee.fdb выполнить запрос вида:

begin distributed transaction;

select * from FB_EMPL...EMPLOYEE;

commit;

то MSSQL 2012 выдает такое предупреждение:

Msg 1046, Level 15, State 1, Line 1
Subqueries are not allowed in this context. Only scalar expressions are allowed.
Msg 102, Level 15, State 1, Line 8
Incorrect syntax near ‘)’.

(42 row(s) affected)

Собственно сам запрос отрабатывает без проблем, но вот это предупреждение задалбывает.

Семь (или сколько там — не помню уже) лет назад я понял, что эти предупреждения связанны с CHECK-ами. В случае таблицы employee, проблемный CHECK содержит такое условие:

salary >= (SELECT min_salary FROM job WHERE
                        job.job_code = employee.job_code AND
                        job.job_grade = employee.job_grade AND
                        job.job_country = employee.job_country) AND
            salary <= (SELECT max_salary FROM job WHERE
                        job.job_code = employee.job_code AND
                        job.job_grade = employee.job_grade AND
                        job.job_country = employee.job_country)

Но дальше этого понимания мысль почему-то не пошла.

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

По-умолчанию, IBProvider продолжает публиковать эти сведения в схемах.

3. Починил получение значений OUT-параметров хранимых процедур.

Весной(?) этого года, в процессе реализации поддержки «RETURNING INTO» похоже я очень сильно закрутил гайки в правилах обработки параметров запросов и поломал получение значений OUT-параметров хранимых процедур. Выглядит это так:

Хранимая процедура:

CREATE PROCEDURE SP_SUB(A INTEGER, B INTEGER)
RETURNS (RESULT INTEGER)
AS
BEGIN
 RESULT=A-B;
END

Запуск этой процедуры через связанный сервер:

begin distributed transaction;

declare @A integer;
declare @R integer;

set @A=4;

exec FB_EMPL...SP_SUB @A, 1, @R output;

print 'R='+convert(varchar(32),@R);

commit;

Ошибка:

Поставщик OLE DB «LCPI.IBProvider.3» для связанного сервера «FB_EMPL» вернул сообщение «IN-привязка параметра [позиция: 4, имя: «»] не связана с маркером IN-параметра запроса.».

Поставщик OLE DB «LCPI.IBProvider.3» для связанного сервера «FB_EMPL» вернул сообщение «В привязках параметров обнаружены ошибки [1].».

Текст запроса на запуск хранимой процедуры, который передается в провайдер:

{?=call "SP_SUB"(?,?,?)}

Четвертый маркер (?) параметра запроса обрабатывается как OUT. А MSSQL (для него это «@R output») говорит провайдеру, что это IN-OUT параметр. Провайдер (после недавних изменений) с ним не соглашается и возвращает ошибку.

Если посмотреть на это дело со стороны, то «output» у параметра «@R» как бы недвусмысленно говорит, что это OUTPUT-параметр. А не REF 🙂

Но поскольку спорить со слоном в данном случае бесмысленно, я просто добавил в IBProvider режим игнорирования подобных нестыковок — см. свойство ignore_err_param.

Определяем в строке подключения «ignore_err_param=4», и обретаем счастье:

R=3

В тестовую системы провайдеры были добавлены проверки с эмуляцией выполнения SP через связанный сервер MSSQL. Так что, надеюсь, больше я это ломать не буду.

—-
Подытоживая выше обозначенные исправления, связанные с Linked Server-ом, приведу строку с настройками IBProvider-a для подключения к employee.fdb (Firebird 2.5) к MSSQL 2008-2012:

auto_commit=true;nested_trans=true;truncate_char=false;dbtime_rules=2;support_odbc_query=true;asynch_fetch=2;dbclient_library=fbclient.dll;ctype_none=ASCII;schema_ldr_cfg__check_constraints=0;ignore_err_param=4;

Переезд на компилятор Visual Stidio 2012

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

Кстати — вчера было ровно шесть лет как я уволил её. Работу. Это был мой подарок себе на ДР.

Потому что деньги — «казенные». Когда тратишь свои — сначала 10 раз подумаешь, а потом заставляешь «игрушку» отработать свою стоимость.

Поэтому у меня компьютеры работают круглосуточно и загружены под завязку. Хотя свою стоимость («немного» выше средней, на момент приобретения) они давно уже «отбили» 🙂

С "Visual Studio 2012", как я тут писал — проблем с «отработкой» стоимости не возникло. Статический анализатор кода окупил её в первые дни эксплуатации. Сейчас просто информация о проблемах многого стоит. А тут конкретно потыкали в код.

Но оставалась последняя вещь, которая напрягала мозг — релизные бинарники, поставляемые пользователям, я продолжал собирать 2010 студией. И это было неправильно 🙂

На днях я добрался, наконец-то, до этой «проблемы». Прочитал наставление и добавил сборку бинарников IBProvider-a с использованием VC11. Их уже можно «пощупать» в новых триалах.

На этот раз (надеюсь) переезд пройдет без эксцессов.

  • Проверил работу бинарников на основных OS (XP SP2 32bit, Vista 64bit, Win7 64bit, Win2003 32bit, Win2008 64bit).
  • Выполнил нагрузочное тестирование (Win7 32bit/64bit, FB2.5).

—-
В прошлый раз (когда я переезжал на 2010), я умудрился наступить на грабли в виде утечек памяти в STL. Это был реальный horror, который продолжался где-то полгода. Пока я не обнаружил, что собираю бинарники непропатченной студией.

Если говорить точнее, то перед этим я таки локализовал утечку в std::basic_string. С помощью WinDbg. Потом полез в сеть за информацией по этому поводу. А после долго бился головой об стол.

Положительным аспектом всей той достаточно трагической комедии было радикальное улучшение диагностики в основной тестовой системе. Ну и опыт, конечно. Который «сын ошибок мутных» 🙂

Если кому интересно, то провайдер все еще периодически собирается «старыми» студиями: VS2005, VS2008. Ну и VS2010, конечно. Так что если у вас Windows 2000 и вы хотите на ней использовать IBProvider — обращайтесь.

——
PS.

Вот такое вот текущее состояние дел.

Теперь можно заняться и Firebird, который 10 дней назад ушел в кому под «большим» нагрузочным тестированием. И до сих пор не вышел из неё.

Непосредственно перед комой пациент вспотел 🙂

Leave a Comment