> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Установка chDB для Rust

> Как установить и использовать chDB для Rust

chDB-rust предоставляет экспериментальные привязки FFI (Foreign Function Interface) для chDB, позволяя выполнять запросы ClickHouse напрямую в приложениях на Rust без внешних зависимостей.

## Установка

### Установка libchdb

Установите библиотеку chDB:

```bash theme={null}
curl -sL https://lib.chdb.io | bash
```

## Использование

chDB для Rust поддерживает как режим выполнения запросов без сохранения состояния, так и режим с сохранением состояния.

### Использование без сохранения состояния

Для простых запросов без сохранения состояния:

```rust theme={null}
use chdb_rust::{execute, arg::Arg, format::OutputFormat};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Выполнение простого запроса
    let result = execute(
        "SELECT version()",
        Some(&[Arg::OutputFormat(OutputFormat::JSONEachRow)])
    )?;
    println!("ClickHouse version: {}", result.data_utf8()?);
    
    // Запрос с CSV-файлом
    let result = execute(
        "SELECT * FROM file('data.csv', 'CSV')",
        Some(&[Arg::OutputFormat(OutputFormat::JSONEachRow)])
    )?;
    println!("CSV data: {}", result.data_utf8()?);
    
    Ok(())
}
```

### Использование с сохранением состояния (сеансы)

Для запросов, которым требуется сохранение состояния, например при работе с базами данных и таблицами:

```rust theme={null}
use chdb_rust::{
    session::SessionBuilder,
    arg::Arg,
    format::OutputFormat,
    log_level::LogLevel
};
use tempdir::TempDir;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Создать временный каталог для хранения базы данных
    let tmp = TempDir::new("chdb-rust")?;
    
    // Создать сеанс с конфигурацией
    let session = SessionBuilder::new()
        .with_data_path(tmp.path())
        .with_arg(Arg::LogLevel(LogLevel::Debug))
        .with_auto_cleanup(true)  // Очистка при удалении
        .build()?;

    // Создать базу данных и таблицу
    session.execute(
        "CREATE DATABASE demo; USE demo", 
        Some(&[Arg::MultiQuery])
    )?;

    session.execute(
        "CREATE TABLE logs (id UInt64, msg String) ENGINE = MergeTree() ORDER BY id",
        None,
    )?;

    // Вставить данные
    session.execute(
        "INSERT INTO logs (id, msg) VALUES (1, 'Hello'), (2, 'World')",
        None,
    )?;

    // Выполнить запрос к данным
    let result = session.execute(
        "SELECT * FROM logs ORDER BY id",
        Some(&[Arg::OutputFormat(OutputFormat::JSONEachRow)]),
    )?;

    println!("Query results:\n{}", result.data_utf8()?);
    
    // Получить статистику запроса
    println!("Rows read: {}", result.rows_read());
    println!("Bytes read: {}", result.bytes_read());
    println!("Query time: {:?}", result.elapsed());

    Ok(())
}
```

## Сборка и тестирование

### Сборка проекта

```bash theme={null}
cargo build
```

### Запуск тестов

```bash theme={null}
cargo test
```

### Зависимости для разработки

Проект включает следующие зависимости для разработки:

* `bindgen` (v0.70.1) - Генерация FFI-привязок по заголовочным файлам C
* `tempdir` (v0.3.7) - Работа с временными каталогами в тестах
* `thiserror` (v1) - Утилиты для обработки ошибок

## Обработка ошибок

chDB для Rust обеспечивает всестороннюю обработку ошибок с помощью перечисления `Error`:

```rust theme={null}
use chdb_rust::{execute, error::Error};

match execute("SELECT 1", None) {
    Ok(result) => {
        println!("Success: {}", result.data_utf8()?);
    },
    Err(Error::QueryError(msg)) => {
        eprintln!("Query failed: {}", msg);
    },
    Err(Error::NoResult) => {
        eprintln!("No result returned");
    },
    Err(Error::NonUtf8Sequence(e)) => {
        eprintln!("Invalid UTF-8: {}", e);
    },
    Err(e) => {
        eprintln!("Other error: {}", e);
    }
}
```

## Репозиторий GitHub

Репозиторий проекта на GitHub доступен по адресу [chdb-io/chdb-rust](https://github.com/chdb-io/chdb-rust).
