-
-
Notifications
You must be signed in to change notification settings - Fork 28
Open
Description
Hello,
I am trying to use the execute polling method on a connection, but the compiler keeps saying that the connection is not send, even though I promoted it to send.
This is the error
error: future cannot be sent between threads safely
--> src/main.rs:17:18
|
17 | let handle = tokio::task::spawn(async move {
| ^^^^^^^^^^^^^^^^^^ future created by async block is not `Send`
|
= help: within `odbc_api::Connection<'_>`, the trait `std::marker::Sync` is not implemented for `*mut odbc_api::odbc_sys::Dbc`
note: future is not `Send` as this value is used across an await
--> /home/pierre/.cargo/registry/src/github.com-1ecc6299db9ec823/odbc-api-0.49.0/src/connection.rs:149:85
|
142 | &self,
| ----- has type `&odbc_api::Connection<'_>` which is not `Send`
...
146 | ) -> Result<Option<CursorPolling<StatementImpl<'_>>>, Error> {
| __________________________________________________________________-
147 | | let query = SqlText::new(query);
148 | | let lazy_statement = move || self.allocate_statement();
149 | | execute_with_parameters_polling(lazy_statement, Some(&query), params, sleep).await
| | ^^^^^^ await occurs here, with `&self` maybe used later
150 | | }
| |_____- `&self` is later dropped here
Some testing code that produces it. I used the example for promote_to_send and made it async.
use lazy_static::lazy_static;
use odbc_api::Environment;
use std::{thread, time::Duration};
lazy_static! {
static ref ENV: Environment = unsafe { Environment::new().unwrap() };
}
#[tokio::main]
async fn main() {
const MSSQL: &str = "Driver={ODBC Driver 17 for SQL Server};\
Server=localhost;\
UID=SA;\
PWD=My@Test@Password1;\
";
let conn = ENV.connect_with_connection_string("MSSQL").unwrap();
let conn = unsafe { conn.promote_to_send() };
let handle = tokio::task::spawn(async move {
let exec = conn.execute_polling("SELECT 1", (), || {
tokio::time::sleep(Duration::from_secs(1))
});
if let Some(cursor) = exec.await.unwrap() {
// dbg!(cursor);
}
// if let Some(cursor) = conn.execute("SELECT 1", ()).unwrap() {
// // dbg!(cursor);
// }
});
handle.await;
}
const CREATE: &str = r#"SELECT 1"#;Cargo.toml
[package]
name = "spark-odbc"
version = "0.1.0"
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
lazy_static = "1.4.0"
# odbc="*"
# odbc-safe="*"
# threadpool = "1.8.1"
odbc-api="*"
tokio = { version = "1.21.2", features = ["macros", "rt-multi-thread", "time"] }Rust info:
rustc 1.64.0 (a55dd71d5 2022-09-19)
stable-x86_64-unknown-linux-gnu
Is there a way around this or should I go back to the sync API?
Metadata
Metadata
Assignees
Labels
No labels