Skip to content

Commit 2a80118

Browse files
committed
Don't require use of iterators
The common case is to simply want a vec of rows to work with, so make that the main API, wrapping the old version returning an iterator.
1 parent 1cbf9a1 commit 2a80118

7 files changed

Lines changed: 91 additions & 125 deletions

File tree

postgres/src/client.rs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ use futures::{Async, Future, Poll, Stream};
33
use std::io::{self, Read};
44
use tokio_postgres::tls::{MakeTlsConnect, TlsConnect};
55
use tokio_postgres::types::{ToSql, Type};
6-
use tokio_postgres::Error;
76
#[cfg(feature = "runtime")]
87
use tokio_postgres::Socket;
8+
use tokio_postgres::{Error, Row, SimpleQueryMessage};
99

1010
#[cfg(feature = "runtime")]
1111
use crate::Config;
12-
use crate::{CopyOutReader, Query, SimpleQuery, Statement, ToStatement, Transaction};
12+
use crate::{CopyOutReader, QueryIter, SimpleQueryIter, Statement, ToStatement, Transaction};
1313

1414
pub struct Client(tokio_postgres::Client);
1515

@@ -46,12 +46,23 @@ impl Client {
4646
self.0.execute(&statement.0, params).wait()
4747
}
4848

49-
pub fn query<T>(&mut self, query: &T, params: &[&dyn ToSql]) -> Result<Query<'_>, Error>
49+
pub fn query<T>(&mut self, query: &T, params: &[&dyn ToSql]) -> Result<Vec<Row>, Error>
50+
where
51+
T: ?Sized + ToStatement,
52+
{
53+
self.query_iter(query, params)?.collect()
54+
}
55+
56+
pub fn query_iter<T>(
57+
&mut self,
58+
query: &T,
59+
params: &[&dyn ToSql],
60+
) -> Result<QueryIter<'_>, Error>
5061
where
5162
T: ?Sized + ToStatement,
5263
{
5364
let statement = query.__statement(self)?;
54-
Ok(Query::new(self.0.query(&statement.0, params)))
65+
Ok(QueryIter::new(self.0.query(&statement.0, params)))
5566
}
5667

5768
pub fn copy_in<T, R>(
@@ -83,12 +94,16 @@ impl Client {
8394
CopyOutReader::new(stream)
8495
}
8596

86-
pub fn simple_query(&mut self, query: &str) -> Result<SimpleQuery<'_>, Error> {
87-
Ok(SimpleQuery::new(self.0.simple_query(query)))
97+
pub fn simple_query(&mut self, query: &str) -> Result<Vec<SimpleQueryMessage>, Error> {
98+
self.simple_query_iter(query)?.collect()
99+
}
100+
101+
pub fn simple_query_iter(&mut self, query: &str) -> Result<SimpleQueryIter<'_>, Error> {
102+
Ok(SimpleQueryIter::new(self.0.simple_query(query)))
88103
}
89104

90105
pub fn transaction(&mut self) -> Result<Transaction<'_>, Error> {
91-
self.simple_query("BEGIN")?.count()?;
106+
self.simple_query("BEGIN")?;
92107
Ok(Transaction::new(self))
93108
}
94109

postgres/src/lib.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ mod client;
88
mod config;
99
mod copy_out_reader;
1010
mod portal;
11-
mod query;
12-
mod query_portal;
13-
mod simple_query;
11+
mod query_iter;
12+
mod query_portal_iter;
13+
mod simple_query_iter;
1414
mod statement;
1515
mod to_statement;
1616
mod transaction;
@@ -24,9 +24,9 @@ pub use crate::client::*;
2424
pub use crate::config::*;
2525
pub use crate::copy_out_reader::*;
2626
pub use crate::portal::*;
27-
pub use crate::query::*;
28-
pub use crate::query_portal::*;
29-
pub use crate::simple_query::*;
27+
pub use crate::query_iter::*;
28+
pub use crate::query_portal_iter::*;
29+
pub use crate::simple_query_iter::*;
3030
pub use crate::statement::*;
3131
pub use crate::to_statement::*;
3232
pub use crate::transaction::*;
Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,26 @@ use std::marker::PhantomData;
44
use tokio_postgres::impls;
55
use tokio_postgres::{Error, Row};
66

7-
pub struct Query<'a> {
7+
pub struct QueryIter<'a> {
88
it: stream::Wait<impls::Query>,
99
_p: PhantomData<&'a mut ()>,
1010
}
1111

1212
// no-op impl to extend the borrow until drop
13-
impl<'a> Drop for Query<'a> {
13+
impl<'a> Drop for QueryIter<'a> {
1414
fn drop(&mut self) {}
1515
}
1616

17-
impl<'a> Query<'a> {
18-
pub(crate) fn new(stream: impls::Query) -> Query<'a> {
19-
Query {
17+
impl<'a> QueryIter<'a> {
18+
pub(crate) fn new(stream: impls::Query) -> QueryIter<'a> {
19+
QueryIter {
2020
it: stream.wait(),
2121
_p: PhantomData,
2222
}
2323
}
24-
25-
/// A convenience API which collects the resulting rows into a `Vec` and returns them.
26-
pub fn into_vec(self) -> Result<Vec<Row>, Error> {
27-
self.collect()
28-
}
2924
}
3025

31-
impl<'a> FallibleIterator for Query<'a> {
26+
impl<'a> FallibleIterator for QueryIter<'a> {
3227
type Item = Row;
3328
type Error = Error;
3429

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,26 @@ use std::marker::PhantomData;
44
use tokio_postgres::impls;
55
use tokio_postgres::{Error, Row};
66

7-
pub struct QueryPortal<'a> {
7+
pub struct QueryPortalIter<'a> {
88
it: stream::Wait<impls::QueryPortal>,
99
_p: PhantomData<&'a mut ()>,
1010
}
1111

1212
// no-op impl to extend the borrow until drop
13-
impl<'a> Drop for QueryPortal<'a> {
13+
impl<'a> Drop for QueryPortalIter<'a> {
1414
fn drop(&mut self) {}
1515
}
1616

17-
impl<'a> QueryPortal<'a> {
18-
pub(crate) fn new(stream: impls::QueryPortal) -> QueryPortal<'a> {
19-
QueryPortal {
17+
impl<'a> QueryPortalIter<'a> {
18+
pub(crate) fn new(stream: impls::QueryPortal) -> QueryPortalIter<'a> {
19+
QueryPortalIter {
2020
it: stream.wait(),
2121
_p: PhantomData,
2222
}
2323
}
24-
25-
/// A convenience API which collects the resulting rows into a `Vec` and returns them.
26-
pub fn into_vec(self) -> Result<Vec<Row>, Error> {
27-
self.collect()
28-
}
2924
}
3025

31-
impl<'a> FallibleIterator for QueryPortal<'a> {
26+
impl<'a> FallibleIterator for QueryPortalIter<'a> {
3227
type Item = Row;
3328
type Error = Error;
3429

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,26 @@ use std::marker::PhantomData;
44
use tokio_postgres::impls;
55
use tokio_postgres::{Error, SimpleQueryMessage};
66

7-
pub struct SimpleQuery<'a> {
7+
pub struct SimpleQueryIter<'a> {
88
it: stream::Wait<impls::SimpleQuery>,
99
_p: PhantomData<&'a mut ()>,
1010
}
1111

1212
// no-op impl to extend borrow until drop
13-
impl<'a> Drop for SimpleQuery<'a> {
13+
impl<'a> Drop for SimpleQueryIter<'a> {
1414
fn drop(&mut self) {}
1515
}
1616

17-
impl<'a> SimpleQuery<'a> {
18-
pub(crate) fn new(stream: impls::SimpleQuery) -> SimpleQuery<'a> {
19-
SimpleQuery {
17+
impl<'a> SimpleQueryIter<'a> {
18+
pub(crate) fn new(stream: impls::SimpleQuery) -> SimpleQueryIter<'a> {
19+
SimpleQueryIter {
2020
it: stream.wait(),
2121
_p: PhantomData,
2222
}
2323
}
24-
25-
/// A convenience API which collects the resulting messages into a `Vec` and returns them.
26-
pub fn into_vec(self) -> Result<Vec<SimpleQueryMessage>, Error> {
27-
self.collect()
28-
}
2924
}
3025

31-
impl<'a> FallibleIterator for SimpleQuery<'a> {
26+
impl<'a> FallibleIterator for SimpleQueryIter<'a> {
3227
type Item = SimpleQueryMessage;
3328
type Error = Error;
3429

postgres/src/test.rs

Lines changed: 9 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use fallible_iterator::FallibleIterator;
21
use std::io::Read;
32
use tokio_postgres::types::Type;
43
use tokio_postgres::NoTls;
@@ -21,11 +20,7 @@ fn query_prepared() {
2120
let mut client = Client::connect("host=localhost port=5433 user=postgres", NoTls).unwrap();
2221

2322
let stmt = client.prepare("SELECT $1::TEXT").unwrap();
24-
let rows = client
25-
.query(&stmt, &[&"hello"])
26-
.unwrap()
27-
.into_vec()
28-
.unwrap();
23+
let rows = client.query(&stmt, &[&"hello"]).unwrap();
2924
assert_eq!(rows.len(), 1);
3025
assert_eq!(rows[0].get::<_, &str>(0), "hello");
3126
}
@@ -34,11 +29,7 @@ fn query_prepared() {
3429
fn query_unprepared() {
3530
let mut client = Client::connect("host=localhost port=5433 user=postgres", NoTls).unwrap();
3631

37-
let rows = client
38-
.query("SELECT $1::TEXT", &[&"hello"])
39-
.unwrap()
40-
.into_vec()
41-
.unwrap();
32+
let rows = client.query("SELECT $1::TEXT", &[&"hello"]).unwrap();
4233
assert_eq!(rows.len(), 1);
4334
assert_eq!(rows[0].get::<_, &str>(0), "hello");
4435
}
@@ -49,8 +40,6 @@ fn transaction_commit() {
4940

5041
client
5142
.simple_query("CREATE TEMPORARY TABLE foo (id SERIAL PRIMARY KEY)")
52-
.unwrap()
53-
.count()
5443
.unwrap();
5544

5645
let mut transaction = client.transaction().unwrap();
@@ -61,11 +50,7 @@ fn transaction_commit() {
6150

6251
transaction.commit().unwrap();
6352

64-
let rows = client
65-
.query("SELECT * FROM foo", &[])
66-
.unwrap()
67-
.into_vec()
68-
.unwrap();
53+
let rows = client.query("SELECT * FROM foo", &[]).unwrap();
6954
assert_eq!(rows.len(), 1);
7055
assert_eq!(rows[0].get::<_, i32>(0), 1);
7156
}
@@ -76,8 +61,6 @@ fn transaction_rollback() {
7661

7762
client
7863
.simple_query("CREATE TEMPORARY TABLE foo (id SERIAL PRIMARY KEY)")
79-
.unwrap()
80-
.count()
8164
.unwrap();
8265

8366
let mut transaction = client.transaction().unwrap();
@@ -88,11 +71,7 @@ fn transaction_rollback() {
8871

8972
transaction.rollback().unwrap();
9073

91-
let rows = client
92-
.query("SELECT * FROM foo", &[])
93-
.unwrap()
94-
.into_vec()
95-
.unwrap();
74+
let rows = client.query("SELECT * FROM foo", &[]).unwrap();
9675
assert_eq!(rows.len(), 0);
9776
}
9877

@@ -102,8 +81,6 @@ fn transaction_drop() {
10281

10382
client
10483
.simple_query("CREATE TEMPORARY TABLE foo (id SERIAL PRIMARY KEY)")
105-
.unwrap()
106-
.count()
10784
.unwrap();
10885

10986
let mut transaction = client.transaction().unwrap();
@@ -114,11 +91,7 @@ fn transaction_drop() {
11491

11592
drop(transaction);
11693

117-
let rows = client
118-
.query("SELECT * FROM foo", &[])
119-
.unwrap()
120-
.into_vec()
121-
.unwrap();
94+
let rows = client.query("SELECT * FROM foo", &[]).unwrap();
12295
assert_eq!(rows.len(), 0);
12396
}
12497

@@ -128,8 +101,6 @@ fn nested_transactions() {
128101

129102
client
130103
.simple_query("CREATE TEMPORARY TABLE foo (id INT PRIMARY KEY)")
131-
.unwrap()
132-
.count()
133104
.unwrap();
134105

135106
let mut transaction = client.transaction().unwrap();
@@ -148,8 +119,6 @@ fn nested_transactions() {
148119

149120
let rows = transaction
150121
.query("SELECT id FROM foo ORDER BY id", &[])
151-
.unwrap()
152-
.into_vec()
153122
.unwrap();
154123
assert_eq!(rows.len(), 1);
155124
assert_eq!(rows[0].get::<_, i32>(0), 1);
@@ -170,11 +139,7 @@ fn nested_transactions() {
170139
transaction3.commit().unwrap();
171140
transaction.commit().unwrap();
172141

173-
let rows = client
174-
.query("SELECT id FROM foo ORDER BY id", &[])
175-
.unwrap()
176-
.into_vec()
177-
.unwrap();
142+
let rows = client.query("SELECT id FROM foo ORDER BY id", &[]).unwrap();
178143
assert_eq!(rows.len(), 3);
179144
assert_eq!(rows[0].get::<_, i32>(0), 1);
180145
assert_eq!(rows[1].get::<_, i32>(0), 3);
@@ -187,8 +152,6 @@ fn copy_in() {
187152

188153
client
189154
.simple_query("CREATE TEMPORARY TABLE foo (id INT, name TEXT)")
190-
.unwrap()
191-
.count()
192155
.unwrap();
193156

194157
client
@@ -201,8 +164,6 @@ fn copy_in() {
201164

202165
let rows = client
203166
.query("SELECT id, name FROM foo ORDER BY id", &[])
204-
.unwrap()
205-
.into_vec()
206167
.unwrap();
207168

208169
assert_eq!(rows.len(), 2);
@@ -221,8 +182,6 @@ fn copy_out() {
221182
"CREATE TEMPORARY TABLE foo (id INT, name TEXT);
222183
INSERT INTO foo (id, name) VALUES (1, 'steven'), (2, 'timothy');",
223184
)
224-
.unwrap()
225-
.count()
226185
.unwrap();
227186

228187
let mut reader = client
@@ -234,7 +193,7 @@ fn copy_out() {
234193

235194
assert_eq!(s, "1\tsteven\n2\ttimothy\n");
236195

237-
client.simple_query("SELECT 1").unwrap().count().unwrap();
196+
client.simple_query("SELECT 1").unwrap();
238197
}
239198

240199
#[test]
@@ -246,8 +205,6 @@ fn portal() {
246205
"CREATE TEMPORARY TABLE foo (id INT);
247206
INSERT INTO foo (id) VALUES (1), (2), (3);",
248207
)
249-
.unwrap()
250-
.count()
251208
.unwrap();
252209

253210
let mut transaction = client.transaction().unwrap();
@@ -256,20 +213,12 @@ fn portal() {
256213
.bind("SELECT * FROM foo ORDER BY id", &[])
257214
.unwrap();
258215

259-
let rows = transaction
260-
.query_portal(&portal, 2)
261-
.unwrap()
262-
.into_vec()
263-
.unwrap();
216+
let rows = transaction.query_portal(&portal, 2).unwrap();
264217
assert_eq!(rows.len(), 2);
265218
assert_eq!(rows[0].get::<_, i32>(0), 1);
266219
assert_eq!(rows[1].get::<_, i32>(0), 2);
267220

268-
let rows = transaction
269-
.query_portal(&portal, 2)
270-
.unwrap()
271-
.into_vec()
272-
.unwrap();
221+
let rows = transaction.query_portal(&portal, 2).unwrap();
273222
assert_eq!(rows.len(), 1);
274223
assert_eq!(rows[0].get::<_, i32>(0), 3);
275224
}

0 commit comments

Comments
 (0)