Новый триал 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 выдает такое предупреждение:
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» вернул сообщение «В привязках параметров обнаружены ошибки [1].».
Текст запроса на запуск хранимой процедуры, который передается в провайдер:
{?=call "SP_SUB"(?,?,?)}
Четвертый маркер (?) параметра запроса обрабатывается как OUT. А MSSQL (для него это «@R output») говорит провайдеру, что это IN-OUT параметр. Провайдер (после недавних изменений) с ним не соглашается и возвращает ошибку.
Если посмотреть на это дело со стороны, то «output» у параметра «@R» как бы недвусмысленно говорит, что это OUTPUT-параметр. А не REF 🙂
Но поскольку спорить со слоном в данном случае бесмысленно, я просто добавил в IBProvider режим игнорирования подобных нестыковок — см. свойство ignore_err_param.
Определяем в строке подключения «ignore_err_param=4», и обретаем счастье:
В тестовую системы провайдеры были добавлены проверки с эмуляцией выполнения SP через связанный сервер MSSQL. Так что, надеюсь, больше я это ломать не буду.
—-
Подытоживая выше обозначенные исправления, связанные с Linked Server-ом, приведу строку с настройками IBProvider-a для подключения к employee.fdb (Firebird 2.5) к MSSQL 2008-2012:
Переезд на компилятор 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 дней назад ушел в кому под «большим» нагрузочным тестированием. И до сих пор не вышел из неё.
Непосредственно перед комой пациент вспотел 🙂