diff options
author | Christopher Baines <mail@cbaines.net> | 2022-05-06 14:16:54 +0100 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2022-05-06 14:16:54 +0100 |
commit | ad9452e63a0a60f79146efd714f081b6c898449e (patch) | |
tree | c83137fd077772270455e69ea335dc05922e1fd7 /nar-herder/database.scm | |
parent | c369d7292e82f85e6eb6157331267fa424703900 (diff) | |
download | nar-herder-ad9452e63a0a60f79146efd714f081b6c898449e.tar nar-herder-ad9452e63a0a60f79146efd714f081b6c898449e.tar.gz |
Support removing nar files
Diffstat (limited to 'nar-herder/database.scm')
-rw-r--r-- | nar-herder/database.scm | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/nar-herder/database.scm b/nar-herder/database.scm index a1670ed..5d2ad1f 100644 --- a/nar-herder/database.scm +++ b/nar-herder/database.scm @@ -40,6 +40,7 @@ dump-database database-insert-narinfo + database-remove-narinfo database-select-narinfo-contents-by-hash database-select-recent-changes @@ -516,6 +517,135 @@ INSERT INTO narinfo_tags (narinfo_id, tag_id) VALUES (:narinfo_id, :tag_id)" narinfo-id)))) +(define* (database-remove-narinfo database store-path + #:key change-datetime) + (define (store-path->narinfo-id db) + (let ((statement + (sqlite-prepare + db + " +SELECT id FROM narinfos WHERE store_path = :store_path" + #:cache? #t))) + + (sqlite-bind-arguments + statement + #:store_path store-path) + + (let ((result (vector-ref (sqlite-step statement) 0))) + (sqlite-reset statement) + + result))) + + (define (remove-narinfo-record db id) + (let ((statement + (sqlite-prepare + db + " +DELETE FROM narinfos WHERE id = :id" + #:cache? #t))) + (sqlite-bind-arguments + statement + #:id id) + + (sqlite-step statement) + (sqlite-reset statement))) + + (define (remove-narinfo-files db narinfo-id) + (let ((statement + (sqlite-prepare + db + " +DELETE FROM narinfo_files WHERE narinfo_id = :narinfo_id" + #:cache? #t))) + (sqlite-bind-arguments + statement + #:narinfo_id narinfo-id) + + (sqlite-map (const #t) statement) + (sqlite-reset statement))) + + (define (remove-narinfo-references db narinfo-id) + (let ((statement + (sqlite-prepare + db + " +DELETE FROM narinfo_references WHERE narinfo_id = :narinfo_id" + #:cache? #t))) + (sqlite-bind-arguments + statement + #:narinfo_id narinfo-id) + + (sqlite-map (const #t) statement) + (sqlite-reset statement))) + + (define (insert-change db contents) + (let ((statement + (sqlite-prepare + db + " +INSERT INTO recent_changes ( + datetime, change, data +) VALUES ( + datetime('now'), 'removal', :store_path +)" + #:cache? #t))) + (sqlite-bind-arguments + statement + #:store_path store-path) + + (sqlite-step statement) + (sqlite-reset statement))) + + (define (insert-change-with-datetime db store-path datetime) + (let ((statement + (sqlite-prepare + db + " +INSERT INTO recent_changes ( + datetime, change, data +) VALUES ( + :datetime, 'removal', :store_path +)" + #:cache? #t))) + (sqlite-bind-arguments + statement + #:store_path store-path + #:datetime datetime) + + (sqlite-step statement) + (sqlite-reset statement))) + + (define (remove-tags db narinfo-id) + (let ((statement + (sqlite-prepare + db + " +DELETE FROM narinfo_tags WHERE narinfo_id = :narinfo_id" + #:cache? #t))) + + (sqlite-bind-arguments + statement + #:narinfo_id narinfo-id) + + (sqlite-map (const #t) statement) + (sqlite-reset statement))) + + (database-call-with-transaction + database + (lambda (db) + (let ((narinfo-id (store-path->narinfo-id db))) + (if change-datetime + (insert-change-with-datetime db store-path + change-datetime) + (insert-change db store-path)) + + (remove-narinfo-files db narinfo-id) + (remove-narinfo-references db narinfo-id) + (remove-tags db narinfo-id) + (remove-narinfo-record db narinfo-id) + + #t)))) + (define (database-select-narinfo-contents-by-hash database hash) (call-with-worker-thread (database-reader-thread-channel database) |