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 — no porque SQLite los guarde así (tiene clases de almacenamiento: NULL, INTEGER, REAL, TEXT, BLOB), sino porque el binding lee cada columna con sqlite3_column_text, que convierte a texto lo que haya guardado. 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).