From 0f0c7c767abfc45d012d434924728613706113cc Mon Sep 17 00:00:00 2001 From: plafue Date: Wed, 19 Jul 2017 14:43:16 +0200 Subject: [PATCH 01/14] Updates postgres dependency to 0.14 --- Cargo.toml | 8 ++++---- src/impls.rs | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 91e44c3..b0f912b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "postgres_array" -version = "0.7.1" +version = "0.8.0" authors = ["Steven Fackler "] license = "MIT" description = "Array support for rust-postgres" repository = "https://github.com/sfackler/rust-postgres-array" -documentation = "https://sfackler.github.io/rust-postgres-array/doc/v0.7.1/postgres_array" +documentation = "https://sfackler.github.io/rust-postgres-array/doc/v0.8.0/postgres_array" [dependencies] fallible-iterator = "0.1" -postgres = ">= 0.12, < 0.14" -postgres-protocol = "0.1" +postgres = "0.14" +postgres-protocol = "0.3" diff --git a/src/impls.rs b/src/impls.rs index 6eda63a..ad05c2e 100644 --- a/src/impls.rs +++ b/src/impls.rs @@ -1,5 +1,5 @@ use fallible_iterator::FallibleIterator; -use postgres::types::{Type, Kind, ToSql, FromSql, IsNull, SessionInfo}; +use postgres::types::{Type, Kind, ToSql, FromSql, IsNull}; use postgres_protocol::types; use postgres_protocol; use std::error::Error; @@ -9,7 +9,7 @@ use {Array, Dimension}; impl FromSql for Array where T: FromSql { - fn from_sql(ty: &Type, raw: &[u8], info: &SessionInfo) -> Result, Box> { + fn from_sql(ty: &Type, raw: &[u8]) -> Result, Box> { let element_type = match *ty.kind() { Kind::Array(ref ty) => ty, _ => unreachable!(), @@ -24,7 +24,7 @@ impl FromSql for Array .collect()); let elements = try!(array.values() - .and_then(|v| FromSql::from_sql_nullable(element_type, v, info)) + .and_then(|v| FromSql::from_sql_nullable(element_type, v)) .collect()); Ok(Array::from_parts(elements, dimensions)) @@ -41,7 +41,7 @@ impl FromSql for Array impl ToSql for Array where T: ToSql { - fn to_sql(&self, ty: &Type, w: &mut Vec, info: &SessionInfo) -> Result> { + fn to_sql(&self, ty: &Type, w: &mut Vec) -> Result> { let element_type = match ty.kind() { &Kind::Array(ref ty) => ty, _ => unreachable!(), @@ -62,7 +62,7 @@ impl ToSql for Array element_type.oid(), elements, |v, w| { - match v.to_sql(element_type, w, info) { + match v.to_sql(element_type, w) { Ok(IsNull::Yes) => Ok(postgres_protocol::IsNull::Yes), Ok(IsNull::No) => Ok(postgres_protocol::IsNull::No), Err(e) => Err(e), From f9d93c0be321566ef60c09d1be44cb08b003920b Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Wed, 19 Jul 2017 08:24:06 -0700 Subject: [PATCH 02/14] Release v0.8.0 --- Cargo.toml | 2 +- src/lib.rs | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b0f912b..d7df5f5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Steven Fackler "] license = "MIT" description = "Array support for rust-postgres" repository = "https://github.com/sfackler/rust-postgres-array" -documentation = "https://sfackler.github.io/rust-postgres-array/doc/v0.8.0/postgres_array" +documentation = "https://docs.rs/postgres_array/0.8.0/postgres_array" [dependencies] fallible-iterator = "0.1" diff --git a/src/lib.rs b/src/lib.rs index e29dbdb..91f0b00 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,5 @@ //! Multi-dimensional arrays with per-dimension specifiable lower bounds -#![doc(html_root_url="https://sfackler.github.io/rust-postgres-array/doc/v0.7.1")] +#![doc(html_root_url="https://docs.rs/postgres_array/0.8.0")] extern crate fallible_iterator; #[macro_use] @@ -25,8 +25,10 @@ impl Dimension { fn shift(&self, idx: i32) -> i32 { let offset = self.lower_bound; assert!(idx >= offset, "out of bounds array access"); - assert!(offset >= 0 || idx <= 0 || i32::max_value() - (-offset) >= idx, - "out of bounds array access"); + assert!( + offset >= 0 || idx <= 0 || i32::max_value() - (-offset) >= idx, + "out of bounds array access" + ); match idx.checked_sub(offset) { Some(shifted) => shifted, None => panic!("out of bounds array access"), @@ -41,10 +43,15 @@ mod tests { #[test] fn test_from_vec() { let a = Array::from_vec(vec![0i32, 1, 2], -1); - assert!(&[Dimension { - len: 3, - lower_bound: -1, - }][..] == a.dimensions()); + assert!( + &[ + Dimension { + len: 3, + lower_bound: -1, + }, + ] + [..] == a.dimensions() + ); assert_eq!(0, a[-1]); assert_eq!(1, a[0]); assert_eq!(2, a[1]); From 54f72f53ae1607d29db00b936f220c10d0afa735 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sun, 23 Jul 2017 13:34:26 -0700 Subject: [PATCH 03/14] Switch tests to circle --- .travis.yml | 9 --- circle.yml | 26 ++++++++ src/array.rs | 83 +++++++++++++++++-------- src/impls.rs | 170 ++++++++++++++++++++++++++++++--------------------- 4 files changed, 182 insertions(+), 106 deletions(-) delete mode 100644 .travis.yml create mode 100644 circle.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 3de70e9..0000000 --- a/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -language: rust -rust: -- nightly -- beta -- stable -addons: - postgresql: 9.4 -script: -- cargo test diff --git a/circle.yml b/circle.yml new file mode 100644 index 0000000..a648ab0 --- /dev/null +++ b/circle.yml @@ -0,0 +1,26 @@ +version: 2 +jobs: + build: + working_directory: ~/build + docker: + - image: jimmycuadra/rust:1.19.0 + - image: postgres:9.6 + environment: + POSTGRES_PASSWORD: password + steps: + - checkout + - restore_cache: + key: registry + - run: cargo generate-lockfile + - save_cache: + key: registry-{{ epoch }} + paths: + - ~/.cargo/registry/index + - restore_cache: + key: dependencies-1.19-{{ checksum "Cargo.lock" }} + - run: cargo test + - save_cache: + key: dependencies-1.19-{{ checksum "Cargo.lock" }} + paths: + - target + - ~/.cargo/registry/cache diff --git a/src/array.rs b/src/array.rs index 4a091ff..1cf85b3 100644 --- a/src/array.rs +++ b/src/array.rs @@ -16,10 +16,12 @@ impl fmt::Display for Array { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { if self.dims.iter().any(|dim| dim.lower_bound != 1) { for dim in &self.dims { - try!(write!(fmt, - "[{}:{}]", - dim.lower_bound, - dim.lower_bound + dim.len - 1)); + try!(write!( + fmt, + "[{}:{}]", + dim.lower_bound, + dim.lower_bound + dim.len - 1 + )); } try!(write!(fmt, "=")); } @@ -27,13 +29,15 @@ impl fmt::Display for Array { } } -fn fmt_helper<'a, T, I>(depth: usize, - dims: &[Dimension], - mut data: &mut I, - fmt: &mut fmt::Formatter) - -> fmt::Result - where I: Iterator, - T: 'a + fmt::Display +fn fmt_helper<'a, T, I>( + depth: usize, + dims: &[Dimension], + mut data: &mut I, + fmt: &mut fmt::Formatter, +) -> fmt::Result +where + I: Iterator, + T: 'a + fmt::Display, { if depth == dims.len() { return write!(fmt, "{}", data.next().unwrap()); @@ -60,9 +64,11 @@ impl Array { /// Panics if the number of elements provided does not match the number of /// elements specified by the dimensions. pub fn from_parts(data: Vec, dimensions: Vec) -> Array { - assert!((data.is_empty() && dimensions.is_empty()) || + assert!( + (data.is_empty() && dimensions.is_empty()) || data.len() as i32 == dimensions.iter().fold(1, |acc, i| acc * i.len), - "size mismatch"); + "size mismatch" + ); Array { dims: dimensions, data: data, @@ -72,10 +78,12 @@ impl Array { /// Creates a new one-dimensional array. pub fn from_vec(data: Vec, lower_bound: i32) -> Array { Array { - dims: vec![Dimension { - len: data.len() as i32, - lower_bound: lower_bound, - }], + dims: vec![ + Dimension { + len: data.len() as i32, + lower_bound: lower_bound, + }, + ], data: data, } } @@ -85,11 +93,13 @@ impl Array { /// For example, the one dimensional array `[1, 2]` would turn into the /// two-dimensional array `[[1, 2]]`. pub fn wrap(&mut self, lower_bound: i32) { - self.dims.insert(0, - Dimension { - len: 1, - lower_bound: lower_bound, - }); + self.dims.insert( + 0, + Dimension { + len: 1, + lower_bound: lower_bound, + }, + ); } /// Consumes another array, appending it to the top level dimension of this @@ -106,8 +116,10 @@ impl Array { /// /// Panics if the dimensions of the two arrays do not match. pub fn push(&mut self, other: Array) { - assert!(self.dims.len() - 1 == other.dims.len(), - "cannot append differently shaped arrays"); + assert!( + self.dims.len() - 1 == other.dims.len(), + "cannot append differently shaped arrays" + ); for (dim1, dim2) in self.dims.iter().skip(1).zip(other.dims.iter()) { assert!(dim1 == dim2, "cannot append differently shaped arrays"); } @@ -196,8 +208,27 @@ tuple_impl!(a: i32, b: i32, c: i32, d: i32); tuple_impl!(a: i32, b: i32, c: i32, d: i32, e: i32); tuple_impl!(a: i32, b: i32, c: i32, d: i32, e: i32, f: i32); tuple_impl!(a: i32, b: i32, c: i32, d: i32, e: i32, f: i32, g: i32); -tuple_impl!(a: i32, b: i32, c: i32, d: i32, e: i32, f: i32, g: i32, h: i32); -tuple_impl!(a: i32, b: i32, c: i32, d: i32, e: i32, f: i32, g: i32, h: i32, i: i32); +tuple_impl!( + a: i32, + b: i32, + c: i32, + d: i32, + e: i32, + f: i32, + g: i32, + h: i32 +); +tuple_impl!( + a: i32, + b: i32, + c: i32, + d: i32, + e: i32, + f: i32, + g: i32, + h: i32, + i: i32 +); /// Indexes into the `Array`, retrieving a reference to the contained /// value. diff --git a/src/impls.rs b/src/impls.rs index ad05c2e..841be0d 100644 --- a/src/impls.rs +++ b/src/impls.rs @@ -7,7 +7,8 @@ use std::error::Error; use {Array, Dimension}; impl FromSql for Array - where T: FromSql +where + T: FromSql, { fn from_sql(ty: &Type, raw: &[u8]) -> Result, Box> { let element_type = match *ty.kind() { @@ -17,15 +18,24 @@ impl FromSql for Array let array = try!(types::array_from_sql(raw)); - let dimensions = try!(array.dimensions() - .map(|d| { - Dimension { len: d.len, lower_bound: d.lower_bound } - }) - .collect()); - - let elements = try!(array.values() - .and_then(|v| FromSql::from_sql_nullable(element_type, v)) - .collect()); + let dimensions = try!( + array + .dimensions() + .map(|d| { + Dimension { + len: d.len, + lower_bound: d.lower_bound, + } + }) + .collect() + ); + + let elements = try!( + array + .values() + .and_then(|v| FromSql::from_sql_nullable(element_type, v)) + .collect() + ); Ok(Array::from_parts(elements, dimensions)) } @@ -39,7 +49,8 @@ impl FromSql for Array } impl ToSql for Array - where T: ToSql +where + T: ToSql, { fn to_sql(&self, ty: &Type, w: &mut Vec) -> Result> { let element_type = match ty.kind() { @@ -47,28 +58,26 @@ impl ToSql for Array _ => unreachable!(), }; - let dimensions = self.dimensions() - .iter() - .map(|d| { - types::ArrayDimension { - len: d.len, - lower_bound: d.lower_bound, - } - }); + let dimensions = self.dimensions().iter().map(|d| { + types::ArrayDimension { + len: d.len, + lower_bound: d.lower_bound, + } + }); let elements = self.iter(); - try!(types::array_to_sql(dimensions, - true, - element_type.oid(), - elements, - |v, w| { - match v.to_sql(element_type, w) { - Ok(IsNull::Yes) => Ok(postgres_protocol::IsNull::Yes), - Ok(IsNull::No) => Ok(postgres_protocol::IsNull::No), - Err(e) => Err(e), - } - }, - w)); + try!(types::array_to_sql( + dimensions, + true, + element_type.oid(), + elements, + |v, w| match v.to_sql(element_type, w) { + Ok(IsNull::Yes) => Ok(postgres_protocol::IsNull::Yes), + Ok(IsNull::No) => Ok(postgres_protocol::IsNull::No), + Err(e) => Err(e), + }, + w, + )); Ok(IsNull::No) } @@ -91,11 +100,15 @@ mod test { use postgres::types::{FromSql, ToSql}; use Array; - fn test_type(sql_type: &str, - checks: &[(T, S)]) { - let conn = Connection::connect("postgres://postgres@localhost", TlsMode::None).unwrap(); + fn test_type( + sql_type: &str, + checks: &[(T, S)], + ) { + let conn = Connection::connect("postgres://postgres:password@localhost", TlsMode::None) + .unwrap(); for &(ref val, ref repr) in checks.iter() { - let stmt = conn.prepare(&format!("SELECT {}::{}", *repr, sql_type)).unwrap(); + let stmt = conn.prepare(&format!("SELECT {}::{}", *repr, sql_type)) + .unwrap(); let result = stmt.query(&[]).unwrap().iter().next().unwrap().get(0); assert!(val == &result); @@ -128,13 +141,15 @@ mod test { #[test] fn test_byteaarray_params() { - test_array_params!("BYTEA", - vec![0u8, 1], - r#""\\x0001""#, - vec![254u8, 255u8], - r#""\\xfeff""#, - vec![10u8, 11u8], - r#""\\x0a0b""#); + test_array_params!( + "BYTEA", + vec![0u8, 1], + r#""\\x0001""#, + vec![254u8, 255u8], + r#""\\xfeff""#, + vec![10u8, 11u8], + r#""\\x0a0b""# + ); } #[test] @@ -144,13 +159,15 @@ mod test { #[test] fn test_namearray_params() { - test_array_params!("NAME", - "hello".to_string(), - "hello", - "world".to_string(), - "world", - "!".to_string(), - "!"); + test_array_params!( + "NAME", + "hello".to_string(), + "hello", + "world".to_string(), + "world", + "!".to_string(), + "!" + ); } #[test] @@ -165,35 +182,41 @@ mod test { #[test] fn test_textarray_params() { - test_array_params!("TEXT", - "hello".to_string(), - "hello", - "world".to_string(), - "world", - "!".to_string(), - "!"); + test_array_params!( + "TEXT", + "hello".to_string(), + "hello", + "world".to_string(), + "world", + "!".to_string(), + "!" + ); } #[test] fn test_charnarray_params() { - test_array_params!("CHAR(5)", - "hello".to_string(), - "hello", - "world".to_string(), - "world", - "! ".to_string(), - "!"); + test_array_params!( + "CHAR(5)", + "hello".to_string(), + "hello", + "world".to_string(), + "world", + "! ".to_string(), + "!" + ); } #[test] fn test_varchararray_params() { - test_array_params!("VARCHAR", - "hello".to_string(), - "hello", - "world".to_string(), - "world", - "!".to_string(), - "!"); + test_array_params!( + "VARCHAR", + "hello".to_string(), + "hello", + "world".to_string(), + "world", + "!".to_string(), + "!" + ); } #[test] @@ -215,6 +238,11 @@ mod test { fn test_empty_array() { let conn = Connection::connect("postgres://postgres@localhost", TlsMode::None).unwrap(); let stmt = conn.prepare("SELECT '{}'::INT4[]").unwrap(); - stmt.query(&[]).unwrap().iter().next().unwrap().get::<_, Array>(0); + stmt.query(&[]) + .unwrap() + .iter() + .next() + .unwrap() + .get::<_, Array>(0); } } From d61d6544a1425cc2cd99d131ace968cd085b31c2 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sun, 23 Jul 2017 13:37:48 -0700 Subject: [PATCH 04/14] Update to postgres 0.15 --- Cargo.toml | 5 ++++- src/impls.rs | 2 +- src/lib.rs | 5 ++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d7df5f5..83c8cf4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,5 +9,8 @@ documentation = "https://docs.rs/postgres_array/0.8.0/postgres_array" [dependencies] fallible-iterator = "0.1" -postgres = "0.14" +postgres-shared = "0.4" postgres-protocol = "0.3" + +[dev-dependencies] +postgres = "0.15" diff --git a/src/impls.rs b/src/impls.rs index 841be0d..2bf4f15 100644 --- a/src/impls.rs +++ b/src/impls.rs @@ -1,5 +1,5 @@ use fallible_iterator::FallibleIterator; -use postgres::types::{Type, Kind, ToSql, FromSql, IsNull}; +use postgres_shared::types::{Type, Kind, ToSql, FromSql, IsNull}; use postgres_protocol::types; use postgres_protocol; use std::error::Error; diff --git a/src/lib.rs b/src/lib.rs index 91f0b00..98ec34d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,9 +3,12 @@ extern crate fallible_iterator; #[macro_use] -extern crate postgres; +extern crate postgres_shared; extern crate postgres_protocol; +#[cfg(test)] +extern crate postgres; + #[doc(inline)] pub use array::Array; From c6bcf583eaac0e916316364129382292bee07021 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sun, 23 Jul 2017 13:42:32 -0700 Subject: [PATCH 05/14] Release v0.9.0 --- Cargo.toml | 4 ++-- src/lib.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 83c8cf4..b2481cc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "postgres_array" -version = "0.8.0" +version = "0.9.0" authors = ["Steven Fackler "] license = "MIT" description = "Array support for rust-postgres" repository = "https://github.com/sfackler/rust-postgres-array" -documentation = "https://docs.rs/postgres_array/0.8.0/postgres_array" +documentation = "https://docs.rs/postgres_array/0.9.0/postgres_array" [dependencies] fallible-iterator = "0.1" diff --git a/src/lib.rs b/src/lib.rs index 98ec34d..a4b29af 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,5 @@ //! Multi-dimensional arrays with per-dimension specifiable lower bounds -#![doc(html_root_url="https://docs.rs/postgres_array/0.8.0")] +#![doc(html_root_url="https://docs.rs/postgres_array/0.9.0")] extern crate fallible_iterator; #[macro_use] From 9c37388c9f4be75c3d77a4019c92019dcda5ae93 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sun, 23 Jul 2017 13:44:23 -0700 Subject: [PATCH 06/14] Update readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1ae0889..0008029 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # rust-postgres-array -[![Build Status](https://travis-ci.org/sfackler/rust-postgres-array.svg?branch=master)](https://travis-ci.org/sfackler/rust-postgres-array) +[![CircleCI](https://circleci.com/gh/sfackler/rust-postgres-array.svg?style=shield)](https://circleci.com/gh/sfackler/rust-postgres-array) -[Documentation](https://sfackler.github.io/rust-postgres-array/doc/v0.7.1/postgres_array) +[Documentation](https://docs.rs/postgres_array) Support for PostgreSQL arrays in [rust-postgres](https://github.com/sfackler/rust-postgres). From c68b66f93755c6b4f24470e9997252161854bf39 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sun, 12 Jan 2020 16:05:52 -0800 Subject: [PATCH 07/14] Upgrade to 2018 --- Cargo.toml | 1 + src/array.rs | 62 ++++++++++++++++++----------------- src/impls.rs | 91 ++++++++++++++++++++++++++-------------------------- src/lib.rs | 24 ++++---------- 4 files changed, 86 insertions(+), 92 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b2481cc..af06c0e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,7 @@ name = "postgres_array" version = "0.9.0" authors = ["Steven Fackler "] +edition = "2018" license = "MIT" description = "Array support for rust-postgres" repository = "https://github.com/sfackler/rust-postgres-array" diff --git a/src/array.rs b/src/array.rs index 1cf85b3..3c030aa 100644 --- a/src/array.rs +++ b/src/array.rs @@ -1,9 +1,9 @@ +use std::fmt; use std::ops::{Index, IndexMut}; use std::slice; use std::vec; -use std::fmt; -use Dimension; +use crate::Dimension; /// A multi-dimensional array. #[derive(Debug, PartialEq, Eq, Clone)] @@ -13,17 +13,17 @@ pub struct Array { } impl fmt::Display for Array { - fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { if self.dims.iter().any(|dim| dim.lower_bound != 1) { for dim in &self.dims { - try!(write!( + write!( fmt, "[{}:{}]", dim.lower_bound, dim.lower_bound + dim.len - 1 - )); + )?; } - try!(write!(fmt, "=")); + write!(fmt, "=")?; } fmt_helper(0, &self.dims, &mut self.data.iter(), fmt) } @@ -32,8 +32,8 @@ impl fmt::Display for Array { fn fmt_helper<'a, T, I>( depth: usize, dims: &[Dimension], - mut data: &mut I, - fmt: &mut fmt::Formatter, + data: &mut I, + fmt: &mut fmt::Formatter<'_>, ) -> fmt::Result where I: Iterator, @@ -43,12 +43,12 @@ where return write!(fmt, "{}", data.next().unwrap()); } - try!(write!(fmt, "{{")); + write!(fmt, "{{")?; for i in 0..dims[depth].len { if i != 0 { - try!(write!(fmt, ",")); + write!(fmt, ",")?; } - try!(fmt_helper(depth + 1, dims, data, fmt)); + fmt_helper(depth + 1, dims, data, fmt)?; } write!(fmt, "}}") } @@ -65,26 +65,24 @@ impl Array { /// elements specified by the dimensions. pub fn from_parts(data: Vec, dimensions: Vec) -> Array { assert!( - (data.is_empty() && dimensions.is_empty()) || - data.len() as i32 == dimensions.iter().fold(1, |acc, i| acc * i.len), + (data.is_empty() && dimensions.is_empty()) + || data.len() as i32 == dimensions.iter().fold(1, |acc, i| acc * i.len), "size mismatch" ); Array { dims: dimensions, - data: data, + data, } } /// Creates a new one-dimensional array. pub fn from_vec(data: Vec, lower_bound: i32) -> Array { Array { - dims: vec![ - Dimension { - len: data.len() as i32, - lower_bound: lower_bound, - }, - ], - data: data, + dims: vec![Dimension { + len: data.len() as i32, + lower_bound, + }], + data, } } @@ -97,7 +95,7 @@ impl Array { 0, Dimension { len: 1, - lower_bound: lower_bound, + lower_bound, }, ); } @@ -147,14 +145,18 @@ impl Array { /// Returns an iterator over references to the elements of the array in the /// higher-dimensional equivalent of row-major order. - pub fn iter<'a>(&'a self) -> Iter<'a, T> { - Iter { inner: self.data.iter() } + pub fn iter(&self) -> Iter<'_, T> { + Iter { + inner: self.data.iter(), + } } /// Returns an iterator over mutable references to the elements of the /// array in the higher-dimensional equivalent of row-major order. - pub fn iter_mut<'a>(&'a mut self) -> IterMut<'a, T> { - IterMut { inner: self.data.iter_mut() } + pub fn iter_mut(&mut self) -> IterMut<'_, T> { + IterMut { + inner: self.data.iter_mut(), + } } /// Returns the underlying data vector for this Array in the @@ -293,13 +295,15 @@ impl IntoIterator for Array { type IntoIter = IntoIter; fn into_iter(self) -> IntoIter { - IntoIter { inner: self.data.into_iter() } + IntoIter { + inner: self.data.into_iter(), + } } } /// An iterator over references to values of an `Array` in the /// higher-dimensional equivalent of row-major order. -pub struct Iter<'a, T: 'a> { +pub struct Iter<'a, T> { inner: slice::Iter<'a, T>, } @@ -329,7 +333,7 @@ impl<'a, T: 'a> ExactSizeIterator for Iter<'a, T> { /// An iterator over mutable references to values of an `Array` in the /// higher-dimensional equivalent of row-major order. -pub struct IterMut<'a, T: 'a> { +pub struct IterMut<'a, T> { inner: slice::IterMut<'a, T>, } diff --git a/src/impls.rs b/src/impls.rs index 2bf4f15..cb7c013 100644 --- a/src/impls.rs +++ b/src/impls.rs @@ -1,41 +1,36 @@ use fallible_iterator::FallibleIterator; -use postgres_shared::types::{Type, Kind, ToSql, FromSql, IsNull}; -use postgres_protocol::types; use postgres_protocol; +use postgres_protocol::types; +use postgres_shared::to_sql_checked; +use postgres_shared::types::{FromSql, IsNull, Kind, ToSql, Type}; use std::error::Error; -use {Array, Dimension}; +use crate::{Array, Dimension}; impl FromSql for Array where T: FromSql, { - fn from_sql(ty: &Type, raw: &[u8]) -> Result, Box> { + fn from_sql(ty: &Type, raw: &[u8]) -> Result, Box> { let element_type = match *ty.kind() { Kind::Array(ref ty) => ty, _ => unreachable!(), }; - let array = try!(types::array_from_sql(raw)); - - let dimensions = try!( - array - .dimensions() - .map(|d| { - Dimension { - len: d.len, - lower_bound: d.lower_bound, - } - }) - .collect() - ); + let array = types::array_from_sql(raw)?; - let elements = try!( - array - .values() - .and_then(|v| FromSql::from_sql_nullable(element_type, v)) - .collect() - ); + let dimensions = array + .dimensions() + .map(|d| Dimension { + len: d.len, + lower_bound: d.lower_bound, + }) + .collect()?; + + let elements = array + .values() + .and_then(|v| FromSql::from_sql_nullable(element_type, v)) + .collect()?; Ok(Array::from_parts(elements, dimensions)) } @@ -52,21 +47,19 @@ impl ToSql for Array where T: ToSql, { - fn to_sql(&self, ty: &Type, w: &mut Vec) -> Result> { + fn to_sql(&self, ty: &Type, w: &mut Vec) -> Result> { let element_type = match ty.kind() { &Kind::Array(ref ty) => ty, _ => unreachable!(), }; - let dimensions = self.dimensions().iter().map(|d| { - types::ArrayDimension { - len: d.len, - lower_bound: d.lower_bound, - } + let dimensions = self.dimensions().iter().map(|d| types::ArrayDimension { + len: d.len, + lower_bound: d.lower_bound, }); let elements = self.iter(); - try!(types::array_to_sql( + types::array_to_sql( dimensions, true, element_type.oid(), @@ -77,7 +70,7 @@ where Err(e) => Err(e), }, w, - )); + )?; Ok(IsNull::No) } @@ -96,18 +89,19 @@ where mod test { use std::fmt; - use postgres::{Connection, TlsMode}; + use crate::Array; use postgres::types::{FromSql, ToSql}; - use Array; + use postgres::{Connection, TlsMode}; fn test_type( sql_type: &str, checks: &[(T, S)], ) { - let conn = Connection::connect("postgres://postgres:password@localhost", TlsMode::None) - .unwrap(); + let conn = + Connection::connect("postgres://postgres:password@localhost", TlsMode::None).unwrap(); for &(ref val, ref repr) in checks.iter() { - let stmt = conn.prepare(&format!("SELECT {}::{}", *repr, sql_type)) + let stmt = conn + .prepare(&format!("SELECT {}::{}", *repr, sql_type)) .unwrap(); let result = stmt.query(&[]).unwrap().iter().next().unwrap().get(0); assert!(val == &result); @@ -119,19 +113,24 @@ mod test { } macro_rules! test_array_params { - ($name:expr, $v1:expr, $s1:expr, $v2:expr, $s2:expr, $v3:expr, $s3:expr) => ({ - - let tests = &[(Some(Array::from_vec(vec!(Some($v1), Some($v2), None), 1)), - format!("'{{{},{},NULL}}'", $s1, $s2)), - (None, "NULL".to_string())]; + ($name:expr, $v1:expr, $s1:expr, $v2:expr, $s2:expr, $v3:expr, $s3:expr) => {{ + let tests = &[ + ( + Some(Array::from_vec(vec![Some($v1), Some($v2), None], 1)), + format!("'{{{},{},NULL}}'", $s1, $s2), + ), + (None, "NULL".to_string()), + ]; test_type(&format!("{}[]", $name), tests); - let mut a = Array::from_vec(vec!(Some($v1), Some($v2)), 0); + let mut a = Array::from_vec(vec![Some($v1), Some($v2)], 0); a.wrap(-1); - a.push(Array::from_vec(vec!(None, Some($v3)), 0)); - let tests = &[(Some(a), format!("'[-1:0][0:1]={{{{{},{}}},{{NULL,{}}}}}'", - $s1, $s2, $s3))]; + a.push(Array::from_vec(vec![None, Some($v3)], 0)); + let tests = &[( + Some(a), + format!("'[-1:0][0:1]={{{{{},{}}},{{NULL,{}}}}}'", $s1, $s2, $s3), + )]; test_type(&format!("{}[][]", $name), tests); - }) + }}; } #[test] diff --git a/src/lib.rs b/src/lib.rs index a4b29af..75357eb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,16 +1,8 @@ //! Multi-dimensional arrays with per-dimension specifiable lower bounds -#![doc(html_root_url="https://docs.rs/postgres_array/0.9.0")] - -extern crate fallible_iterator; -#[macro_use] -extern crate postgres_shared; -extern crate postgres_protocol; - -#[cfg(test)] -extern crate postgres; +#![doc(html_root_url = "https://docs.rs/postgres_array/0.9.0")] #[doc(inline)] -pub use array::Array; +pub use crate::array::Array; pub mod array; mod impls; @@ -47,13 +39,11 @@ mod tests { fn test_from_vec() { let a = Array::from_vec(vec![0i32, 1, 2], -1); assert!( - &[ - Dimension { - len: 3, - lower_bound: -1, - }, - ] - [..] == a.dimensions() + &[Dimension { + len: 3, + lower_bound: -1, + },][..] + == a.dimensions() ); assert_eq!(0, a[-1]); assert_eq!(1, a[0]); From a2f4b5c29dae81a02a6b25f4da58587a58bbf33f Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sun, 12 Jan 2020 16:20:51 -0800 Subject: [PATCH 08/14] Upgrade to new postgres version --- Cargo.toml | 9 +++++---- circle.yml | 13 ++++++------ src/impls.rs | 56 ++++++++++++++++++++++++---------------------------- 3 files changed, 37 insertions(+), 41 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index af06c0e..6721ca1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,9 +9,10 @@ repository = "https://github.com/sfackler/rust-postgres-array" documentation = "https://docs.rs/postgres_array/0.9.0/postgres_array" [dependencies] -fallible-iterator = "0.1" -postgres-shared = "0.4" -postgres-protocol = "0.3" +bytes = "0.5" +fallible-iterator = "0.2" +postgres-types = "0.1" +postgres-protocol = "0.5" [dev-dependencies] -postgres = "0.15" +postgres = "0.17" diff --git a/circle.yml b/circle.yml index a648ab0..290a005 100644 --- a/circle.yml +++ b/circle.yml @@ -1,10 +1,9 @@ version: 2 jobs: build: - working_directory: ~/build docker: - - image: jimmycuadra/rust:1.19.0 - - image: postgres:9.6 + - image: rust:1.40.0 + - image: postgres:12 environment: POSTGRES_PASSWORD: password steps: @@ -15,12 +14,12 @@ jobs: - save_cache: key: registry-{{ epoch }} paths: - - ~/.cargo/registry/index + - /usr/local/cargo/registry/index - restore_cache: - key: dependencies-1.19-{{ checksum "Cargo.lock" }} + key: dependencies-1.40-{{ checksum "Cargo.lock" }} - run: cargo test - save_cache: - key: dependencies-1.19-{{ checksum "Cargo.lock" }} + key: dependencies-1.40-{{ checksum "Cargo.lock" }} paths: - target - - ~/.cargo/registry/cache + - /usr/local/cargo/registry/cache diff --git a/src/impls.rs b/src/impls.rs index cb7c013..399a36e 100644 --- a/src/impls.rs +++ b/src/impls.rs @@ -1,17 +1,17 @@ use fallible_iterator::FallibleIterator; use postgres_protocol; use postgres_protocol::types; -use postgres_shared::to_sql_checked; -use postgres_shared::types::{FromSql, IsNull, Kind, ToSql, Type}; +use postgres_types::{to_sql_checked, FromSql, IsNull, Kind, ToSql, Type}; use std::error::Error; use crate::{Array, Dimension}; +use postgres_types::private::BytesMut; -impl FromSql for Array +impl<'de, T> FromSql<'de> for Array where - T: FromSql, + T: FromSql<'de>, { - fn from_sql(ty: &Type, raw: &[u8]) -> Result, Box> { + fn from_sql(ty: &Type, raw: &'de [u8]) -> Result, Box> { let element_type = match *ty.kind() { Kind::Array(ref ty) => ty, _ => unreachable!(), @@ -21,15 +21,17 @@ where let dimensions = array .dimensions() - .map(|d| Dimension { - len: d.len, - lower_bound: d.lower_bound, + .map(|d| { + Ok(Dimension { + len: d.len, + lower_bound: d.lower_bound, + }) }) .collect()?; let elements = array .values() - .and_then(|v| FromSql::from_sql_nullable(element_type, v)) + .map(|v| FromSql::from_sql_nullable(element_type, v)) .collect()?; Ok(Array::from_parts(elements, dimensions)) @@ -47,7 +49,7 @@ impl ToSql for Array where T: ToSql, { - fn to_sql(&self, ty: &Type, w: &mut Vec) -> Result> { + fn to_sql(&self, ty: &Type, w: &mut BytesMut) -> Result> { let element_type = match ty.kind() { &Kind::Array(ref ty) => ty, _ => unreachable!(), @@ -61,7 +63,6 @@ where types::array_to_sql( dimensions, - true, element_type.oid(), elements, |v, w| match v.to_sql(element_type, w) { @@ -90,24 +91,25 @@ mod test { use std::fmt; use crate::Array; - use postgres::types::{FromSql, ToSql}; - use postgres::{Connection, TlsMode}; + use postgres::types::{FromSqlOwned, ToSql}; + use postgres::{Client, NoTls}; - fn test_type( + fn test_type( sql_type: &str, checks: &[(T, S)], ) { - let conn = - Connection::connect("postgres://postgres:password@localhost", TlsMode::None).unwrap(); + let mut conn = Client::connect("postgres://postgres:password@localhost", NoTls).unwrap(); for &(ref val, ref repr) in checks.iter() { - let stmt = conn - .prepare(&format!("SELECT {}::{}", *repr, sql_type)) - .unwrap(); - let result = stmt.query(&[]).unwrap().iter().next().unwrap().get(0); + let result = conn + .query(&*format!("SELECT {}::{}", *repr, sql_type), &[]) + .unwrap()[0] + .get(0); assert!(val == &result); - let stmt = conn.prepare(&format!("SELECT $1::{}", sql_type)).unwrap(); - let result = stmt.query(&[val]).unwrap().iter().next().unwrap().get(0); + let result = conn + .query(&*format!("SELECT $1::{}", sql_type), &[val]) + .unwrap()[0] + .get(0); assert!(val == &result); } } @@ -235,13 +237,7 @@ mod test { #[test] fn test_empty_array() { - let conn = Connection::connect("postgres://postgres@localhost", TlsMode::None).unwrap(); - let stmt = conn.prepare("SELECT '{}'::INT4[]").unwrap(); - stmt.query(&[]) - .unwrap() - .iter() - .next() - .unwrap() - .get::<_, Array>(0); + let mut conn = Client::connect("postgres://postgres@localhost", NoTls).unwrap(); + conn.query("SELECT '{}'::INT4[]", &[]).unwrap()[0].get::<_, Array>(0); } } From c7d3f31f9f2bfbc8155a52c6a75f4687eef6c3cd Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sun, 12 Jan 2020 16:25:06 -0800 Subject: [PATCH 09/14] Release v0.10.0 --- Cargo.toml | 3 +-- src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 6721ca1..ed1be43 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,11 @@ [package] name = "postgres_array" -version = "0.9.0" +version = "0.10.0" authors = ["Steven Fackler "] edition = "2018" license = "MIT" description = "Array support for rust-postgres" repository = "https://github.com/sfackler/rust-postgres-array" -documentation = "https://docs.rs/postgres_array/0.9.0/postgres_array" [dependencies] bytes = "0.5" diff --git a/src/lib.rs b/src/lib.rs index 75357eb..a326a53 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,5 @@ //! Multi-dimensional arrays with per-dimension specifiable lower bounds -#![doc(html_root_url = "https://docs.rs/postgres_array/0.9.0")] +#![doc(html_root_url = "https://docs.rs/postgres_array/0.10")] #[doc(inline)] pub use crate::array::Array; From 014e740ae5c3c4bcb6bfae8b8790eb4e73be9f32 Mon Sep 17 00:00:00 2001 From: Nikhil Benesch Date: Wed, 6 Jan 2021 01:06:33 -0500 Subject: [PATCH 10/14] Upgrade to new postgres version --- Cargo.toml | 8 ++++---- circle.yml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ed1be43..e0e9682 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,10 +8,10 @@ description = "Array support for rust-postgres" repository = "https://github.com/sfackler/rust-postgres-array" [dependencies] -bytes = "0.5" +bytes = "1.0" fallible-iterator = "0.2" -postgres-types = "0.1" -postgres-protocol = "0.5" +postgres-types = "0.2" +postgres-protocol = "0.6" [dev-dependencies] -postgres = "0.17" +postgres = "0.19" diff --git a/circle.yml b/circle.yml index 290a005..23f9e02 100644 --- a/circle.yml +++ b/circle.yml @@ -2,7 +2,7 @@ version: 2 jobs: build: docker: - - image: rust:1.40.0 + - image: rust:1.45.0 - image: postgres:12 environment: POSTGRES_PASSWORD: password From fd0cac7df5e46dbe4e1364eebf28627e1a028353 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Wed, 6 Jan 2021 08:08:19 -0500 Subject: [PATCH 11/14] Release v0.11.0 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index e0e9682..c03eb0d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "postgres_array" -version = "0.10.0" +version = "0.11.0" authors = ["Steven Fackler "] edition = "2018" license = "MIT" From 00c305670b5537e0109547ab969d3e23fa8216d7 Mon Sep 17 00:00:00 2001 From: Joseph Koshakow Date: Thu, 13 Oct 2022 18:43:27 -0400 Subject: [PATCH 12/14] Fix display for 0 dimensional arrays --- src/array.rs | 4 ++++ src/lib.rs | 3 +++ 2 files changed, 7 insertions(+) diff --git a/src/array.rs b/src/array.rs index 3c030aa..9886d8d 100644 --- a/src/array.rs +++ b/src/array.rs @@ -39,6 +39,10 @@ where I: Iterator, T: 'a + fmt::Display, { + if dims.len() == 0 { + return write!(fmt, "{{}}"); + } + if depth == dims.len() { return write!(fmt, "{}", data.next().unwrap()); } diff --git a/src/lib.rs b/src/lib.rs index a326a53..21240da 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -146,5 +146,8 @@ mod tests { a.push(Array::from_vec(vec![4, 5, 6], 3)); a.wrap(1); assert_eq!("[1:1][-2:-1][3:5]={{{1,2,3},{4,5,6}}}", &format!("{}", a)); + + let a: Array = Array::from_parts(vec![], vec![]); + assert_eq!("{}", &format!("{}", a)); } } From 830bd609dda5a0d7e49256e2d059a9a6a2fedd4e Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sun, 16 Oct 2022 20:55:41 -0400 Subject: [PATCH 13/14] bump ci version --- circle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/circle.yml b/circle.yml index 23f9e02..8e1b563 100644 --- a/circle.yml +++ b/circle.yml @@ -2,7 +2,7 @@ version: 2 jobs: build: docker: - - image: rust:1.45.0 + - image: rust:1.64.0 - image: postgres:12 environment: POSTGRES_PASSWORD: password From a3b83ff88e848167364c0c797af9e9c487b7ed95 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sun, 16 Oct 2022 20:59:08 -0400 Subject: [PATCH 14/14] Release v0.11.1 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index c03eb0d..5fa0f65 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "postgres_array" -version = "0.11.0" +version = "0.11.1" authors = ["Steven Fackler "] edition = "2018" license = "MIT"