14

FOpen、FRead、FWrite、FSeek、およびFCloseを使用して、Netburner組み込みデバイス(Windows以外)用のカスタムVFS(仮想ファイルシステム)を実装しようとしています。利用可能なVFSのFOpen*バージョンが見つからなかったことに驚きました。これにより、組み込みデバイスへの移植性が大幅に向上します。

SQLite用のVFSの作成に関する情報はhttp://sqlite.org/c3ref/vfs.htmlで見つかりまし たが、情報は非常に詳細であり、実装について他にも多くの質問があります。

Win、OS2、LinuxのSQLiteソースコードにVFSの例がいくつかありますが、コメントは多くなく、ソースコードのみが含まれています。

上記のリンクと例で提供されている情報を使用してカスタムVFSを作成することはできますが、そのようにすると何かを見逃してしまうと確信しています。

私の質問は次のとおりです。

  • 私が見逃しているSQLiteVFSに関するドキュメントは他にありますか?多分実装ガイド?
  • 利用可能なSQLiteVFSのFopenバージョンはありますか?
  • カスタムSQLiteVFSを作成した後、それをテストするために使用できる単体テストコードはありますか?
  • 共有したい提案、コメント、SQLiteVFSの実装に関する経験。
4

2 に答える 2

5

ヘッダーファイルに追加のドキュメントソースがあることに気づきました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のmanページを参照してください)。組み込み環境では、おそらくこれらを実装しないままにしておくことができます(これらをNULLに設定してみてください)。

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

OSの標準ライブラリで乱数ジェネレータがまだ提供されていない場合は、乱数ジェネレータを実装する必要がある場合があります。小さいながらも良い線形フィードバックレジスタをお勧めします。

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

これらは、OSに接続するための時間管理機能です。

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

ここでは常に0を返すことで逃げることができます:-)os_unix.cのunixGetLastErrorを参照してください(Googleコード検索に感謝します!)

幸運を!

于 2010-09-08T11:20:37.973 に答える
4

1つのオプションは、メモリベースのVFSを使用し、完了したらメモリをファイルにダンプすることです。すでにシリアル化/逆シリアル化をサポートしているメモリベースのVFSについては、http://article.gmane.org/gmane.comp.db.sqlite.general/46450を参照してください。

欠点は、ファイルを永続化するために手動でファイルを書き出す必要があることです。アプリケーションが突然停止した場合、DBへの中間的な変更は保持されません。

于 2011-02-01T22:39:36.733 に答える