Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Загрузка SQLite из памяти / 19 сообщений из 19, страница 1 из 1
23.11.2018, 17:55
    #39737658
hottabych31
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка SQLite из памяти
Привет!

Мне в одном проекте нужно загружать бд sqlite из памяти. В списке расширений у SQLite'а есть memvfs.c, который позволяет делать подключения к БД типа sqlite3_open_v2("file:/whatever?ptr=0xf05538&sz=14336&max=65536", &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_URI, "memvfs");

В общем, как я понял мне нужно скомпилировать sqlite3.dll с уже включенным в неё этим расширением, потому что расширения для SQLite грузятся уже после открытия БД (?вроде).
Куда что нужно подключить чтобы можно было вызвать функцию как показано выше?
Заранее благодарен.
...
Рейтинг: 0 / 0
23.11.2018, 18:00
    #39737662
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка SQLite из памяти
В C++ с SQLLite не работал, работал только из Java.

Но твои мучения не понятны, т.к.

https://www.sqlite.org/inmemorydb.html
The most common way to force an SQLite database to exist purely in memory is to open the database using the special filename ":memory:"
...
Рейтинг: 0 / 0
23.11.2018, 18:01
    #39737666
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка SQLite из памяти
или я не правильно понял задачу (((
...
Рейтинг: 0 / 0
23.11.2018, 18:24
    #39737680
hottabych31
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка SQLite из памяти
Leonid Kudryavtsev,

Чуть неправильно.
Алгоритм такой:
1. читаем блоб из postgre,
2. читаем sqlite из блоба.

сохранение/загрузку из файла не предлагать, не спортивно)

там не c++, там c. Нужно скомпилить библиотеку с включенным в нее расширением, чтобы выполнить по человечки функцию sqlite3_open_v2
...
Рейтинг: 0 / 0
23.11.2018, 18:27
    #39737682
hottabych31
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка SQLite из памяти
Leonid Kudryavtsev,
Мучения не то слово, день убил в попытках разобраться что там и к чему...
...
Рейтинг: 0 / 0
23.11.2018, 21:11
    #39737752
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка SQLite из памяти
Если не путаю "in memory" это когда с нуля ты создал БД в памяти. А если надо загрузить/выгрузить готовое - этого нет в SQLite.
...
Рейтинг: 0 / 0
23.11.2018, 21:58
    #39737765
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка SQLite из памяти
Хранить базу SQLite в PG...
Следующим шагом будет засовывание этой PG базы в какой-нибудь Hive?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.11.2018, 22:43
    #39737782
hottabych31
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка SQLite из памяти
Dima T,

Есть. Я уже написал выше про это расширение. Суть в том, что в самом низу стека обработки запроса (по версии sqlite) находится уровень файловой системы ОС. Разработчики сделали уровень абстракции, который позволяет отвязаться от реализации IO для конкретной ОС. Так вот memvfs как раз и реализует ввод/вывод в выделенном куске памяти, а не в файл.
Моих знаний C не хватает, чтобы встроить это расширение в код основной библиотеки и её собрать.

Dimitry Sibiryakov,
для моих задач(хранение справочных данных и настроек в компактном зашифрованном виде, иметь возможность быстрого select'а, удобство разработки CRUD форм,поддержка sql, универсальность) я не придумал решения лучше, правда, долго думал... Но может думалка не варит.
...
Рейтинг: 0 / 0
23.11.2018, 23:15
    #39737788
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка SQLite из памяти
hottabych31я не придумал решения лучше

Говори честно: "нагугить готовый код шифрования какого-нибудь JSON и сохранения его в
блобе не смог".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.11.2018, 23:29
    #39737794
hottabych31
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка SQLite из памяти
Dimitry Sibiryakov,

Ненавижу врать.
Как вы представляете работать с JSON как с РСУБД? Ну, правда. Тем более всё это запаковать/распаковать, сериализовать/десериализовать, как-никак время занимает, машинное. И SQL не поддерживает.

Собственно, мне концепция "смерть кощея в игле, игла в яйце, яйцо в зайце, заяц в шоке" тоже не нравится, но не знаю, как сделать лучше. Была идея запихнуть всё рядом с другими таблицами, но потом подумалось, что экземпляров настроек может быть несколько... В общем, как мне запихнуть гребаное расширение в кодовую базу сикьюлайта?
...
Рейтинг: 0 / 0
23.11.2018, 23:35
    #39737798
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка SQLite из памяти
hottabych31Как вы представляете работать с JSON как с РСУБД? Ну, правда.

Легко: std::map. Чего я не представляю, так это "справочных данных и настроек", которым
нужна отдельная РСУБД. У тебя миллион настроек и справочник, который не нужен в главной БД?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.11.2018, 23:40
    #39737799
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка SQLite из памяти
хранить настройки в ини-файле не предлагать, да?))
...
Рейтинг: 0 / 0
23.11.2018, 23:51
    #39737804
hottabych31
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка SQLite из памяти
Dimitry Sibiryakov,

Ну да, порядка 50 таблиц, в среднем по 10 полей в каждой. Есть foreign constraints.
...
Рейтинг: 0 / 0
24.11.2018, 01:12
    #39737813
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка SQLite из памяти
hottabych31Dimitry Sibiryakov,

Ну да, порядка 50 таблиц, в среднем по 10 полей в каждой. Есть foreign constraints.
это справочники
их в общей бд надо держать
причём даже в общей схеме, так чтобы другие приложения могли взять
а вот настройки, их мало
и их вообще-то тоже не помешает в БД хранить, потому что их захотят править из админки...
так что на те настройки, что в редиску sqlite можно положить, совсем мало остаётся
...
Рейтинг: 0 / 0
24.11.2018, 12:36
    #39737879
hottabych31
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка SQLite из памяти
полудух,

Да, вот только беда в том, что экземпляров справочников может быть несколько, от разных поставщиков. Разрулить это в общей схеме проблематично, на мой взгляд. Добавлять дополнительный ключ не хочу, копировать таблицы тоже.
В схеме с редиской sqlite'ом есть преимущество, что можно абстрагироваться от большей части мути, связанной с множественностью экземпляров справочников. Загрузил один конкретный, подключился и работай.

Кстати, с сабжем разобрался немного другим путем - загружаю расширение из dll (создаю inmemory бд, гружу memvfs.dll, всё это только один раз при инициализации), и далее уже подключаюсь через обычную sqlite3_open_v2 функцию. Не комильфо, но пока так.
...
Рейтинг: 0 / 0
24.11.2018, 13:22
    #39737896
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка SQLite из памяти
hottabych31экземпляров справочников может быть несколько, от разных поставщиков. Разрулить это в
общей схеме проблематично, на мой взгляд.

Какое счастье, что у PG может быть много схем в одной базе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.11.2018, 19:32
    #39738239
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка SQLite из памяти
Dima TЕсли не путаю "in memory" это когда с нуля ты создал БД в памяти. А если надо загрузить/выгрузить готовое - этого нет в SQLite.
Да, разбираться надо, самому писать

Я так понял, база in memory это просто набор страниц в структуре Pager возращаемой sqlite3BtreePager. Код сохранения базы на диск в инете находится, но вот кода создать обратно, поиском не нашел. Также как и документации на внутренние ф-ции/структуры SQLLite.

IMHO только жестким хакингом. Раньше таким увлекался, но теперь лениво )))

Подозреваю, нужно востановить Pager одни в один как был, и потом просто добавить его в массив открытых баз (как делает команда/ф-ция attach)

Кроме того, в коде attach попадается очень обнадеживающий макрос SQLITE_ENABLE_DESERIALIZE. Вполне возмонжно, все уже реализовано до нас

https://www.sqlite.org/c3ref/serialize.html
https://www.sqlite.org/c3ref/deserialize.html

Чисто в порядке бреда сам так не делал, не проверял. Возможно брежу.
...
Рейтинг: 0 / 0
25.11.2018, 19:33
    #39738240
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка SQLite из памяти
документацию на C API нашел, только буковки/ссылочки там больно мелкие ))), с первого раза не заметил )))
...
Рейтинг: 0 / 0
25.11.2018, 21:09
    #39738268
hottabych31
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка SQLite из памяти
Leonid Kudryavtsev, спасибо. Уже немного разобрался.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Загрузка SQLite из памяти / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]