Установка
[dependencies]amethystate = { version = "0.26", features = ["redb"] }Движка по умолчанию нет. Приложение само называет тот, что будет держать его файл, а крейт, который только объявляет структуры или служит адаптером к фреймворку, не называет никакого и оставляет выбор приложению. Всё ниже — про то, какой назвать.
Выбор движка
Заголовок раздела «Выбор движка»Движков шесть, и каждый store держит ровно один из них.
Фичи Cargo решают, какие из шести вообще войдут в сборку; какой возьмётся за
store — говорят при открытии, через StoreBuilder::backend. Если не сказать,
берётся первый включённый.
| feature | движок | где лежит |
|---|---|---|
redb |
redb | файл .redb |
sqlite |
SQLite | файл .db |
json |
JSON | файл .json |
toml |
TOML | файл .toml |
ron |
RON | файл .ron |
localstorage |
localStorage браузера | ключи под amethystate.<имя store>. на странице |
Текстовые движки пишут два файла: данные и файл-спутник .meta. В спутнике
лежит то, без чего store не прочитает данные обратно: какая версия каждой
структуры их записала, как выглядели её поля и что уже сделал проход миграции.
Файл данных человек по-прежнему прочитает и сам по себе, но открытый без
спутника он теряет схему, под которой записан. Поэтому файлы принадлежат друг
другу, и резервная копия берёт оба. redb и SQLite держат ту же запись внутри
своего единственного файла.
Формат задаёт, что store может выразить. В Выборе движка измерено, что каждый движок делает с одними и теми же значениями.
Сборка без движка всё равно компилируется, но store в ней не откроется:
StoreBuilder::build ответит OpenStore::WouldNotOpen и назовёт фичи, которые
надо включить.
Фича memory добавляет ещё один движок — вовсе без файла. Сам он store не
берёт никогда: его просят по имени, или он встаёт на место файла, который не
открылся, — см. Открытие store.
В браузере
Заголовок раздела «В браузере»У страницы, собранной под wasm32-unknown-unknown, файлов нет, и движок для
неё — фича localstorage: localStorage браузера, по значению JSON на ключ, и
всё это видно в инструментах разработчика. Запись ложится сразу, в том же
вызове, без дебаунса, а переполненная квота приходит ошибкой этого set.
Запись из другой вкладки приходит как изменение со стороны — так же, как правка
файла текстового движка. Где угодно, кроме страницы, store не откроется.
amethystate = { version = "0.26", features = ["localstorage"] }Несколько движков сразу
Заголовок раздела «Несколько движков сразу»Фичи Cargo аддитивны. Если в сборке несколько движков, store, которому движок
не назвали, берёт тот, что раньше в списке redb, SQLite, JSON, TOML, RON,
localStorage.
Так что стоит какой-нибудь зависимости включить redb, и за такой store
возьмётся redb, что бы ни просил ваш крейт.
Скомпилировать сразу несколько - законно: инструмент, который читает тот файл, на который его направили, или набор тестов, прогоняющий один и тот же случай по каждому. Назовите движок явно при создании store, и этот порядок перестаёт что-либо значить.
SQLite собирается из исходников, поэтому нужен C-тулчейн. Зато минимальную версию SQLite выбирает библиотека, а не дистрибутив пользователя.
Разница не косметическая. Стоит начать пользоваться какой-нибудь возможностью
SQLite — скажем, STRICT-таблицами, — и минимум прыгает до 3.37. В самом файле
это никак не отмечено, поэтому SQLite постарее скажет не «версия не та», а
«схема испорчена» — про целый и невредимый файл.
amethystate = { version = "0.26", features = ["sqlite"] }Переход с существующего решения
Заголовок раздела «Переход с существующего решения»См. Переход со своего решения.
Таймер guinea, период которого следует за сохранённой настройкой: см. guinea.