mirror of
git://git.savannah.gnu.org/guix/data-service.git
synced 2023-12-14 03:23:03 +01:00
Add a new channel-news module, along with tables the relevant data
This commit is contained in:
parent
66d726f1fd
commit
3ef99acc79
|
@ -74,6 +74,7 @@ SOURCES = \
|
|||
guix-data-service/model/build-server.scm \
|
||||
guix-data-service/model/build-status.scm \
|
||||
guix-data-service/model/build.scm \
|
||||
guix-data-service/model/channel-news.scm \
|
||||
guix-data-service/model/derivation.scm \
|
||||
guix-data-service/model/git-branch.scm \
|
||||
guix-data-service/model/git-repository.scm \
|
||||
|
|
134
guix-data-service/model/channel-news.scm
Normal file
134
guix-data-service/model/channel-news.scm
Normal file
|
@ -0,0 +1,134 @@
|
|||
(define-module (guix-data-service model channel-news)
|
||||
#:use-module (srfi srfi-1)
|
||||
#:use-module (ice-9 vlist)
|
||||
#:use-module (ice-9 match)
|
||||
#:use-module (squee)
|
||||
#:use-module (guix channels)
|
||||
#:use-module (guix-data-service model utils)
|
||||
#:export (insert-channel-news-entries-for-guix-revision))
|
||||
|
||||
(define (insert-channel-news-entry-text conn text)
|
||||
(insert-missing-data-and-return-all-ids
|
||||
conn
|
||||
"channel_news_entry_text"
|
||||
'(lang text)
|
||||
(map (match-lambda
|
||||
((lang . text)
|
||||
(list lang text)))
|
||||
text)))
|
||||
|
||||
(define (insert-channel-news-entry conn commit tag)
|
||||
(match (exec-query
|
||||
conn
|
||||
(string-append
|
||||
"INSERT INTO channel_news_entries (commit, tag) VALUES ("
|
||||
(value->quoted-string-or-null commit)
|
||||
","
|
||||
(value->quoted-string-or-null tag)
|
||||
") RETURNING id"))
|
||||
(((id))
|
||||
(string->number id))))
|
||||
|
||||
(define (insert-channel-news-entries conn channel-news-entries)
|
||||
(define select-channel-news-entries
|
||||
"
|
||||
SELECT channel_news_entries.id,
|
||||
channel_news_entries.commit,
|
||||
channel_news_entries.tag,
|
||||
(
|
||||
SELECT ARRAY_AGG(
|
||||
channel_news_entry_titles.channel_news_entry_text_id
|
||||
ORDER BY channel_news_entry_titles.channel_news_entry_text_id
|
||||
)
|
||||
FROM channel_news_entry_titles
|
||||
WHERE channel_news_entry_id = channel_news_entries.id
|
||||
) AS title_text,
|
||||
(
|
||||
SELECT ARRAY_AGG(
|
||||
channel_news_entry_bodies.channel_news_entry_text_id
|
||||
ORDER BY channel_news_entry_bodies.channel_news_entry_text_id
|
||||
)
|
||||
FROM channel_news_entry_bodies
|
||||
WHERE channel_news_entry_id = channel_news_entries.id
|
||||
) AS body_text
|
||||
FROM channel_news_entries
|
||||
ORDER BY id")
|
||||
|
||||
(define existing
|
||||
(exec-query->vhash conn
|
||||
select-channel-news-entries
|
||||
(match-lambda
|
||||
((_ commit tag title-ids body-ids)
|
||||
(list commit
|
||||
tag
|
||||
(map string->number
|
||||
(parse-postgresql-array-string title-ids))
|
||||
(map string->number
|
||||
(parse-postgresql-array-string body-ids)))))
|
||||
(lambda (result)
|
||||
(string->number (first result)))))
|
||||
|
||||
(map
|
||||
(lambda (entry)
|
||||
(let ((commit (channel-news-entry-commit entry))
|
||||
(tag (channel-news-entry-tag entry))
|
||||
(title-ids
|
||||
(sort (insert-channel-news-entry-text
|
||||
conn (channel-news-entry-title entry))
|
||||
<))
|
||||
(body-ids
|
||||
(sort (insert-channel-news-entry-text
|
||||
conn
|
||||
(channel-news-entry-body entry))
|
||||
<)))
|
||||
(or (and=> (vhash-assoc (list (or commit '())
|
||||
(or tag '())
|
||||
title-ids
|
||||
body-ids)
|
||||
existing)
|
||||
(match-lambda
|
||||
((value . key)
|
||||
key)))
|
||||
(let ((channel-news-entry-id
|
||||
(insert-channel-news-entry conn commit tag)))
|
||||
(for-each
|
||||
(lambda (table ids)
|
||||
(exec-query
|
||||
conn
|
||||
(string-append
|
||||
"INSERT INTO " table
|
||||
" VALUES "
|
||||
(string-join
|
||||
(map (lambda (id)
|
||||
(simple-format #f "(~A, ~A)"
|
||||
channel-news-entry-id
|
||||
id))
|
||||
ids)
|
||||
", "))))
|
||||
'("channel_news_entry_titles"
|
||||
"channel_news_entry_bodies")
|
||||
(list title-ids
|
||||
body-ids))
|
||||
|
||||
channel-news-entry-id))))
|
||||
channel-news-entries))
|
||||
|
||||
(define (insert-channel-news-entries-for-guix-revision
|
||||
conn
|
||||
guix-revision-id
|
||||
channel-news-entries)
|
||||
(unless (null? channel-news-entries)
|
||||
(let ((channel-news-entry-ids
|
||||
(insert-channel-news-entries conn channel-news-entries)))
|
||||
(exec-query
|
||||
conn
|
||||
(string-append
|
||||
"INSERT INTO guix_revision_channel_news_entries "
|
||||
"(guix_revision_id, channel_news_entry_id, index) VALUES "
|
||||
(string-join
|
||||
(map (lambda (id index)
|
||||
(simple-format #f "(~A,~A,~A)" guix-revision-id id index))
|
||||
channel-news-entry-ids
|
||||
(iota (length channel-news-entries)))
|
||||
", ")))))
|
||||
#t)
|
39
sqitch/deploy/channel_news_tables.sql
Normal file
39
sqitch/deploy/channel_news_tables.sql
Normal file
|
@ -0,0 +1,39 @@
|
|||
-- Deploy guix-data-service:channel_news_tables to pg
|
||||
|
||||
BEGIN;
|
||||
|
||||
CREATE TABLE channel_news_entries (
|
||||
id integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
|
||||
commit varchar,
|
||||
tag varchar
|
||||
);
|
||||
|
||||
CREATE TABLE guix_revision_channel_news_entries (
|
||||
guix_revision_id integer NOT NULL REFERENCES guix_revisions (id),
|
||||
channel_news_entry_id integer NOT NULL REFERENCES channel_news_entries (id),
|
||||
index integer NOT NULL,
|
||||
PRIMARY KEY (guix_revision_id, channel_news_entry_id)
|
||||
);
|
||||
|
||||
CREATE TABLE channel_news_entry_text (
|
||||
id integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
|
||||
lang varchar NOT NULL,
|
||||
text varchar NOT NULL,
|
||||
UNIQUE (lang, text)
|
||||
);
|
||||
|
||||
CREATE TABLE channel_news_entry_titles (
|
||||
channel_news_entry_id
|
||||
integer NOT NULL REFERENCES channel_news_entries (id),
|
||||
channel_news_entry_text_id
|
||||
integer NOT NULL REFERENCES channel_news_entry_text (id)
|
||||
);
|
||||
|
||||
CREATE TABLE channel_news_entry_bodies (
|
||||
channel_news_entry_id
|
||||
integer NOT NULL REFERENCES channel_news_entries (id),
|
||||
channel_news_entry_text_id
|
||||
integer NOT NULL REFERENCES channel_news_entry_text (id)
|
||||
);
|
||||
|
||||
COMMIT;
|
11
sqitch/revert/channel_news_tables.sql
Normal file
11
sqitch/revert/channel_news_tables.sql
Normal file
|
@ -0,0 +1,11 @@
|
|||
-- Revert guix-data-service:channel_news_tables from pg
|
||||
|
||||
BEGIN;
|
||||
|
||||
DROP TABLE guix_revision_channel_news_entries;
|
||||
DROP TABLE channel_news_entry_titles;
|
||||
DROP TABLE channel_news_entry_bodies;
|
||||
DROP TABLE channel_news_entry_text;
|
||||
DROP TABLE channel_news_entries;
|
||||
|
||||
COMMIT;
|
|
@ -26,3 +26,4 @@ fix_null_values_in_git_branches 2019-09-29T11:06:12Z Christopher Baines <mail@cb
|
|||
add_retry_value_to_job_event_enum 2019-10-02T19:13:52Z Christopher Baines <mail@cbaines.net> # Add retry value to job_event enum
|
||||
remove_guix_revision_duplicates 2019-10-05T08:00:14Z Christopher Baines <mail@cbaines.net> # Remove duplicates in the guix_revisions table
|
||||
package_derivations_by_guix_revision_range 2019-11-09T19:09:48Z Christopher Baines <mail@cbaines.net> # Add package_derivations_by_guix_revision_range
|
||||
channel_news_tables 2019-11-15T07:32:07Z Christopher Baines <mail@cbaines.net> # Add tables to store channel news
|
||||
|
|
7
sqitch/verify/channel_news_tables.sql
Normal file
7
sqitch/verify/channel_news_tables.sql
Normal file
|
@ -0,0 +1,7 @@
|
|||
-- Verify guix-data-service:channel_news_tables on pg
|
||||
|
||||
BEGIN;
|
||||
|
||||
-- XXX Add verifications here.
|
||||
|
||||
ROLLBACK;
|
Loading…
Reference in a new issue