tokio-rs / rdbc

Rust DataBase Connectivity (RDBC) :: Common Rust API for database drivers
Apache License 2.0
569 stars 25 forks source link

Impossible to create multiple prepared statements at once #46

Open weiznich opened 4 years ago

weiznich commented 4 years ago

I would expect that it's possible to create multiple prepared statements for a single connection at once like following:

fn check<'a>(
    conn: &'a mut (dyn Connection + 'static),
) -> (
    Rc<RefCell<dyn Statement + 'a>>,
    Rc<RefCell<dyn Statement + 'a>>,
) {
    let a = conn.prepare("SELECT name, id FROM users").unwrap();
    let b = conn.prepare("SELECT name, id FROM posts").unwrap();

    (a, b)
}

This fails because to create a prepared statement it is required to borrow the connection mutably, which implies that you can only create one prepared statement per connection at one point in time. This disallows common patterns like a prepared statement cache.

Error message:

error[E0499]: cannot borrow `*conn` as mutable more than once at a time
  --> src/main.rs:16:13
   |
9  | fn check<'a>(
   |          -- lifetime `'a` defined here
...
15 |     let a = conn.prepare("SELECT name, id FROM users").unwrap();
   |             ---- first mutable borrow occurs here
16 |     let b = conn.prepare("SELECT name, id FROM posts").unwrap();
   |             ^^^^ second mutable borrow occurs here
17 | 
18 |     (a, b)
   |     ------ returning this value requires that `*conn` is borrowed for `'a`
andygrove commented 4 years ago

Thanks for raising this and also for filing https://github.com/blackbeam/rust-mysql-simple/issues/199