@@ -9,8 +9,10 @@ use std::fmt;
99use std:: io;
1010use std:: ops:: Deref ;
1111use std:: slice;
12+ use std:: sync:: Arc ;
13+ use std:: marker:: PhantomData ;
1214
13- use { Result , RowsNew , LazyRowsNew , StatementInternals } ;
15+ use { Result , RowsNew , LazyRowsNew , StatementInternals , StatementInfo } ;
1416use transaction:: Transaction ;
1517use types:: { FromSql , WrongType } ;
1618use stmt:: { Statement , Column } ;
@@ -33,23 +35,18 @@ impl<'a, T> Deref for MaybeOwned<'a, T> {
3335}
3436
3537/// The resulting rows of a query.
36- pub struct Rows < ' stmt > {
37- stmt : MaybeOwned < ' stmt , Statement < ' stmt > > ,
38+ pub struct Rows < ' compat > {
39+ stmt_info : Arc < StatementInfo > ,
3840 data : Vec < RowData > ,
41+ _marker : PhantomData < & ' compat u8 >
3942}
4043
41- impl < ' a > RowsNew < ' a > for Rows < ' a > {
42- fn new ( stmt : & ' a Statement < ' a > , data : Vec < RowData > ) -> Rows < ' a > {
44+ impl RowsNew for Rows < ' static > {
45+ fn new ( stmt : & Statement , data : Vec < RowData > ) -> Rows < ' static > {
4346 Rows {
44- stmt : MaybeOwned :: Borrowed ( stmt) ,
45- data : data,
46- }
47- }
48-
49- fn new_owned ( stmt : Statement < ' a > , data : Vec < RowData > ) -> Rows < ' a > {
50- Rows {
51- stmt : MaybeOwned :: Owned ( stmt) ,
47+ stmt_info : stmt. info ( ) . clone ( ) ,
5248 data : data,
49+ _marker : PhantomData ,
5350 }
5451 }
5552}
@@ -63,10 +60,10 @@ impl<'a> fmt::Debug for Rows<'a> {
6360 }
6461}
6562
66- impl < ' stmt > Rows < ' stmt > {
63+ impl < ' rows > Rows < ' rows > {
6764 /// Returns a slice describing the columns of the `Rows`.
6865 pub fn columns ( & self ) -> & [ Column ] {
69- self . stmt . columns ( )
66+ & self . stmt_info . columns [ .. ]
7067 }
7168
7269 /// Returns the number of rows present.
@@ -86,15 +83,15 @@ impl<'stmt> Rows<'stmt> {
8683 /// Panics if `idx` is out of bounds.
8784 pub fn get < ' a > ( & ' a self , idx : usize ) -> Row < ' a > {
8885 Row {
89- stmt : & * self . stmt ,
86+ stmt_info : & self . stmt_info ,
9087 data : MaybeOwned :: Borrowed ( & self . data [ idx] ) ,
9188 }
9289 }
9390
9491 /// Returns an iterator over the `Row`s.
9592 pub fn iter < ' a > ( & ' a self ) -> Iter < ' a > {
9693 Iter {
97- stmt : & * self . stmt ,
94+ stmt_info : & self . stmt_info ,
9895 iter : self . data . iter ( ) ,
9996 }
10097 }
@@ -111,7 +108,7 @@ impl<'a> IntoIterator for &'a Rows<'a> {
111108
112109/// An iterator over `Row`s.
113110pub struct Iter < ' a > {
114- stmt : & ' a Statement < ' a > ,
111+ stmt_info : & ' a StatementInfo ,
115112 iter : slice:: Iter < ' a , RowData > ,
116113}
117114
@@ -121,7 +118,7 @@ impl<'a> Iterator for Iter<'a> {
121118 fn next ( & mut self ) -> Option < Row < ' a > > {
122119 self . iter . next ( ) . map ( |row| {
123120 Row {
124- stmt : & * self . stmt ,
121+ stmt_info : self . stmt_info ,
125122 data : MaybeOwned :: Borrowed ( row) ,
126123 }
127124 } )
@@ -136,7 +133,7 @@ impl<'a> DoubleEndedIterator for Iter<'a> {
136133 fn next_back ( & mut self ) -> Option < Row < ' a > > {
137134 self . iter . next_back ( ) . map ( |row| {
138135 Row {
139- stmt : & * self . stmt ,
136+ stmt_info : self . stmt_info ,
140137 data : MaybeOwned :: Borrowed ( row) ,
141138 }
142139 } )
@@ -147,14 +144,14 @@ impl<'a> ExactSizeIterator for Iter<'a> {}
147144
148145/// A single result row of a query.
149146pub struct Row < ' a > {
150- stmt : & ' a Statement < ' a > ,
147+ stmt_info : & ' a StatementInfo ,
151148 data : MaybeOwned < ' a , RowData > ,
152149}
153150
154151impl < ' a > fmt:: Debug for Row < ' a > {
155152 fn fmt ( & self , fmt : & mut fmt:: Formatter ) -> fmt:: Result {
156153 fmt. debug_struct ( "Row" )
157- . field ( "statement" , self . stmt )
154+ . field ( "statement" , self . stmt_info )
158155 . finish ( )
159156 }
160157}
@@ -172,7 +169,7 @@ impl<'a> Row<'a> {
172169
173170 /// Returns a slice describing the columns of the `Row`.
174171 pub fn columns ( & self ) -> & [ Column ] {
175- self . stmt . columns ( )
172+ & self . stmt_info . columns [ .. ]
176173 }
177174
178175 /// Retrieves the contents of a field of the row.
@@ -227,12 +224,12 @@ impl<'a> Row<'a> {
227224 where I : RowIndex ,
228225 T : FromSql
229226 {
230- let idx = match idx. idx ( self . stmt ) {
227+ let idx = match idx. idx ( & self . stmt_info . columns ) {
231228 Some ( idx) => idx,
232229 None => return None ,
233230 } ;
234231
235- let ty = self . stmt . columns ( ) [ idx] . type_ ( ) ;
232+ let ty = self . stmt_info . columns [ idx] . type_ ( ) ;
236233 if !<T as FromSql >:: accepts ( ty) {
237234 return Some ( Err ( Error :: Conversion ( Box :: new ( WrongType :: new ( ty. clone ( ) ) ) ) ) ) ;
238235 }
@@ -248,7 +245,7 @@ impl<'a> Row<'a> {
248245 pub fn get_bytes < I > ( & self , idx : I ) -> Option < & [ u8 ] >
249246 where I : RowIndex + fmt:: Debug
250247 {
251- match idx. idx ( self . stmt ) {
248+ match idx. idx ( & self . stmt_info . columns ) {
252249 Some ( idx) => self . data . get ( idx) ,
253250 None => panic ! ( "invalid index {:?}" , idx) ,
254251 }
@@ -259,13 +256,13 @@ impl<'a> Row<'a> {
259256pub trait RowIndex {
260257 /// Returns the index of the appropriate column, or `None` if no such
261258 /// column exists.
262- fn idx ( & self , stmt : & Statement ) -> Option < usize > ;
259+ fn idx ( & self , _ : & [ Column ] ) -> Option < usize > ;
263260}
264261
265262impl RowIndex for usize {
266263 #[ inline]
267- fn idx ( & self , stmt : & Statement ) -> Option < usize > {
268- if * self >= stmt . columns ( ) . len ( ) {
264+ fn idx ( & self , columns : & [ Column ] ) -> Option < usize > {
265+ if * self >= columns. len ( ) {
269266 None
270267 } else {
271268 Some ( * self )
@@ -275,15 +272,15 @@ impl RowIndex for usize {
275272
276273impl < ' a > RowIndex for & ' a str {
277274 #[ inline]
278- fn idx ( & self , stmt : & Statement ) -> Option < usize > {
279- if let Some ( idx) = stmt . columns ( ) . iter ( ) . position ( |d| d. name ( ) == * self ) {
275+ fn idx ( & self , columns : & [ Column ] ) -> Option < usize > {
276+ if let Some ( idx) = columns. iter ( ) . position ( |d| d. name ( ) == * self ) {
280277 return Some ( idx) ;
281278 } ;
282279
283280 // FIXME ASCII-only case insensitivity isn't really the right thing to
284281 // do. Postgres itself uses a dubious wrapper around tolower and JDBC
285282 // uses the US locale.
286- stmt . columns ( ) . iter ( ) . position ( |d| d. name ( ) . eq_ignore_ascii_case ( * self ) )
283+ columns. iter ( ) . position ( |d| d. name ( ) . eq_ignore_ascii_case ( * self ) )
287284 }
288285}
289286
@@ -381,7 +378,7 @@ impl<'trans, 'stmt> FallibleIterator for LazyRows<'trans, 'stmt> {
381378 . pop_front ( )
382379 . map ( |r| {
383380 Row {
384- stmt : self . stmt ,
381+ stmt_info : & * * self . stmt . info ( ) ,
385382 data : MaybeOwned :: Owned ( r) ,
386383 }
387384 } ) ;
0 commit comments