2016-07-05 10 views
1

SQLiteデータベースの各ページの最後にバイトを予約することができます。予約済みのバイトでデータベースを作成する方法は?

documentationによれば:私はこの機能を使用すると、バイト変更手動通常、空のデータベースを作成して、それを試して

SQLite has the ability to set aside a small number of extra bytes at the end of every page for use by extensions. These extra bytes are used, for example, by the SQLite Encryption Extension to store a nonce and/or cryptographic checksum associated with each page. The "reserved space" size in the 1-byte integer at offset 20 is the number of bytes of space at the end of each page to reserve for extensions. This value is usually 0. The value can be odd.

;(20オフセットに、ヘッダを進エディタを使用しました) null以外の値(予約された16バイトの場合、 - > x10) sqlite3の中.dbinfo使用

(…) reserved bytes: 16 (…)

だから、すべてが正しいように見えますが、データベースを編集するコマンドは成功しません。このエラーメッセージの 各コマンド(例えばCREATE TABLE example('id' int);)結果:

Error: database disk image is malformed

だから私の質問です:私は(不正な形式として拒否されることはありません)この予約スペースとSQLiteデータベースを作成するにはどうすればよいですか?

答えて

2

最初のデータベースページには、ヘッダーだけでなく、テーブルの最初のB-tree pageも含まれています。 そのデータがページの使用可能領域の外側にないことを確認する必要があります。 マスターテーブルが空の場合、調整する唯一のことは、Bツリーヘッダーのオフセット5にあるセル内容領域の開始位置へのポインタです(この場合、使用可能な領域の終わりを単に指す必要があります)。 SQLiteライブラリがSQLITE_OMIT_BUILTIN_TESTでコンパイルされていない場合


とにかく、あなたは(空のデータベースのために)この値を設定するsqlite3_test_control() functionを使用することができます。

sqlite3_test_control(SQLITE_TESTCTRL_RESERVE, sqlite3 *db, int N) 
関連する問題