Снегопат
https://snegopat.ru/forum/

Sqlite - кто тут просил?
https://snegopat.ru/forum/viewtopic.php?f=1&t=325
Страница 1 из 3

Автор:  Magister [ 22 дек 2012, 23:08 ]
Заголовок сообщения:  Sqlite - кто тут просил?

Пока работа над SynEdit заглохла (никак не могу до конца понять логику сворачивания кода в SynEdit...), то в качестве разминки для ума решил сделать аддин sqlite.

Пока умеет немного - открыть базу, выполнить произвольный запрос, вернуть результат.

Методы:

OpenDatabase(dbFile) - открыть базу по пути. При этом создается внутренний объект для работы с базой, собственно открытия файла не происходит.
Возвращает строку с идентификатором базы, его нужно использовать дальше для работы с базой.

CloseDatabase(db) - освободить внутренний объект для указанной базы.
Возвращает булево - true или false. False может быть, если переданный идентификатор не существует.

ExecSQL(db, sql) - выполнить произвольный запрос в указанной базе.
Возвращает:
    - для запросов вида SELECT - таблицу значений (ValueTable)
    - для остальных запросов - количество "задетых" строк (Affected rows)
    - при возникновении ошибки - False
Также при возникновении ошибки ругается в окно сообщений с описанием что именно не так.

Пример использования:
Код:
var obj = addins.byUniqueName("sqlite").object;
db = obj.OpenDatabase("d:\\Misha\\Projects\\Lazarus\\Snegopat\\sqlite\\test.sqlite")
res = obj.ExecSQL(db, "CREATE TABLE test(id INTEGER PRIMARY KEY ASC, txt)")
message(res)
res = obj.ExecSQL(db, "INSERT INTO test(txt) values ('Row 1'),('Row 2')")
message(res)
res = obj.ExecSQL(db, "SELECT * FROM test")
obj.ExecSQL(db, "DROP TABLE test")
obj.CloseDatabase(db)
res.ВыбратьСтроку()


Вобщем, если надо - берите, пользуйтесь :)
Предложения к улучшению принимаются.

Файлы см. в репозитории.

P.S. вау, юбилейное сообщение - №100 :)

Автор:  orefkov [ 24 дек 2012, 08:55 ]
Заголовок сообщения:  Re: Sqlite - кто тут просил?

Дал правов на коммиты в scripts, можешь заливать.
Какая версия sqlite используется?
Как в ТЗ выгружаешь, через COM ?

Автор:  Magister [ 24 дек 2012, 11:06 ]
Заголовок сообщения:  Re: Sqlite - кто тут просил?

orefkov писал(а):
Дал правов на коммиты в scripts, можешь заливать.

Сейчас буду пробовать upd. Залил. Надеюсь, всё правильно сделал?
orefkov писал(а):
Какая версия sqlite используется?

Скачал на днях с оф. сайта - sqlite-dll-win32-x86-3071500
В принципе её можно свободно обновлять, если только не меняется интерфейс. DLL используется стандартная.
orefkov писал(а):
Как в ТЗ выгружаешь, через COM ?

Я только один вариант придумал - через COM. Выгружаю примерно так:
Код:
vt := Designer.v8New('ValueTable', nil);
vt.Columns.Add(...);
...
vtRow := vt.Add();
vtRow.set(idx, val);
...

Автор:  orefkov [ 24 дек 2012, 12:20 ]
Заголовок сообщения:  Re: Sqlite - кто тут просил?

Код:
var obj = addins.byUniqueName("sqlite").object;
db = obj.OpenDatabase(":memory:")
res = obj.ExecSQL(db, "SELECT sqlite_version()")

Выдает
EOleException: ???????? ??? ???????
в окно сообщений.

Автор:  Magister [ 24 дек 2012, 12:31 ]
Заголовок сообщения:  Re: Sqlite - кто тут просил?

Ну как бы логично.
1С не дает добавить колонку с именем "sqlite_version()" в таблицу значений :)

Вот так:
Код:
var obj = addins.byUniqueName("sqlite").object;
db = obj.OpenDatabase(":memory:")
res = obj.ExecSQL(db, "SELECT sqlite_version() version")
res.ВыбратьСтроку()
obj.CloseDatabase(db)

Всё работает.

Сейчас добавлю вырезку недопустимых символов.

Автор:  orefkov [ 24 дек 2012, 12:36 ]
Заголовок сообщения:  Re: Sqlite - кто тут просил?

А, понял. Лучше не вырезку, заменяй на "_".
И сообщения бы читабельные, а не ??????

Автор:  Magister [ 24 дек 2012, 13:07 ]
Заголовок сообщения:  Re: Sqlite - кто тут просил?

orefkov писал(а):
А, понял. Лучше не вырезку, заменяй на "_".
И сообщения бы читабельные, а не ??????

Ок, сделал замену. Правда список символов доступных не знаю где взять, добавил пока основное - скобки, точку, запятую, решетку, слеши.
По поводу сообщений - тут проблема с кодировкой. У меня внутренняя кодировка - UTF-8, а в 1С - UTF-16. Так что чтобы понять, надо ли перекодировать сообщение - нужно знать откуда оно.
Пока добавил перекодировку, если исключение возникает не при выполнении запроса. Будет ещё где-то не та кодировка - буду дальше думать.

P.S. блин, хрен разберешься с этим fossil...
Еле залил.

Автор:  orefkov [ 24 дек 2012, 15:15 ]
Заголовок сообщения:  Re: Sqlite - кто тут просил?

Цитата:
Правда список символов доступных не знаю где взять

Ну, я предполагаю, что имена колонок в 1Сной ТЗ должны удовлетворять правилам именования идентификаторов.
Поэтому все, что не подходит - заменять.
Кстати, а в 7ке без проблем любые имена для колонок ТЗ можно использовать.
Сейчас проверил на 1sqlite, возвращает тз с колонкой "sqlite_version()"

Автор:  orefkov [ 24 дек 2012, 15:16 ]
Заголовок сообщения:  Re: Sqlite - кто тут просил?

С fossil все просто
fossil add
fossil ci
fossil push
вот тут читай.

Автор:  Magister [ 24 дек 2012, 16:54 ]
Заголовок сообщения:  Re: Sqlite - кто тут просил?

У меня чуть другая ситуация получилась.
Написал commit message по-русски, в консоли. Закомитил, получили крякозябры (кодировка не та).
Долго искал, как откатить коммит, таки придумал.

Страница 1 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/