[−][src]Struct hdbconnect::ResultSet
The result of a database query.
This is essentially a set of Row
s, and each Row
is a set of HdbValue
s.
The method try_into
converts the data from this generic format
in a singe step into your application specific format.
ResultSet
implements std::iter::Iterator
, so you can
directly iterate over the rows of a resultset.
While iterating, the not yet transported rows are fetched "silently" on demand, which can fail.
The Iterator-Item is thus not Row
, but HdbResult<Row>
.
for row in connection.query(query_string)? { // handle fetch errors and convert each line individually: let entity: Entity = row?.try_into()?; println!("Got entity: {:?}", entity); }
Implementations
impl ResultSet
[src]
pub fn try_into<'de, T>(self) -> HdbResult<T> where
T: Deserialize<'de>,
[src]
T: Deserialize<'de>,
Conveniently translates the complete resultset into a rust type that implements
serde::Deserialize
and has an adequate structure.
The implementation of this method uses
serde_db::de
.
A resultset is essentially a two-dimensional structure, given as a list of rows, where each row is a list of fields; the name of each field is given in the metadata of the resultset.
The method supports a variety of target data structures, with the only strong limitation that no data loss is supported.
It depends on the dimension of the resultset what target data structure you can choose for deserialization:
-
You can always use a
Vec<line_struct>
, if the elements ofline_struct
match the field list of the resultset. -
If the resultset contains only a single line (e.g. because you specified
TOP 1
in your select clause), then you can optionally choose to deserialize directly into a plainline_struct
. -
If the resultset contains only a single column, then you can optionally choose to deserialize directly into a
Vec<plain_field>
. -
If the resultset contains only a single value (one row with one column), then you can optionally choose to deserialize into a plain
line_struct
, or aVec<plain_field>
, or aplain_field
.
Also the translation of the individual field values provides flexibility.
-
You can e.g. convert values from a nullable column into a plain field, provided that no NULL values are given in the resultset.
-
Vice versa, you can use an
Option<plain_field>
, even if the column is marked as NOT NULL. -
Similarly, integer types can differ, as long as the concrete values can be assigned without loss.
As usual with serde deserialization, you need to specify the type of your target variable
explicitly, so that try_into()
can derive the type it needs to instantiate:
#[derive(Deserialize)] struct Entity { ... } let typed_result: Vec<Entity> = resultset.try_into()?;
Errors
HdbError::Deserialization
if the deserialization into the target type is not possible.
pub fn into_single_row(self) -> HdbResult<Row>
[src]
Converts the resultset into a single row.
Errors
HdbError::Usage
if the resultset contains more than a single row, or is empty.
pub fn metadata(&self) -> Arc<Vec<FieldMetadata>>
[src]
Access to metadata.
Examples
let rs: ResultSet; //... // get the precision of the second field let prec: i16 = resultset.metadata()[1].precision();
or
let rs: ResultSet; //... for field_metadata in &*rs.metadata() { // evaluate metadata of a field }
pub fn total_number_of_rows(&self) -> HdbResult<usize>
[src]
Returns the total number of rows in the resultset, including those that still need to be fetched from the database, but excluding those that have already been removed from the resultset.
This method can be expensive, and it can fail, since it fetches all yet outstanding rows from the database.
Errors
Several variants of HdbError
are possible.
pub fn next_row(&mut self) -> HdbResult<Option<Row>>
[src]
Removes the next row and returns it, or None if the ResultSet
is empty.
Consequently, the ResultSet
has one row less after the call.
May need to fetch further rows from the database, which can fail.
Errors
Several variants of HdbError
are possible.
pub fn fetch_all(&self) -> HdbResult<()>
[src]
Fetches all not yet transported result lines from the server.
Bigger resultsets are typically not transported in one roundtrip from the database; the number of roundtrips depends on the total number of rows in the resultset and the configured fetch-size of the connection.
Fetching can fail, e.g. if the network connection is broken.
Errors
Several variants of HdbError
are possible.
pub fn server_usage(&self) -> ServerUsage
[src]
Provides information about the the server-side resource consumption that
is related to this ResultSet
object.
Trait Implementations
impl Debug for ResultSet
[src]
impl DeserializableResultset for ResultSet
[src]
type ROW = Row
Concrete type for the DB row, which must implement DeserializabeRow
.
type E = DeserializationError
Error type of the database driver.
pub fn has_multiple_rows(&mut self) -> Result<bool, DeserializationError>
[src]
pub fn next(&mut self) -> DeserializationResult<Option<Row>>
[src]
pub fn number_of_fields(&self) -> usize
[src]
pub fn fieldname(&self, i: usize) -> Option<&str>
[src]
pub fn into_typed<'de, T>(self) -> Result<T, Self::E> where
T: Deserialize<'de>,
[src]
T: Deserialize<'de>,
impl Display for ResultSet
[src]
impl Iterator for ResultSet
[src]
type Item = HdbResult<Row>
The type of the elements being iterated over.
pub fn next(&mut self) -> Option<HdbResult<Row>>
[src]
pub fn size_hint(&self) -> (usize, Option<usize>)
1.0.0[src]
pub fn count(self) -> usize
1.0.0[src]
pub fn last(self) -> Option<Self::Item>
1.0.0[src]
pub fn advance_by(&mut self, n: usize) -> Result<(), usize>
[src]
pub fn nth(&mut self, n: usize) -> Option<Self::Item>
1.0.0[src]
pub fn step_by(self, step: usize) -> StepBy<Self>
1.28.0[src]
pub fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter> where
U: IntoIterator<Item = Self::Item>,
1.0.0[src]
U: IntoIterator<Item = Self::Item>,
pub fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter> where
U: IntoIterator,
1.0.0[src]
U: IntoIterator,
pub fn map<B, F>(self, f: F) -> Map<Self, F> where
F: FnMut(Self::Item) -> B,
1.0.0[src]
F: FnMut(Self::Item) -> B,
pub fn for_each<F>(self, f: F) where
F: FnMut(Self::Item),
1.21.0[src]
F: FnMut(Self::Item),
pub fn filter<P>(self, predicate: P) -> Filter<Self, P> where
P: FnMut(&Self::Item) -> bool,
1.0.0[src]
P: FnMut(&Self::Item) -> bool,
pub fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F> where
F: FnMut(Self::Item) -> Option<B>,
1.0.0[src]
F: FnMut(Self::Item) -> Option<B>,
pub fn enumerate(self) -> Enumerate<Self>
1.0.0[src]
pub fn peekable(self) -> Peekable<Self>
1.0.0[src]
pub fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P> where
P: FnMut(&Self::Item) -> bool,
1.0.0[src]
P: FnMut(&Self::Item) -> bool,
pub fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P> where
P: FnMut(&Self::Item) -> bool,
1.0.0[src]
P: FnMut(&Self::Item) -> bool,
pub fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P> where
P: FnMut(Self::Item) -> Option<B>,
[src]
P: FnMut(Self::Item) -> Option<B>,
pub fn skip(self, n: usize) -> Skip<Self>
1.0.0[src]
pub fn take(self, n: usize) -> Take<Self>
1.0.0[src]
pub fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F> where
F: FnMut(&mut St, Self::Item) -> Option<B>,
1.0.0[src]
F: FnMut(&mut St, Self::Item) -> Option<B>,
pub fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F> where
U: IntoIterator,
F: FnMut(Self::Item) -> U,
1.0.0[src]
U: IntoIterator,
F: FnMut(Self::Item) -> U,
pub fn flatten(self) -> Flatten<Self> where
Self::Item: IntoIterator,
1.29.0[src]
Self::Item: IntoIterator,
pub fn fuse(self) -> Fuse<Self>
1.0.0[src]
pub fn inspect<F>(self, f: F) -> Inspect<Self, F> where
F: FnMut(&Self::Item),
1.0.0[src]
F: FnMut(&Self::Item),
pub fn by_ref(&mut self) -> &mut Self
1.0.0[src]
#[must_use =
"if you really need to exhaust the iterator, consider `.for_each(drop)` instead"]pub fn collect<B>(self) -> B where
B: FromIterator<Self::Item>,
1.0.0[src]
B: FromIterator<Self::Item>,
pub fn partition<B, F>(self, f: F) -> (B, B) where
B: Default + Extend<Self::Item>,
F: FnMut(&Self::Item) -> bool,
1.0.0[src]
B: Default + Extend<Self::Item>,
F: FnMut(&Self::Item) -> bool,
pub fn partition_in_place<'a, T, P>(self, predicate: P) -> usize where
Self: DoubleEndedIterator<Item = &'a mut T>,
P: FnMut(&T) -> bool,
T: 'a,
[src]
Self: DoubleEndedIterator<Item = &'a mut T>,
P: FnMut(&T) -> bool,
T: 'a,
pub fn is_partitioned<P>(self, predicate: P) -> bool where
P: FnMut(Self::Item) -> bool,
[src]
P: FnMut(Self::Item) -> bool,
pub fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R where
R: Try<Ok = B>,
F: FnMut(B, Self::Item) -> R,
1.27.0[src]
R: Try<Ok = B>,
F: FnMut(B, Self::Item) -> R,
pub fn try_for_each<F, R>(&mut self, f: F) -> R where
R: Try<Ok = ()>,
F: FnMut(Self::Item) -> R,
1.27.0[src]
R: Try<Ok = ()>,
F: FnMut(Self::Item) -> R,
pub fn fold<B, F>(self, init: B, f: F) -> B where
F: FnMut(B, Self::Item) -> B,
1.0.0[src]
F: FnMut(B, Self::Item) -> B,
pub fn fold_first<F>(self, f: F) -> Option<Self::Item> where
F: FnMut(Self::Item, Self::Item) -> Self::Item,
[src]
F: FnMut(Self::Item, Self::Item) -> Self::Item,
pub fn all<F>(&mut self, f: F) -> bool where
F: FnMut(Self::Item) -> bool,
1.0.0[src]
F: FnMut(Self::Item) -> bool,
pub fn any<F>(&mut self, f: F) -> bool where
F: FnMut(Self::Item) -> bool,
1.0.0[src]
F: FnMut(Self::Item) -> bool,
pub fn find<P>(&mut self, predicate: P) -> Option<Self::Item> where
P: FnMut(&Self::Item) -> bool,
1.0.0[src]
P: FnMut(&Self::Item) -> bool,
pub fn find_map<B, F>(&mut self, f: F) -> Option<B> where
F: FnMut(Self::Item) -> Option<B>,
1.30.0[src]
F: FnMut(Self::Item) -> Option<B>,
pub fn try_find<F, R>(
&mut self,
f: F
) -> Result<Option<Self::Item>, <R as Try>::Error> where
R: Try<Ok = bool>,
F: FnMut(&Self::Item) -> R,
[src]
&mut self,
f: F
) -> Result<Option<Self::Item>, <R as Try>::Error> where
R: Try<Ok = bool>,
F: FnMut(&Self::Item) -> R,
pub fn position<P>(&mut self, predicate: P) -> Option<usize> where
P: FnMut(Self::Item) -> bool,
1.0.0[src]
P: FnMut(Self::Item) -> bool,
pub fn rposition<P>(&mut self, predicate: P) -> Option<usize> where
Self: ExactSizeIterator + DoubleEndedIterator,
P: FnMut(Self::Item) -> bool,
1.0.0[src]
Self: ExactSizeIterator + DoubleEndedIterator,
P: FnMut(Self::Item) -> bool,
pub fn max(self) -> Option<Self::Item> where
Self::Item: Ord,
1.0.0[src]
Self::Item: Ord,
pub fn min(self) -> Option<Self::Item> where
Self::Item: Ord,
1.0.0[src]
Self::Item: Ord,
pub fn max_by_key<B, F>(self, f: F) -> Option<Self::Item> where
B: Ord,
F: FnMut(&Self::Item) -> B,
1.6.0[src]
B: Ord,
F: FnMut(&Self::Item) -> B,
pub fn max_by<F>(self, compare: F) -> Option<Self::Item> where
F: FnMut(&Self::Item, &Self::Item) -> Ordering,
1.15.0[src]
F: FnMut(&Self::Item, &Self::Item) -> Ordering,
pub fn min_by_key<B, F>(self, f: F) -> Option<Self::Item> where
B: Ord,
F: FnMut(&Self::Item) -> B,
1.6.0[src]
B: Ord,
F: FnMut(&Self::Item) -> B,
pub fn min_by<F>(self, compare: F) -> Option<Self::Item> where
F: FnMut(&Self::Item, &Self::Item) -> Ordering,
1.15.0[src]
F: FnMut(&Self::Item, &Self::Item) -> Ordering,
pub fn rev(self) -> Rev<Self> where
Self: DoubleEndedIterator,
1.0.0[src]
Self: DoubleEndedIterator,
pub fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB) where
Self: Iterator<Item = (A, B)>,
FromA: Default + Extend<A>,
FromB: Default + Extend<B>,
1.0.0[src]
Self: Iterator<Item = (A, B)>,
FromA: Default + Extend<A>,
FromB: Default + Extend<B>,
pub fn copied<'a, T>(self) -> Copied<Self> where
Self: Iterator<Item = &'a T>,
T: 'a + Copy,
1.36.0[src]
Self: Iterator<Item = &'a T>,
T: 'a + Copy,
pub fn cloned<'a, T>(self) -> Cloned<Self> where
Self: Iterator<Item = &'a T>,
T: 'a + Clone,
1.0.0[src]
Self: Iterator<Item = &'a T>,
T: 'a + Clone,
pub fn cycle(self) -> Cycle<Self> where
Self: Clone,
1.0.0[src]
Self: Clone,
pub fn sum<S>(self) -> S where
S: Sum<Self::Item>,
1.11.0[src]
S: Sum<Self::Item>,
pub fn product<P>(self) -> P where
P: Product<Self::Item>,
1.11.0[src]
P: Product<Self::Item>,
pub fn cmp<I>(self, other: I) -> Ordering where
I: IntoIterator<Item = Self::Item>,
Self::Item: Ord,
1.5.0[src]
I: IntoIterator<Item = Self::Item>,
Self::Item: Ord,
pub fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering where
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,
[src]
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,
pub fn partial_cmp<I>(self, other: I) -> Option<Ordering> where
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
1.5.0[src]
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
pub fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering> where
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
[src]
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
pub fn eq<I>(self, other: I) -> bool where
I: IntoIterator,
Self::Item: PartialEq<<I as IntoIterator>::Item>,
1.5.0[src]
I: IntoIterator,
Self::Item: PartialEq<<I as IntoIterator>::Item>,
pub fn eq_by<I, F>(self, other: I, eq: F) -> bool where
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,
[src]
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,
pub fn ne<I>(self, other: I) -> bool where
I: IntoIterator,
Self::Item: PartialEq<<I as IntoIterator>::Item>,
1.5.0[src]
I: IntoIterator,
Self::Item: PartialEq<<I as IntoIterator>::Item>,
pub fn lt<I>(self, other: I) -> bool where
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
1.5.0[src]
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
pub fn le<I>(self, other: I) -> bool where
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
1.5.0[src]
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
pub fn gt<I>(self, other: I) -> bool where
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
1.5.0[src]
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
pub fn ge<I>(self, other: I) -> bool where
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
1.5.0[src]
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
pub fn is_sorted(self) -> bool where
Self::Item: PartialOrd<Self::Item>,
[src]
Self::Item: PartialOrd<Self::Item>,
pub fn is_sorted_by<F>(self, compare: F) -> bool where
F: FnMut(&Self::Item, &Self::Item) -> Option<Ordering>,
[src]
F: FnMut(&Self::Item, &Self::Item) -> Option<Ordering>,
pub fn is_sorted_by_key<F, K>(self, f: F) -> bool where
K: PartialOrd<K>,
F: FnMut(Self::Item) -> K,
[src]
K: PartialOrd<K>,
F: FnMut(Self::Item) -> K,
Auto Trait Implementations
impl !RefUnwindSafe for ResultSet
[src]
impl !Send for ResultSet
[src]
impl !Sync for ResultSet
[src]
impl Unpin for ResultSet
[src]
impl !UnwindSafe for ResultSet
[src]
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<I> IntoIterator for I where
I: Iterator,
[src]
I: Iterator,
type Item = <I as Iterator>::Item
The type of the elements being iterated over.
type IntoIter = I
Which kind of iterator are we turning this into?
pub fn into_iter(self) -> I
[src]
impl<I> IteratorRandom for I where
I: Iterator,
[src]
I: Iterator,
pub fn choose<R>(self, rng: &mut R) -> Option<Self::Item> where
R: Rng + ?Sized,
[src]
R: Rng + ?Sized,
pub fn choose_stable<R>(self, rng: &mut R) -> Option<Self::Item> where
R: Rng + ?Sized,
[src]
R: Rng + ?Sized,
pub fn choose_multiple_fill<R>(
self,
rng: &mut R,
buf: &mut [Self::Item]
) -> usize where
R: Rng + ?Sized,
[src]
self,
rng: &mut R,
buf: &mut [Self::Item]
) -> usize where
R: Rng + ?Sized,
pub fn choose_multiple<R>(
self,
rng: &mut R,
amount: usize
) -> Vec<Self::Item, Global> where
R: Rng + ?Sized,
[src]
self,
rng: &mut R,
amount: usize
) -> Vec<Self::Item, Global> where
R: Rng + ?Sized,
impl<T> Same<T> for T
type Output = T
Should always be Self
impl<T> ToString for T where
T: Display + ?Sized,
[src]
T: Display + ?Sized,
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
V: MultiLane<T>,