Привет всем!
Сегодня первый день после моих летних «enjoyable holidays». Даже немного соскучился по своей игрушке. Не уверен, что это взаимно. Потому что за все лето не было ни одной технической проблемы, связанной с провайдером.
И еще сегодня ДР релиза третьей версии IBProvider-a. Три года. Ходить и отнимать добывать еду он уже научился. Наверное скоро болтать начнет 🙂
Всем привет.
Сегодня обновил лицензию на единственную коммерческую программу (не считая Visual Studio), которую активно использую непосредственно в процессе разработки — «Araxis Merge. Professional Edition». До арахиса достаточно долго (несколько лет) сидел на WinMerge. Пока в один прекрасный момент не убил (без результата) несколько дней на анализ изменений в трех километровом файле с C# кодом. Угробив время, я понял что проблема заключается в WinMerge и нужно искать замену. Память напомнила про Araxis, ломанной версией которого я пользовался в прошлой жизни (да простят мне это Боги). Скачал и поставил его триал. Наверное в это поверится с трудом — но с его помощью я проверил проблемный файл за полчаса. И я тогда понял — что за хороший, реально хороший инструмент не жалко и заплатить.
Но я, правда, потом удолбал их службу поддержки требуя реализации некоторых фич, ускоряющих работу. Появившаяся в последних выпусках «локальная кнопочка закрытия» на закладках — одна из моих хотелок. Но в основном — «мы сожалеем что вы вынуждены так страдать». Я тогда хорошо посмеялся, и решил что когда-нибудь тоже начну так отвечать своим пользователям.
Но как говорится — «не было бы счастья». Судя по всему сейчас идет настоящий кризис. Не такой как в 2008, а реальный. Но о котором все молчат. Месяц назад получаю письмо — «Дмитрий, помните вы просили реализовать такую штуку. Если она вам все еще интересна — можете её потестировать». Что я и сделал. Действительно, сделали все как я и просил. Плюс исчезли мелкие баги, о которых даже сообщать было лень. И хотя мне предлагали еще ключики для продолжения тестирования, до тех пор пока они не зарелизятся, решил не ждать и купил ключ для нормальной активации свой тестовой сборки. Благо она работает стабильно.
Вот такие вот дела.
Так что, когда я вижу в сети как народ тратит свое время на поиски бесплатных альтернатив IBProvider-у, то вспоминаю почему я купил Araxis и 🙂
Привет всем.
Второго мая, в качестве предварительного забега, было запущено выполнение всех тестов. Последний раз такое делалось пару лет назад. С тех пор количество тестов увеличилось почти в семь раз (в основном за счет добавления комбинаций с использование UTF8), тестовая система стала более производительной, IBProvider — навороченным. В забеге использовался Firebird.
Скажу сразу — до финиша добежать не удалось, потому что тесты выжрали двух-гигабайтный лимит на количество транзакций. Проехало всего ~253 тысячи тестов.
[LCPI.IBProvider.3]: Ошибка старта транзакции.
Implementation limit exceeded
Transactions count exceeded. Perform backup and restore to make database operable again
Причина — наличие тестов с огромным количеством автоматических транзакций.
Однако общий результат — вполне удовлетворительный (в хорошем смысле этого слова). (далее…)
Привет всем.
В дистрибутив NetProvider-а были добавлены примеры (проекты на C# для VS2008, VS2010, VS2012), в числе которых — запись и чтение бинарного блоба размером 8GB (каталог Sample_0007__8GB_bin_blob).
Firebird (2.5) без проблем сохраняет и позволяет прочитать такие блобы. Но ни через API, ни через OCTET_LENGTH не в состоянии вернуть правильный размер такого блоба.
ISC API
Через API размер блоба определяется с помощью функции isc_blob_info и тега isc_info_blob_total_length (id: 6).
Для блоба, размером 8GB, серверный клиент возвращает длину в виде 4-байтного числа [буфер с ответом: (tag)06 04 00 00 00 00 00 | (end_tag)01 cc cc cc cc].
Хотя, для 3GB блоба, почему-то, возвращается уже 8-байтное число [буфер с ответом: (tag)06 08 00 00 00 00 c0 00 00 00 00 | (end_tag)01 cc cc cc]. Что несколько озадачивает…
OCTET_LENGTH
С этой SQL функцией все просто — она возвращает INTEGER (INT32), поэтому даже теоретически не в состоянии вернуть значения больше 2GB. Для 3GB блоба эта функция возвращает -1073741824.
FB3 (сборка 30319) OCTET_LENGTH все еще продолжает возвращать INTEGER. Наверное, руки пока не дошли перевести на BIGINT, который в FB3 стал допустимым для первого диалекта.
Так что, в плане определения размера блоба у Firebird пока все грустно непонятно.
И возня с этой непонятностью сожрала у меня первую половину текущего дня.
Привет всем.
На сайт загружена новая сборка (1183) .NET провайдера, в которой реализована полноценная поддержка объектов System.IO.Stream и System.IO.TextReader. Объекты этих классов можно:
- передавать в качестве IN-значений параметров команды
- получать через OUT-значения параметров команды
- получать через методы GetStream и GetTextReader класса OleDbDataReader
- использовать как для обычных колонок, так и для колонок с массивами.
При передаче и при получении объектов этих классов используются механизмы «поточной обработки данных». Иными словами — теперь через Stream и TextReader можно перекачивать любые объемы информации. (далее…)
Привет всем.
Вчера в клиентскую часть сайта IBProvider-а были загружены релизные бинарники нового выпуска провайдера — версия 3.16.1.
Исправлены две ошибки, выявленные в процессе создания тестов для NetProvider-а:
- Первая связана с древним суеверием о необходимости писать нулевой байт в начало буфера, передаваемого в isc_get_segment. Я даже помню кто и когда (1999 год) мне это внушил.
- Вторая ошибка тоже древняя и находится в реализации storage-объекта для бинарных данных. Проявляется в достаточно специфическом случае.
В целом, текущее состояние IBProvider-а не вызывает каких-то негативных мыслей. Наоборот — есть чувство глубокой удовлетворенности от того небольшого марш броска, который был совершен с августа прошлого года. Пока еще могу сам себя удивлять:
- Новые конструкции для работы с потоками символов
- Асинхронная загрузка результирующих данных
- Подтянули код до текущего состояния FB3 и добавили поддержку «RETURNING INTO».
- Прикручен пул подключений к тестовой системе
- Исправлено множество недочетов и ошибок. Некоторые из которых были выявлены в результате многоступенчатых обновлений провайдера, тестов и оборудования. Иными словами — в процессе непрерывного совершенствования
Так что, еще раз всех и себя лично поздравляю с текущим состоянием IBProvider-a.
А теперь — прекращаем оглядываться назад и двигаемся вперед. Нереализованных идей еще целая прорва 🙂
Привет всем.
В качестве эксперимента по закачке больших объемов данных (например — текстовых), я создал следующий забавный пример на C#, передающий в стандартный OLEDB.NET и наш LCPI.OLEDB.NET провайдеры объект с интерфейсом IIBP_ISequenialStream_WideChar. (далее…)
Привет всем.
Новая сборка нашего ADO.NET провайдер для OLEDB доступна для скачивания.
Реализованы два метода — OleDbDataReader.GetBytes и OleDbDataReader.GetChars. В обоих случаях, у OLEDB провайдера запрашиваются storage-объекты и применяется «блочное» чтение данных. Если запрашивается только размер данных (значение аргумента «buffer» равно null), то у OLEDB провайдера запрашивается количество байт/символов в колонке, что в большинстве случаев исключает чтение данных блоба. Кроме блобов, эти методы могут так же применяться и к обычным CHAR/VARCHAR колонкам.
Сама реализация (хочется надеяться) более продумана по сравнению с тем, как эти методы реализованы в стандартном OLEDB.NET и Firebird .NET провайдере. Последние (судя по коду) сначала грузят все данные, а потом либо определяют размер либо возвращают затребованный сегмент. То есть, если последовательно читать по-одному байту блоб размером N байт, то этот блоб будет N-раз целиком прочитан из базы данных. И еще есть сомнения насчет того, что эти провайдеры позволяют читать блобы размер которых больше 2GB.
Что дальше?
Естественно, останавливаться на достигнутых результатах пока не планируется. Следующими шагами, я так думаю, будут:
- Добавление в OleDbDataReader методов GetStream, GetTextReader (по аналогии с нативным .NET провайдером для MSSQL)
- Поддержка Stream, TextReader в качестве значений параметров
Будет интересно потом поиграть в перекачку файлов в базу и обратно 🙂
Первого мая, без шума и пыли, вышло второе обновление IB XE3
Если там что-то и поменялось (я насчитал 17 исправлений), то мои тесты этого не заметили. Ну, если быть точнее, то запрос вида «SELECT EXTRACT(YEAR FROM NULL) FROM RDB$DATABASE» не починили. Но, в любом случае — поставился без ошибок(Ё!), тестовые базы создались без проблем и хуже чем 11.0.1 вроде не стало 🙂
Меня вот что забавляет. Бинарники нового релиза были сгенерированы 24 апреля 2013 года. Раньше, если я правильно все помню, декларировалось, что сервер (перед релизом) гоняется под нагрузкой около месяца. А тут они за неделю уложились. Красавцы, ничего не скажешь.
До кучи я еще нашел и скачал исходные тексты «нового» ODBC для InterBase. Для коллекции. 4MB исходников. По моим меркам это среднестатистический (если не сказать что вообще — нулевой) уровень развития драйвера. У меня провайдеры v1/v2 болтались в этом объеме. Заглянул в код, вздрогнул, увидев руку Джима мастера (это же он там свой след в истории оставил?) и потерял к нему интерес 🙂
Такие вот дела.
Привет всем.
Вышел очередной релиз IBProvider-a — 3.16.0.15007.
С технической точки зрения, лично мне он (уже) интересен не новыми возможностями (закрыл темы, на которые на хватило сил в 2010 году), а исправленными ошибками. Основной диагноз был — неустойчивый к исключениям алгоритм обработки результатов выполнения команды.
После исправления выявленных багов я (с перепугу) пытался погонять тесты под «Application Verifier», но он ругается на fbclient.dll (2.5). На раскопки серверного клиента меня уже не хватило. Старею 🙂
Ну да ладно. Глядя на регулярные уведомления о скачивании нашего «.NET провайдера для OLEDB», я вспомнил об этой штуке. Думаю, время пришло немного отдохнуть от C++ и толкнуть вперед нашу .NET игрушку.