55 / Redes

SQLite

std/sqlite ofrece bindings de SQLite3 cargados en tiempo de ejecución vía dlopen. sqlite_open(":memory:") crea una base de datos en memoria, sqlite_exec ejecuta sentencias DDL/DML, y sqlite_query devuelve filas como arreglos de strings. No se necesitan dependencias externas — SQLite viene incluido en la mayoría de los sistemas operativos.

55-sqlite.nxFuente →
// SQLite — in-memory database with SQL queries
// SQLite — base de datos en memoria con consultas SQL

import "std/sqlite"

fn main() -> int {
    // Open an in-memory database. The handle is an opaque pointer (*int);
    // sqlite_open returns NULL on failure.
    let db = sqlite_open(":memory:")

    // Create a table
    sqlite_exec(db, "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)")

    // Insert rows
    sqlite_exec(db, "INSERT INTO users (name, age) VALUES ('Alice', 30)")
    sqlite_exec(db, "INSERT INTO users (name, age) VALUES ('Bob', 25)")
    sqlite_exec(db, "INSERT INTO users (name, age) VALUES ('Charlie', 35)")

    // Query all rows
    let rows: Array = sqlite_query(db, "SELECT name, age FROM users ORDER BY age")
    var i: int = 0
    while i < rows.length() {
        let row: Array = rows[i]
        let name: String = row[0]
        let age: String = row[1]
        print(name + " is " + age + " years old")
        i = i + 1
    }

    // Query with a condition
    let seniors: Array = sqlite_query(db, "SELECT name FROM users WHERE age >= 30")
    print("users 30+: " + int_to_string(seniors.length()))

    sqlite_close(db)
    return 0
}
Salidastdout
Bob is 25 years old
Alice is 30 years old
Charlie is 35 years old
users 30+: 2

Cómo funciona

sqlite_open devuelve un handle opaco de base de datos (*int, NULL en caso de fallo). La ruta especial ":memory:" crea una base de datos temporal en memoria que se descarta al cerrar el handle. Para almacenamiento persistente, pasar una ruta de archivo como "data.db".

sqlite_query devuelve un arreglo de filas, donde cada fila es un arreglo de valores string (SQLite almacena internamente todos los valores como texto). El orden de las columnas coincide con la cláusula SELECT. sqlite_exec se usa para sentencias que no devuelven datos (CREATE, INSERT, UPDATE, DELETE).