]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/002.functions.config.sql
fixing i18n infrastructure in the DB
[Evergreen.git] / Open-ILS / src / sql / Pg / 002.functions.config.sql
1 BEGIN;
2
3 /*
4 CREATE OR REPLACE FUNCTION oils_xml_transform ( TEXT, TEXT ) RETURNS TEXT AS $_$
5         SELECT  CASE    WHEN (SELECT COUNT(*) FROM config.xml_transform WHERE name = $2 AND xslt = '---') > 0 THEN $1
6                         ELSE xslt_process($1, (SELECT xslt FROM config.xml_transform WHERE name = $2))
7                 END;
8 $_$ LANGUAGE SQL STRICT IMMUTABLE;
9
10
11
12 CREATE TYPE biblio_field_vtype AS ( record BIGINT, field INT, content TEXT );
13 CREATE OR REPLACE FUNCTION biblio_field_table ( record BIGINT, field_list INT[] ) RETURNS SETOF biblio_field_vtype AS $_$
14 DECLARE
15         i INT;
16         rec biblio_field_vtype%ROWTYPE;
17 BEGIN
18         FOR i IN ARRAY_LOWER(field_list,1) .. ARRAY_UPPER(field_list,1) LOOP
19                 FOR rec IN      SELECT  DISTINCT r, field_list[i], BTRIM(REGEXP_REPLACE(REGEXP_REPLACE(f, E'\n', ' ', 'g'), '[ ]+', ' ', 'g'))
20                                   FROM  xpath_table_ns(
21                                                 'id',
22                                                 $$oils_xml_transform(marc,'$$ || (SELECT format FROM config.metabib_field WHERE id = field_list[i]) || $$')$$,
23                                                 'biblio.record_entry',
24                                                 (SELECT xpath FROM config.metabib_field WHERE id = field_list[i]),
25                                                 'id = ' || record,
26                                                 (SELECT x.prefix FROM config.xml_transform x JOIN config.metabib_field m ON (m.format = x.name) WHERE m.id = field_list[i]),
27                                                     (SELECT x.namespace_uri FROM config.xml_transform x JOIN config.metabib_field m ON (m.format = x.name) WHERE m.id = field_list[i])
28                                         ) AS t( r bigint, f text)
29                                   WHERE f IS NOT NULL LOOP
30                         RETURN NEXT rec;
31                 END LOOP;
32         END LOOP;
33 END;
34 $_$ LANGUAGE PLPGSQL;
35
36
37 CREATE OR REPLACE FUNCTION biblio_field_table ( record BIGINT, field INT ) RETURNS SETOF biblio_field_vtype AS $_$
38         SELECT * FROM biblio_field_table( $1, ARRAY[$2] )
39 $_$ LANGUAGE SQL;
40
41 */
42
43 CREATE OR REPLACE FUNCTION oils_i18n_xlate ( keytable TEXT, keycol TEXT, identcol TEXT, keyvalue TEXT, raw_locale TEXT ) RETURNS TEXT AS $func$
44 DECLARE
45     locale      TEXT := LOWER( REGEXP_REPLACE( REGEXP_REPLACE( raw_locale, E'[;, ].+$', '' ), E'-', '_', 'g' ) );
46     language    TEXT := REGEXP_REPLACE( locale, E'_.+$', '' );
47     result      config.i18n_core%ROWTYPE;
48     fallback    TEXT;
49     keyfield    TEXT := keytable || '.' || keycol;
50 BEGIN
51
52     -- Try the full locale
53     SELECT  * INTO result
54       FROM  config.i18n_core
55       WHERE fq_field = keyfield
56             AND identity_value = keyvalue
57             AND translation = locale;
58
59     -- Try just the language
60     IF NOT FOUND THEN
61         SELECT  * INTO result
62           FROM  config.i18n_core
63           WHERE fq_field = keyfield
64                 AND identity_value = keyvalue
65                 AND translation = language;
66     END IF;
67
68     -- Fall back to the string we passed in in the first place
69     IF NOT FOUND THEN
70         EXECUTE
71             'SELECT ' ||
72                 keycol ||
73             ' FROM ' || keytable ||
74             ' WHERE ' || identcol || ' = ' || quote_literal(keyvalue)
75                 INTO fallback;
76         RETURN fallback;
77     END IF;
78
79     RETURN result.string;
80 END;
81 $func$ LANGUAGE PLPGSQL;
82
83 -- Function for marking translatable strings in SQL statements
84 CREATE OR REPLACE FUNCTION oils_i18n_gettext( TEXT ) RETURNS TEXT AS $$
85     SELECT $1;
86 $$ LANGUAGE SQL;
87
88 COMMIT;
89