66//! extern crate postgres;
77//! extern crate postgres_large_object;
88//!
9- //! use std::old_path::Path;
10- //! use std::old_io::fs::File;
11- //! use std::old_io::util;
9+ //! use std::fs::File;
10+ //! use std::io;
1211//!
1312//! use postgres::{Connection, SslMode};
1413//! use postgres_large_object::{LargeObjectExt, LargeObjectTransactionExt, Mode};
1514//!
1615//! fn main() {
1716//! let conn = Connection::connect("postgres://postgres@localhost", &SslMode::None).unwrap();
1817//!
19- //! let mut file = File::open(&Path::new( "vacation_photos.tar.gz") ).unwrap();
18+ //! let mut file = File::open("vacation_photos.tar.gz").unwrap();
2019//! let trans = conn.transaction().unwrap();
2120//! let oid = trans.create_large_object().unwrap();
2221//! {
2322//! let mut large_object = trans.open_large_object(oid, Mode::Write).unwrap();
24- //! util ::copy(&mut file, &mut large_object).unwrap();
23+ //! io ::copy(&mut file, &mut large_object).unwrap();
2524//! }
2625//! trans.commit().unwrap();
2726//!
28- //! let mut file = File::create(&Path::new( "vacation_photos_copy.tar.gz") ).unwrap();
27+ //! let mut file = File::create("vacation_photos_copy.tar.gz").unwrap();
2928//! let trans = conn.transaction().unwrap();
3029//! let mut large_object = trans.open_large_object(oid, Mode::Read).unwrap();
31- //! util ::copy(&mut large_object, &mut file).unwrap();
30+ //! io ::copy(&mut large_object, &mut file).unwrap();
3231//! }
3332//! ```
34- #![ feature( unsafe_destructor, io, old_io , core) ]
33+ #![ feature( unsafe_destructor, io, core) ]
3534#![ doc( html_root_url="https://sfackler.github.io/rust-postgres-large-object/doc" ) ]
3635
3736extern crate postgres;
@@ -40,7 +39,6 @@ use std::cmp;
4039use std:: fmt;
4140use std:: i32;
4241use std:: num:: FromPrimitive ;
43- use std:: old_io:: { self , IoResult , IoError , IoErrorKind , SeekStyle } ;
4442use std:: io;
4543use std:: slice:: bytes;
4644
@@ -58,7 +56,7 @@ pub trait LargeObjectExt: GenericConnection {
5856impl < T : GenericConnection > LargeObjectExt for T {
5957 fn create_large_object ( & self ) -> Result < Oid > {
6058 let stmt = try!( self . prepare_cached ( "SELECT pg_catalog.lo_create(0)" ) ) ;
61- stmt. query ( & [ ] ) . map ( |mut r| r. next ( ) . unwrap ( ) . get ( 0 ) )
59+ stmt. query ( & [ ] ) . map ( |r| r. iter ( ) . next ( ) . unwrap ( ) . get ( 0 ) )
6260 }
6361
6462 fn delete_large_object ( & self , oid : Oid ) -> Result < ( ) > {
@@ -106,7 +104,7 @@ impl<'conn> LargeObjectTransactionExt for Transaction<'conn> {
106104 let has_64 = major > 9 || ( major == 9 && minor >= 3 ) ;
107105
108106 let stmt = try!( self . prepare_cached ( "SELECT pg_catalog.lo_open($1, $2)" ) ) ;
109- let fd = try!( stmt. query ( & [ & oid, & mode. to_i32 ( ) ] ) ) . next ( ) . unwrap ( ) . get ( 0 ) ;
107+ let fd = try!( stmt. query ( & [ & oid, & mode. to_i32 ( ) ] ) ) . iter ( ) . next ( ) . unwrap ( ) . get ( 0 ) ;
110108 Ok ( LargeObject {
111109 trans : self ,
112110 fd : fd,
@@ -116,19 +114,6 @@ impl<'conn> LargeObjectTransactionExt for Transaction<'conn> {
116114 }
117115}
118116
119- macro_rules! try_old_io {
120- ( $e: expr) => {
121- match $e {
122- Ok ( ok) => ok,
123- Err ( e) => return Err ( IoError {
124- kind: IoErrorKind :: OtherIoError ,
125- desc: "error communicating with server" ,
126- detail: Some ( format!( "{}" , e) ) ,
127- } )
128- }
129- }
130- }
131-
132117macro_rules! try_io {
133118 ( $e: expr) => {
134119 match $e {
@@ -173,11 +158,11 @@ impl<'a> LargeObject<'a> {
173158 } else {
174159 let len: i32 = match FromPrimitive :: from_i64 ( len) {
175160 Some ( len) => len,
176- None => return Err ( Error :: IoError ( IoError {
177- kind : IoErrorKind :: InvalidInput ,
178- desc : "The database does not support objects larger than 2GB" ,
179- detail : None ,
180- } ) ) ,
161+ None => return Err ( Error :: IoError ( io :: Error :: new (
162+ io :: ErrorKind :: InvalidInput ,
163+ "The database does not support objects larger than 2GB" ,
164+ None ,
165+ ) ) ) ,
181166 } ;
182167 let stmt = try!( self . trans . prepare_cached ( "SELECT pg_catalog.lo_truncate($1, $2)" ) ) ;
183168 stmt. execute ( & [ & self . fd , & len] ) . map ( |_| ( ) )
@@ -203,48 +188,18 @@ impl<'a> LargeObject<'a> {
203188 }
204189}
205190
206- impl < ' a > Reader for LargeObject < ' a > {
207- fn read ( & mut self , buf : & mut [ u8 ] ) -> IoResult < usize > {
208- let stmt = try_old_io ! ( self . trans. prepare_cached( "SELECT pg_catalog.loread($1, $2)" ) ) ;
209- let cap = cmp:: min ( buf. len ( ) , i32:: MAX as usize ) as i32 ;
210- let row = try_old_io ! ( stmt. query( & [ & self . fd, & cap] ) ) . next ( ) . unwrap ( ) ;
211- let out = row. get_bytes ( 0 ) . unwrap ( ) ;
212-
213- if !buf. is_empty ( ) && out. is_empty ( ) {
214- return Err ( old_io:: standard_error ( IoErrorKind :: EndOfFile ) ) ;
215- }
216-
217- bytes:: copy_memory ( buf, & out) ;
218- Ok ( out. len ( ) )
219- }
220- }
221-
222191impl < ' a > io:: Read for LargeObject < ' a > {
223192 fn read ( & mut self , buf : & mut [ u8 ] ) -> io:: Result < usize > {
224193 let stmt = try_io ! ( self . trans. prepare_cached( "SELECT pg_catalog.loread($1, $2)" ) ) ;
225194 let cap = cmp:: min ( buf. len ( ) , i32:: MAX as usize ) as i32 ;
226- let row = try_io ! ( stmt. query( & [ & self . fd, & cap] ) ) . next ( ) . unwrap ( ) ;
195+ let row = try_io ! ( stmt. query( & [ & self . fd, & cap] ) ) . into_iter ( ) . next ( ) . unwrap ( ) ;
227196 let out = row. get_bytes ( 0 ) . unwrap ( ) ;
228197
229198 bytes:: copy_memory ( buf, & out) ;
230199 Ok ( out. len ( ) )
231200 }
232201}
233202
234- impl < ' a > Writer for LargeObject < ' a > {
235- fn write_all ( & mut self , mut buf : & [ u8 ] ) -> IoResult < ( ) > {
236- let stmt = try_old_io ! ( self . trans. prepare_cached( "SELECT pg_catalog.lowrite($1, $2)" ) ) ;
237-
238- while !buf. is_empty ( ) {
239- let cap = cmp:: min ( buf. len ( ) , i32:: MAX as usize ) ;
240- try_old_io ! ( stmt. execute( & [ & self . fd, &&buf[ ..cap] ] ) ) ;
241- buf = & buf[ cap..] ;
242- }
243-
244- Ok ( ( ) )
245- }
246- }
247-
248203impl < ' a > io:: Write for LargeObject < ' a > {
249204 fn write ( & mut self , buf : & [ u8 ] ) -> io:: Result < usize > {
250205 let stmt = try_io ! ( self . trans. prepare_cached( "SELECT pg_catalog.lowrite($1, $2)" ) ) ;
@@ -258,44 +213,6 @@ impl<'a> io::Write for LargeObject<'a> {
258213 }
259214}
260215
261- impl < ' a > Seek for LargeObject < ' a > {
262- fn tell ( & self ) -> IoResult < u64 > {
263- if self . has_64 {
264- let stmt = try_old_io ! ( self . trans. prepare_cached( "SELECT pg_catalog.lo_tell64($1)" ) ) ;
265- Ok ( try_old_io ! ( stmt. query( & [ & self . fd] ) ) . next ( ) . unwrap ( ) . get :: < _ , i64 > ( 0 ) as u64 )
266- } else {
267- let stmt = try_old_io ! ( self . trans. prepare_cached( "SELECT pg_catalog.lo_tell($1)" ) ) ;
268- Ok ( try_old_io ! ( stmt. query( & [ & self . fd] ) ) . next ( ) . unwrap ( ) . get :: < _ , i32 > ( 0 ) as u64 )
269- }
270- }
271-
272- fn seek ( & mut self , pos : i64 , style : SeekStyle ) -> IoResult < ( ) > {
273- let kind = match style {
274- SeekStyle :: SeekSet => 0 ,
275- SeekStyle :: SeekCur => 1 ,
276- SeekStyle :: SeekEnd => 2 ,
277- } ;
278-
279- if self . has_64 {
280- let stmt = try_old_io ! ( self . trans. prepare_cached( "SELECT pg_catalog.lo_lseek64($1, $2, $3)" ) ) ;
281- try_old_io ! ( stmt. execute( & [ & self . fd, & pos, & kind] ) ) ;
282- } else {
283- let pos: i32 = match FromPrimitive :: from_i64 ( pos) {
284- Some ( pos) => pos,
285- None => return Err ( IoError {
286- kind : IoErrorKind :: InvalidInput ,
287- desc : "The database does not support seeks larger than 2GB" ,
288- detail : None ,
289- } ) ,
290- } ;
291- let stmt = try_old_io ! ( self . trans. prepare_cached( "SELECT pg_catalog.lo_lseek($1, $2, $3)" ) ) ;
292- try_old_io ! ( stmt. execute( & [ & self . fd, & pos, & kind] ) ) ;
293- }
294-
295- Ok ( ( ) )
296- }
297- }
298-
299216impl < ' a > io:: Seek for LargeObject < ' a > {
300217 fn seek ( & mut self , pos : io:: SeekFrom ) -> io:: Result < u64 > {
301218 let ( kind, pos) = match pos {
@@ -314,7 +231,7 @@ impl<'a> io::Seek for LargeObject<'a> {
314231
315232 if self . has_64 {
316233 let stmt = try_io ! ( self . trans. prepare_cached( "SELECT pg_catalog.lo_lseek64($1, $2, $3)" ) ) ;
317- Ok ( try_io ! ( stmt. query( & [ & self . fd, & pos, & kind] ) ) . next ( ) . unwrap ( ) . get :: < _ , i64 > ( 0 ) as u64 )
234+ Ok ( try_io ! ( stmt. query( & [ & self . fd, & pos, & kind] ) ) . iter ( ) . next ( ) . unwrap ( ) . get :: < _ , i64 > ( 0 ) as u64 )
318235 } else {
319236 let pos: i32 = match FromPrimitive :: from_i64 ( pos) {
320237 Some ( pos) => pos,
@@ -323,7 +240,7 @@ impl<'a> io::Seek for LargeObject<'a> {
323240 None ) ) ,
324241 } ;
325242 let stmt = try_io ! ( self . trans. prepare_cached( "SELECT pg_catalog.lo_lseek($1, $2, $3)" ) ) ;
326- Ok ( try_io ! ( stmt. query( & [ & self . fd, & pos, & kind] ) ) . next ( ) . unwrap ( ) . get :: < _ , i32 > ( 0 ) as u64 )
243+ Ok ( try_io ! ( stmt. query( & [ & self . fd, & pos, & kind] ) ) . iter ( ) . next ( ) . unwrap ( ) . get :: < _ , i32 > ( 0 ) as u64 )
327244 }
328245 }
329246}
@@ -373,19 +290,6 @@ mod test {
373290 lo. finish ( ) . unwrap ( ) ;
374291 }
375292
376- #[ test]
377- fn test_write_read_old_io ( ) {
378- use std:: old_io:: { Writer , Reader } ;
379-
380- let conn = Connection :: connect ( "postgres://postgres@localhost" , & SslMode :: None ) . unwrap ( ) ;
381- let trans = conn. transaction ( ) . unwrap ( ) ;
382- let oid = trans. create_large_object ( ) . unwrap ( ) ;
383- let mut lo = trans. open_large_object ( oid, Mode :: Write ) . unwrap ( ) ;
384- lo. write_all ( b"hello world!!!" ) . unwrap ( ) ;
385- let mut lo = trans. open_large_object ( oid, Mode :: Read ) . unwrap ( ) ;
386- assert_eq ! ( b"hello world!!!" , lo. read_to_end( ) . unwrap( ) ) ;
387- }
388-
389293 #[ test]
390294 fn test_write_read ( ) {
391295 use std:: io:: { Write , Read } ;
@@ -401,29 +305,6 @@ mod test {
401305 assert_eq ! ( b"hello world!!!" , out) ;
402306 }
403307
404- #[ test]
405- fn test_seek_tell_old_io ( ) {
406- use std:: old_io:: { Writer , Reader , Seek , SeekStyle } ;
407-
408- let conn = Connection :: connect ( "postgres://postgres@localhost" , & SslMode :: None ) . unwrap ( ) ;
409- let trans = conn. transaction ( ) . unwrap ( ) ;
410- let oid = trans. create_large_object ( ) . unwrap ( ) ;
411- let mut lo = trans. open_large_object ( oid, Mode :: Write ) . unwrap ( ) ;
412- lo. write_all ( b"hello world!!!" ) . unwrap ( ) ;
413-
414- assert_eq ! ( 14 , lo. tell( ) . unwrap( ) ) ;
415- lo. seek ( 1 , SeekStyle :: SeekSet ) . unwrap ( ) ;
416- assert_eq ! ( 1 , lo. tell( ) . unwrap( ) ) ;
417- assert_eq ! ( b'e' , lo. read_u8( ) . unwrap( ) ) ;
418- assert_eq ! ( 2 , lo. tell( ) . unwrap( ) ) ;
419- lo. seek ( -4 , SeekStyle :: SeekEnd ) . unwrap ( ) ;
420- assert_eq ! ( 10 , lo. tell( ) . unwrap( ) ) ;
421- assert_eq ! ( b'd' , lo. read_u8( ) . unwrap( ) ) ;
422- lo. seek ( -3 , SeekStyle :: SeekCur ) . unwrap ( ) ;
423- assert_eq ! ( 8 , lo. tell( ) . unwrap( ) ) ;
424- assert_eq ! ( b'r' , lo. read_u8( ) . unwrap( ) ) ;
425- }
426-
427308 #[ test]
428309 fn test_seek_tell ( ) {
429310 use std:: io:: { Write , Read , Seek , SeekFrom } ;
@@ -448,17 +329,6 @@ mod test {
448329 assert_eq ! ( b'r' , buf[ 0 ] ) ;
449330 }
450331
451- #[ test]
452- fn test_write_with_read_fd_old_io ( ) {
453- use std:: old_io:: Writer ;
454-
455- let conn = Connection :: connect ( "postgres://postgres@localhost" , & SslMode :: None ) . unwrap ( ) ;
456- let trans = conn. transaction ( ) . unwrap ( ) ;
457- let oid = trans. create_large_object ( ) . unwrap ( ) ;
458- let mut lo = trans. open_large_object ( oid, Mode :: Read ) . unwrap ( ) ;
459- assert ! ( lo. write_all( b"hello world!!!" ) . is_err( ) ) ;
460- }
461-
462332 #[ test]
463333 fn test_write_with_read_fd ( ) {
464334 use std:: io:: Write ;
@@ -470,24 +340,6 @@ mod test {
470340 assert ! ( lo. write_all( b"hello world!!!" ) . is_err( ) ) ;
471341 }
472342
473- #[ test]
474- fn test_truncate_old_io ( ) {
475- use std:: old_io:: { Seek , SeekStyle , Writer , Reader } ;
476-
477- let conn = Connection :: connect ( "postgres://postgres@localhost" , & SslMode :: None ) . unwrap ( ) ;
478- let trans = conn. transaction ( ) . unwrap ( ) ;
479- let oid = trans. create_large_object ( ) . unwrap ( ) ;
480- let mut lo = trans. open_large_object ( oid, Mode :: Write ) . unwrap ( ) ;
481- lo. write_all ( b"hello world!!!" ) . unwrap ( ) ;
482-
483- lo. truncate ( 5 ) . unwrap ( ) ;
484- lo. seek ( 0 , SeekStyle :: SeekSet ) . unwrap ( ) ;
485- assert_eq ! ( b"hello" , lo. read_to_end( ) . unwrap( ) ) ;
486- lo. truncate ( 10 ) . unwrap ( ) ;
487- lo. seek ( 0 , SeekStyle :: SeekSet ) . unwrap ( ) ;
488- assert_eq ! ( b"hello\0 \0 \0 \0 \0 " , lo. read_to_end( ) . unwrap( ) ) ;
489- }
490-
491343 #[ test]
492344 fn test_truncate ( ) {
493345 use std:: io:: { Seek , SeekFrom , Write , Read } ;
0 commit comments