1sqlite

Автор alyuev, 01 декабря 2025, 13:20

« назад - далее »

alyuev

Хм.... На удивление - даже получилось. Откомпилилась библиотека 1sqlite_3.32.3.23, а потом даже обновился движок и теперь 3.53.2. И запустился в 1С. Но пока ещё плотно не проверял. Да, и не скажу на счет того, что нужно сделать, чтобы подогнать все изменения, которые делались Антоном после версии 3.32. Нашел только вот это в истории версий

* 1sqlite 3.32.3.24
+ Изменена функция подключения таблиц, это позволило подключать таблицы 1С с наличием в Идентификаторе знака подчёркивания "_".
Подобные таблицы не редкость, пример: Справочник_КонтурEDI_ДополнительныеРеквизиты
 
* 1sqlite 3.33.0.24
+ Обновлен движок: https://sqlite.org/releaselog/3_33_0.html
Хорошее обновление!  UPDATE FROM значительно ускоряет обновление поля в таблице sqlite. Обновление таблицы размером в 4000 строк с 900мс, ускоряется до 32мс, за счет отсутствия дерганья 4000 раз коррелирующего подзапроса.
 
* 1sqlite 3.33.0.25
Внезапно обнаружил, что CDO под Linux+Wine@Etersoft не работает, его там просто нет, а перекодировать из/в BASE64 под 1С 7.7 без него большие сообщения довольно затруднительно (слишком медленно). Поэтому:
+ функции text_base64 to_base64(text_utf-8) и text_utf-8 from_base64(text_base64)
Примечание: кодировка Windows-1251 таким образом используется в 0.01% случаев, а sqlite внутри своей базы использует utf-8, а 1sqlite прозрачно преобразовывает Windows-1251 при передаче в sqlite и наоборот, то такой вариант работы с BASE64 приемлем.
ВНИМАНИЕ!!! Закодированный в BASE64 текст будет в кодировке UTF-8
 
* 1sqlite 3.35.1.25
Обновлен движок https://www.sqlite.org/releaselog/3_35_1.html
Компиляция движка произведена с включением математических функций (+3кб): https://www.sqlite.org/lang_mathfunc.html
 
* 1sqlite 3.36.0.26
Внезапно оказалось что запрос к пустой дате возвращает не совсем пустую дату, т.е. ПустоеЗначение(ДатаИзSQLite)=0, а не 1 как должно быть. Исправлено.
 
* 1sqlite 3.40.1.26
Обновлен движок sqlite, изменения всегда тут:  https://www.sqlite.org/changes.html
Включен json по-умолчанию https://www.sqlite.org/json1.html
Но, на мой взгляд, из интересного для нас только: RIGHT and FULL OUTER JOIN.
Возможно еще и материализация (повторное использование первого запроса, без обращения к базе) отразится в скорости запросов к CTE и VIEW, что-то может резко поменяться, но такие запросы редкость.
Все остальные фишки и оптимизации вроде с клюшками не работают никак, но может где-то Вы это и заметите. Если найдете, обязательно сообщите.


_________________

Если получится это восстановить - будет хорошо. Или вдруг кто-то найдет более свежие исходники - будет совсем здорово.

Злоп

Лучи добра за поддержание проекта.

smitti911

Обнаружил на другом компе sqlite1c_3.46.0.31:

https://drive.google.com/file/d/1KMOJ_ItRkYC-ZFfEa_jbGlQFa-XcGTtr/view?usp=sharing

alyuev

О! Благодарю! Сейчас кину в анализ.

alyuev

Вот, что написал ИИ Claude после анализа.

Что было в авторском исходнике 3.46.0.31 (

Фиксы.txt
)
Автор оставил свои реальные правки. Разбор:
1. 🔴 Регистронезависимость ИМЁН ПОЛЕЙ (
sqlite3StrIHash
) — у нас этого НЕ БЫЛО, добавил.
Баг автора: запрос


SELECT Автомобили.МаркА FROM Справочник_Автомобили AS АвтомобилИ
GROUP BY Автомобили.ID

давал
no such column: Автомобили.МаркА
. Причина: имена идентификаторов хешируются функцией
sqlite3StrIHash
, а она складывала байты через
UpperToLower
. Для кириллицы в разном регистре («МаркА» vs «Марка») получались разные хеши → разные корзины → поле не находилось. Мы чинили парный
StrICmp
(сравнение), но забыли хеш. Это и был пропущенный фикс — теперь хеш считается по кодовым точкам через
oasUpper2Lower
, как у автора.
2. 🟡 Фикс компиляции
u64→double
(ошибка C2520) — у автора в коде printf-форматирования. У нас та же проблема решена в других местах того же движка (
sqlite3AtoF
/JSONB) — эквивалентно.
3. 🟡 Пустая дата (
CDate
) — автор делает
if(m_Date.m_DateNum == -1) m_Date.m_DateNum = 0
(прямой доступ — у него работает, т.к. раскладка в его заголовках совпадает). У нас — безопасный эквивалент через
*pValue = CDate...
(работает независимо от раскладки). Оставил наш.
4. 🟢
baseStr2Id
— автор перевёл на
strtol(..., 36)
(выравнивание с 1С++ MetaDataWork). Мелочь; у нас кастомный парсер, трогать рискованно.
Плюс: его
to_base64
/
from_base64
— это библиотека libb64, но в 3.46 она даже не зарегистрирована (код лежит, но не подключён). Наш рукописный base64 зарегистрирован и проверен — то есть у нас функциональнее.
Итог
  • Добавлен реальный пропущенный фикс — кириллические имена полей в разном регистре теперь находятся (

    GROUP BY Поле
    
    , алиасы и т.п.). Релиз 

    1sqlite_3.53.2.49.dll
    
    .
  • Остальное у нас уже есть в эквиваленте или лучше.

Злоп