# 📦 Why RocksDB v0.23.0 Is In Your Build

## The Dependency Chain

```
Your Project (syntaxis)
    ↓
    ├─ syntaxis-core
    │   ↓
    │   └─ surrealdb = "2.3"
    │       ↓
    │       └─ surrealdb-core = "2.3.10"
    │           ↓
    │           └─ rocksdb v0.23.0  ← RIGHT HERE
    │
    ├─ syntaxis-cli      (uses syntaxis-core)
    ├─ syntaxis-api      (uses syntaxis-core)
    ├─ syntaxis-tui      (uses syntaxis-core)
    └─ syntaxis-vapora   (uses syntaxis-core)
```

## Direct Answer

**RocksDB is used by SurrealDB internally**, not directly by your code.

### Dependency Chain Explained

```
rocksdb v0.23.0
  └─ surrealdb-core v2.3.10
      └─ surrealdb v2.3.10
          └─ syntaxis-core v0.1.0
              └─ Your crates (cli, api, tui, etc.)
```

### What This Means

**RocksDB v0.23.0** is included because:

1. **SurrealDB depends on it**
   - We added: `surrealdb = "2.3"` to syntaxis-core
   - SurrealDB internally uses RocksDB for file-based storage
   - RocksDB is a high-performance embedded key-value store

2. **For file-based deployment mode**
   - When you use: `url = "file:///path/to/db"`
   - SurrealDB uses RocksDB as the underlying storage engine
   - This gives you persistent file-based database without a server

3. **It's optional - embedded mode only**
   - For in-memory mode: `url = "mem://"` → RocksDB not needed
   - For server mode: `ws://localhost:8000` → RocksDB on server side
   - Rust code doesn't directly use RocksDB

---

## Cargo.toml Dependency Chain

### Your Addition
```toml
# syntaxis-core/Cargo.toml

[dependencies]
surrealdb = { version = "2.3", features = ["kv-mem", "kv-rocksdb"] }
           ↑                                                ↑
    What we added                    This feature enables RocksDB support
```

### What SurrealDB Does
```toml
# surrealdb/Cargo.toml (internal - we don't control this)

[dependencies]
rocksdb = "0.23"     ← Included for file-based storage
serde = "1.0"
tokio = "1.0"
# ... many other dependencies
```

### The Result
When you build, Cargo resolves:
```
surrealdb v2.3 → rocksdb v0.23.0
                (automatically pulled in)
```

---

## Why Is This GOOD?

### ✅ It Means You Have Multiple Deployment Options

| Mode | Requires RocksDB? | How It Works |
|------|-------------------|-------------|
| In-Memory | ❌ NO | Data in RAM only |
| File-Based | ✅ YES | Uses RocksDB for persistence |
| Server Mode | ✅ YES (on server) | RocksDB on remote server |
| Docker | ✅ YES (in container) | Container has RocksDB |
| Kubernetes | ✅ YES (in pod) | Pod has RocksDB |

### ✅ You Don't Need To Manage RocksDB

- **Automatic**: SurrealDB handles RocksDB internals
- **Transparent**: You just specify `url = "file://..."`
- **Safe**: RocksDB is battle-tested, production-grade
- **Fast**: Highly optimized key-value store

### ✅ You Can Ignore It

If you use server mode (`ws://localhost:8000`):
- RocksDB is only on the server
- Your Rust binary doesn't link against it
- Smaller compiled binary size
- Can run on systems without RocksDB libraries

---

## How RocksDB Is Used

### Internally (You Don't See This)

```rust
// In surrealdb-core (internal SurrealDB code)

// When file-based:
let db = Database::new("file:///tmp/mydb")?;
    ↓
// SurrealDB uses RocksDB for storage
let rocksdb = rocksdb::DB::open(opts, "/tmp/mydb")?;
rocksdb.put(b"key", b"value")?;
```

### From Your Code (Simple)

```rust
// Your code (syntaxis-core)
let db = SurrealDatabase::new_file("/tmp/db").await?;
    ↓
// SurrealDB handles RocksDB internally
    ↓
// You just use the Database trait
let projects = db.list_projects().await?;
```

**You never directly interact with RocksDB!**

---

## What About Compilation?

### When You Compile

```bash
cargo build --workspace
    ↓
Rust resolves dependencies:
  surrealdb v2.3
    └─ rocksdb v0.23.0  ← Automatically downloaded
    └─ librocksdb-sys v0.17.3+10.4.2  ← C/C++ bindings
    ↓
Downloads and compiles:
  - RocksDB source (C++)
  - Rust bindings to RocksDB
  - Your code using SurrealDB
```

### Build Time Impact

- **First build**: Longer (compiles RocksDB C++ code)
- **Incremental builds**: Fast (cached)
- **Binary size**: Included when linked (file-based mode)

### To Check What's In Your Binary

```bash
# See all dependencies
cargo tree | grep rocksdb

# Check binary size
ls -lh target/debug/syntaxis-cli
ls -lh target/release/syntaxis-cli

# The release binary will be larger due to RocksDB code
```

---

## Do You Need to Do Anything?

### ❌ NO - It's Automatic

1. **No configuration needed**
   - SurrealDB and RocksDB work together automatically

2. **No version conflicts**
   - Cargo manages all versions

3. **No code changes needed**
   - Your code stays the same

4. **Works transparently**
   - Just use the Database trait

### ✅ You Can Control It Via Features

```toml
# If you wanted to disable file-based mode:
surrealdb = { version = "2.3", features = ["kv-mem"] }
                                          ↓
                          Only in-memory mode (no RocksDB)

# Current (with file-based support):
surrealdb = { version = "2.3", features = ["kv-mem", "kv-rocksdb"] }
                                                       ↑
                            Both in-memory AND file-based modes
```

---

## Summary

| Question | Answer |
|----------|--------|
| **Why RocksDB?** | SurrealDB uses it for file-based storage |
| **Required?** | Only for file-based/server deployments |
| **Your fault?** | No - automatic dependency |
| **Need to manage it?** | No - SurrealDB handles it |
| **Can you disable it?** | Yes - remove `kv-rocksdb` feature |
| **Affects binary?** | Yes - adds ~10-20MB to release binary |
| **Can you use server mode instead?** | Yes - RocksDB stays on server |

---

## Best Practice

### For Minimal Binary Size (Server Mode Only)

```toml
# syntaxis-core/Cargo.toml
surrealdb = { version = "2.3", features = ["kv-mem"] }
# Uses only in-memory mode
# No RocksDB linked into binary
# Connect to remote server: ws://localhost:8000
```

### For All Deployment Modes (Current)

```toml
# syntaxis-core/Cargo.toml
surrealdb = { version = "2.3", features = ["kv-mem", "kv-rocksdb"] }
# Supports in-memory, file-based, server modes
# RocksDB linked into binary when using file-based
# Most flexible
```

---

## Conclusion

**RocksDB v0.23.0 appears in your build because:**

1. ✅ You added SurrealDB 2.3 (correct!)
2. ✅ SurrealDB uses RocksDB for persistence (expected)
3. ✅ This is automatic and transparent
4. ✅ You don't need to do anything

**It's a normal, expected, beneficial dependency.** 🎯

You can deploy with confidence! The RocksDB inclusion means you have **multiple deployment options** including persistent file-based storage when needed.
