SSIS в картинках. Динамическая строка подключения

Два пользователя напрягли вопросом указания динамических значений некоторых параметров строки подключения в SSIS пакете.

Пришлось вникать в эту тему.

Оказалось все достаточно просто — нужно целиком формировать строку подключения. Причем её можно собирать из нескольких частей.

Думаю, следующая картинка все доходчиво объясняет:

У нас тут три переменных.

В переменных Variable_LOC и Variable_CN_STR1 заданы явные значения.

В переменной Variable_CN_STR значение формируется динамически через выражение:

location="+ @[User::Variable_LOC] +";"+@[User::Variable_CN_STR1]

В объекте подключения RAM.GAMER (в моем случае это OLE DB подключение) добавляем Expression определяющее свойство ConnectionString и указываем его значение как @[User::Variable_CN_STR].

Вести с полей

Всех с бодрым началом лета.

В IBProvider проведена очередная серия обновлений исходного кода. Устранил вещи, об которые начал спотыкаться мозг.

Основная суть — зачистка и переработка интерфейсов принимающих строковые значения. Если совсем просто, то вместо «const char*» и «const std::string&» теперь используется structure::t_const_str_box (аналог std::string_view).

В процессе переработки чуть было не наступил на грабли. Так что, в некоторых случаях, методы, принимающие указатели вида «const char*», пришлось сохранить.

После всех этих изменений, бинарник провайдера (x64) потяжелел приблизительно на 40KB. Это было ожидаемо, но все равно неприятно. Назад откатывать не стал — оптимизировал другие конструкции (-10KB).

Судя по результатам тестирования, функциональность не поломалась. Общая производительность тоже не просела. Даже стало немного быстрее:

Было

[16.05.2020 15:51:13] [summary] [TESTS]
[16.05.2020 15:51:13] [summary] EXECUTED      : 703686
[16.05.2020 15:51:13] [summary] SUCCEEDED     : 703630
[16.05.2020 15:51:13] [summary] FAILED        : 0
[16.05.2020 15:51:13] [summary] WITH WARNINGS : 56 [ 82 warning(s) ]
[16.05.2020 15:51:13] [summary] 
[16.05.2020 15:51:13] [summary] - - - - - - - - - - - - - - - - - - - - - -
[16.05.2020 15:51:13] [summary] [TEST TIMES]
[16.05.2020 15:51:13] [summary] REAL          : 4191257823522 [4 day(s)20:25:25.7823522]
[16.05.2020 15:51:13] [summary] USER          : 822947500000  [22:51:34.7500000]
[16.05.2020 15:51:13] [summary] KERNEL        : 337996562500  [09:23:19.6562500]
[16.05.2020 15:51:13] [summary] TOTAL         : 1160944062500 [1 day(s)08:14:54.4062500]

Стало

[02.06.2020 06:05:50] [summary] [TESTS]
[02.06.2020 06:05:50] [summary] EXECUTED      : 703686
[02.06.2020 06:05:50] [summary] SUCCEEDED     : 703628
[02.06.2020 06:05:50] [summary] FAILED        : 1 [ 2 error(s) ] <--- привет от FB.
[02.06.2020 06:05:50] [summary] WITH WARNINGS : 57 [ 75 warning(s) ]
[02.06.2020 06:05:50] [summary] 
[02.06.2020 06:05:50] [summary] - - - - - - - - - - - - - - - - - - - - - -
[02.06.2020 06:05:50] [summary] [TEST TIMES]
[02.06.2020 06:05:50] [summary] REAL          : 3935194767393 [4 day(s)13:18:39.4767393]
[02.06.2020 06:05:50] [summary] USER          : 800231406250  [22:13:43.1406250]
[02.06.2020 06:05:50] [summary] KERNEL        : 325012343750  [09:01:41.2343750]
[02.06.2020 06:05:50] [summary] TOTAL         : 1125243750000 [1 day(s)07:15:24.3750000]

Все это ускорение, конечно, условно. Но все равно приятно.

Если все сложится благоприятно (основное тестирование закончится только завтра), то новое обновление провайдера (v5.18) будет выложено на этой неделе.

Немного статистики

На днях провел небольшую экскурсию в свое прошлое и подвел итоги.

Вкратце.

1. Общий объем исходных кодов рабочих проектов, с которыми приходится регулярно иметь дело, составляет около 80MB.

2. Половину составляют тесты.

А я еще чертыхаюсь — что так все стало сложно и тяжко? 🙂

Регулярные выражения

Вчера весь день доводил до ума одну конструкцию IBProvider, которая была сделана одной из первых в его третьей версии. И краем глаза увидел код вида:

 :inherited(NULL)
 ,m_ProviderClassID(ProviderClassID)
 ,m_spData(pData)
 ,m_spUnkOwner(pUnkOwner)
{
 assert(m_spData);
 assert(m_spUnkOwner);

Непорядок, подумал я. Надо бы задействовать structure::not_null_ptr для подсказки смарт-указателям:

 ,m_spData(structure::not_null_ptr(pData))
 ,m_spUnkOwner(structure::not_null_ptr(pUnkOwner))

Но решил не отвлекаться.

К вечеру, а тем более сегодня с утра, уже не мог вспомнить — ГДЕ ЭТО Я ВИДЕЛ???

Чертыхаясь, пришлось осваивать регулярные выражения.

С использованием справок, онлайн-тестеров и такой-то матери, осилил выражение — (,m_sp)[\w]*[(][p].

Нашлось даже больше чем ожидал:

I am an engineer a regular expression expert! 🙂

Хорошая статья на Хабре

Почему компания «Интел» делает ставку в разработке чипов на гений Джима Келлера?

Их отличительной чертой станет разделение основных функций, что позволит компании улучшать будущие микропроцессоры по блокам.

SSIS. Перекачка из MS SQL (OLE DB) в Firebird

Надо бы где-то сохранить нюансы связанные с SSIS, remote MSSQL, OLE DB и транзакциями.

1. Настроить DTC на обоих компьютерах.

Control Panel\All Control Panel Items\Administrative Tools\Component Services

Обращаем внимание на «No Authentication Required».

2. В FireWall на обоих компьютерах нужно разрешить DTC.


Наверное, в диких условиях так делать нельзя.

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

SSIS и «LCPI ADO.NET Data Provider for OLE DB»

Выложил новое обновление .NET провайдера, в котором реализован workaround костыль для костыля в SSIS — v1.20.

Так что теперь SSIS может закачивать данные в FB/IB через lcpi.data.oledb->IBProvider.

Руководство к действию в картинках.

Araxis Merge 2020.5368

Есть три вещи, в которых я провожу 90% времени во время создания кода (порядок произвольный):

1. Visual Studio 2019 CE
2. WinCVS
3. Araxis Merge Pro

Первые две вещи — бесплатные.

Araxis куплен и лицензия многократно продлена.

Если вы пользуетесь этой штукой, то каждый раз, когда нажимаете на кнопочку «закрыть» на вкладке с сравнением файлов, можете мысленно вспоминать меня (ага). Это я их задолбал и они её добавили.

В последнем обновлении появилась еще одна «мегафича» — подсветка фрагментов текста, идентичных выделенному блоку.

Я их наверное лет шесть слезно просил добавить эту штуку.

Теперь вот в некотором замешательстве, потому что новых идей по улучшению этого инструмента у меня нет 🙂

Вести с полей

Привет всем.

Никак не получается притормозить изменения в IBP и перейти к финализации версии 5.17. Ну очень увлекательное занятие.

0. Сначала о стороннем. Судя по субъективным наблюдениям — если гонять тесты в четыре потока, то FB3 (Win/SS/x64) вроде как работает без проблем. Если в десять потоков, то рано или поздно к нему приходит северный пушистый зверь и его приходится перегружать.

HOME4 Wed May 13 09:39:53 2020
Database: D:\DATABASE\RAM\IBP_TEST_FB30_D3.GDB
internal Firebird consistency check (pointer page vanished from DPM_next (249), file: dpm.cpp line: 1904)

При Обаме такого не было.

1. В IBP добавлена поддержка InterBase 2020 (v14). Поддержка заключается в определении нового списка ключевых слов и подключении исправленного механизма чтения/записи массивов. Последнее, по большому счету, заключается в прогоне тестов для 32-битного и 64-битного сервера.

Впечатление о сервере абсолютно нейтральное. Даже вспоминаться его родителей не хочется. Не упал и … ладно. Запросы типа «select EXTRACT(DAY FROM NULL) FROM …» как не переваривались, так и не перевариваются.

2. В схеме метаданных PROCEDURES корректно восстанавливается определение UDR процедур Firebird. Тут уже можно и выругаться по поводу отсутствия в дистрибутиве FB3 откомпилированного модуля udrcpp_example.dll. Типа, сами разбирайтесь …
(далее…)

64-битные счетчики ссылок

В новой тестовой сборке IBProvider (v5.17.0.34920) осуществлен переезд на 64-битные unsigned счетчики ссылок COM-объектов.

Как в 64-битных, так и в 32-битных сборках.

IUnknown::AddRef теперь всегда возвращает 1, а IUnknown::Release или 1 или 0.


Внутренние объекты тоже переведены на 64-битные счетчики ссылок.


Для инкремента и декремента используются Interlocked-функции Win32 API.

На древней 32-битной WinXP SP2 (в виртуальной машине) все работает.

Полагаю, проблемы будут только на древних системах с 32-битными процессорами.