由于误用的预处理语句

时间:2017-04-07 12:19:55

标签: sqlite rust ffi

我正在将一些代码移植到Rust,它从stdin读取数据库路径,打开数据库并循环查询。我在C中做了类似的事情,所以我很确定问题是我对Rust FFI的不了解。

我正在使用来自rusqlite的libsqlite3-sys提供的sqlite3绑定。 The whole code is here

open_connection初始化指针并将其传递给sqlite3_open_v2并检查一切是否正常。

// Line 54 of complete code 
fn open_connection(s: String) -> Result<RawConnection, SQLite3Error> {
    unsafe {
        let mut db: *mut sqlite3::sqlite3 = mem::uninitialized();
        let r = sqlite3::sqlite3_open_v2(CString::new(s).unwrap().as_ptr(),
                                         &mut db,
                                         sqlite3::SQLITE_OPEN_CREATE |
                                         sqlite3::SQLITE_OPEN_READWRITE,
                                         ptr::null());
        match r {
            sqlite3::SQLITE_OK => Ok(RawConnection { db: db }),
            _ => return Err(SQLite3Error::OpenError),
        }
    }
}

I create an SQL statement通过将查询从Rust字符串转换为C字符串,为语句本身的位置创建另一个指针,然后继续创建语句并检查输出:

// Line 35 of complete code
fn create_statement(conn: &RawConnection, query: String) -> Result<Statement, SQLite3Error> {
    let len = query.len();
    let raw_query = CString::new(query).unwrap().as_ptr();
    unsafe {
        let mut stmt: *mut sqlite3::sqlite3_stmt = mem::uninitialized();
        if stmt.is_null() {
            println!("Now it is null!");
        }
        match sqlite3::sqlite3_prepare_v2(conn.db,
                                          raw_query,
                                          len as i32,
                                          &mut stmt,
                                          ptr::null_mut()) {
            sqlite3::SQLITE_OK => Ok(Statement { stmt: stmt }),
            _ => Err(SQLite3Error::StatementError),
        }
    }
}

我尝试execute a statement

// Line 81 of complete code
fn execute_statement(conn: &RawConnection, stmt: Statement) -> Result<Cursor, SQLite3Error> {

    match unsafe { sqlite3::sqlite3_step(stmt.stmt) } {
        sqlite3::SQLITE_OK => Ok(Cursor::OKCursor),
        sqlite3::SQLITE_DONE => Ok(Cursor::DONECursor),
        sqlite3::SQLITE_ROW => {
            let n_columns = unsafe { sqlite3::sqlite3_column_count(stmt.stmt) } as i32;
            let mut types: Vec<EntityType> = Vec::new();
            for i in 0..n_columns {
                types.push(match unsafe { sqlite3::sqlite3_column_type(stmt.stmt, i) } {
                    sqlite3::SQLITE_INTEGER => EntityType::Integer,
                    sqlite3::SQLITE_FLOAT => EntityType::Float,
                    sqlite3::SQLITE_TEXT => EntityType::Text,
                    sqlite3::SQLITE_BLOB => EntityType::Blob,
                    sqlite3::SQLITE_NULL => EntityType::Null,
                    _ => EntityType::Null,
                })
            }
            Ok(Cursor::RowsCursor {
                stmt: stmt,
                num_columns: n_columns,
                types: types,
                previous_status: sqlite3::SQLITE_ROW,
            })
        }
        x => {
            println!("{}", x);
            return Err(SQLite3Error::ExecuteError);
        }
    }
}

这总是失败,错误代码为21 MISUSE。通常,当您尝试执行NULL语句但是我不知道如何弄清楚时会发生此错误。

您是否看到任何其他可能导致代码错误的问题?

0 个答案:

没有答案