Рекомендации по внедрению SQLite VFS с помощью FOpen * - PullRequest
14 голосов
/ 30 июля 2010

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

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

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

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

Мои вопросы:

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

Ответы [ 2 ]

4 голосов
/ 02 февраля 2011

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

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

4 голосов
/ 08 сентября 2010

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

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

  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!)

Удачи!

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