Skip to content

Commit 38c1b54

Browse files
committed
Hide Cursor, and just return a Box<Iterator> instead
This will allow us to abstract the `Connection` to be non-backend-specific, without also having to do the same for `Cursor`.
1 parent 7682be7 commit 38c1b54

6 files changed

Lines changed: 12 additions & 16 deletions

File tree

diesel/src/connection/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ mod cursor;
44
#[doc(hidden)]
55
pub mod raw;
66

7-
pub use self::cursor::Cursor;
8-
97
use std::cell::Cell;
108
use std::ffi::{CString, CStr};
119
use std::rc::Rc;
@@ -22,6 +20,7 @@ use query_builder::pg::PgQueryBuilder;
2220
use query_dsl::{FilterDsl, LimitDsl};
2321
use query_source::{Table, Queryable};
2422
use result::*;
23+
use self::cursor::Cursor;
2524
use self::raw::RawConnection;
2625
use types::{NativeSqlType, ToSql};
2726

@@ -123,13 +122,14 @@ impl Connection {
123122
}
124123

125124
#[doc(hidden)]
126-
pub fn query_all<T, U>(&self, source: T) -> QueryResult<Cursor<T::SqlType, U>> where
125+
pub fn query_all<'a, T, U: 'a>(&self, source: T) -> QueryResult<Box<Iterator<Item=U> + 'a>> where
127126
T: AsQuery,
128127
T::Query: QueryFragment,
129128
U: Queryable<T::SqlType>,
130129
{
131130
let (sql, params, types) = self.prepare_query(&source.as_query());
132-
self.exec_sql_params(&sql, &params, &Some(types)).map(Cursor::new)
131+
self.exec_sql_params(&sql, &params, &Some(types))
132+
.map(|r| Box::new(Cursor::new(r)) as Box<Iterator<Item=U>>)
133133
}
134134

135135
fn exec_sql_params(&self, query: &str, param_data: &Vec<Option<Vec<u8>>>, param_types: &Option<Vec<u32>>) -> QueryResult<DbResult> {

diesel/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ pub mod prelude {
7171
pub use result::{QueryResult, TransactionError, TransactionResult, ConnectionError, ConnectionResult, OptionalExtension};
7272
}
7373

74-
pub use connection::{Connection, Cursor};
74+
pub use connection::Connection;
7575
pub use prelude::*;
7676
#[doc(inline)]
7777
pub use query_builder::functions::{insert, update, delete, select};

diesel/src/query_dsl/load_dsl.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use connection::{Connection, Cursor};
1+
use connection::Connection;
22
use query_builder::{Query, QueryFragment, AsQuery};
33
use query_source::Queryable;
44
use result::QueryResult;
@@ -11,8 +11,8 @@ pub trait LoadDsl: AsQuery + Sized where
1111
{
1212
/// Executes the given query, returning an `Iterator` over the returned
1313
/// rows.
14-
fn load<U>(self, conn: &Connection) -> QueryResult<Cursor<Self::SqlType, U>> where
15-
U: Queryable<Self::SqlType>
14+
fn load<'a, U>(self, conn: &Connection) -> QueryResult<Box<Iterator<Item=U> + 'a>> where
15+
U: Queryable<Self::SqlType> + 'a,
1616
{
1717
conn.query_all(self)
1818
}
@@ -40,8 +40,8 @@ pub trait LoadDsl: AsQuery + Sized where
4040
}
4141

4242
/// Runs the command, returning an `Iterator` over the affected rows.
43-
fn get_results<U>(self, conn: &Connection) -> QueryResult<Cursor<Self::SqlType, U>> where
44-
U: Queryable<Self::SqlType>
43+
fn get_results<'a, U>(self, conn: &Connection) -> QueryResult<Box<Iterator<Item=U> + 'a>> where
44+
U: Queryable<Self::SqlType> + 'a,
4545
{
4646
self.load(conn)
4747
}

diesel/src/types/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ pub type BigSerial = BigInt;
5757
#[derive(Clone, Copy, Default)] pub struct Nullable<T: NativeSqlType + NotNull>(T);
5858
#[derive(Clone, Copy, Default)] pub struct Array<T: NativeSqlType>(T);
5959

60-
pub trait NativeSqlType {
60+
pub trait NativeSqlType: 'static {
6161
fn oid(&self) -> u32;
6262
fn array_oid(&self) -> u32;
6363
fn new() -> Self where Self: Sized;

diesel_tests/tests/compile-fail/select_carries_correct_result_type_info.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ fn main() {
1919

2020
let ids: Vec<i32> = select_name.load(&connection).unwrap().collect();
2121
//~^ ERROR the trait `diesel::query_source::Queryable<diesel::types::VarChar>` is not implemented for the type `i32`
22-
//~| ERROR E0277
2322
let names: Vec<String> = select_id.load(&connection).unwrap().collect();
2423
//~^ ERROR the trait `diesel::query_source::Queryable<diesel::types::Integer>` is not implemented
25-
//~| ERROR E0277
2624
}

diesel_tests/tests/filter_operators.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,7 @@ trait TestResultHelpers<U> {
125125
fn as_vec(self) -> Vec<U>;
126126
}
127127

128-
impl<ST, U> TestResultHelpers<U> for QueryResult<Cursor<ST, U>> where
129-
Cursor<ST, U>: Iterator<Item=U>,
130-
{
128+
impl<U> TestResultHelpers<U> for QueryResult<Box<Iterator<Item=U>>> {
131129
fn as_vec(self) -> Vec<U> {
132130
self.unwrap().collect()
133131
}

0 commit comments

Comments
 (0)