rayforce-sys 1.0.0

Raw FFI bindings to the RayforceDB v2 core (librayforce)
docs.rs failed to build rayforce-sys-1.0.0
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.

CI Crates.io Docs.rs License: MIT Rust Version

Rust bindings for RayforceDB, a high-performance columnar database designed for analytics and data operations. The core is written in pure C with minimal overhead — combining columnar storage with SIMD vectorization for lightning-fast analytics on time-series and big-data workloads.

The bindings call the core's C API directly (no marshalling shim), so reads are zero-copy where it counts: a numeric column is exposed as a &[T] slice rather than copied element by element.

Full Documentation: https://rs.rayforcedb.com/

Features

  • Fluent API — chainable, intuitive query builders that read like the operation; real operator overloads for arithmetic, methods for comparisons.
  • Zero-Copy & High Performance — build a column in a single memcpy, read it back as a borrow; minimal overhead between Rust and the RayforceDB runtime via the C API.
  • Type-Safe — a full value model (atoms, vectors, lists, dicts, tables) with ToValue/FromValue conversions and optional chrono temporals.
  • Lightweight — the core is less than a 1 MB footprint.
  • Batteries included — CSV & splayed I/O, binary serialization, and a TCP/IPC client.

Quick Start

use rayforce::{col, Runtime, Table, Value};

let _rt = Runtime::new()?;                       // one live runtime per process

let quotes = Table::new(
    &["symbol", "bid", "ask"],
    &[
        Value::sym_vec(&["AAPL", "AAPL", "AAPL", "GOOG", "GOOG", "GOOG"]),
        Value::vec(&[100.0f64, 101.0, 102.0, 200.0, 201.0, 202.0]),
        Value::vec(&[110.0f64, 111.0, 112.0, 210.0, 211.0, 212.0]),
    ],
)?;

let result = quotes
    .select()
    .agg("max_bid", col("bid").max())
    .agg("min_bid", col("bid").min())
    .agg("avg_ask", col("ask").avg())
    .agg("count",   col("bid").count())
    .filter(col("bid").ge(110.0).and(col("ask").gt(100.0)))
    .by("symbol")
    .execute()?;

println!("{result}");
┌────────┬─────────┬─────────┬─────────┬───────┐
│ symbol │ max_bid │ min_bid │ avg_ask │ count │
│  SYM   │   F64   │   F64   │   F64   │  I64  │
├────────┼─────────┼─────────┼─────────┼───────┤
│ GOOG   │ 202.0   │ 200.0   │ 211.0   │ 3     │
├────────┴─────────┴─────────┴─────────┴───────┤
│ 1 rows (1 shown) 5 columns (5 shown)         │
└──────────────────────────────────────────────┘

Installation

The crate links two local checkouts: the RayforceDB core (RAYFORCE_SRC) and the rayforce-q IPC client (RAYFORCE_Q_SRC). The build script compiles both and statically links librayforce.a.

# Cargo.toml
[dependencies]
rayforce = { git = "https://github.com/RayforceDB/rayforce-rs" }
git clone https://github.com/RayforceDB/rayforce   ~/rayforce      # core
git clone https://github.com/RayforceDB/rayforce-q ~/rayforce-q    # Q IPC client

export RAYFORCE_SRC=/path/to/rayforce       # default: ~/rayforce
export RAYFORCE_Q_SRC=/path/to/rayforce-q   # default: ~/rayforce-q

cargo build
cargo test

Requirements: a C toolchain (make, clang) and libclang for bindgen.

bindgen locates libclang via LIBCLANG_PATH. This is deliberately not set in the repo's .cargo/config.toml. If bindgen can't auto-detect libclang, set it yourself:

# macOS (CTL):
export LIBCLANG_PATH="/Library/Developer/CommandLineTools/usr/lib"
# Linux:
export LIBCLANG_PATH="$(dirname "$(find /usr/lib -name 'libclang*.so*' | head -1)")"

The chrono is on by default for date/time/timestamp conversions.


Built with ❤️ for high-performance data processing | MIT Licensed | RayforceDB