forked from dlang/cdcdb
68 lines
3.9 KiB
Markdown
68 lines
3.9 KiB
Markdown
# cdcdb
|
||
|
||
Библиотека для версионирования и хранения данных в SQLite с опорой на content-defined chunking (CDC). Алгоритм **FastCDC** используется для разбиения входного потока на чанки переменного размера, что обеспечивает эффективную дедупликацию и экономию места. Поддерживаются опциональное сжатие **Zstd**, транзакции и проверка целостности на основе **SHA-256**. Дополнительно фиксируется контекст выполнения при создании снимков (UID, RUID, процесс). Основные сценарии применения — резервное копирование и контроль версий файлов.
|
||
|
||
## Алгоритм FastCDC
|
||
**FastCDC** — это алгоритм разделения данных на чанки переменной длины, основанный на скользящем хэшировании содержимого. Он использует таблицу **Gear** для вычисления "отпечатков" данных и выбирает точки разреза с учётом минимального, целевого и максимального размеров чанка. Такой подход позволяет эффективно выявлять изменения и сохранять только уникальные части данных.
|
||
|
||
## Архитектура и основные компоненты
|
||
|
||
Библиотека разделена на несколько уровней:
|
||
|
||
- **Storage** — фасад для работы с БД SQLite. Отвечает за разбиение данных (FastCDC), сохранение/удаление снимков, управление блобами и транзакциями.
|
||
- **Snapshot** — объект-ссылка на конкретный снимок. Предоставляет доступ к данным (буфером или потоково), а также к метаданным и операциям удаления.
|
||
- **Context** — структура с параметрами окружения (UID, RUID, имена пользователей, процесс), передаваемыми при создании снимка.
|
||
|
||
## Пример использования
|
||
```d
|
||
import cdcdb;
|
||
import std.stdio : writeln, File;
|
||
|
||
void main()
|
||
{
|
||
string dbPath = "example.db";
|
||
|
||
// Storage с Zstd-сжатием
|
||
auto storage = new Storage(dbPath, true, 22);
|
||
|
||
// Контекст
|
||
Context ctx = Context(1000, 1000, "user", "user", "example");
|
||
|
||
// Новый снимок
|
||
ubyte[] data = cast(ubyte[]) "Hello, cdcdb!".dup;
|
||
auto snap = storage.newSnapshot("example_file", data, ctx, "Версия 1.0");
|
||
if (snap)
|
||
{
|
||
writeln("Создан снимок: ID=", snap.id, ", Файл=", snap.file);
|
||
}
|
||
|
||
// Восстановление через потоковую запись
|
||
auto snapshots = storage.getSnapshots("example_file");
|
||
if (snapshots.length > 0)
|
||
{
|
||
auto lastSnap = snapshots[0];
|
||
File outFile = File("restored.txt", "wb");
|
||
lastSnap.data((const(ubyte)[] chunk) => outFile.rawWrite(chunk));
|
||
outFile.close();
|
||
writeln("Данные восстановлены в restored.txt");
|
||
}
|
||
|
||
// Удаление
|
||
long deleted = storage.removeSnapshots("example_file");
|
||
writeln("Удалено снимков: ", deleted);
|
||
}
|
||
```
|
||
|
||
## Инструменты
|
||
|
||
В директории `tools` есть скрипт на D для генерации таблицы Gear, используемой FastCDC.
|
||
Чтобы создать новую таблицу:
|
||
|
||
```bash
|
||
chmod +x ./tools/gen.d
|
||
./tools/gen.d > ./source/gear.d
|
||
```
|
||
|
||
## Лицензия
|
||
|
||
Boost Software License 1.0 (BSL-1.0).
|