mirror of
https://github.com/isar/rusqlite.git
synced 2025-03-31 19:12:58 +08:00
Merge pull request #25 from jgallagher/rust-stabilization
Rust stabilization
This commit is contained in:
commit
81fd7543a3
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "rusqlite"
|
name = "rusqlite"
|
||||||
version = "0.0.11"
|
version = "0.0.12"
|
||||||
authors = ["John Gallagher <jgallagher@bignerdranch.com>"]
|
authors = ["John Gallagher <jgallagher@bignerdranch.com>"]
|
||||||
description = "Ergonomic wrapper for SQLite"
|
description = "Ergonomic wrapper for SQLite"
|
||||||
repository = "https://github.com/jgallagher/rusqlite"
|
repository = "https://github.com/jgallagher/rusqlite"
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
# Version 0.0.12 (2015-03-24)
|
||||||
|
|
||||||
|
* Updates to track rustc stabilization.
|
||||||
|
|
||||||
# Version 0.0.11 (2015-03-12)
|
# Version 0.0.11 (2015-03-12)
|
||||||
|
|
||||||
* Reexport `sqlite3_stmt` from `libsqlite3-sys` for easier `impl`-ing of `ToSql` and `FromSql`.
|
* Reexport `sqlite3_stmt` from `libsqlite3-sys` for easier `impl`-ing of `ToSql` and `FromSql`.
|
||||||
|
18
src/lib.rs
18
src/lib.rs
@ -48,12 +48,12 @@
|
|||||||
//! }
|
//! }
|
||||||
//! }
|
//! }
|
||||||
//! ```
|
//! ```
|
||||||
#![feature(unsafe_destructor, core, path, libc, rustc_private, collections)]
|
#![feature(unsafe_destructor, core, libc)]
|
||||||
#![cfg_attr(test, feature(test))]
|
#![cfg_attr(test, feature(test))]
|
||||||
|
|
||||||
extern crate libc;
|
extern crate libc;
|
||||||
extern crate "libsqlite3-sys" as ffi;
|
extern crate "libsqlite3-sys" as ffi;
|
||||||
#[macro_use] extern crate rustc_bitflags;
|
#[macro_use] extern crate bitflags;
|
||||||
|
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
@ -109,7 +109,7 @@ impl fmt::Display for SqliteError {
|
|||||||
|
|
||||||
impl error::Error for SqliteError {
|
impl error::Error for SqliteError {
|
||||||
fn description(&self) -> &str {
|
fn description(&self) -> &str {
|
||||||
self.message.as_slice()
|
&self.message
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -900,13 +900,13 @@ mod test {
|
|||||||
let rows = query.query(&[&4i32]).unwrap();
|
let rows = query.query(&[&4i32]).unwrap();
|
||||||
let v: Vec<i32> = rows.map(|r| r.unwrap().get(0)).collect();
|
let v: Vec<i32> = rows.map(|r| r.unwrap().get(0)).collect();
|
||||||
|
|
||||||
assert_eq!(v.as_slice(), [3i32, 2, 1].as_slice());
|
assert_eq!(v, [3i32, 2, 1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
let rows = query.query(&[&3i32]).unwrap();
|
let rows = query.query(&[&3i32]).unwrap();
|
||||||
let v: Vec<i32> = rows.map(|r| r.unwrap().get(0)).collect();
|
let v: Vec<i32> = rows.map(|r| r.unwrap().get(0)).collect();
|
||||||
assert_eq!(v.as_slice(), [2i32, 1].as_slice());
|
assert_eq!(v, [2i32, 1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -930,7 +930,7 @@ mod test {
|
|||||||
let error = result.unwrap_err();
|
let error = result.unwrap_err();
|
||||||
|
|
||||||
assert!(error.code == ffi::SQLITE_NOTICE);
|
assert!(error.code == ffi::SQLITE_NOTICE);
|
||||||
assert!(error.message.as_slice() == "Query did not return a row");
|
assert!(error.message == "Query did not return a row");
|
||||||
|
|
||||||
let bad_query_result = db.query_row_safe("NOT A PROPER QUERY; test123", &[], |_| ());
|
let bad_query_result = db.query_row_safe("NOT A PROPER QUERY; test123", &[], |_| ());
|
||||||
|
|
||||||
@ -943,7 +943,7 @@ mod test {
|
|||||||
db.execute_batch("CREATE TABLE foo(x INTEGER);").unwrap();
|
db.execute_batch("CREATE TABLE foo(x INTEGER);").unwrap();
|
||||||
|
|
||||||
let err = db.prepare("SELECT * FROM does_not_exist").unwrap_err();
|
let err = db.prepare("SELECT * FROM does_not_exist").unwrap_err();
|
||||||
assert!(err.message.as_slice().contains("does_not_exist"));
|
assert!(err.message.contains("does_not_exist"));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -961,7 +961,7 @@ mod test {
|
|||||||
assert_eq!(2i32, second.get(0));
|
assert_eq!(2i32, second.get(0));
|
||||||
|
|
||||||
let result = first.get_opt::<i32>(0);
|
let result = first.get_opt::<i32>(0);
|
||||||
assert!(result.unwrap_err().message.as_slice().contains("advancing to next row"));
|
assert!(result.unwrap_err().message.contains("advancing to next row"));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -973,7 +973,7 @@ mod test {
|
|||||||
assert_eq!(db.last_insert_rowid(), 1);
|
assert_eq!(db.last_insert_rowid(), 1);
|
||||||
|
|
||||||
let mut stmt = db.prepare("INSERT INTO foo DEFAULT VALUES").unwrap();
|
let mut stmt = db.prepare("INSERT INTO foo DEFAULT VALUES").unwrap();
|
||||||
for _ in range(0i32, 9) {
|
for _ in 0i32 .. 9 {
|
||||||
stmt.execute(&[]).unwrap();
|
stmt.execute(&[]).unwrap();
|
||||||
}
|
}
|
||||||
assert_eq!(db.last_insert_rowid(), 10);
|
assert_eq!(db.last_insert_rowid(), 10);
|
||||||
|
@ -240,7 +240,7 @@ mod test {
|
|||||||
let mut stmt = db.prepare("INSERT INTO foo VALUES(1)").unwrap();
|
let mut stmt = db.prepare("INSERT INTO foo VALUES(1)").unwrap();
|
||||||
|
|
||||||
bencher.iter(|| {
|
bencher.iter(|| {
|
||||||
for _ in range(0i32, 1000) {
|
for _ in 0i32 .. 1000 {
|
||||||
stmt.execute(&[]).unwrap();
|
stmt.execute(&[]).unwrap();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -255,7 +255,7 @@ mod test {
|
|||||||
bencher.iter(|| {
|
bencher.iter(|| {
|
||||||
let mut tx = db.transaction().unwrap();
|
let mut tx = db.transaction().unwrap();
|
||||||
tx.set_commit();
|
tx.set_commit();
|
||||||
for _ in range(0i32, 1000) {
|
for _ in 0i32 .. 1000 {
|
||||||
stmt.execute(&[]).unwrap();
|
stmt.execute(&[]).unwrap();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
13
src/types.rs
13
src/types.rs
@ -101,7 +101,7 @@ impl<'a> ToSql for &'a str {
|
|||||||
|
|
||||||
impl ToSql for String {
|
impl ToSql for String {
|
||||||
unsafe fn bind_parameter(&self, stmt: *mut sqlite3_stmt, col: c_int) -> c_int {
|
unsafe fn bind_parameter(&self, stmt: *mut sqlite3_stmt, col: c_int) -> c_int {
|
||||||
self.as_slice().bind_parameter(stmt, col)
|
(&self[..]).bind_parameter(stmt, col)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -115,7 +115,7 @@ impl<'a> ToSql for &'a [u8] {
|
|||||||
|
|
||||||
impl ToSql for Vec<u8> {
|
impl ToSql for Vec<u8> {
|
||||||
unsafe fn bind_parameter(&self, stmt: *mut sqlite3_stmt, col: c_int) -> c_int {
|
unsafe fn bind_parameter(&self, stmt: *mut sqlite3_stmt, col: c_int) -> c_int {
|
||||||
self.as_slice().bind_parameter(stmt, col)
|
(&self[..]).bind_parameter(stmt, col)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -192,12 +192,13 @@ impl FromSql for String {
|
|||||||
|
|
||||||
impl FromSql for Vec<u8> {
|
impl FromSql for Vec<u8> {
|
||||||
unsafe fn column_result(stmt: *mut sqlite3_stmt, col: c_int) -> SqliteResult<Vec<u8>> {
|
unsafe fn column_result(stmt: *mut sqlite3_stmt, col: c_int) -> SqliteResult<Vec<u8>> {
|
||||||
|
use std::slice::from_raw_parts;
|
||||||
let c_blob = ffi::sqlite3_column_blob(stmt, col);
|
let c_blob = ffi::sqlite3_column_blob(stmt, col);
|
||||||
let len = ffi::sqlite3_column_bytes(stmt, col);
|
let len = ffi::sqlite3_column_bytes(stmt, col);
|
||||||
|
|
||||||
assert!(len >= 0); let len = len as usize;
|
assert!(len >= 0); let len = len as usize;
|
||||||
|
|
||||||
Ok(Vec::from_raw_buf(mem::transmute(c_blob), len))
|
Ok(from_raw_parts(mem::transmute(c_blob), len).to_vec())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -206,7 +207,7 @@ impl FromSql for time::Timespec {
|
|||||||
col: c_int) -> SqliteResult<time::Timespec> {
|
col: c_int) -> SqliteResult<time::Timespec> {
|
||||||
let col_str = FromSql::column_result(stmt, col);
|
let col_str = FromSql::column_result(stmt, col);
|
||||||
col_str.and_then(|txt: String| {
|
col_str.and_then(|txt: String| {
|
||||||
time::strptime(txt.as_slice(), SQLITE_DATETIME_FMT).map(|tm| {
|
time::strptime(&txt, SQLITE_DATETIME_FMT).map(|tm| {
|
||||||
tm.to_timespec()
|
tm.to_timespec()
|
||||||
}).map_err(|parse_error| {
|
}).map_err(|parse_error| {
|
||||||
SqliteError{ code: ffi::SQLITE_MISMATCH, message: format!("{}", parse_error) }
|
SqliteError{ code: ffi::SQLITE_MISMATCH, message: format!("{}", parse_error) }
|
||||||
@ -255,7 +256,7 @@ mod test {
|
|||||||
db.execute("INSERT INTO foo(t) VALUES (?)", &[&s.to_string()]).unwrap();
|
db.execute("INSERT INTO foo(t) VALUES (?)", &[&s.to_string()]).unwrap();
|
||||||
|
|
||||||
let from: String = db.query_row("SELECT t FROM foo", &[], |r| r.get(0));
|
let from: String = db.query_row("SELECT t FROM foo", &[], |r| r.get(0));
|
||||||
assert_eq!(from.as_slice(), s);
|
assert_eq!(from, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -285,7 +286,7 @@ mod test {
|
|||||||
let row1 = rows.next().unwrap().unwrap();
|
let row1 = rows.next().unwrap().unwrap();
|
||||||
let s1: Option<String> = row1.get(0);
|
let s1: Option<String> = row1.get(0);
|
||||||
let b1: Option<Vec<u8>> = row1.get(1);
|
let b1: Option<Vec<u8>> = row1.get(1);
|
||||||
assert_eq!(s.unwrap(), s1.unwrap().as_slice());
|
assert_eq!(s.unwrap(), s1.unwrap());
|
||||||
assert!(b1.is_none());
|
assert!(b1.is_none());
|
||||||
|
|
||||||
let row2 = rows.next().unwrap().unwrap();
|
let row2 = rows.next().unwrap().unwrap();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user