#database-driver #hana #driver #relational #sql-database

hdbconnect

A synchronous pure rust database driver for SAP HANA(TM)

84 releases

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.0.26 Dec 7, 2016

#684 in Database interfaces

Download history 22/week @ 2024-09-11 56/week @ 2024-09-18 78/week @ 2024-09-25 210/week @ 2024-10-09 8/week @ 2024-10-16 184/week @ 2024-10-23 16/week @ 2024-10-30 7/week @ 2024-11-06 109/week @ 2024-11-13 30/week @ 2024-11-20 179/week @ 2024-11-27 249/week @ 2024-12-04

567 downloads per month

MIT/Apache

1MB
17K SLoC

hdbconnect

Latest version Documentation License unsafe forbidden

A synchronous pure rust SQL driver for SAP HANA(TM).

Use hdbconnect_async if you want an asynchronous driver for SAP HANA.

Usage

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

[dependencies]
hdbconnect = "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::{Connection, HdbResult};

pub fn main() -> HdbResult<()> {
    let mut connection = Connection::new("hdbsql://HORST:SeCrEt@hxehost:39013")?;

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

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

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

    // 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)?.try_into()?;

    // 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

The docs contain 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

r2d2_pool

Adds an implementation of a r2d2 database pool.

dist_tx

Adds support for distributed transactions, based on dist_tx.

Versions

See the change log.

Dependencies

~15–25MB
~459K SLoC