]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/000.functions.general.sql
LP#1947173: Clean up bad cataloging pot hole
[Evergreen.git] / Open-ILS / src / sql / Pg / 000.functions.general.sql
1 -- Rather than polluting the public schema with general Evergreen
2 -- functions, carve out a dedicated schema
3
4 DROP SCHEMA IF EXISTS evergreen CASCADE;
5
6 BEGIN;
7
8 CREATE SCHEMA evergreen;
9
10 CREATE OR REPLACE FUNCTION evergreen.change_db_setting(setting_name TEXT, settings TEXT[]) RETURNS VOID AS $$
11 BEGIN
12     EXECUTE 'ALTER DATABASE ' || quote_ident(current_database()) || ' SET ' || quote_ident(setting_name) || ' = ' || array_to_string(settings, ',');
13 END;
14 $$ LANGUAGE plpgsql;
15
16 SELECT evergreen.change_db_setting('search_path', ARRAY['evergreen','public','pg_catalog']);
17
18 CREATE OR REPLACE FUNCTION evergreen.lowercase( TEXT ) RETURNS TEXT AS $$
19     return lc(shift);
20 $$ LANGUAGE PLPERLU STRICT IMMUTABLE;
21
22 CREATE OR REPLACE FUNCTION evergreen.uppercase( TEXT ) RETURNS TEXT AS $$
23     return uc(shift);
24 $$ LANGUAGE PLPERLU STRICT IMMUTABLE;
25
26 CREATE OR REPLACE FUNCTION evergreen.xml_escape(str TEXT) RETURNS text AS $$
27     SELECT REPLACE(REPLACE(REPLACE($1,
28        '&', '&'),
29        '<', '&lt;'),
30        '>', '&gt;');
31 $$ LANGUAGE SQL IMMUTABLE;
32
33 CREATE OR REPLACE FUNCTION evergreen.regexp_split_to_array(TEXT, TEXT)
34 RETURNS TEXT[] AS $$
35     return encode_array_literal([split $_[1], $_[0]]);
36 $$ LANGUAGE PLPERLU STRICT IMMUTABLE;
37
38 -- Provide a named type for patching functions
39 CREATE TYPE evergreen.patch AS (patch TEXT);
40
41 CREATE OR REPLACE FUNCTION evergreen.xml_pretty_print(input XML) 
42     RETURNS XML
43     LANGUAGE SQL AS
44 $func$
45 SELECT xslt_process($1::text,
46 $$<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
47     version="1.0">
48    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
49    <xsl:strip-space elements="*"/>
50    <xsl:template match="@*|node()">
51      <xsl:copy>
52        <xsl:apply-templates select="@*|node()"/>
53      </xsl:copy>
54    </xsl:template>
55  </xsl:stylesheet>
56 $$::text)::XML
57 $func$;
58
59 COMMENT ON FUNCTION evergreen.xml_pretty_print(input XML) IS
60 'Simple pretty printer for XML, as written by Andrew Dunstan at http://goo.gl/zBHIk';
61
62 CREATE OR REPLACE FUNCTION evergreen.could_be_serial_holding_code(TEXT) RETURNS BOOL AS $$
63     use JSON::XS;
64     use MARC::Field;
65
66     eval {
67         my $holding_code = (new JSON::XS)->decode(shift);
68         new MARC::Field('999', @$holding_code);
69     };
70     return 0 if $@;
71     # verify that subfield labels are exactly one character long
72     foreach (keys %{ { @$holding_code } }) {
73         return 0 if length($_) != 1;
74     }
75     return 1;
76 $$ LANGUAGE PLPERLU;
77
78 COMMENT ON FUNCTION evergreen.could_be_serial_holding_code(TEXT) IS
79     'Return true if parameter is valid JSON representing an array that at minimum doesn''t make MARC::Field balk and only has subfield labels exactly one character long.  Otherwise false.';
80
81 CREATE OR REPLACE FUNCTION evergreen.protect_reserved_rows_from_delete() RETURNS trigger AS $protect_reserved$
82 BEGIN
83 IF OLD.id < TG_ARGV[0]::INT THEN
84     RAISE EXCEPTION 'Cannot delete row with reserved ID %', OLD.id;
85 END IF;
86 RETURN OLD;
87 END
88 $protect_reserved$
89 LANGUAGE plpgsql;
90
91 CREATE OR REPLACE FUNCTION evergreen.unaccent_and_squash ( IN arg text) RETURNS text
92     IMMUTABLE STRICT AS $$
93         BEGIN
94         RETURN evergreen.lowercase(public.unaccent('public.unaccent', regexp_replace(arg, '[\s[:punct:]]','','g')));
95         END;
96 $$ LANGUAGE PLPGSQL;
97
98
99 COMMIT;