5.5 KiB
cdcdb
Библиотека для хранения и управления снимками текстовых данных в базе SQLite. Использует механизм content-defined chunking (CDC) на основе алгоритма FastCDC для разделения данных на чанки переменного размера, что обеспечивает эффективную дедупликацию. Поддерживает опциональную компрессию Zstd, транзакции и проверку целостности данных через SHA-256. Основное применение — резервное копирование и версионирование текстовых файлов с минимизацией занимаемого пространства.
Алгоритм FastCDC
FastCDC — это алгоритм разделения данных на чанки переменного размера, основанный на хэшировании содержимого. Он использует таблицу Gear для вычисления "отпечатков" данных, определяя точки разделения с учетом минимального, целевого и максимального размеров чанка. Это позволяет эффективно выявлять изменения в данных и хранить только уникальные чанки, снижая объем хранилища.
Основные классы
Storage
Класс для работы с базой SQLite и управления снимками.
- Конструктор: Инициализирует подключение к базе SQLite.
- Методы:
newSnapshot
: Создает снимок данных. Возвращает объектSnapshot
илиnull
, если данные совпадают с последним снимком.getSnapshots
: Получает список снимков (все или по метке). Возвращает массив объектовSnapshot
.getSnapshot
: Получает снимок по ID. Возвращает объектSnapshot
.setupCDC
: Настраивает параметры разделения данных CDC. Ничего не возвращает.removeSnapshots
: Удаляет снимки по метке, ID или объекту Snapshot. Возвращает количество удаленных снимков (для метки) илиtrue
/false
(для ID или объекта).getVersion
: Возвращает строку с версией библиотеки.
Snapshot
Класс для работы с отдельным снимком данных.
-
Конструктор: Создает объект снимка для работы с данными по его ID.
-
Методы:
data
: Извлекает полные данные снимка. Возвращает массив байтов (ubyte[]
).data
: Извлекает данные снимка потоково через делегат. Ничего не возвращает.remove
: Удаляет снимок из базы. Возвращаетtrue
при успешном удалении, иначеfalse
.
-
Свойства:
id
: ID снимка (long).label
: Метка снимка (string).created
: Временная метка создания (UTC,DateTime
).length
: Длина исходных данных (long).sha256
: Хэш SHA-256 данных (ubyte[32]).status
: Статус снимка ("pending" или "ready").description
: Описание снимка (string).
Пример использования
import cdcdb;
import std.stdio : writeln, File;
import std.file : exists, remove;
void main()
{
// Создаем базу
string dbPath = "example.db";
// Инициализация Storage с компрессией Zstd
auto storage = new Storage(dbPath, true, 22);
// Создание снимка
ubyte[] data = cast(ubyte[]) "Hello, cdcdb!".dup;
auto snap = storage.newSnapshot("example_file", data, "Версия 1.0");
if (snap)
{
writeln("Создан снимок: ID=", snap.id, ", Метка=", snap.label);
}
// Восстановление данных
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. Он позволяет генерировать пользовательские таблицы хэшей для настройки разделения данных. Для создания новой таблицы выполните:
chmod +x ./tools/gen.d
./tools/gen.d > ./source/gear.d
Установка
- В
dub.json
:"dependencies": { "cdcdb": "~>0.1.0" }
- Сборка:
dub build
.
Лицензия
Boost Software License 1.0 (BSL-1.0).