Как встроить sqlite VFS в библиотеку - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь скомпилировать SQLite в библиотеку, с которой затем будет ссылаться другое приложение.Я не могу скомпилировать SQLite непосредственно в это приложение по причинам, которые выходят за рамки этого вопроса.

Однако мне нужна VFS, которая по умолчанию недоступна.Пытаясь выяснить, как заставить это работать, я пытаюсь сделать доступной оболочку vfstrace приложению, которое ссылается на SQLite.Это легко докажет, что это работает, поскольку я могу регистрировать активность SQLite VFS из shim и видеть, что она фактически используется, когда приложение вызывает SQLite.

Как мне это сделать?Все примеры, которые я нашел, показывают случай, когда у вас есть исходный файл (например, shell.c), и вы компилируете его, sqlite3.c и test_vfstrace.c для создания исполняемого файла.Однако у меня нет такой роскоши.Я мог бы скомпилировать sqlite.c и test_vfstrace.c и сгенерировать файл библиотеки libsqlite3.so, но нет «основной» функции для вызова vfstrace_register, чтобы VFS действительно была доступна.Есть ли какой-нибудь другой хук для библиотечного кейса, где я могу это настроить?Если нет, как мне сделать доступным новый VFS?

1 Ответ

0 голосов
/ 19 октября 2018

SQLite инициализируется с помощью функции sqlite3_initialize(), которая вызывается автоматически, когда пользователь вызывает различные функции, такие как sqlite3_open(), хотя при последующих вызовах он не используется.Эта функция в свою очередь вызывает специфическую для ОС функцию инициализации sqlite3_os_init().Это функция, которая инициализирует все VFS, встроенные в SQLite.

Для приведенного примера VFS добавьте test_vfstrace.c к объединению и затем поместите такой вызов в sqlite3_os_init() прямо перед оператором return:

  vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);

Затем создайте библиотеку с этими изменениями.

Значение последнего параметра 1 сделает эту VFS по умолчанию, поэтому если вы не хотите, чтобы сообщения трассировки печаталисьдля каждой операции SQLite, выполняемой через код, связанный с библиотекой, которую вы только что создали, измените ее на 0 и явно укажите эту VFS при открытии базы данных для отслеживания вызовов.Например, укажите SQLITE_USE_URI параметр времени компиляции , а затем передайте имя файла form : "file:database.db?vfs=unix", где "database.db" - фактическое имя файла дляоткрыт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...