1
0
Fork 0
forked from dlang/cdcdb
cdcdb/README.md

68 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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).