Своё хранилище данных

Ключи и значения в файле без внешних библиотек.

Код

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

подключить хранилище;

// ⚠️ Строки вида "текст строкаN = ..." перед каждым вывести(...) — не
// стилистический выбор, а обход известного, честно задокументированного
// ограничения (см. "Известные ограничения" в ДОКУМЕНТАЦИЯ_ЯЗЫКА.md):
// результат конкатенации текста, переданный НАПРЯМУЮ в вызов функции без
// промежуточной переменной, не попадает под отслеживание ARC и не
// освобождается — не крах, просто небольшая, безопасная утечка памяти.

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

    сохранить(путь, "имя", "Никита");
    сохранить(путь, "город", "Москва");

    результат из текста имя = получить(путь, "имя");
    если (имя.успешно)
        текст строка1 = "имя: " + имя.значение;
        вывести(строка1);
        // Возвращённое значение — свежая, независимая копия (свой
        // malloc-буфер, не ссылка внутрь файла) — освобождаем, когда
        // больше не нужна, тем же принципом, что и результат
        // прочитать_файл().
        освободить_память(имя.значение);
    конец

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

    // Обновление — просто сохраняем тот же ключ заново; более поздняя
    // запись "перекрывает" более раннюю при следующем поиске (файл
    // растёт, append-only, но старое значение больше не будет найдено).
    сохранить(путь, "имя", "Пётр");
    результат из текста имя_после = получить(путь, "имя");
    если (имя_после.успешно)
        текст строка3 = "имя после обновления: " + имя_после.значение;
        вывести(строка3);
        освободить_память(имя_после.значение);
    конец

    удалить(путь, "город");
    результат из текста город_после = получить(путь, "город");
    если ( не город_после.успешно)
        текст строка4 = "город после удаления: " + город_после.сообщение;
        вывести(строка4);
    конец

    результат из текста отсутствует = получить(путь, "не_существует");
    если ( не отсутствует.успешно)
        текст строка5 = "несуществующий ключ: " + отсутствует.сообщение;
        вывести(строка5);
    конец

    вернуть 0;
конец

Как запустить

Сохраните код в файл, например хранилище_пример.код, и выполните:

запустить хранилище_пример.код

Как это работает

  • подключить хранилище; даёт простое хранилище «ключ — значение», написанное на самой «Сфере».
  • сохранить, получить, удалить: перезапись того же ключа обновляет значение.
  • Возвращённое значение нужно освободить через освободить_память, когда оно больше не нужно.

Исходник лежит в репозитории: examples/хранилище/хранилище_пример.код.