diff --git a/src/statement.rs b/src/statement.rs index 0487115..b864d46 100644 --- a/src/statement.rs +++ b/src/statement.rs @@ -55,6 +55,21 @@ impl<'l> Statement<'l> { unsafe { ffi::sqlite3_column_count(self.raw.0) as usize } } + /// Return the name of a column in the statement + #[inline] + pub fn column_name(&self, i: usize) -> String { + unsafe { + let ret = ffi::sqlite3_column_name(self.raw.0, i as c_int); + c_str_to_string!(ret) + } + } + + /// Return column names in the statement + #[inline] + pub fn column_names(&self) -> Vec { + (0..self.columns()).map(|i| self.column_name(i)).collect() + } + /// Return the type of a column. /// /// The type is revealed after the first step has been taken. diff --git a/tests/lib.rs b/tests/lib.rs index f69cb87..dbbc89d 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -137,11 +137,15 @@ fn cursor_workflow() { #[test] fn statement_columns() { let connection = setup_users(":memory:"); - let statement = "SELECT * FROM users"; + let statement = "SELECT id, name, age, photo as user_photo FROM users"; let mut statement = ok!(connection.prepare(statement)); assert_eq!(statement.columns(), 4); + let column_names = statement.column_names(); + assert_eq!(column_names, vec!["id", "name", "age", "user_photo"]); + assert_eq!("user_photo", statement.column_name(3)); + assert_eq!(ok!(statement.next()), State::Row); assert_eq!(statement.columns(), 4);