aboutsummaryrefslogtreecommitdiff
path: root/nar-herder/database.scm
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2022-03-13 11:40:49 +0000
committerChristopher Baines <mail@cbaines.net>2022-03-13 11:40:49 +0000
commit3a9964701b0520fec1efb2d58c4f5a9891deacd2 (patch)
treee118cbdb0ba2630cba86851a3d10134752bb6b5b /nar-herder/database.scm
parentf69da3686583d53974e720a9e66103126631cb69 (diff)
downloadnar-herder-3a9964701b0520fec1efb2d58c4f5a9891deacd2.tar
nar-herder-3a9964701b0520fec1efb2d58c4f5a9891deacd2.tar.gz
Support inserting tags when inserting narinfos
This is the beginning of implementing support for tagging. The communicating of tags through changes still needs implementing.
Diffstat (limited to 'nar-herder/database.scm')
-rw-r--r--nar-herder/database.scm65
1 files changed, 64 insertions, 1 deletions
diff --git a/nar-herder/database.scm b/nar-herder/database.scm
index e8c8b8d..a1670ed 100644
--- a/nar-herder/database.scm
+++ b/nar-herder/database.scm
@@ -324,8 +324,48 @@ PRAGMA optimize;")))
id)))
+(define (tag->tag-id db key value)
+ (define (insert-tag)
+ (let ((statement
+ (sqlite-prepare
+ db
+ "
+INSERT INTO tags (key, value) VALUES (:key, :value)"
+ #:cache? #t)))
+
+ (sqlite-bind-arguments
+ statement
+ #:key key
+ #:value value)
+
+ (sqlite-step statement)
+ (sqlite-reset statement)
+
+ (last-insert-rowid db)))
+
+ (let ((statement
+ (sqlite-prepare
+ db
+ "
+SELECT id FROM tags WHERE key = :key AND value = :value"
+ #:cache? #t)))
+
+ (sqlite-bind-arguments
+ statement
+ #:key key
+ #:value value)
+
+ (match (let ((result (sqlite-step statement)))
+ (sqlite-reset statement)
+ result)
+ (#f
+ (insert-tag))
+ (#(id)
+ id))))
+
(define* (database-insert-narinfo database narinfo
- #:key change-datetime)
+ #:key change-datetime
+ (tags '()))
(define (insert-narinfo-record db)
(let ((statement
(sqlite-prepare
@@ -428,6 +468,26 @@ INSERT INTO recent_changes (
(sqlite-step statement)
(sqlite-reset statement)))
+ (define (insert-tags db narinfo-id tags)
+ (let ((statement
+ (sqlite-prepare
+ db
+ "
+INSERT INTO narinfo_tags (narinfo_id, tag_id) VALUES (:narinfo_id, :tag_id)"
+ #:cache? #t)))
+
+ (map (match-lambda
+ ((key . value)
+ (let ((tag-id (tag->tag-id db key value)))
+ (sqlite-bind-arguments
+ statement
+ #:narinfo_id narinfo-id
+ #:tag_id tag-id)
+
+ (sqlite-step statement)
+ (sqlite-reset statement))))
+ tags)))
+
(database-call-with-transaction
database
(lambda (db)
@@ -451,6 +511,9 @@ INSERT INTO recent_changes (
change-datetime)
(insert-change db (narinfo-contents narinfo)))
+ (unless (null? tags)
+ (insert-tags db narinfo-id tags))
+
narinfo-id))))
(define (database-select-narinfo-contents-by-hash database hash)