Всех с бодрым началом лета.
В 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, remote MSSQL, OLE DB и транзакциями.
1. Настроить DTC на обоих компьютерах.
Control Panel\All Control Panel Items\Administrative Tools\Component Services
Обращаем внимание на «No Authentication Required».
2. В FireWall на обоих компьютерах нужно разрешить DTC.
—
Наверное, в диких условиях так делать нельзя.
Но для тестовой инфраструктуры, когда нужно быстро разобраться с проблемой ленивого пользователя IBProvider — самое оно.
Выложил новое обновление .NET провайдера, в котором реализован workaround костыль для костыля в SSIS — v1.20.
Так что теперь SSIS может закачивать данные в FB/IB через lcpi.data.oledb->IBProvider.
Руководство к действию в картинках.
Есть три вещи, в которых я провожу 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. Типа, сами разбирайтесь …
(далее…)
В новой тестовой сборке 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-битными процессорами.
Надо сформулировать, в первую очередь для себя, базовые принципы, на которые стоит опереться при создании интерфейса компонент. Пока нахожусь в здравом уме и ясной памяти 🙂
1. В основе должен быть IUnknown.
— Это динамическая поддержка нескольких интерфейсов
— Это агрегация
1.5 Взять из COM принципы управления памятью и указателями на интерфейсы.
2. Первый аргумент методов должен быть указатель на интерфейс контекста вызова. Через этот контекст можно:
— Выполнять отмену вызова
— Возвращать описания ошибок/предупреждений/сообщений вызова
— Выделять память компоненту
Нужно ли передавать контекст в методы контекста? Наверное, да.
<уже начал напрягаться, чтобы вспомнить>
3. Для настройки и получения характеристик компонент следует использовать свойства, сгруппированные в наборы.
— Для идентификатора набора свойств вполне подходит GUID.
— Внутри набора используется целочисленный идентификатор свойства.
— У компоненты может быть несколько наборов свойств.
— У свойства может быть несколько равнозначных символьных идентификаторов.
— Свойство может связанно с несколькими объектами внутри компоненты (например — Columns внутри Rowset). При получении/установки свойства нужно указывать идентификатор целевого объекта.
4. Нужен аналог VARIANT. Для универсальной передачи типизированных значений (свойств, в первую очередь).
<пока все>
—
А, ну да. Напомню себе, что у модуля с компонентами должен быть метод инициализации и деинициализации. Допускается повторная инициализация, компенсируемая связанным вызовом метода деинициализации.
—
PS. Если вспомню что еще, дополню.