Fix divergence of stock serials schema and upgraded schema
[working/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.array_remove_item_by_value(inp ANYARRAY, el ANYELEMENT) RETURNS anyarray AS $$ SELECT ARRAY_ACCUM(x.e) FROM UNNEST( $1 ) x(e) WHERE x.e <> $2; $$ LANGUAGE SQL;
19
20 CREATE OR REPLACE FUNCTION evergreen.lowercase( TEXT ) RETURNS TEXT AS $$
21     return lc(shift);
22 $$ LANGUAGE PLPERLU STRICT IMMUTABLE;
23
24 CREATE OR REPLACE FUNCTION evergreen.xml_escape(str TEXT) RETURNS text AS $$
25     SELECT REPLACE(REPLACE(REPLACE($1,
26        '&', '&amp;'),
27        '<', '&lt;'),
28        '>', '&gt;');
29 $$ LANGUAGE SQL IMMUTABLE;
30
31 CREATE OR REPLACE FUNCTION evergreen.regexp_split_to_array(TEXT, TEXT)
32 RETURNS TEXT[] AS $$
33     return encode_array_literal([split $_[1], $_[0]]);
34 $$ LANGUAGE PLPERLU STRICT IMMUTABLE;
35
36 -- Provide a named type for patching functions
37 CREATE TYPE evergreen.patch AS (patch TEXT);
38
39 CREATE OR REPLACE FUNCTION evergreen.xml_pretty_print(input XML) 
40     RETURNS XML
41     LANGUAGE SQL AS
42 $func$
43 SELECT xslt_process($1::text,
44 $$<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
45     version="1.0">
46    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
47    <xsl:strip-space elements="*"/>
48    <xsl:template match="@*|node()">
49      <xsl:copy>
50        <xsl:apply-templates select="@*|node()"/>
51      </xsl:copy>
52    </xsl:template>
53  </xsl:stylesheet>
54 $$::text)::XML
55 $func$;
56
57 COMMENT ON FUNCTION evergreen.xml_pretty_print(input XML) IS
58 'Simple pretty printer for XML, as written by Andrew Dunstan at http://goo.gl/zBHIk';
59
60 CREATE OR REPLACE FUNCTION evergreen.could_be_serial_holding_code(TEXT) RETURNS BOOL AS $$
61     use JSON::XS;
62     use MARC::Field;
63
64     eval {
65         my $holding_code = (new JSON::XS)->decode(shift);
66         new MARC::Field('999', @$holding_code);
67     };
68     return 0 if $@;
69     # verify that subfield labels are exactly one character long
70     foreach (keys %{ { @$holding_code } }) {
71         return 0 if length($_) != 1;
72     }
73     return 1;
74 $$ LANGUAGE PLPERLU;
75
76 COMMENT ON FUNCTION evergreen.could_be_serial_holding_code(TEXT) IS
77     '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.';
78
79 COMMIT;