diff --git a/sql/upgrades/025.sql b/sql/upgrades/025.sql new file mode 100644 index 00000000..54cf0132 --- /dev/null +++ b/sql/upgrades/025.sql @@ -0,0 +1,91 @@ +-- SWH DB schema upgrade +-- from_version: 24 +-- to_version: 25 +-- description: Add synthetic flag to release and revision. Update gnu +-- project to appease apgdiff. + +insert into dbversion(version, release, description) + values(25, now(), 'Work In Progress'); + +ALTER TABLE "release" + ADD COLUMN synthetic boolean DEFAULT false NOT NULL; + +ALTER TABLE revision + ADD COLUMN synthetic boolean DEFAULT false NOT NULL; + +ALTER TYPE revision_log_entry + ADD ATTRIBUTE synthetic boolean; + +ALTER TYPE revision_entry + DROP ATTRIBUTE parents, + ADD ATTRIBUTE synthetic boolean, + ADD ATTRIBUTE parents bytea[]; + +UPDATE organization SET description='GNU is not Unix!' where name='gnu'; + +CREATE OR REPLACE FUNCTION swh_release_add() RETURNS void + LANGUAGE plpgsql + AS $$ +begin + perform swh_person_add_from_release(); + + insert into release (id, revision, date, date_offset, name, comment, author, synthetic) + select t.id, t.revision, t.date, t.date_offset, t.name, t.comment, a.id, t.synthetic + from tmp_release t + left join person a on a.name = t.author_name and a.email = t.author_email; + return; +end +$$; + +CREATE OR REPLACE FUNCTION swh_revision_add() RETURNS void + LANGUAGE plpgsql + AS $$ +begin + perform swh_person_add_from_revision(); + + insert into revision (id, date, date_offset, committer_date, committer_date_offset, type, directory, message, author, committer, synthetic) + select t.id, t.date, t.date_offset, t.committer_date, t.committer_date_offset, t.type, t.directory, t.message, a.id, c.id, t.synthetic + from tmp_revision t + left join person a on a.name = t.author_name and a.email = t.author_email + left join person c on c.name = t.committer_name and c.email = t.committer_email; + return; +end +$$; + +CREATE OR REPLACE FUNCTION swh_revision_get() RETURNS SETOF revision_entry + LANGUAGE plpgsql + AS $$ +begin + return query + select t.id, r.date, r.date_offset, + r.committer_date, r.committer_date_offset, + r.type, r.directory, r.message, + a.name, a.email, c.name, c.email, r.synthetic, + array_agg(rh.parent_id::bytea order by rh.parent_rank) + as parents + from tmp_revision t + left join revision r on t.id = r.id + left join person a on a.id = r.author + left join person c on c.id = r.committer + left join revision_history rh on rh.id = r.id + group by t.id, a.name, a.email, r.date, r.date_offset, + c.name, c.email, r.committer_date, r.committer_date_offset, + r.type, r.directory, r.message, r.synthetic; + return; +end +$$; + +CREATE OR REPLACE FUNCTION swh_revision_log(root_revision sha1_git) RETURNS SETOF revision_log_entry + LANGUAGE sql STABLE + AS $$ + select revision.id, date, date_offset, + committer_date, committer_date_offset, + type, directory, message, + author.name as author_name, author.email as author_email, + committer.name as committer_name, committer.email as committer_email, + revision.synthetic + from swh_revision_list(root_revision) as rev_list + join revision on revision.id = rev_list + join person as author on revision.author = author.id + join person as committer on revision.committer = committer.id; +$$;