Линии внедрения SQLite VFS с FOpen *

Я собираюсь реализовать пользовательскую VFS (виртуальную файловую систему) для встроенного устройства Netburner (без окон) с использованием FOpen, FRead, FWrite, FSeek и FClose. Я был удивлен, что не смог найти доступную версию VFS FOpen *. Это сделало бы его гораздо более переносимым для встроенных устройств.

Я нашел некоторую информацию о создании VFS для SQLite здесь http://sqlite.org/c3ref/vfs.html но информация очень подробно, и у меня есть много других вопросов об осуществлении.

У меня есть пример VFS в исходном коде SQLite для Win, OS2, Linux, но у них нет большого количества комментариев, только исходный код.

Я мог бы использовать информацию, представленную в ссылке выше, и примеры для создания моей собственной VFS, но я уверен, что я пропустил бы что-то, если бы сделал это так.

Мои вопросы:

  • Есть ли еще документация о SQLite VFS, которую я пропускаю? Может быть, руководство по внедрению?
  • Существует ли версия VFS версии Fopen, доступная?
  • Есть ли модуль тестирования модулей для тестирования моего SQLite VFS после его создания?
  • Предложения, комментарии, опыт внедрения SQLite VFS, который вы хотели бы поделиться.

Ответы

Ответ 1

Вы заметили, что в файле заголовка sqlite3.h имеется дополнительный источник документации? Кроме того, поиск кода Google - ваш друг.

Не беспокойтесь о недостающих вещах, это то, на что рассчитан набор тестов. Угадайте цель каждого метода по их имени, документации и примерам реализации; перейти к реализации первого проекта; запускайте тесты на целевой платформе; итерации до тех пор, пока панель не станет зеленой. Из беглого чтения документа интерфейса, который вы указали, вот несколько образованных догадок:

  int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*,
               int flags, int *pOutFlags);
  int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir);
  int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut);
  int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut);

Это ваши функции управления файлами во время работы. Вы заметите, что xOpen() в свою очередь возвращает структуру sqlite3_file, которая имеет собственные методы указателя для чтения и записи.

  void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename);
  void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg);
  void (*(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol))(void);
  void (*xDlClose)(sqlite3_vfs*, void*);

Это для общих библиотек (см. справочную страницу dlopen() в Linux). Во встроенной среде вы, вероятно, можете оставить эти нереализованные (попробуйте установить их в NULL).

  int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut);

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

  int (*xSleep)(sqlite3_vfs*, int microseconds);
  int (*xCurrentTime)(sqlite3_vfs*, double*);
  int (*xCurrentTimeInt64)(sqlite3_vfs*, sqlite3_int64*);

Это функции управления временем, чтобы подключиться к вашей ОС.

  int (*xGetLastError)(sqlite3_vfs*, int, char *);

Вы можете уйти, всегда вернув 0 здесь:-) См. unixGetLastError в os_unix.c(спасибо Google Code Search!)

Удачи!

Ответ 2

Один из вариантов - использовать VFS на базе памяти, а затем просто выгружать память в файл, когда вы закончите. См. http://article.gmane.org/gmane.comp.db.sqlite.general/46450 для VFS с памятью, которая уже поддерживает сериализацию/десериализацию.

Недостатком является то, что вы должны вручную записать файл, чтобы он сохранялся. Если ваше приложение внезапно исчезнет, ​​любые промежуточные изменения в БД не будут сохраняться.