Добавлена новая таблица labels. Теперь метки вынесены в отдельную таблицу, не дублируя записи.
This commit is contained in:
parent
5bb4d65c92
commit
48a9c39caa
4 changed files with 109 additions and 27 deletions
|
@ -176,10 +176,14 @@ public:
|
|||
auto queryResult = sql(
|
||||
q{
|
||||
SELECT COALESCE(
|
||||
(SELECT (label = ? AND sha256 = ?)
|
||||
FROM snapshots
|
||||
ORDER BY created_utc DESC
|
||||
LIMIT 1),
|
||||
(
|
||||
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
|
||||
),
|
||||
0
|
||||
) AS is_last;
|
||||
}, label, sha256
|
||||
|
@ -205,7 +209,10 @@ public:
|
|||
mask_s,
|
||||
mask_l,
|
||||
status
|
||||
) VALUES (?,?,?,?,?,?,?,?,?,?)
|
||||
)
|
||||
SELECT
|
||||
(SELECT id FROM labels WHERE name = ?),
|
||||
?,?,?,?,?,?,?,?,?
|
||||
RETURNING id
|
||||
},
|
||||
snapshot.label,
|
||||
|
@ -247,6 +254,18 @@ 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(
|
||||
|
@ -268,9 +287,22 @@ public:
|
|||
{
|
||||
auto queryResult = sql(
|
||||
q{
|
||||
SELECT id, label, sha256, description, created_utc, source_length,
|
||||
algo_min, algo_normal, algo_max, mask_s, mask_l, status
|
||||
FROM snapshots WHERE id = ?
|
||||
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 = ?
|
||||
}, id
|
||||
);
|
||||
|
||||
|
@ -301,9 +333,22 @@ public:
|
|||
{
|
||||
auto queryResult = sql(
|
||||
q{
|
||||
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);
|
||||
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;
|
||||
}, label
|
||||
);
|
||||
|
||||
|
@ -379,7 +424,7 @@ public:
|
|||
auto queryResult = sql(
|
||||
q{
|
||||
DELETE FROM snapshots
|
||||
WHERE label = ?
|
||||
WHERE label = (SELECT id FROM labels WHERE name = ?)
|
||||
RETURNING 1;
|
||||
}, label);
|
||||
|
||||
|
|
|
@ -1,4 +1,20 @@
|
|||
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
|
||||
|
@ -7,7 +23,7 @@ auto _scheme = [
|
|||
-- идентификатор снимка
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
-- метка/название снимка
|
||||
label TEXT NOT NULL,
|
||||
label INTEGER NOT NULL,
|
||||
-- SHA-256 всего файла (BLOB(32))
|
||||
sha256 BLOB NOT NULL CHECK (length(sha256) = 32),
|
||||
-- Комментарий/описание
|
||||
|
@ -28,7 +44,11 @@ auto _scheme = [
|
|||
mask_l INTEGER NOT NULL,
|
||||
-- 0=pending, 1=ready
|
||||
status INTEGER NOT NULL DEFAULT 0
|
||||
CHECK (status IN (0,1))
|
||||
CHECK (status IN (0,1)),
|
||||
FOREIGN KEY (label)
|
||||
REFERENCES labels(id)
|
||||
ON UPDATE CASCADE
|
||||
ON DELETE CASCADE
|
||||
)
|
||||
},
|
||||
q{
|
||||
|
@ -249,5 +269,20 @@ 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;
|
||||
}
|
||||
];
|
||||
|
|
|
@ -112,18 +112,6 @@ 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;
|
||||
|
@ -138,6 +126,20 @@ 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;
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
module cdcdb.version_;
|
||||
|
||||
enum cdcdbVersion = "0.1.0";
|
||||
enum cdcdbVersion = "0.1.1";
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue