Changelog

All notable changes to OxiDB, organized by version.

v0.18.0

2026-03-05 latest

Added

  • OxiWire binary protocol -- Custom wire format with 1-byte type tags, 4-byte LE lengths, 8-byte LE numbers. Magic byte 0xDB. Replaces MsgPack for all request/response paths. Encoder + decoder in Rust and Go
  • .NET EF Core provider -- Full Entity Framework Core support with LINQ queries, transactions, and both TCP and embedded modes. d7d5a05
  • .NET NuGet packages -- OxiDb.Client.Tcp, OxiDb.Client.Embedded, OxiDb.EntityFrameworkCore. d7d5a05
  • Composite index tests -- 9 subtests covering exact match, prefix match, count, sort, update, delete, aggregate, drop, and triple-field composite indexes in Go.
  • Parallel OxiWire serialization -- Result sets >= 5,000 docs are serialized across up to 8 CPU cores. Chunk-based, zero per-doc allocation.
  • OxiDB vs MongoDB benchmark suite -- 22 tests across 7 categories. Score: OxiDB 19 -- MongoDB 1.
  • OxiDB vs PostgreSQL benchmark suite -- 20 tests comparing document workloads. Score: OxiDB 10 -- PostgreSQL 10. d7d5a05
  • OxiDB vs SQLite benchmark -- 100K document embedded benchmark. ce8db5f

Changed

  • Aggregation indexed-path threshold -- Changed from 10% to 50% selectivity. Indexed aggregation path now preferred when candidate set is less than 50% of collection size.
  • Go client rewritten for OxiWire -- All requests/responses use OxiWire binary format. MsgPack dependency removed entirely.
  • Pipeline handler updated -- Sub-responses decoded from OxiWire and re-encoded for composite pipeline responses.

Removed

  • MsgPack support -- Removed from server (Rust), Go client, and all benchmark tests. OxiWire is the sole binary protocol.
  • github.com/vmihailenco/msgpack/v5 -- Removed from Go module dependencies.

v0.17.0

2026-02-23

Added

  • LRU document cache -- Per-collection in-memory cache with configurable capacity. JSON deserialized once, then Arc-refcounted. 0997d8e
  • Streaming scan for non-indexed finds -- Avoids loading all documents into memory for large unindexed queries. 39cd803
  • Lock-free pread -- Separate read-only file handle uses pread for concurrent reads without locking the write path. 63093a3
  • Sorted-offset batch reads -- Indexed finds sort offsets before reading to minimize disk seeks. 63093a3
  • Zero-decode aggregation -- Extract only needed fields from raw JSONB, skip full document deserialization. 4a6f696
  • Batch pread for indexed $match aggregations -- Combine pread with zero-decode for indexed aggregation paths. 4b610ea
  • Zero-decode index creation -- Extract only _id and the indexed field from raw JSONB during index build. beb3f49
  • DocIdSet optimization -- Inline storage for single-document index entries saves ~80 bytes per entry. 4897f86
  • Zero-decode filter for unindexed scans -- JSONB keypath extraction avoids full JSON parse on scan. 7b9c639
  • Parallel segmented scan -- Large unindexed queries split across CPU cores for parallel processing. b339e5a
  • Index-only count for aggregations -- $group with $sum: 1 on indexed fields returns set size without touching documents. b339e5a

Changed

  • Memory consumption reduced -- Skip bulk cache during insert, drop unused Value clones, use DocIdSet instead of BTreeSet for single-entry indexes. 4897f86
  • Streaming I/O throughout -- Replaced collect-then-process patterns with streaming iterators for finds, aggregations, and index creation.

v0.16.0

2026-02-23

Added

  • Core document database engine -- Append-only storage, WAL with CRC32 checksums, per-collection locking.
  • JSON query language -- $eq, $ne, $gt, $gte, $lt, $lte, $in, $exists, $regex, $and, $or. Dot notation for nested fields.
  • Update operators -- $set, $unset, $inc, $mul, $min, $max, $rename, $currentDate, $push, $pull, $addToSet, $pop.
  • Aggregation pipeline -- $match, $group, $sort, $project, $limit, $skip, $unwind, $addFields, $lookup, $count. Accumulators: $sum, $avg, $min, $max, $count, $first, $last, $push.
  • Single-field, unique, and composite indexes -- BTreeMap-backed with index-only count and index-backed sort.
  • Full-text search -- TF-IDF ranking with HTML, XML, JSON, PDF, DOCX, XLSX, and OCR support.
  • Vector search -- HNSW index with cosine, euclidean, and dot product distance metrics.
  • ACID transactions -- OCC with 3-phase commit, per-document versioning, deadlock-free sorted locking.
  • SQL support -- SELECT, INSERT, UPDATE, DELETE, CREATE/DROP INDEX, CREATE/DROP TABLE, JOINs, GROUP BY, aggregate functions.
  • Blob storage -- S3-style bucket/object API with metadata, ETags, content types.
  • Encryption at rest -- AES-256-GCM with random 12-byte nonce per document.
  • Zstd compression -- Level 3, transparent per-document, thread-local context reuse.
  • Change streams -- Watch collections for insert/update/delete events. Resumable with 4096-event replay buffer.
  • Stored procedures -- Named multi-step operations with parameter substitution.
  • Scheduled tasks -- Background job scheduling with enable/disable control.
  • Multi-database support -- Isolated databases within a single server instance.
  • Backup & restore -- Compressed full backups with all data, indexes, and metadata.
  • TCP server -- Length-prefixed JSON over TCP (max 16 MiB). Tokio-based async runtime.
  • SCRAM-SHA-256 authentication -- Salted challenge-response, no plaintext passwords on wire.
  • RBAC -- Admin, ReadWrite, Read roles with per-command authorization.
  • TLS/SSL -- Certificate-based encryption for all traffic.
  • Audit logging -- GELF format for centralized logging.
  • Raft clustering -- Multi-node replication via openraft (optional cluster feature flag).
  • Client libraries -- Python, Go, Julia, .NET (TCP + Embedded), Swift (C FFI), Java/Spring Boot.
  • C FFI -- oxidb-client-ffi (cdylib) and oxidb-embedded-ffi (staticlib + cdylib) for language bindings.