Skip to content

Commit b030f83

Browse files
authored
stage release (#354)
1 parent eaa9c30 commit b030f83

File tree

7 files changed

+4903
-4
lines changed

7 files changed

+4903
-4
lines changed

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](http://keepachangelog.com/)
66
and this project adheres to [Semantic Versioning](http://semver.org/).
77

8+
## [v0.9.4]
9+
10+
### Changed
11+
- Relax pypgstac dependencies
12+
813
## [v0.9.3]
914

1015
### Fixed
@@ -548,6 +553,7 @@ _TODO_
548553

549554
- Fixed issue with pypgstac loads which caused some writes to fail ([#18](https://github.com/stac-utils/pgstac/pull/18))
550555

556+
[v0.9.4]: https://github.com/stac-utils/pgstac/compare/v0.9.3...v0.9.4
551557
[v0.9.3]: https://github.com/stac-utils/pgstac/compare/v0.9.2...v0.9.3
552558
[v0.9.2]: https://github.com/stac-utils/pgstac/compare/v0.9.1...v0.9.2
553559
[v0.9.1]: https://github.com/stac-utils/pgstac/compare/v0.9.0...v0.9.1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,324 @@
1+
SET client_min_messages TO WARNING;
2+
SET SEARCH_PATH to pgstac, public;
3+
RESET ROLE;
4+
DO $$
5+
DECLARE
6+
BEGIN
7+
IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='postgis') THEN
8+
CREATE EXTENSION IF NOT EXISTS postgis;
9+
END IF;
10+
IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='btree_gist') THEN
11+
CREATE EXTENSION IF NOT EXISTS btree_gist;
12+
END IF;
13+
IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname='unaccent') THEN
14+
CREATE EXTENSION IF NOT EXISTS unaccent;
15+
END IF;
16+
END;
17+
$$ LANGUAGE PLPGSQL;
18+
19+
DO $$
20+
BEGIN
21+
CREATE ROLE pgstac_admin;
22+
EXCEPTION WHEN duplicate_object THEN
23+
RAISE NOTICE '%, skipping', SQLERRM USING ERRCODE = SQLSTATE;
24+
END
25+
$$;
26+
27+
DO $$
28+
BEGIN
29+
CREATE ROLE pgstac_read;
30+
EXCEPTION WHEN duplicate_object THEN
31+
RAISE NOTICE '%, skipping', SQLERRM USING ERRCODE = SQLSTATE;
32+
END
33+
$$;
34+
35+
DO $$
36+
BEGIN
37+
CREATE ROLE pgstac_ingest;
38+
EXCEPTION WHEN duplicate_object THEN
39+
RAISE NOTICE '%, skipping', SQLERRM USING ERRCODE = SQLSTATE;
40+
END
41+
$$;
42+
43+
44+
GRANT pgstac_admin TO current_user;
45+
46+
-- Function to make sure pgstac_admin is the owner of items
47+
CREATE OR REPLACE FUNCTION pgstac_admin_owns() RETURNS VOID AS $$
48+
DECLARE
49+
f RECORD;
50+
BEGIN
51+
FOR f IN (
52+
SELECT
53+
concat(
54+
oid::regproc::text,
55+
'(',
56+
coalesce(pg_get_function_identity_arguments(oid),''),
57+
')'
58+
) AS name,
59+
CASE prokind WHEN 'f' THEN 'FUNCTION' WHEN 'p' THEN 'PROCEDURE' WHEN 'a' THEN 'AGGREGATE' END as typ
60+
FROM pg_proc
61+
WHERE
62+
pronamespace=to_regnamespace('pgstac')
63+
AND proowner != to_regrole('pgstac_admin')
64+
AND proname NOT LIKE 'pg_stat%'
65+
)
66+
LOOP
67+
BEGIN
68+
EXECUTE format('ALTER %s %s OWNER TO pgstac_admin;', f.typ, f.name);
69+
EXCEPTION WHEN others THEN
70+
RAISE NOTICE '%, skipping', SQLERRM USING ERRCODE = SQLSTATE;
71+
END;
72+
END LOOP;
73+
FOR f IN (
74+
SELECT
75+
oid::regclass::text as name,
76+
CASE relkind
77+
WHEN 'i' THEN 'INDEX'
78+
WHEN 'I' THEN 'INDEX'
79+
WHEN 'p' THEN 'TABLE'
80+
WHEN 'r' THEN 'TABLE'
81+
WHEN 'v' THEN 'VIEW'
82+
WHEN 'S' THEN 'SEQUENCE'
83+
ELSE NULL
84+
END as typ
85+
FROM pg_class
86+
WHERE relnamespace=to_regnamespace('pgstac') and relowner != to_regrole('pgstac_admin') AND relkind IN ('r','p','v','S') AND relname NOT LIKE 'pg_stat'
87+
)
88+
LOOP
89+
BEGIN
90+
EXECUTE format('ALTER %s %s OWNER TO pgstac_admin;', f.typ, f.name);
91+
EXCEPTION WHEN others THEN
92+
RAISE NOTICE '%, skipping', SQLERRM USING ERRCODE = SQLSTATE;
93+
END;
94+
END LOOP;
95+
RETURN;
96+
END;
97+
$$ LANGUAGE PLPGSQL;
98+
SELECT pgstac_admin_owns();
99+
100+
CREATE SCHEMA IF NOT EXISTS pgstac AUTHORIZATION pgstac_admin;
101+
102+
GRANT ALL ON ALL FUNCTIONS IN SCHEMA pgstac to pgstac_admin;
103+
GRANT ALL ON ALL TABLES IN SCHEMA pgstac to pgstac_admin;
104+
GRANT ALL ON ALL SEQUENCES IN SCHEMA pgstac to pgstac_admin;
105+
106+
ALTER ROLE pgstac_admin SET SEARCH_PATH TO pgstac, public;
107+
ALTER ROLE pgstac_read SET SEARCH_PATH TO pgstac, public;
108+
ALTER ROLE pgstac_ingest SET SEARCH_PATH TO pgstac, public;
109+
110+
GRANT USAGE ON SCHEMA pgstac to pgstac_read;
111+
ALTER DEFAULT PRIVILEGES IN SCHEMA pgstac GRANT SELECT ON TABLES TO pgstac_read;
112+
ALTER DEFAULT PRIVILEGES IN SCHEMA pgstac GRANT USAGE ON TYPES TO pgstac_read;
113+
ALTER DEFAULT PRIVILEGES IN SCHEMA pgstac GRANT ALL ON SEQUENCES TO pgstac_read;
114+
115+
GRANT pgstac_read TO pgstac_ingest;
116+
GRANT ALL ON SCHEMA pgstac TO pgstac_ingest;
117+
ALTER DEFAULT PRIVILEGES IN SCHEMA pgstac GRANT ALL ON TABLES TO pgstac_ingest;
118+
ALTER DEFAULT PRIVILEGES IN SCHEMA pgstac GRANT ALL ON FUNCTIONS TO pgstac_ingest;
119+
120+
SET ROLE pgstac_admin;
121+
ALTER DEFAULT PRIVILEGES FOR ROLE pgstac_admin IN SCHEMA pgstac GRANT SELECT ON TABLES TO pgstac_read;
122+
ALTER DEFAULT PRIVILEGES FOR ROLE pgstac_admin IN SCHEMA pgstac GRANT USAGE ON TYPES TO pgstac_read;
123+
ALTER DEFAULT PRIVILEGES FOR ROLE pgstac_admin IN SCHEMA pgstac GRANT ALL ON SEQUENCES TO pgstac_read;
124+
ALTER DEFAULT PRIVILEGES FOR ROLE pgstac_admin IN SCHEMA pgstac GRANT ALL ON TABLES TO pgstac_ingest;
125+
ALTER DEFAULT PRIVILEGES FOR ROLE pgstac_admin IN SCHEMA pgstac GRANT ALL ON FUNCTIONS TO pgstac_ingest;
126+
RESET ROLE;
127+
128+
SET ROLE pgstac_ingest;
129+
ALTER DEFAULT PRIVILEGES FOR ROLE pgstac_ingest IN SCHEMA pgstac GRANT SELECT ON TABLES TO pgstac_read;
130+
ALTER DEFAULT PRIVILEGES FOR ROLE pgstac_ingest IN SCHEMA pgstac GRANT USAGE ON TYPES TO pgstac_read;
131+
ALTER DEFAULT PRIVILEGES FOR ROLE pgstac_ingest IN SCHEMA pgstac GRANT ALL ON SEQUENCES TO pgstac_read;
132+
ALTER DEFAULT PRIVILEGES FOR ROLE pgstac_ingest IN SCHEMA pgstac GRANT ALL ON TABLES TO pgstac_ingest;
133+
ALTER DEFAULT PRIVILEGES FOR ROLE pgstac_ingest IN SCHEMA pgstac GRANT ALL ON FUNCTIONS TO pgstac_ingest;
134+
RESET ROLE;
135+
136+
SET SEARCH_PATH TO pgstac, public;
137+
SET ROLE pgstac_admin;
138+
139+
DO $$
140+
BEGIN
141+
DROP FUNCTION IF EXISTS analyze_items;
142+
EXCEPTION WHEN others THEN
143+
RAISE NOTICE '%, skipping', SQLERRM USING ERRCODE = SQLSTATE;
144+
END
145+
$$;
146+
DO $$
147+
BEGIN
148+
DROP FUNCTION IF EXISTS validate_constraints;
149+
EXCEPTION WHEN others THEN
150+
RAISE NOTICE '%, skipping', SQLERRM USING ERRCODE = SQLSTATE;
151+
END
152+
$$;
153+
154+
-- Install these idempotently as migrations do not put them before trying to modify the collections table
155+
156+
157+
CREATE OR REPLACE FUNCTION collection_geom(content jsonb)
158+
RETURNS geometry AS $$
159+
WITH box AS (SELECT content->'extent'->'spatial'->'bbox'->0 as box)
160+
SELECT
161+
st_makeenvelope(
162+
(box->>0)::float,
163+
(box->>1)::float,
164+
(box->>2)::float,
165+
(box->>3)::float,
166+
4326
167+
)
168+
FROM box;
169+
$$ LANGUAGE SQL IMMUTABLE STRICT;
170+
171+
CREATE OR REPLACE FUNCTION collection_datetime(content jsonb)
172+
RETURNS timestamptz AS $$
173+
SELECT
174+
CASE
175+
WHEN
176+
(content->'extent'->'temporal'->'interval'->0->>0) IS NULL
177+
THEN '-infinity'::timestamptz
178+
ELSE
179+
(content->'extent'->'temporal'->'interval'->0->>0)::timestamptz
180+
END
181+
;
182+
$$ LANGUAGE SQL IMMUTABLE STRICT;
183+
184+
CREATE OR REPLACE FUNCTION collection_enddatetime(content jsonb)
185+
RETURNS timestamptz AS $$
186+
SELECT
187+
CASE
188+
WHEN
189+
(content->'extent'->'temporal'->'interval'->0->>1) IS NULL
190+
THEN 'infinity'::timestamptz
191+
ELSE
192+
(content->'extent'->'temporal'->'interval'->0->>1)::timestamptz
193+
END
194+
;
195+
$$ LANGUAGE SQL IMMUTABLE STRICT;
196+
-- BEGIN migra calculated SQL
197+
-- END migra calculated SQL
198+
DO $$
199+
BEGIN
200+
INSERT INTO queryables (name, definition, property_wrapper, property_index_type) VALUES
201+
('id', '{"title": "Item ID","description": "Item identifier","$ref": "https://schemas.stacspec.org/v1.0.0/item-spec/json-schema/item.json#/definitions/core/allOf/2/properties/id"}', null, null);
202+
EXCEPTION WHEN unique_violation THEN
203+
RAISE NOTICE '%', SQLERRM USING ERRCODE = SQLSTATE;
204+
END
205+
$$;
206+
207+
DO $$
208+
BEGIN
209+
INSERT INTO queryables (name, definition, property_wrapper, property_index_type) VALUES
210+
('geometry', '{"title": "Item Geometry","description": "Item Geometry","$ref": "https://geojson.org/schema/Feature.json"}', null, null);
211+
EXCEPTION WHEN unique_violation THEN
212+
RAISE NOTICE '%', SQLERRM USING ERRCODE = SQLSTATE;
213+
END
214+
$$;
215+
216+
DO $$
217+
BEGIN
218+
INSERT INTO queryables (name, definition, property_wrapper, property_index_type) VALUES
219+
('datetime','{"description": "Datetime","type": "string","title": "Acquired","format": "date-time","pattern": "(\\+00:00|Z)$"}', null, null);
220+
EXCEPTION WHEN unique_violation THEN
221+
RAISE NOTICE '%', SQLERRM USING ERRCODE = SQLSTATE;
222+
END
223+
$$;
224+
225+
DELETE FROM queryables a USING queryables b
226+
WHERE a.name = b.name AND a.collection_ids IS NOT DISTINCT FROM b.collection_ids AND a.id > b.id;
227+
228+
229+
INSERT INTO pgstac_settings (name, value) VALUES
230+
('context', 'off'),
231+
('context_estimated_count', '100000'),
232+
('context_estimated_cost', '100000'),
233+
('context_stats_ttl', '1 day'),
234+
('default_filter_lang', 'cql2-json'),
235+
('additional_properties', 'true'),
236+
('use_queue', 'false'),
237+
('queue_timeout', '10 minutes'),
238+
('update_collection_extent', 'false'),
239+
('format_cache', 'false'),
240+
('readonly', 'false')
241+
ON CONFLICT DO NOTHING
242+
;
243+
244+
245+
INSERT INTO cql2_ops (op, template, types) VALUES
246+
('eq', '%s = %s', NULL),
247+
('neq', '%s != %s', NULL),
248+
('ne', '%s != %s', NULL),
249+
('!=', '%s != %s', NULL),
250+
('<>', '%s != %s', NULL),
251+
('lt', '%s < %s', NULL),
252+
('lte', '%s <= %s', NULL),
253+
('gt', '%s > %s', NULL),
254+
('gte', '%s >= %s', NULL),
255+
('le', '%s <= %s', NULL),
256+
('ge', '%s >= %s', NULL),
257+
('=', '%s = %s', NULL),
258+
('<', '%s < %s', NULL),
259+
('<=', '%s <= %s', NULL),
260+
('>', '%s > %s', NULL),
261+
('>=', '%s >= %s', NULL),
262+
('like', '%s LIKE %s', NULL),
263+
('ilike', '%s ILIKE %s', NULL),
264+
('+', '%s + %s', NULL),
265+
('-', '%s - %s', NULL),
266+
('*', '%s * %s', NULL),
267+
('/', '%s / %s', NULL),
268+
('not', 'NOT (%s)', NULL),
269+
('between', '%s BETWEEN %s AND %s', NULL),
270+
('isnull', '%s IS NULL', NULL),
271+
('upper', 'upper(%s)', NULL),
272+
('lower', 'lower(%s)', NULL),
273+
('casei', 'upper(%s)', NULL),
274+
('accenti', 'unaccent(%s)', NULL)
275+
ON CONFLICT (op) DO UPDATE
276+
SET
277+
template = EXCLUDED.template
278+
;
279+
280+
281+
ALTER FUNCTION to_text COST 5000;
282+
ALTER FUNCTION to_float COST 5000;
283+
ALTER FUNCTION to_int COST 5000;
284+
ALTER FUNCTION to_tstz COST 5000;
285+
ALTER FUNCTION to_text_array COST 5000;
286+
287+
ALTER FUNCTION update_partition_stats SECURITY DEFINER;
288+
ALTER FUNCTION partition_after_triggerfunc SECURITY DEFINER;
289+
ALTER FUNCTION drop_table_constraints SECURITY DEFINER;
290+
ALTER FUNCTION create_table_constraints SECURITY DEFINER;
291+
ALTER FUNCTION check_partition SECURITY DEFINER;
292+
ALTER FUNCTION repartition SECURITY DEFINER;
293+
ALTER FUNCTION where_stats SECURITY DEFINER;
294+
ALTER FUNCTION search_query SECURITY DEFINER;
295+
ALTER FUNCTION format_item SECURITY DEFINER;
296+
ALTER FUNCTION maintain_index SECURITY DEFINER;
297+
298+
GRANT USAGE ON SCHEMA pgstac to pgstac_read;
299+
GRANT ALL ON SCHEMA pgstac to pgstac_ingest;
300+
GRANT ALL ON SCHEMA pgstac to pgstac_admin;
301+
302+
-- pgstac_read role limited to using function apis
303+
GRANT EXECUTE ON FUNCTION search TO pgstac_read;
304+
GRANT EXECUTE ON FUNCTION search_query TO pgstac_read;
305+
GRANT EXECUTE ON FUNCTION item_by_id TO pgstac_read;
306+
GRANT EXECUTE ON FUNCTION get_item TO pgstac_read;
307+
GRANT SELECT ON ALL TABLES IN SCHEMA pgstac TO pgstac_read;
308+
309+
310+
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA pgstac to pgstac_ingest;
311+
GRANT ALL ON ALL TABLES IN SCHEMA pgstac to pgstac_ingest;
312+
GRANT USAGE ON ALL SEQUENCES IN SCHEMA pgstac to pgstac_ingest;
313+
314+
REVOKE ALL PRIVILEGES ON PROCEDURE run_queued_queries FROM public;
315+
GRANT ALL ON PROCEDURE run_queued_queries TO pgstac_admin;
316+
317+
REVOKE ALL PRIVILEGES ON FUNCTION run_queued_queries_intransaction FROM public;
318+
GRANT ALL ON FUNCTION run_queued_queries_intransaction TO pgstac_admin;
319+
320+
RESET ROLE;
321+
322+
SET ROLE pgstac_ingest;
323+
SELECT update_partition_stats_q(partition) FROM partitions_view;
324+
SELECT set_version('0.9.4');

0 commit comments

Comments
 (0)