Добавлена новая таблица 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(
 | 
							auto queryResult = sql(
 | 
				
			||||||
			q{
 | 
								q{
 | 
				
			||||||
				SELECT COALESCE(
 | 
									SELECT COALESCE(
 | 
				
			||||||
					(SELECT (label = ? AND sha256 = ?)
 | 
										(
 | 
				
			||||||
					FROM snapshots
 | 
											SELECT (s.sha256 = ?2)
 | 
				
			||||||
					ORDER BY created_utc DESC
 | 
											FROM snapshots s
 | 
				
			||||||
					LIMIT 1),
 | 
											JOIN labels l ON l.id = s.label
 | 
				
			||||||
 | 
											WHERE l.name = ?1
 | 
				
			||||||
 | 
											ORDER BY s.created_utc DESC
 | 
				
			||||||
 | 
											LIMIT 1
 | 
				
			||||||
 | 
										),
 | 
				
			||||||
					0
 | 
										0
 | 
				
			||||||
				) AS is_last;
 | 
									) AS is_last;
 | 
				
			||||||
			}, label, sha256
 | 
								}, label, sha256
 | 
				
			||||||
| 
						 | 
					@ -205,7 +209,10 @@ public:
 | 
				
			||||||
					mask_s,
 | 
										mask_s,
 | 
				
			||||||
					mask_l,
 | 
										mask_l,
 | 
				
			||||||
					status
 | 
										status
 | 
				
			||||||
				) VALUES (?,?,?,?,?,?,?,?,?,?)
 | 
									)
 | 
				
			||||||
 | 
									SELECT
 | 
				
			||||||
 | 
										(SELECT id FROM labels WHERE name = ?),
 | 
				
			||||||
 | 
										?,?,?,?,?,?,?,?,?
 | 
				
			||||||
				RETURNING id
 | 
									RETURNING id
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			snapshot.label,
 | 
								snapshot.label,
 | 
				
			||||||
| 
						 | 
					@ -247,6 +254,18 @@ public:
 | 
				
			||||||
		return !queryResult.empty();
 | 
							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)
 | 
						bool addSnapshotChunk(DBSnapshotChunk snapshotChunk)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		auto queryResult = sql(
 | 
							auto queryResult = sql(
 | 
				
			||||||
| 
						 | 
					@ -268,9 +287,22 @@ public:
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		auto queryResult = sql(
 | 
							auto queryResult = sql(
 | 
				
			||||||
			q{
 | 
								q{
 | 
				
			||||||
				SELECT id, label, sha256, description, created_utc, source_length,
 | 
									SELECT
 | 
				
			||||||
					algo_min, algo_normal, algo_max, mask_s, mask_l, status
 | 
										s.id,
 | 
				
			||||||
				FROM snapshots WHERE 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
 | 
								}, id
 | 
				
			||||||
		);
 | 
							);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -301,9 +333,22 @@ public:
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		auto queryResult = sql(
 | 
							auto queryResult = sql(
 | 
				
			||||||
			q{
 | 
								q{
 | 
				
			||||||
				SELECT id, label, sha256, description, created_utc, source_length,
 | 
									SELECT
 | 
				
			||||||
					algo_min, algo_normal, algo_max, mask_s, mask_l, status
 | 
										s.id,
 | 
				
			||||||
				FROM snapshots WHERE (length(?) = 0 OR label = ?1);
 | 
										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
 | 
								}, label
 | 
				
			||||||
		);
 | 
							);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -379,7 +424,7 @@ public:
 | 
				
			||||||
		auto queryResult = sql(
 | 
							auto queryResult = sql(
 | 
				
			||||||
			q{
 | 
								q{
 | 
				
			||||||
				DELETE FROM snapshots
 | 
									DELETE FROM snapshots
 | 
				
			||||||
				WHERE label = ?
 | 
									WHERE label = (SELECT id FROM labels WHERE name = ?)
 | 
				
			||||||
				RETURNING 1;
 | 
									RETURNING 1;
 | 
				
			||||||
			}, label);
 | 
								}, label);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,20 @@
 | 
				
			||||||
auto _scheme = [
 | 
					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{
 | 
						q{
 | 
				
			||||||
		-- ------------------------------------------------------------
 | 
							-- ------------------------------------------------------------
 | 
				
			||||||
		-- Таблица snapshots
 | 
							-- Таблица snapshots
 | 
				
			||||||
| 
						 | 
					@ -7,7 +23,7 @@ auto _scheme = [
 | 
				
			||||||
			-- идентификатор снимка
 | 
								-- идентификатор снимка
 | 
				
			||||||
			id INTEGER PRIMARY KEY AUTOINCREMENT,
 | 
								id INTEGER PRIMARY KEY AUTOINCREMENT,
 | 
				
			||||||
			-- метка/название снимка
 | 
								-- метка/название снимка
 | 
				
			||||||
			label TEXT NOT NULL,
 | 
								label INTEGER NOT NULL,
 | 
				
			||||||
			-- SHA-256 всего файла (BLOB(32))
 | 
								-- SHA-256 всего файла (BLOB(32))
 | 
				
			||||||
			sha256 BLOB NOT NULL CHECK (length(sha256) = 32),
 | 
								sha256 BLOB NOT NULL CHECK (length(sha256) = 32),
 | 
				
			||||||
			-- Комментарий/описание
 | 
								-- Комментарий/описание
 | 
				
			||||||
| 
						 | 
					@ -28,7 +44,11 @@ auto _scheme = [
 | 
				
			||||||
			mask_l INTEGER NOT NULL,
 | 
								mask_l INTEGER NOT NULL,
 | 
				
			||||||
			-- 0=pending, 1=ready
 | 
								-- 0=pending, 1=ready
 | 
				
			||||||
			status INTEGER NOT NULL DEFAULT 0
 | 
								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{
 | 
						q{
 | 
				
			||||||
| 
						 | 
					@ -249,5 +269,20 @@ auto _scheme = [
 | 
				
			||||||
		BEGIN
 | 
							BEGIN
 | 
				
			||||||
			SELECT RAISE(ABORT, "blobs: разрешён UPDATE только полей last_seen_utc и refcount");
 | 
								SELECT RAISE(ABORT, "blobs: разрешён UPDATE только полей last_seen_utc и refcount");
 | 
				
			||||||
		END
 | 
							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))
 | 
							if (_db.isLast(label, sha256))
 | 
				
			||||||
			return null;
 | 
								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();
 | 
							_db.beginImmediate();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		bool ok;
 | 
							bool ok;
 | 
				
			||||||
| 
						 | 
					@ -138,6 +126,20 @@ public:
 | 
				
			||||||
			_db.commit();
 | 
								_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);
 | 
							auto idSnapshot = _db.addSnapshot(dbSnapshot);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		DBSnapshotChunk dbSnapshotChunk;
 | 
							DBSnapshotChunk dbSnapshotChunk;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,3 @@
 | 
				
			||||||
module cdcdb.version_;
 | 
					module cdcdb.version_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum cdcdbVersion = "0.1.0";
 | 
					enum cdcdbVersion = "0.1.1";
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue