diff options
author | Christopher Baines <mail@cbaines.net> | 2019-08-04 09:39:40 +0100 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2019-08-04 09:39:40 +0100 |
commit | 84197686ce227b21dae48745f2919a51e070c3c5 (patch) | |
tree | 0ed4cc11138628575e490b803e766e8749a337d6 /guix-data-service/model | |
parent | 1724bc485f13922d768bc09309a6a7975678c321 (diff) | |
download | data-service-84197686ce227b21dae48745f2919a51e070c3c5.tar data-service-84197686ce227b21dae48745f2919a51e070c3c5.tar.gz |
Fix some duplicated values in tables
The licenses table, along with the package_metadata table had duplicate
values. This could happen as the unique constraints on those tables didn't
properly account for the nullable fields.
The duplicates in those tables also affected the license_sets, packages,
package_derivations tables in a similar way. Finally, the
guix_revision_package_derivations table was also affected.
This commit adds a migration to fix the data, as well as the constraints. THe
code to populate the licenses and package_metadata tables is also updated.
Diffstat (limited to 'guix-data-service/model')
-rw-r--r-- | guix-data-service/model/license.scm | 57 | ||||
-rw-r--r-- | guix-data-service/model/package-metadata.scm | 22 | ||||
-rw-r--r-- | guix-data-service/model/utils.scm | 8 |
3 files changed, 57 insertions, 30 deletions
diff --git a/guix-data-service/model/license.scm b/guix-data-service/model/license.scm index 0b28343..73df612 100644 --- a/guix-data-service/model/license.scm +++ b/guix-data-service/model/license.scm @@ -43,28 +43,6 @@ (inferior-eval '(use-modules (guix licenses)) inf) (inferior-eval (proc packages) inf)) -(define (select-licenses license-values) - (string-append - "SELECT id, licenses.name, licenses.uri, licenses.comment " - "FROM licenses " - "JOIN (VALUES " - (string-join - (map (lambda (values) - (string-append - "(" - (string-join - (map value->quoted-string-or-null - values) - ", ") - ")")) - license-values) - ", ") - ") AS vals (name, uri, comment) " - "ON " - "licenses.name = vals.name AND " - "licenses.uri = vals.uri AND " - "licenses.comment = vals.comment")) - (define (insert-licenses values) (string-append "INSERT INTO licenses " @@ -91,15 +69,39 @@ (map number->string (sort (map string->number ids) <))) + (define (non-string-to-false lst) + (map (lambda (value) + (if (string? value) + value + #f)) + lst)) + + (define (empty-string-to-false lst) + ;; TODO squee returns empty strings for null values, which will probably + ;; cause problems + (map (lambda (value) + (if (string? value) + (if (string-null? value) + #f + value) + value)) + lst)) + (let* ((unique-license-tuples (filter (lambda (license-tuple) (not (null? license-tuple))) (delete-duplicates - (concatenate license-data)))) + (map + (lambda (lst) + (non-string-to-false + (empty-string-to-false lst))) + (concatenate license-data))))) (existing-license-entries (exec-query->vhash conn - (select-licenses unique-license-tuples) - cdr + "SELECT id, name, uri, comment FROM licenses" + (lambda (vals) + (non-string-to-false + (empty-string-to-false (cdr vals)))) first)) ;; id (missing-license-entries (delete-duplicates @@ -128,5 +130,8 @@ (begin (error "missing license entry" license-values))))) - license-value-lists))) + (map (lambda (lst) + (non-string-to-false + (empty-string-to-false lst))) + license-value-lists)))) license-data))) diff --git a/guix-data-service/model/package-metadata.scm b/guix-data-service/model/package-metadata.scm index 37a8da8..178d783 100644 --- a/guix-data-service/model/package-metadata.scm +++ b/guix-data-service/model/package-metadata.scm @@ -52,8 +52,14 @@ "ON " (string-join (map (lambda (field) - (string-append - "package_metadata." field " = vals." field)) + (if (member field '("home_page" "location_id" + "license_set_id")) + (string-append + "(package_metadata." field " = vals." field " OR " + "(package_metadata." field " IS NULL AND" + " vals." field " IS NULL))") + (string-append + "package_metadata." field " = vals." field))) fields) " AND "))) @@ -129,7 +135,8 @@ WHERE packages.id IN ( (map (lambda (package license-set-id) (list (inferior-package-synopsis package) (inferior-package-description package) - (inferior-package-home-page package) + (non-empty-string-or-false + (inferior-package-home-page package)) (location->location-id conn (inferior-package-location package)) @@ -140,7 +147,14 @@ WHERE packages.id IN ( (let* ((existing-package-metadata-entries (exec-query->vhash conn (select-package-metadata package-metadata) - cdr + (match-lambda + ((id synopsis description home-page + location-id license-set-id) + (list synopsis + description + (non-empty-string-or-false home-page) + location-id + license-set-id))) first)) ;; id)) (missing-package-metadata-entries (delete-duplicates diff --git a/guix-data-service/model/utils.scm b/guix-data-service/model/utils.scm index 1ece31a..0ce9fea 100644 --- a/guix-data-service/model/utils.scm +++ b/guix-data-service/model/utils.scm @@ -5,6 +5,7 @@ #:use-module (squee) #:export (quote-string value->quoted-string-or-null + non-empty-string-or-false exec-query->vhash two-lists->vhash deduplicate-strings @@ -18,6 +19,13 @@ (string-append "$STR$" value "$STR$") "NULL")) +(define (non-empty-string-or-false s) + (if (string? s) + (if (string-null? s) + #f + s) + #f)) + (define (exec-query->vhash conn query field-function value-function) (fold (lambda (row result) (vhash-cons (field-function row) |