Работа с базой данных (SQLite)

стандартная_библиотека/база_данных.код — обёртка над SQLite через прямой FFI, тем же способом, каким графика.код обёрнута вокруг SDL2. SQLite выбрана как стартовая база данных сознательно — она встраиваемая (вся база — один файл, без отдельно запущенного сервера, без сети, без пароля), что прямо совпадает с уже проверенной моделью FFI к SDL2.

⚠️ Честно, открыто: это временное, стартовое решение — стратегическая цель куда амбициознее: собственная, написанная на самой "Сфере" система хранения данных, без зависимости от какой-либо внешней библиотеки.

подключить база_данных;

функция главная(): целое
    результат из текста бд_результат = открыть_базу("пример.db");
    текст бд = бд_результат.значение;

    выполнить_sql(бд, "CREATE TABLE IF NOT EXISTS пользователи (id INTEGER PRIMARY KEY, имя TEXT);");

    // Параметризованная вставка через "?" — безопасно, без риска
    // SQL-инъекции (в отличие от склейки строк).
    текст stmt_буфер = выделить_память(8);
    sqlite_подготовить(бд, "INSERT INTO пользователи (имя) VALUES (?);", целое32(-1), stmt_буфер, нулевой_указатель_бд());
    текст stmt = прочитать_указатель(stmt_буфер, 0);
    sqlite_привязать_текст(stmt, целое32(1), "Никита", целое32(-1), целое(-1));
    sqlite_шаг(stmt);
    sqlite_завершить(stmt);

    sqlite_закрыть(бд);
    вернуть 0;
конец

Полный, рабочий пример (с CREATE TABLE, параметризованной вставкой и чтением через SELECT) — examples/веб/база_данных_пример.код. Проверено объективно: реальная утилита sqlite3 командной строки подтверждает записанные данные в файле базы; valgrind — 0 ошибок, 0 утечек.

⚠️ Пятый аргумент sqlite_привязать_текст (деструктор) обязательно целое (64-битный тип), не целое32 — это специальное значение указателя SQLITE_TRANSIENT, а не число; при 32-битном типе SQLite получает неверное значение и падает при освобождении подготовленного выражения.