SQLite3の内容をディスクから読み込みしたい #12
-
概要SQLite3をディスクから読み込めるように移植を進めているのですが、以下のようなエラーが出て先に進めずにいます。
実行する際に使用しているコマンドは以下です。
やりたいこととしてはnutaさんの実装をベースに既存のファイルシステムサーバーを介してDBの内容を取得してそこから読み込みをしたいと思っているのですが、上記のエラーが出ます。 開発環境OS: macOS-13.2.1-x86_64-i386-64bit
PYTHON3: Python 3.10.10
CC: Homebrew clang version 16.0.6 Target: x86_64-apple-darwin22.3.0 Thread model: posix InstalledDir: /usr/local//opt/llvm/bin
LD: Homebrew LLD 16.0.6 (compatible with GNU linkers)
QEMU: QEMU emulator version 8.0.3 Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers
OBJCOPY: llvm-objcopy, compatible with GNU objcopy Homebrew LLVM version 16.0.6 Optimized build.
MAKE: GNU Make 3.81 Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program built for i386-apple-darwin11.3.0
|
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 1 reply
-
エラーメッセージから察するに、データベースファイルの読み込み処理が上手くいっていないのだと思います。次の関数を見てみます。 static int hinaosRead(sqlite3_file *file, void *pBuf, int iAmt, sqlite3_int64 iOfst) { この関数は、書き込み先バッファ ( 原因の部分はこちらです: // dbの内容を読み込んでメモリに展開する
m.type = FS_READ_MSG;
m.fs_read.fd = fd;
err = ipc_call(fs_server, &m); ここでいくつか未実装な部分があります。
以上を踏まえると、 int offset = 0;
while (offset < iAmt) {
// 読み込みたいバイト数
size_t read_len = MIN(sizeof(m.fs_read_reply.data), iAmt - offset);
// TODO: fdのオフセット位置を iOfst + offset へ移動する (シーク処理) IPCを実装する
struct message m;
m.type = FS_READ_MSG;
m.fs_read.fd = fd;
m.fs_read.len = read_len;
error_t err = ipc_call(fs_server, &m);
DEBUG_ASSERT(m.type == FS_READ_REPLY_MSG);
DEBUG_ASSERT(m.fs_read_reply.data_len == read_len);
memcpy((uint8_t *) pBuf + offset, (void *)m.fs_read_reply.data, read_len);
offset += read_len;
} |
Beta Was this translation helpful? Give feedback.
-
@nuta |
Beta Was this translation helpful? Give feedback.
エラーメッセージから察するに、データベースファイルの読み込み処理が上手くいっていないのだと思います。次の関数を見てみます。
この関数は、書き込み先バッファ (
pBuf
) に加えて、読み込むバイト数 (iAmt
)、ファイルオフセット (iOfst
) を受け取っています。つまり[iOfst, iOfst + iAmt)
の範囲を読み込むことをSQLite3は要求しています。原因の部分はこちらです:
ここでいくつか未実装な部分があります。
m.fs_read.len
(読み込みたい要求バイト数) が未設定。m.fs_read_reply.data_len
(実際に読み込んだバイト数) をチェックしていない。iOfst
から読み込むためのファイルハンドルのシーク処理が欠けている。HinaOSにはないので、新たに「ファイルハンドルのオフセット位置を移動する」機能を加える必要がある。以上を踏まえると、
hinaosRead
関数は次のような実装になるはずです 👍