Nyx by Example

nyx-db SQL

nyx-db is a SQL engine written in Nyx, listening on port 6382 with a RESP-based protocol. EXEC runs DDL/DML; QUERY returns rows as a RESP array. For embedded use in the same process, std/sqlite is lighter.

Code

// nyx-db SQL — CREATE, INSERT, SELECT via RESP commands

fn resp_cmd(parts: Array) -> String {
    var sb: StringBuilder = StringBuilder.new()
    sb.append("*" + int_to_string(parts.length()) + "\r\n")
    var i: int = 0
    while i < parts.length() {
        let p: String = parts[i]
        sb.append("$" + int_to_string(p.length()) + "\r\n" + p + "\r\n")
        i = i + 1
    }
    return sb.to_string()
}

fn main() -> int {
    // nyx-db listens on port 6382 (SQL engine written in Nyx)
    let fd: int = tcp_connect("127.0.0.1", 6382)
    if fd < 0 {
        print("connection failed (is nyx-db running?)")
        return 1
    }

    // Send SQL as a single EXEC command
    let create: String = "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)"
    tcp_write(fd, resp_cmd(["EXEC", create]))
    let r1: String = tcp_read_line(fd)
    print("CREATE -> " + r1.trim())

    // Insert rows
    tcp_write(fd, resp_cmd(["EXEC", "INSERT INTO users VALUES (1, 'Alice', 30)"]))
    let r2: String = tcp_read_line(fd)
    print("INSERT 1 -> " + r2.trim())

    tcp_write(fd, resp_cmd(["EXEC", "INSERT INTO users VALUES (2, 'Bob', 25)"]))
    tcp_read_line(fd)

    // SELECT returns rows as RESP array
    tcp_write(fd, resp_cmd(["QUERY", "SELECT name FROM users WHERE age >= 30"]))
    let sel_hdr: String = tcp_read_line(fd)
    print("SELECT header -> " + sel_hdr.trim())

    // For embedded use (no daemon), see std/sqlite (recipe 55)
    print("")
    print("for embedded SQL (same process), use std/sqlite")

    tcp_close(fd)
    return 0
}

Output

CREATE -> +OK
INSERT 1 -> +OK
SELECT header -> *1

for embedded SQL (same process), use std/sqlite

Explanation

nyx-db speaks RESP (the same wire protocol as nyx-kv) to keep the client surface tiny — any RESP client library works. EXEC is for statements that return a status (DDL, INSERT, UPDATE, DELETE); QUERY returns rows as a RESP array of arrays. Rows are flattened column-by-column. When your program owns the data and doesn't need network access, skip the daemon and use std/sqlite directly for lower latency.

← Previous Next →

Source: examples/by-example/92-db-sql.nx