Skip to content

Commit 47d1458

Browse files
committed
More infrastructure for lazy queries
cc rust-postgres#13
1 parent c2b3768 commit 47d1458

2 files changed

Lines changed: 71 additions & 29 deletions

File tree

src/lib.rs

Lines changed: 51 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,43 @@ impl<'self> NormalPostgresStatement<'self> {
482482
}
483483
})
484484
}
485+
486+
fn lazy_query<'a>(&'a self, row_limit: uint, params: &[&ToSql])
487+
-> PostgresResult<'a> {
488+
match self.try_lazy_query(row_limit, params) {
489+
Ok(result) => result,
490+
Err(err) => fail2!("Error executing query: {}", err.to_str())
491+
}
492+
}
493+
494+
fn try_lazy_query<'a>(&'a self, _row_limit: uint, params: &[&ToSql])
495+
-> Result<PostgresResult<'a>, PostgresDbError> {
496+
match self.execute("", params) {
497+
Some(err) => {
498+
return Err(err);
499+
}
500+
None => ()
501+
}
502+
503+
let mut data = ~[];
504+
loop {
505+
match_read_message_or_fail!(self.conn, {
506+
EmptyQueryResponse |
507+
CommandComplete {_} => {
508+
break;
509+
},
510+
DataRow { row } => data.push(row)
511+
})
512+
}
513+
self.conn.wait_for_ready();
514+
515+
// we're going to be popping off
516+
data.reverse();
517+
Ok(PostgresResult {
518+
stmt: self,
519+
data: data,
520+
})
521+
}
485522
}
486523
487524
impl<'self> PostgresStatement for NormalPostgresStatement<'self> {
@@ -535,39 +572,12 @@ impl<'self> PostgresStatement for NormalPostgresStatement<'self> {
535572
536573
fn query<'a>(&'a self, params: &[&ToSql])
537574
-> PostgresResult<'a> {
538-
match self.try_query(params) {
539-
Ok(result) => result,
540-
Err(err) => fail2!("Error running query: {}", err.to_str())
541-
}
575+
self.lazy_query(0, params)
542576
}
543577
544578
fn try_query<'a>(&'a self, params: &[&ToSql])
545579
-> Result<PostgresResult<'a>, PostgresDbError> {
546-
match self.execute("", params) {
547-
Some(err) => {
548-
return Err(err);
549-
}
550-
None => ()
551-
}
552-
553-
let mut data = ~[];
554-
loop {
555-
match_read_message_or_fail!(self.conn, {
556-
EmptyQueryResponse |
557-
CommandComplete {_} => {
558-
break;
559-
},
560-
DataRow { row } => data.push(row)
561-
})
562-
}
563-
self.conn.wait_for_ready();
564-
565-
// we're going to be popping off
566-
data.reverse();
567-
Ok(PostgresResult {
568-
stmt: self,
569-
data: data,
570-
})
580+
self.try_lazy_query(0, params)
571581
}
572582
573583
fn find_col_named(&self, col: &str) -> Option<uint> {
@@ -608,6 +618,18 @@ impl<'self> PostgresStatement for TransactionalPostgresStatement<'self> {
608618
}
609619
}
610620
621+
impl<'self> TransactionalPostgresStatement<'self> {
622+
pub fn lazy_query<'a>(&'a self, row_limit: uint, params: &[&ToSql])
623+
-> PostgresResult<'a> {
624+
self.stmt.lazy_query(row_limit, params)
625+
}
626+
627+
pub fn try_lazy_query<'a>(&'a self, row_limit: uint, params: &[&ToSql])
628+
-> Result<PostgresResult<'a>, PostgresDbError> {
629+
self.try_lazy_query(row_limit, params)
630+
}
631+
}
632+
611633
pub struct PostgresResult<'self> {
612634
priv stmt: &'self NormalPostgresStatement<'self>,
613635
priv data: ~[~[Option<~[u8]>]]

src/test.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,26 @@ fn test_query() {
6868
assert_eq!(~[1i64, 2], result.map(|row| { row[0] }).collect());
6969
}
7070

71+
#[test]
72+
fn test_lazy_query() {
73+
let conn = PostgresConnection::connect("postgres://postgres@127.0.0.1:5432");
74+
75+
do conn.in_transaction |trans| {
76+
trans.update("CREATE TEMPORARY TABLE foo (id INT PRIMARY KEY)", []);
77+
let stmt = trans.prepare("INSERT INTO foo (id) VALUES ($1)");
78+
let values = ~[0i32, 1, 2, 3, 4, 5];
79+
for value in values.iter() {
80+
stmt.update([value as &ToSql]);
81+
}
82+
83+
let stmt = trans.prepare("SELECT id FROM foo ORDER BY id");
84+
let result = stmt.lazy_query(2, []);
85+
assert_eq!(values, result.map(|row| { row[0] }).collect());
86+
87+
trans.set_rollback();
88+
}
89+
}
90+
7191
fn test_type<T: Eq+ToSql+FromSql>(sql_type: &str, values: &[T]) {
7292
let conn = PostgresConnection::connect("postgres://postgres@127.0.0.1:5432");
7393
conn.update("CREATE TEMPORARY TABLE foo (

0 commit comments

Comments
 (0)