sqlw 0.1.0

Compile-time SQL query building with schema-safe field references and automatic parameter binding
Documentation
/// cargo bench -p sqlw --bench generation
use criterion::{Criterion, black_box, criterion_group, criterion_main};
use sqlw::{query_qmark as query, schema};

schema!(User "user" {
    ID "id",
    NAME "name",
    AGE "age",
    HEIGHT "height",
    ACTIVE "active",
});

schema!(Post "post" {
    ID "id",
    USER_ID "user_id",
    TITLE "title",
    CONTENT "content",
    PUBLISHED "published",
});

fn bench_simple_select(c: &mut Criterion) {
    c.bench_function("simple_select", |b| {
        b.iter(|| {
            let name = black_box("John");
            let query = query!(
                SELECT User::NAME, User::AGE FROM User::TABLE
                WHERE User::NAME = {name}
            );
            let (sql, args) = query.split();
            black_box((sql, args));
        });
    });
}

fn bench_insert(c: &mut Criterion) {
    c.bench_function("insert", |b| {
        b.iter(|| {
            let name = black_box("John");
            let age = black_box(25);
            let height = black_box(Some(1.85));
            let active = black_box(true);
            let query = query!(
                INSERT INTO User::TABLE (User::NAME,
                                         User::AGE,
                                         User::HEIGHT,
                                         User::ACTIVE)
                VALUES ({name}, {age}, {height}, {active})
            );
            let (sql, args) = query.split();
            black_box((sql, args));
        });
    });
}

fn bench_update(c: &mut Criterion) {
    c.bench_function("update", |b| {
        b.iter(|| {
            let name = black_box("John");
            let age = black_box(30);
            let query = query!(
                UPDATE User::TABLE
                SET User::AGE = {age}
                WHERE User::NAME = {name}
            );
            let (sql, args) = query.split();
            black_box((sql, args));
        });
    });
}

fn bench_delete(c: &mut Criterion) {
    c.bench_function("delete", |b| {
        b.iter(|| {
            let name = black_box("John");
            let query = query!(
                DELETE FROM User::TABLE
                WHERE User::NAME = {name}
            );
            let (sql, args) = query.split();
            black_box((sql, args));
        });
    });
}

fn bench_complex_join(c: &mut Criterion) {
    c.bench_function("complex_join", |b| {
        b.iter(|| {
            let user_id = black_box(42);
            let published = black_box(true);
            let query = query!(
                SELECT User::NAME,
                       Post::TITLE,
                       Post::CONTENT
                FROM User::TABLE
                INNER JOIN Post::TABLE ON User::ID = Post::USER_ID
                WHERE User::ID = {user_id}
                    AND Post::PUBLISHED = {published}
            );
            let (sql, args) = query.split();
            black_box((sql, args));
        });
    });
}

criterion_group!(
    name = benches;
    config = Criterion::default();
    targets = bench_simple_select,
              bench_insert,
              bench_update,
              bench_delete,
              bench_complex_join
);

criterion_main!(benches);