> ## Documentation Index
> Fetch the complete documentation index at: https://cs-lua.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# store

> Key-value на SQLite и datafile для читаемых .lua

# store

Key-value на SQLite и datafile для читаемых .lua.

```lua theme={null}
local store = require("store")
local s = store.open("balance")

local rec = s:get(p:steamid()) or { coins = 0 }
rec.coins = rec.coins + 100
s:set(p:steamid(), rec)
```

Записывать руками не нужно: очередь уезжает на диск при смене карты и при
выгрузке плагина.

## Что выбрать

|                                  | `store` | `datafile` | [`db`](../db/index.md) |
| -------------------------------- | ------- | ---------- | ---------------------- |
| статистика, балансы, свои баны   | да      | нет        | да                     |
| конфиг, список админов, префиксы | нет     | да         | нет                    |
| правится руками в редакторе      | нет     | да         | нет                    |
| ложится в git осмысленным диффом | нет     | да         | нет                    |
| выборки, сортировки, топ-10      | нет     | нет        | да                     |
| писать надо часто                | да      | нет        | да                     |

Функции и userdata не сохраняются нигде: это ошибка, а не тихая потеря.

## Ключ-значение

Key-value поверх SQLite в каталоге плагина.

|                              |                                              |
| ---------------------------- | -------------------------------------------- |
| [`store.open`](kv.md#open)   | Открывает хранилище                          |
| [`s:get`](kv.md#get)         | Читает значение по ключу                     |
| [`s:set`](kv.md#set)         | Кладёт значение в очередь записи             |
| [`s:delete`](kv.md#delete)   | Удаляет ключ                                 |
| [`s:keys`](kv.md#keys)       | Все ключи хранилища                          |
| [`s:all`](kv.md#all)         | Всё содержимое хранилища                     |
| [`s:flush`](kv.md#flush)     | Записывает очередь на диск одной транзакцией |
| [`s:pending`](kv.md#pending) | Сколько записей ждёт в очереди               |

## datafile

Чтение и запись `.lua`-файлов. Формат читаемый и правится руками, поэтому
подходит для того, что редактирует человек: список админов, набор префиксов,
сток магазина. Им же ядро хранит `data/users.lua`.

**Запись атомарна.** Новое содержимое пишется в `.tmp`, старый файл переезжает в
`.bak`, и только потом `.tmp` встаёт на место. **Вывод детерминированный:** ключи
сортируются, две записи одних и тех же данных дают побайтово одинаковый файл.

|                                               |                                        |
| --------------------------------------------- | -------------------------------------- |
| [`datafile.at`](datafile.md#at)               | Привязывает модуль к своему каталогу   |
| [`datafile.load`](datafile.md#load)           | Читает таблицу из `<dir>/<name>.lua`   |
| [`datafile.save`](datafile.md#save)           | Пишет таблицу в `<dir>/<name>.lua`     |
| [`datafile.serialize`](datafile.md#serialize) | Превращает таблицу в текст, без записи |
| [`datafile.dir`](datafile.md#dir)             | Каталог, к которому привязан модуль    |
