#database-driver #hana #driver #relational #async

hdbconnect_async

An asynchronous pure rust database driver for SAP HANA(TM)

16 unstable releases (5 breaking)

new 0.30.1 Dec 11, 2024
0.30.0 Nov 29, 2024
0.29.1 Nov 17, 2024
0.28.6 Jun 12, 2024
0.26.0 Feb 16, 2023

#2215 in Database interfaces

Download history 23/week @ 2024-09-22 37/week @ 2024-09-29 158/week @ 2024-10-06 41/week @ 2024-10-13 287/week @ 2024-10-20 24/week @ 2024-10-27 22/week @ 2024-11-03 30/week @ 2024-11-10 171/week @ 2024-11-17 127/week @ 2024-11-24 74/week @ 2024-12-01

403 downloads per month

MIT/Apache

1MB
17K SLoC

hdbconnect_async

Latest version Documentation License

An asynchronous pure rust SQL driver for SAP HANA(TM).

Use hdbconnect if you want a synchronous driver for SAP HANA.

Usage

Add hdbconnect_async to the dependencies section in your project's Cargo.toml:

[dependencies]
hdbconnect_async = "0.30"

Assuming you have

  • a HANA accessible at port 39013 on host hxehost,
  • and you can log on to it as user HORST with password SeCrEt,

then a first simple test which sets up some table, inserts data and reads them back might look like this:

use hdbconnect_async::{Connection, HdbResult};

#[tokio::main]
pub async fn main() -> HdbResult<()> {
    let mut connection = Connection::new("hdbsql://HORST:SeCrEt@hxehost:39013").await?;

    // Cleanup if necessary, and set up a test table
    connection.multiple_statements_ignore_err(vec![
        "drop table FOO_SQUARE"
    ]).await;
    connection.multiple_statements(vec![
        "create table FOO_SQUARE ( f1 INT primary key, f2 BIGINT)",
    ]).await?;

    // Insert some test data
    let mut insert_stmt = connection.prepare(
        "insert into FOO_SQUARE (f1, f2) values(?,?)"
    ).await?;

    for i in 0..100 {
        insert_stmt.add_batch(&(i, i * i))?;
    }
    insert_stmt.execute_batch().await?;

    // Read the table data directly into a rust data structure
    let stmt = "select * from FOO_SQUARE order by f1 asc";
    let n_square: Vec<(i32, u64)> =
        connection.query(stmt).await?.try_into().await?;

    // Verify ...
    for (idx, (n, square)) in n_square.into_iter().enumerate() {
        assert_eq!(idx as i32, n);
        assert_eq!((idx * idx) as u64, square);
    }
    Ok(())
}

Documentation

See https://docs.rs/hdbconnect_async/ for the full functionality of hdbconnect_async.

There you find also more code examples, especially in the description of module code_examples.

TLS

The TLS implementation is based on rustls.

rustls's flexibility to use non-default crypto providers is currently not (yet) exposed by hdbconnect. Nevertheless, the need of rustls to initialize crypto shines through. We thus recommend calling hdbconnect::initialize_crypto early in your main.

Features

rocket_pool

Adds an implementation of a rocket_db_pools database pool.

dist_tx

Adds support for distributed transactions, based on dist_tx.

Versions

See the change log.

Dependencies

~16–48MB
~876K SLoC