NyaruDB2
What is NyaruDB2?
NyaruDB2 is an experimental, embeddable database library for iOS & macOS, written in Swift. Its primary goal is to explore table partitioning and indexed queries in a mobile context—think of lightweight shards instead of one monolithic file.
⚠️ Disclaimer: This is very much a proof-of-concept. APIs may change, and it’s not intended for production use… yet!
Key Concepts
- Partitioning (Sharding): Split collections into multiple files (“shards”) based on a key (e.g. a
category
field), reducing I/O for targeted queries. - Indexes: Built-in B-Tree indexes accelerate equality, range, prefix and substring searches.
- Compression: Supports multiple algorithms (none, GZIP, LZFSE, LZ4) to trade off size vs. CPU.
Core Features
- Actor-Backed B-Tree Indexes Provide equality and range queries (equal, greaterThan, between, startsWith, contains) using a thread-safe, in-memory B-Tree implementation.
- Async/Await API Non-blocking insert, fetch, update, and delete operations with a fluent query builder.
- Pluggable Compression Choose between gzip, LZFSE, or LZ4 on a per-shard basis.
Installation
Add NyaruDB2 to your Package.swift
:
// swift-tools-version:5.9 import PackageDescription let package = Package( name: "YourApp", dependencies: [ .package(url: "https://github.com/galileostudio/nyarudb2.git", .upToNextMinor(from: "0.1.0-alpha1")) ], targets: [ .target( name: "YourApp", dependencies: [ .product(name: "NyaruDB2", package: "nyarudb2") ] ) ] )
Then run:
swift package update
Quick Start
import NyaruDB2 // 1. Initialize let db = try NyaruDB2( path: "AppData", shardKey: "category", // enable partitioning on “category” compressionMethod: .gzip, // compress shards with GZIP fileProtectionType: .completeUntilFirstUserAuthentication ) // 2. Define your model struct Item: Codable, Equatable { let id: Int let name: String let category: String } // 3. Insert documents let items = [ Item(id: 1, name: "Apple", category: "Fruit"), Item(id: 2, name: "Carrot", category: "Vegetable"), ] try await db.bulkInsert(items, into: "Inventory") // 4. Query with auto-shard pruning var query = try await db.query(from: "Inventory") as Query<Item> query.where(\.category, .equal("Fruit")) let fruits = try await query.execute() print("Fruits:", fruits)
Learn More & Contribute
🔗 Repo: https://github.com/galileostudio/nyarudb2
📄 Docs: https://galileostudio.github.io/nyarudb2/
This project is an open playground for database ideas on mobile. Feedback, stars ⭐, issues and PRs are very welcome!
Top comments (0)