Skip to content

[next] Pool API #1185

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 30 additions & 0 deletions script/enforce-new-mod-style.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/usr/bin/env bash

# This script scans the project for `mod.rs` files and exits with a nonzero code if it finds any.
#
# You can also call it with `--fix` to replace any `mod.rs` files with their 2018 edition equivalents.
# The new files will be staged for commit for convenience.

FILES=$(find ./ -name mod.rs -print)

if [[ -z $FILES ]]; then
exit 0
fi

if [ "$1" != "--fix" ]; then
echo 'This project uses the Rust 2018 module style. mod.rs files are forbidden.'
echo "Execute \`$0 --fix\` to replace these with their 2018 equivalents and stage for commit."
echo 'Found mod.rs files:'
echo "$FILES"
exit 1
fi

echo 'Fixing Rust 2018 Module Style'

while read -r file; do
dest="$(dirname $file).rs"
echo "$file -> $dest"
mv $file $dest
git add $dest
done <<< $FILES

29 changes: 24 additions & 5 deletions sqlx-core/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,10 @@ pub enum Error {
/// The database URL is malformed or contains invalid or unsupported
/// values for one or more options; a value of [`ConnectOptions`] failed
/// to be parsed.
ConnectOptions { message: Cow<'static, str>, source: Option<Box<dyn StdError + Send + Sync>> },
ConnectOptions {
message: Cow<'static, str>,
source: Option<Box<dyn StdError + Send + Sync>>,
},

/// An error that was returned from the database, normally from the
/// execution of a SQL command.
Expand Down Expand Up @@ -65,26 +68,40 @@ pub enum Error {
///
Closed,

AcquireTimedOut,

/// An error occurred decoding a SQL value from the database.
Decode(DecodeError),

/// An error occurred encoding a value to be sent to the database.
Encode(EncodeError),

/// An attempt to access a column by index past the end of the row.
ColumnIndexOutOfBounds { index: usize, len: usize },
ColumnIndexOutOfBounds {
index: usize,
len: usize,
},

/// An attempt to access a column by name where no such column is
/// present in the row.
ColumnNotFound { name: Box<str> },
ColumnNotFound {
name: Box<str>,
},

/// An error occurred decoding a SQL value of a specific column
/// from the database.
ColumnDecode { column_index: usize, column_name: Box<str>, source: DecodeError },
ColumnDecode {
column_index: usize,
column_name: Box<str>,
source: DecodeError,
},

/// An error occurred encoding a value for a specific parameter to
/// be sent to the database.
ParameterEncode { parameter: Either<usize, Box<str>>, source: EncodeError },
ParameterEncode {
parameter: Either<usize, Box<str>>,
source: EncodeError,
},
}

impl Error {
Expand Down Expand Up @@ -144,6 +161,8 @@ impl Display for Error {

Self::Closed => f.write_str("Connection or pool is closed"),

Self::AcquireTimedOut => f.write_str("Timeout on acquiring a connection from Pool"),

Self::Decode(error) => {
write!(f, "Decode: {}", error)
}
Expand Down
11 changes: 11 additions & 0 deletions sqlx-core/src/runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ mod tokio_;
pub use actix_::Actix;
#[cfg(feature = "async-std")]
pub use async_std_::AsyncStd;
use std::future::Future;
use std::time::Duration;
#[cfg(feature = "tokio")]
pub use tokio_::Tokio;

Expand Down Expand Up @@ -82,6 +84,15 @@ pub trait Runtime: 'static + Send + Sync + Sized + Debug {
fn connect_unix_async(path: &Path) -> BoxFuture<'_, io::Result<Self::UnixStream>>
where
Self: Async;

#[doc(hidden)]
#[cfg(all(unix, feature = "async"))]
fn timeout_async<'a, F: Future + Send + 'a>(
fut: F,
timeout: Duration,
) -> BoxFuture<'a, Option<F::Output>>
where
Self: Async;
}

/// Marks a [`Runtime`] as being capable of handling asynchronous execution.
Expand Down
10 changes: 10 additions & 0 deletions sqlx-core/src/runtime/tokio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ use futures_util::{AsyncReadExt, AsyncWriteExt, FutureExt, TryFutureExt};

use crate::io::Stream;
use crate::{Async, Runtime};
use std::future::Future;
use std::time::{Duration, Instant};

/// Provides [`Runtime`] for [**Tokio**](https://tokio.rs). Supports only non-blocking operation.
///
Expand Down Expand Up @@ -55,6 +57,14 @@ impl Runtime for Tokio {
fn connect_unix_async(path: &Path) -> BoxFuture<'_, io::Result<Self::UnixStream>> {
UnixStream::connect(path).map_ok(Compat::new).boxed()
}

#[doc(hidden)]
fn timeout_async<'a, F: Future + Send + 'a>(
fut: F,
timeout: Duration,
) -> BoxFuture<'a, Option<F::Output>> {
Box::pin(_tokio::time::timeout(timeout.into(), fut).map(Result::ok))
}
}

impl Async for Tokio {}
Expand Down
10 changes: 10 additions & 0 deletions sqlx/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ async-std = ["async", "sqlx-core/async-std"]
actix = ["async", "sqlx-core/actix"]
tokio = ["async", "sqlx-core/tokio"]

# Connection Pool
pool = ["crossbeam-queue", "parking_lot"]

# MySQL
mysql = ["sqlx-mysql"]
mysql-async = ["async", "mysql", "sqlx-mysql/async"]
Expand All @@ -38,8 +41,15 @@ postgres = ["sqlx-postgres"]
postgres-async = ["async", "postgres", "sqlx-postgres/async"]
postgres-blocking = ["blocking", "postgres", "sqlx-postgres/blocking"]


[dependencies]
sqlx-core = { version = "0.6.0-pre", path = "../sqlx-core" }
sqlx-mysql = { version = "0.6.0-pre", path = "../sqlx-mysql", optional = true }
sqlx-postgres = { version = "0.6.0-pre", path = "../sqlx-postgres", optional = true }
futures-util = { version = "0.3", optional = true, features = ["io"] }

crossbeam-queue = { version = "0.3.1", optional = true }
parking_lot = { version = "0.11", optional = true }

[dev-dependencies]
futures = "0.3.5"
3 changes: 3 additions & 0 deletions sqlx/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@
#[cfg(feature = "blocking")]
pub mod blocking;

#[cfg(feature = "pool")]
pub mod pool;

mod query;
mod query_as;
mod runtime;
Expand Down
Loading