diff --git a/CHANGELOG.md b/CHANGELOG.md index 458646b..0c24603 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,5 @@ # Changelog -## [0.1.1] - 2025-09-14 -### Added -- Table `labels` for snapshot labels. -### Fixed -- Improved data integrity with label normalization. - ## [0.1.0] — 2025-09-13 ### Added - SQLite-backed snapshot library with content-defined chunking (FastCDC). diff --git a/CHANGELOG.ru.md b/CHANGELOG.ru.md index f1ec152..f292e6d 100644 --- a/CHANGELOG.ru.md +++ b/CHANGELOG.ru.md @@ -1,12 +1,6 @@ # Changelog -## [0.1.1] - 2025-09-14 -### Added -- Таблица `labels` для меток снимков. -### Fixed -- Улучшена целостность данных при нормализации меток. - -## [0.1.0] - 2025-09-13 +## [0.1.0] — 2025-09-13 ### Added - Библиотека для снимков данных на базе SQLite с контентно-зависимым разбиением (FastCDC). - Дедупликация по SHA-256 чанков, опциональная компрессия Zstd. diff --git a/README.md b/README.md index f490306..85a9bc5 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ chmod +x ./tools/gen.d ```json "dependencies": { - "cdcdb": "~>0.1" + "cdcdb": "~>0.1.0" } ``` * **Build**: `dub build`. diff --git a/README.ru.md b/README.ru.md index f05a400..28a99f7 100644 --- a/README.ru.md +++ b/README.ru.md @@ -89,7 +89,7 @@ chmod +x ./tools/gen.d - **В `dub.json`**: ```json "dependencies": { - "cdcdb": "~>0.1" + "cdcdb": "~>0.1.0" } ``` - **Сборка**: `dub build`. diff --git a/source/cdcdb/dblite.d b/source/cdcdb/dblite.d index 217652a..3e01338 100644 --- a/source/cdcdb/dblite.d +++ b/source/cdcdb/dblite.d @@ -176,14 +176,10 @@ public: auto queryResult = sql( q{ SELECT COALESCE( - ( - SELECT (s.sha256 = ?2) - FROM snapshots s - JOIN labels l ON l.id = s.label - WHERE l.name = ?1 - ORDER BY s.created_utc DESC - LIMIT 1 - ), + (SELECT (label = ? AND sha256 = ?) + FROM snapshots + ORDER BY created_utc DESC + LIMIT 1), 0 ) AS is_last; }, label, sha256 @@ -209,10 +205,7 @@ public: mask_s, mask_l, status - ) - SELECT - (SELECT id FROM labels WHERE name = ?), - ?,?,?,?,?,?,?,?,? + ) VALUES (?,?,?,?,?,?,?,?,?,?) RETURNING id }, snapshot.label, @@ -254,18 +247,6 @@ public: return !queryResult.empty(); } - bool addLabel(string name) - { - auto queryResult = sql( - q{ - INSERT INTO labels (name) VALUES (?) - ON CONFLICT(name) DO NOTHING - }, name - ); - - return !queryResult.empty(); - } - bool addSnapshotChunk(DBSnapshotChunk snapshotChunk) { auto queryResult = sql( @@ -287,22 +268,9 @@ public: { auto queryResult = sql( q{ - SELECT - s.id, - l.name label, - s.sha256, - s.description, - s.created_utc, - s.source_length, - s.algo_min, - s.algo_normal, - s.algo_max, - s.mask_s, - s.mask_l, - s.status - FROM snapshots s - JOIN labels l ON l.id = s.label - WHERE s.id = ? + SELECT id, label, sha256, description, created_utc, source_length, + algo_min, algo_normal, algo_max, mask_s, mask_l, status + FROM snapshots WHERE id = ? }, id ); @@ -333,22 +301,9 @@ public: { auto queryResult = sql( q{ - SELECT - s.id, - l.name label, - s.sha256, - s.description, - s.created_utc, - s.source_length, - s.algo_min, - s.algo_normal, - s.algo_max, - s.mask_s, - s.mask_l, - s.status - FROM snapshots s - JOIN labels l ON l.id = s.label AND (length(?) = 0 OR l.name = ?1) - ORDER BY s.created_utc, s.id; + SELECT id, label, sha256, description, created_utc, source_length, + algo_min, algo_normal, algo_max, mask_s, mask_l, status + FROM snapshots WHERE (length(?) = 0 OR label = ?1); }, label ); @@ -424,7 +379,7 @@ public: auto queryResult = sql( q{ DELETE FROM snapshots - WHERE label = (SELECT id FROM labels WHERE name = ?) + WHERE label = ? RETURNING 1; }, label); diff --git a/source/cdcdb/scheme.d b/source/cdcdb/scheme.d index 1527ea1..b3b10c4 100644 --- a/source/cdcdb/scheme.d +++ b/source/cdcdb/scheme.d @@ -1,20 +1,4 @@ auto _scheme = [ - q{ - -- ------------------------------------------------------------ - -- Таблица labels - -- ------------------------------------------------------------ - CREATE TABLE IF NOT EXISTS labels ( - -- идентификатор метки - id INTEGER PRIMARY KEY AUTOINCREMENT, - -- имя метки - name TEXT NOT NULL UNIQUE - ) - }, - q{ - -- Индекс по имени метки - CREATE INDEX IF NOT EXISTS idx_labels_name - ON labels(name) - }, q{ -- ------------------------------------------------------------ -- Таблица snapshots @@ -23,7 +7,7 @@ auto _scheme = [ -- идентификатор снимка id INTEGER PRIMARY KEY AUTOINCREMENT, -- метка/название снимка - label INTEGER NOT NULL, + label TEXT NOT NULL, -- SHA-256 всего файла (BLOB(32)) sha256 BLOB NOT NULL CHECK (length(sha256) = 32), -- Комментарий/описание @@ -44,11 +28,7 @@ auto _scheme = [ mask_l INTEGER NOT NULL, -- 0=pending, 1=ready status INTEGER NOT NULL DEFAULT 0 - CHECK (status IN (0,1)), - FOREIGN KEY (label) - REFERENCES labels(id) - ON UPDATE CASCADE - ON DELETE CASCADE + CHECK (status IN (0,1)) ) }, q{ @@ -269,20 +249,5 @@ auto _scheme = [ BEGIN SELECT RAISE(ABORT, "blobs: разрешён UPDATE только полей last_seen_utc и refcount"); END - }, - q{ - -- ------------------------------------------------------------ - -- Удаление записи из labels, если удалён последний snapshot - -- ------------------------------------------------------------ - CREATE TRIGGER IF NOT EXISTS trg_snapshots_delete_label - AFTER DELETE ON snapshots - FOR EACH ROW - BEGIN - DELETE FROM labels - WHERE id = OLD.label - AND NOT EXISTS ( - SELECT 1 FROM snapshots WHERE label = OLD.label - ); - END; } ]; diff --git a/source/cdcdb/storage.d b/source/cdcdb/storage.d index ee7424b..74df78d 100644 --- a/source/cdcdb/storage.d +++ b/source/cdcdb/storage.d @@ -112,6 +112,18 @@ public: if (_db.isLast(label, sha256)) return null; + DBSnapshot dbSnapshot; + + dbSnapshot.label = label; + dbSnapshot.sha256 = sha256; + dbSnapshot.description = description; + dbSnapshot.sourceLength = data.length; + dbSnapshot.algoMin = _minSize; + dbSnapshot.algoNormal = _normalSize; + dbSnapshot.algoMax = _maxSize; + dbSnapshot.maskS = _maskS; + dbSnapshot.maskL = _maskL; + _db.beginImmediate(); bool ok; @@ -126,20 +138,6 @@ public: _db.commit(); } - _db.addLabel(label); - - DBSnapshot dbSnapshot; - - dbSnapshot.label = label; - dbSnapshot.sha256 = sha256; - dbSnapshot.description = description; - dbSnapshot.sourceLength = data.length; - dbSnapshot.algoMin = _minSize; - dbSnapshot.algoNormal = _normalSize; - dbSnapshot.algoMax = _maxSize; - dbSnapshot.maskS = _maskS; - dbSnapshot.maskL = _maskL; - auto idSnapshot = _db.addSnapshot(dbSnapshot); DBSnapshotChunk dbSnapshotChunk; diff --git a/source/cdcdb/version_.d b/source/cdcdb/version_.d index 142c1db..ac00177 100644 --- a/source/cdcdb/version_.d +++ b/source/cdcdb/version_.d @@ -1,3 +1,3 @@ module cdcdb.version_; -enum cdcdbVersion = "0.1.1"; +enum cdcdbVersion = "0.1.0";