Skip to content

Commit 3e006d9

Browse files
committed
Merge branch 'release-v0.3.4' into release
2 parents 7141f43 + c475fe0 commit 3e006d9

File tree

4 files changed

+35
-34
lines changed

4 files changed

+35
-34
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ language: rust
22
rust:
33
- nightly
44
- beta
5-
- stable
5+
- 1.3.0
66
addons:
77
postgresql: 9.4
88
script:

Cargo.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
[package]
22
name = "postgres_large_object"
3-
version = "0.3.3"
3+
version = "0.3.4"
44
authors = ["Steven Fackler <sfackler@gmail.com>"]
55
license = "MIT"
66
description = "Large object support for rust-postgres"
77
repository = "https://github.com/sfackler/rust-postgres-large-object"
8-
documentation = "https://sfackler.github.io/rust-postgres-large-object/doc/v0.3.3/postgres_large_object"
8+
documentation = "https://sfackler.github.io/rust-postgres-large-object/doc/v0.3.4/postgres_large_object"
99
readme = "README.md"
1010
keywords = ["database", "sql", "postgres"]
1111

1212
[dependencies]
1313
postgres = ">= 0.9, < 0.11"
14-
debug-builders = "0.1"

README.md

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,35 @@ A crate providing access to the Postgres large object API.
44

55
[![Build Status](https://travis-ci.org/sfackler/rust-postgres-large-object.svg?branch=master)](https://travis-ci.org/sfackler/rust-postgres-large-object)
66

7-
[Documentation](https://sfackler.github.io/rust-postgres-large-object/doc/v0.3.3/postgres_large_object)
7+
[Documentation](https://sfackler.github.io/rust-postgres-large-object/doc/v0.3.4/postgres_large_object)
88

99
# Example
1010

1111
```rust
1212
extern crate postgres;
1313
extern crate postgres_large_object;
1414

15-
use std::old_path::Path;
16-
use std::old_io::fs::File;
17-
use std::old_io::util;
15+
use std::fs::File;
16+
use std::io;
1817

1918
use postgres::{Connection, SslMode};
2019
use postgres_large_object::{LargeObjectExt, LargeObjectTransactionExt, Mode};
2120

2221
fn main() {
2322
let conn = Connection::connect("postgres://postgres@localhost", &SslMode::None).unwrap();
2423

25-
let mut file = File::open(&Path::new("vacation_photos.tar.gz")).unwrap();
24+
let mut file = File::open("vacation_photos.tar.gz").unwrap();
2625
let trans = conn.transaction().unwrap();
2726
let oid = trans.create_large_object().unwrap();
2827
{
2928
let mut large_object = trans.open_large_object(oid, Mode::Write).unwrap();
30-
util::copy(&mut file, &mut large_object).unwrap();
29+
io::copy(&mut file, &mut large_object).unwrap();
3130
}
3231
trans.commit().unwrap();
3332

34-
let mut file = File::create(&Path::new("vacation_photos_copy.tar.gz")).unwrap();
33+
let mut file = File::create("vacation_photos_copy.tar.gz").unwrap();
3534
let trans = conn.transaction().unwrap();
3635
let mut large_object = trans.open_large_object(oid, Mode::Read).unwrap();
37-
util::copy(&mut large_object, &mut file).unwrap();
36+
io::copy(&mut large_object, &mut file).unwrap();
3837
}
3938
```

src/lib.rs

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,17 @@
3030
//! io::copy(&mut large_object, &mut file).unwrap();
3131
//! }
3232
//! ```
33-
#![doc(html_root_url="https://sfackler.github.io/rust-postgres-large-object/doc/v0.3.3")]
33+
#![doc(html_root_url="https://sfackler.github.io/rust-postgres-large-object/doc/v0.3.4")]
3434

3535
extern crate postgres;
36-
extern crate debug_builders;
3736

38-
use debug_builders::DebugStruct;
3937
use postgres::{Result, Transaction, GenericConnection};
4038
use postgres::error::Error;
4139
use postgres::types::Oid;
4240
use std::cmp;
4341
use std::fmt;
4442
use std::i32;
45-
use std::io;
43+
use std::io::{self, Write};
4644

4745
/// An extension trait adding functionality to create and delete large objects.
4846
pub trait LargeObjectExt {
@@ -133,10 +131,10 @@ pub struct LargeObject<'a> {
133131

134132
impl<'a> fmt::Debug for LargeObject<'a> {
135133
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
136-
DebugStruct::new(fmt, "LargeObject")
137-
.field("fd", &self.fd)
138-
.field("transaction", &self.trans)
139-
.finish()
134+
fmt.debug_struct("LargeObject")
135+
.field("fd", &self.fd)
136+
.field("transaction", &self.trans)
137+
.finish()
140138
}
141139
}
142140

@@ -147,6 +145,11 @@ impl<'a> Drop for LargeObject<'a> {
147145
}
148146

149147
impl<'a> LargeObject<'a> {
148+
/// Returns the file descriptor of the opened object.
149+
pub fn fd(&self) -> i32 {
150+
self.fd
151+
}
152+
150153
/// Truncates the object to the specified size.
151154
///
152155
/// If `len` is larger than the size of the object, it will be padded with
@@ -156,13 +159,12 @@ impl<'a> LargeObject<'a> {
156159
let stmt = try!(self.trans.prepare_cached("SELECT pg_catalog.lo_truncate64($1, $2)"));
157160
stmt.execute(&[&self.fd, &len]).map(|_| ())
158161
} else {
159-
let len: i32 = if len <= i32::max_value() as i64 {
162+
let len = if len <= i32::max_value() as i64 {
160163
len as i32
161164
} else {
162-
return Err(Error::IoError(io::Error::new(
163-
io::ErrorKind::InvalidInput,
164-
"The database does not support objects larger than 2GB"
165-
)))
165+
return Err(Error::IoError(io::Error::new(io::ErrorKind::InvalidInput,
166+
"The database does not support objects \
167+
larger than 2GB")));
166168
};
167169
let stmt = try!(self.trans.prepare_cached("SELECT pg_catalog.lo_truncate($1, $2)"));
168170
stmt.execute(&[&self.fd, &len]).map(|_| ())
@@ -189,16 +191,12 @@ impl<'a> LargeObject<'a> {
189191
}
190192

191193
impl<'a> io::Read for LargeObject<'a> {
192-
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
194+
fn read(&mut self, mut buf: &mut [u8]) -> io::Result<usize> {
193195
let stmt = try_io!(self.trans.prepare_cached("SELECT pg_catalog.loread($1, $2)"));
194196
let cap = cmp::min(buf.len(), i32::MAX as usize) as i32;
195197
let row = try_io!(stmt.query(&[&self.fd, &cap])).into_iter().next().unwrap();
196198
let out = row.get_bytes(0).unwrap();
197-
198-
for (i, o) in out.iter().zip(buf.iter_mut()) {
199-
*o = *i;
200-
}
201-
Ok(out.len())
199+
buf.write(out)
202200
}
203201
}
204202

@@ -232,8 +230,11 @@ impl<'a> io::Seek for LargeObject<'a> {
232230
};
233231

234232
if self.has_64 {
235-
let stmt = try_io!(self.trans.prepare_cached("SELECT pg_catalog.lo_lseek64($1, $2, $3)"));
236-
Ok(try_io!(stmt.query(&[&self.fd, &pos, &kind])).iter().next().unwrap().get::<_, i64>(0) as u64)
233+
let stmt = try_io!(self.trans
234+
.prepare_cached("SELECT pg_catalog.lo_lseek64($1, $2, $3)"));
235+
let rows = try_io!(stmt.query(&[&self.fd, &pos, &kind]));
236+
let pos: i64 = rows.iter().next().unwrap().get(0);
237+
Ok(pos as u64)
237238
} else {
238239
let pos = if pos <= i32::max_value() as i64 {
239240
pos as i32
@@ -242,7 +243,9 @@ impl<'a> io::Seek for LargeObject<'a> {
242243
"cannot seek more than 2^31 bytes"));
243244
};
244245
let stmt = try_io!(self.trans.prepare_cached("SELECT pg_catalog.lo_lseek($1, $2, $3)"));
245-
Ok(try_io!(stmt.query(&[&self.fd, &pos, &kind])).iter().next().unwrap().get::<_, i32>(0) as u64)
246+
let rows = try_io!(stmt.query(&[&self.fd, &pos, &kind]));
247+
let pos: i32 = rows.iter().next().unwrap().get(0);
248+
Ok(pos as u64)
246249
}
247250
}
248251
}

0 commit comments

Comments
 (0)