x
1
DECLARE
2
rec record;
3
sql text;
4
var_schema text;
5
BEGIN
6
7
FOR rec IN
8
SELECT name, default_version, installed_version
9
FROM pg_catalog.pg_available_extensions
10
WHERE name IN (
11
'postgis',
12
'postgis_raster',
13
'postgis_sfcgal',
14
'postgis_topology',
15
'postgis_tiger_geocoder'
16
)
17
ORDER BY length(name) -- this is to make sure 'postgis' is first !
18
LOOP --{
19
20
IF target_version IS NULL THEN
21
target_version := rec.default_version;
22
END IF;
23
24
IF rec.installed_version IS NULL THEN --{
25
-- If the support installed by available extension
26
-- is found unpackaged, we package it
27
IF --{
28
-- PostGIS is always available (this function is part of it)
29
rec.name = 'postgis'
30
31
-- PostGIS raster is available if type 'raster' exists
32
OR ( rec.name = 'postgis_raster' AND EXISTS (
33
SELECT 1 FROM pg_catalog.pg_type
34
WHERE typname = 'raster' ) )
35
36
-- PostGIS SFCGAL is available if
37
-- 'postgis_sfcgal_version' function exists
38
OR ( rec.name = 'postgis_sfcgal' AND EXISTS (
39
SELECT 1 FROM pg_catalog.pg_proc
40
WHERE proname = 'postgis_sfcgal_version' ) )
41
42
-- PostGIS Topology is available if
43
-- 'topology.topology' table exists
44
-- NOTE: watch out for https://trac.osgeo.org/postgis/ticket/2503
45
OR ( rec.name = 'postgis_topology' AND EXISTS (
46
SELECT 1 FROM pg_catalog.pg_class c
47
JOIN pg_catalog.pg_namespace n ON (c.relnamespace = n.oid )
48
WHERE n.nspname = 'topology' AND c.relname = 'topology') )
49
50
OR ( rec.name = 'postgis_tiger_geocoder' AND EXISTS (
51
SELECT 1 FROM pg_catalog.pg_class c
52
JOIN pg_catalog.pg_namespace n ON (c.relnamespace = n.oid )
53
WHERE n.nspname = 'tiger' AND c.relname = 'geocode_settings') )
54
THEN --}{ -- the code is unpackaged
55
-- Force install in same schema as postgis
56
SELECT INTO var_schema n.nspname
57
FROM pg_namespace n, pg_proc p
58
WHERE p.proname = 'postgis_full_version'
59
AND n.oid = p.pronamespace
60
LIMIT 1;
61
IF rec.name NOT IN('postgis_topology', 'postgis_tiger_geocoder')
62
THEN
63
sql := format(
64
'CREATE EXTENSION %1$I SCHEMA %2$I VERSION unpackaged;'
65
'ALTER EXTENSION %1$I UPDATE TO %3$I',
66
rec.name, var_schema, target_version);
67
ELSE
68
sql := format(
69
'CREATE EXTENSION %1$I VERSION unpackaged;'
70
'ALTER EXTENSION %1$I UPDATE TO %2$I',
71
rec.name, target_version);
72
END IF;
73
RAISE NOTICE 'Packaging and updating %', rec.name;
74
RAISE DEBUG '%', sql;
75
EXECUTE sql;
76
ELSE
77
RAISE DEBUG 'Skipping % (not in use)', rec.name;
78
END IF; --}
79
ELSE -- The code is already packaged, upgrade it --}{
80
sql = format(
81
'ALTER EXTENSION %1$I UPDATE TO "ANY";'
82
'ALTER EXTENSION %1$I UPDATE TO %2$I',
83
rec.name, target_version
84
);
85
RAISE NOTICE 'Updating extension % %', rec.name, rec.installed_version;
86
RAISE DEBUG '%', sql;
87
EXECUTE sql;
88
END IF; --}
89
90
END LOOP; --}
91
92
RETURN format(
93
'Upgrade to version %s completed, run SELECT postgis_full_version(); for details',
94
target_version
95
);
96
97
98
END