1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
//! Contains the `Row` trait use backend::Backend; use deserialize::{self, FromSql}; /// Represents a single database row. /// Apps should not need to concern themselves with this trait. /// /// This trait is only used as an argument to [`FromSqlRow`]. /// /// [`FromSqlRow`]: ../deserialize/trait.FromSqlRow.html pub trait Row<DB: Backend> { /// Returns the value of the next column in the row. fn take(&mut self) -> Option<&DB::RawValue>; /// Returns whether the next `count` columns are all `NULL`. /// /// If this method returns `true`, then the next `count` calls to `take` /// would all return `None`. fn next_is_null(&self, count: usize) -> bool; /// Skips the next `count` columns. This method must be called if you are /// choosing not to call `take` as a result of `next_is_null` returning /// `true`. fn advance(&mut self, count: usize) { for _ in 0..count { self.take(); } } } /// Represents a row of a SQL query, where the values are accessed by name /// rather than by index. /// /// This trait is used by implementations of /// [`QueryableByName`](../deserialize/trait.QueryableByName.html) pub trait NamedRow<DB: Backend> { /// Retrieve and deserialize a single value from the query /// /// Note that `ST` *must* be the exact type of the value with that name in /// the query. The compiler will not be able to verify that you have /// provided the correct type. If there is a mismatch, you may receive an /// incorrect value, or a runtime error. /// /// If two or more fields in the query have the given name, the result of /// this function is undefined. fn get<ST, T>(&self, column_name: &str) -> deserialize::Result<T> where T: FromSql<ST, DB>, { let idx = self .index_of(column_name) .ok_or_else(|| format!("Column `{}` was not present in query", column_name).into()); let idx = match idx { Ok(x) => x, Err(e) => return Err(e), }; let raw_value = self.get_raw_value(idx); T::from_sql(raw_value) } #[doc(hidden)] fn index_of(&self, column_name: &str) -> Option<usize>; #[doc(hidden)] fn get_raw_value(&self, index: usize) -> Option<&DB::RawValue>; }