Работа с базой данных (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
получает неверное значение и падает при освобождении подготовленного
выражения.