diff --git a/sql/upgrades/147.sql b/sql/upgrades/147.sql new file mode 100644 --- /dev/null +++ b/sql/upgrades/147.sql @@ -0,0 +1,25 @@ +-- SWH DB schema upgrade +-- from_version: 146 +-- to_version: 147 +-- description: Make swh_release_add properly idempotent + +-- latest schema version +insert into dbversion(version, release, description) + values(147, now(), 'Work In Progress'); + +-- Create entries in release from tmp_release +create or replace function swh_release_add() + returns void + language plpgsql +as $$ +begin + perform swh_person_add_from_release(); + + insert into release (id, target, target_type, date, date_offset, date_neg_utc_offset, name, comment, author, synthetic) + select distinct t.id, t.target, t.target_type, t.date, t.date_offset, t.date_neg_utc_offset, t.name, t.comment, a.id, t.synthetic + from tmp_release t + left join person a on a.fullname = t.author_fullname + where not exists (select 1 from release where t.id = release.id); + return; +end +$$; diff --git a/swh/storage/sql/30-swh-schema.sql b/swh/storage/sql/30-swh-schema.sql --- a/swh/storage/sql/30-swh-schema.sql +++ b/swh/storage/sql/30-swh-schema.sql @@ -17,7 +17,7 @@ -- latest schema version insert into dbversion(version, release, description) - values(146, now(), 'Work In Progress'); + values(147, now(), 'Work In Progress'); -- a SHA1 checksum create domain sha1 as bytea check (length(value) = 20); diff --git a/swh/storage/sql/40-swh-func.sql b/swh/storage/sql/40-swh-func.sql --- a/swh/storage/sql/40-swh-func.sql +++ b/swh/storage/sql/40-swh-func.sql @@ -680,9 +680,10 @@ perform swh_person_add_from_release(); insert into release (id, target, target_type, date, date_offset, date_neg_utc_offset, name, comment, author, synthetic) - select t.id, t.target, t.target_type, t.date, t.date_offset, t.date_neg_utc_offset, t.name, t.comment, a.id, t.synthetic - from tmp_release t - left join person a on a.fullname = t.author_fullname; + select distinct t.id, t.target, t.target_type, t.date, t.date_offset, t.date_neg_utc_offset, t.name, t.comment, a.id, t.synthetic + from tmp_release t + left join person a on a.fullname = t.author_fullname + where not exists (select 1 from release where t.id = release.id); return; end $$; diff --git a/swh/storage/tests/test_storage.py b/swh/storage/tests/test_storage.py --- a/swh/storage/tests/test_storage.py +++ b/swh/storage/tests/test_storage.py @@ -1108,6 +1108,12 @@ swh_storage.refresh_stat_counters() assert swh_storage.stat_counters()['release'] == 2 + def test_release_add_same_twice(self, swh_storage): + result = swh_storage.release_add([data.release, data.release]) + + assert list(result) == ['release:add'] + assert 1 <= result['release:add'] <= 2 + def test_release_add_from_generator(self, swh_storage): def _rel_gen(): yield data.release