@@ -23,7 +23,6 @@ use postgres_shared::RowData;
2323use std:: collections:: HashMap ;
2424use std:: fmt;
2525use std:: io;
26- use std:: mem;
2726use std:: sync:: Arc ;
2827use std:: sync:: mpsc:: { self , Sender , Receiver } ;
2928use tokio_core:: reactor:: Handle ;
@@ -33,6 +32,7 @@ pub use postgres_shared::{params, Column, RowIndex};
3332
3433use error:: { ConnectError , Error , DbError , SqlState } ;
3534use params:: { ConnectParams , IntoConnectParams } ;
35+ use stmt:: Statement ;
3636use stream:: PostgresStream ;
3737use tls:: Handshake ;
3838use transaction:: Transaction ;
@@ -41,6 +41,7 @@ use rows::Row;
4141
4242pub mod error;
4343pub mod rows;
44+ pub mod stmt;
4445mod stream;
4546pub mod tls;
4647pub mod transaction;
@@ -878,19 +879,17 @@ impl Connection {
878879 let name = format ! ( "s{}" , id) ;
879880 self . raw_prepare ( & name, query)
880881 . 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) ) ;
887886 ( stmt, conn)
888887 } )
889888 . boxed ( )
890889 }
891890
892891 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)
894893 . and_then ( |conn| conn. finish_execute ( ) )
895894 . boxed ( )
896895 }
@@ -899,8 +898,8 @@ impl Connection {
899898 statement : & Statement ,
900899 params : & [ & ToSql ] )
901900 -> 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)
904903 . map ( |c| c. read_rows ( ) . map ( move |r| Row :: new ( columns. clone ( ) , r) ) )
905904 . flatten_state_stream ( )
906905 . boxed ( )
@@ -926,30 +925,6 @@ impl Connection {
926925 }
927926}
928927
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-
953928fn connect_err ( fields : & mut ErrorFields ) -> ConnectError {
954929 match DbError :: new ( fields) {
955930 Ok ( err) => ConnectError :: Db ( Box :: new ( err) ) ,
@@ -967,6 +942,18 @@ trait RowNew {
967942 fn new ( columns : Arc < Vec < Column > > , data : RowData ) -> Row ;
968943}
969944
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+
970957trait TransactionNew {
971958 fn new ( c : Connection ) -> Transaction ;
972959}
0 commit comments