2010-07-30 17 views
13

Estoy a punto de implementar un VFS (sistema de archivos virtual) personalizado para un dispositivo integrado Netburner (sin Windows) usando FOpen, FRead, FWrite, FSeek y FClose. Me sorprendió que no pudiera encontrar disponible una versión FOpen * del VFS. Lo haría mucho más portátil para dispositivos integrados.Líneas de guía de implementación SQLite VFS con FOpen *

me encontré con algo de información sobre la creación de la VFS para SQLite aquí http://sqlite.org/c3ref/vfs.html pero la información es muy detallada y tengo un montón de otras preguntas acerca de la aplicación.

Tengo un ejemplo de VFS en el código fuente de SQLite para Win, OS2, Linux pero no tienen muchos comentarios, solo código fuente.

Podría utilizar la información proporcionada en el enlace de arriba y los ejemplos para crear mi VFS personalizado, pero estoy seguro de que extrañaría algo si lo hiciera de esa manera.

Mis preguntas son:

  • ¿Hay más documentación sobre el SQLite VFS que me falta? Tal vez una guía de implementación?
  • ¿Hay una versión de Fopen de SQLite VFS disponible?
  • ¿Hay un código de prueba de unidad disponible para probar mi SQLite VFS personalizado una vez que lo haya creado?
  • Sugerencias, comentarios, experiencias con la implementación de SQLite VFS que le gustaría compartir.
+0

Si ejecuta Linux en su dispositivo incrustado, ¿por qué necesita implementar un nuevo SQLite VFS? –

+0

no es Linux ni Windows ni OS2, es una versión modificada de http://www.freertos.org/ y no incluye las bibliotecas de Linux/Windows –

+1

Creo que se refiere a "implementación * guía *" no a "implementación gremio". Un gremio es una organización de artesanos (algo así como una unión, pero más, um, medieval). No tengo una buena respuesta a su pregunta, pero sospecho que 'fopen' y sus amigos no se pueden usar para sqlite, ya que no existe un mecanismo de bloqueo y la semántica, particularmente cuando los datos entran en almacenamiento permanente, no son tan clavado como sqlite necesita que sean. – zwol

Respuesta

4

¿Notó que hay una fuente adicional de documentación en el archivo de encabezado sqlite3.h? Además, Google Code Search es tu amigo.

No se preocupe demasiado por las cosas que faltan, para esto es el banco de pruebas. Adivina el propósito de cada método a partir de su nombre, la documentación y las implementaciones de ejemplo; ir a un primer borrador de implementación; ejecutar las pruebas en su plataforma objetivo; iterar hasta que la barra esté verde. A partir de una lectura superficial de la interfaz de documento que usted ha citado, aquí hay algunas conjeturas:

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

esas son sus funciones de gestión de archivos-de-la-Mill Run. Notará que xOpen() a su vez devuelve una estructura sqlite3_file, que tiene sus propios métodos de puntero para leer y escribir.

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*); 

Esos son bibliotecas compartidas (véase la página dlopen() hombre en Linux). En un entorno incrustado, probablemente pueda dejar esto sin implementar (intente establecer estos en NULL).

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

Es posible que tenga que implementar un generador de números aleatorios, si la biblioteca estándar de su sistema operativo ya no proporciona uno. Sugiero un linear feedback register, que es pequeño pero bueno.

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

Estas son las funciones de gestión del tiempo, para conectar con su sistema operativo.

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

Usted puede conseguir lejos que siempre devuelve un 0 aquí :-) Ver unixGetLastError en os_unix.c (gracias Google Code Search!)

¡Buena suerte!

4

Una opción es usar un VFS basado en memoria y luego simplemente volcar la memoria en el archivo cuando haya terminado. Ver: http://article.gmane.org/gmane.comp.db.sqlite.general/46450 para un VFS basado en memoria que ya admite serialización/deserialización.

La desventaja es que debe escribir manualmente el archivo para que persista. Si su aplicación se agota repentinamente, no se conservarán los cambios intermedios en la base de datos.

+0

Enlace muy esclarecedor con una implementación de un VFS, pero no estoy seguro si podemos usarlo tal como está (vea http://osdir.com/ml/sqlite-users/2013-06/msg00067.html) – Tibo