@@ -23,7 +23,6 @@ use postgres_shared::RowData;
23
23
use std:: collections:: HashMap ;
24
24
use std:: fmt;
25
25
use std:: io;
26
- use std:: mem;
27
26
use std:: sync:: Arc ;
28
27
use std:: sync:: mpsc:: { self , Sender , Receiver } ;
29
28
use tokio_core:: reactor:: Handle ;
@@ -33,6 +32,7 @@ pub use postgres_shared::{params, Column, RowIndex};
33
32
34
33
use error:: { ConnectError , Error , DbError , SqlState } ;
35
34
use params:: { ConnectParams , IntoConnectParams } ;
35
+ use stmt:: Statement ;
36
36
use stream:: PostgresStream ;
37
37
use tls:: Handshake ;
38
38
use transaction:: Transaction ;
@@ -41,6 +41,7 @@ use rows::Row;
41
41
42
42
pub mod error;
43
43
pub mod rows;
44
+ pub mod stmt;
44
45
mod stream;
45
46
pub mod tls;
46
47
pub mod transaction;
@@ -878,19 +879,17 @@ impl Connection {
878
879
let name = format ! ( "s{}" , id) ;
879
880
self . raw_prepare ( & name, query)
880
881
. map ( |( params, columns, conn) | {
881
- let stmt = Statement {
882
- close_sender : conn. 0 . close_sender . clone ( ) ,
883
- name : name,
884
- params : params,
885
- columns : Arc :: new ( columns) ,
886
- } ;
882
+ let stmt = Statement :: new ( conn. 0 . close_sender . clone ( ) ,
883
+ name,
884
+ params,
885
+ Arc :: new ( columns) ) ;
887
886
( stmt, conn)
888
887
} )
889
888
. boxed ( )
890
889
}
891
890
892
891
pub fn execute ( self , statement : & Statement , params : & [ & ToSql ] ) -> BoxFuture < ( u64 , Connection ) , Error > {
893
- self . raw_execute ( & statement. name , "" , & statement. params , params)
892
+ self . raw_execute ( statement. name ( ) , "" , statement. parameters ( ) , params)
894
893
. and_then ( |conn| conn. finish_execute ( ) )
895
894
. boxed ( )
896
895
}
@@ -899,8 +898,8 @@ impl Connection {
899
898
statement : & Statement ,
900
899
params : & [ & ToSql ] )
901
900
-> BoxStateStream < Row , Connection , Error > {
902
- let columns = statement. columns . clone ( ) ;
903
- self . raw_execute ( & statement. name , "" , & statement. params , params)
901
+ let columns = statement. columns_arc ( ) . clone ( ) ;
902
+ self . raw_execute ( statement. name ( ) , "" , statement. parameters ( ) , params)
904
903
. map ( |c| c. read_rows ( ) . map ( move |r| Row :: new ( columns. clone ( ) , r) ) )
905
904
. flatten_state_stream ( )
906
905
. boxed ( )
@@ -926,30 +925,6 @@ impl Connection {
926
925
}
927
926
}
928
927
929
- pub struct Statement {
930
- close_sender : Sender < ( u8 , String ) > ,
931
- name : String ,
932
- params : Vec < Type > ,
933
- columns : Arc < Vec < Column > > ,
934
- }
935
-
936
- impl Drop for Statement {
937
- fn drop ( & mut self ) {
938
- let name = mem:: replace ( & mut self . name , String :: new ( ) ) ;
939
- let _ = self . close_sender . send ( ( b'S' , name) ) ;
940
- }
941
- }
942
-
943
- impl Statement {
944
- pub fn parameters ( & self ) -> & [ Type ] {
945
- & self . params
946
- }
947
-
948
- pub fn columns ( & self ) -> & [ Column ] {
949
- & self . columns
950
- }
951
- }
952
-
953
928
fn connect_err ( fields : & mut ErrorFields ) -> ConnectError {
954
929
match DbError :: new ( fields) {
955
930
Ok ( err) => ConnectError :: Db ( Box :: new ( err) ) ,
@@ -967,6 +942,18 @@ trait RowNew {
967
942
fn new ( columns : Arc < Vec < Column > > , data : RowData ) -> Row ;
968
943
}
969
944
945
+ trait StatementNew {
946
+ fn new ( close_sender : Sender < ( u8 , String ) > ,
947
+ name : String ,
948
+ params : Vec < Type > ,
949
+ columns : Arc < Vec < Column > > )
950
+ -> Statement ;
951
+
952
+ fn columns_arc ( & self ) -> & Arc < Vec < Column > > ;
953
+
954
+ fn name ( & self ) -> & str ;
955
+ }
956
+
970
957
trait TransactionNew {
971
958
fn new ( c : Connection ) -> Transaction ;
972
959
}
0 commit comments