]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/002.schema.config.sql
escape &s in xml nodes (not sure why XPATH does not); skip null values in flatten_marc
[Evergreen.git] / Open-ILS / src / sql / Pg / 002.schema.config.sql
1 /*
2  * Copyright (C) 2004-2008  Georgia Public Library Service
3  * Copyright (C) 2008  Equinox Software, Inc.
4  * Mike Rylander <miker@esilibrary.com>
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  */
17
18
19
20 DROP SCHEMA stats CASCADE;
21 DROP SCHEMA config CASCADE;
22
23 BEGIN;
24 CREATE SCHEMA stats;
25
26 CREATE SCHEMA config;
27 COMMENT ON SCHEMA config IS $$
28 /*
29  * Copyright (C) 2005  Georgia Public Library Service 
30  * Mike Rylander <mrylander@gmail.com>
31  *
32  * The config schema holds static configuration data for the
33  * Open-ILS installation.
34  *
35  * ****
36  *
37  * This program is free software; you can redistribute it and/or
38  * modify it under the terms of the GNU General Public License
39  * as published by the Free Software Foundation; either version 2
40  * of the License, or (at your option) any later version.
41  *
42  * This program is distributed in the hope that it will be useful,
43  * but WITHOUT ANY WARRANTY; without even the implied warranty of
44  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
45  * GNU General Public License for more details.
46  */
47 $$;
48
49 CREATE TABLE config.internal_flag (
50     name    TEXT    PRIMARY KEY,
51     value   TEXT,
52     enabled BOOL    NOT NULL DEFAULT FALSE
53 );
54 INSERT INTO config.internal_flag (name) VALUES ('ingest.metarecord_mapping.skip_on_insert');
55
56 CREATE TABLE config.upgrade_log (
57     version         TEXT    PRIMARY KEY,
58     install_date    TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
59 );
60
61 INSERT INTO config.upgrade_log (version) VALUES ('0200'); -- miker
62
63 CREATE TABLE config.bib_source (
64         id              SERIAL  PRIMARY KEY,
65         quality         INT     CHECK ( quality BETWEEN 0 AND 100 ),
66         source          TEXT    NOT NULL UNIQUE,
67         transcendant    BOOL    NOT NULL DEFAULT FALSE
68 );
69 COMMENT ON TABLE config.bib_source IS $$
70 /*
71  * Copyright (C) 2005  Georgia Public Library Service 
72  * Mike Rylander <mrylander@gmail.com>
73  *
74  * Valid sources of MARC records
75  *
76  * This is table is used to set up the relative "quality" of each
77  * MARC source, such as OCLC.
78  *
79  * ****
80  *
81  * This program is free software; you can redistribute it and/or
82  * modify it under the terms of the GNU General Public License
83  * as published by the Free Software Foundation; either version 2
84  * of the License, or (at your option) any later version.
85  *
86  * This program is distributed in the hope that it will be useful,
87  * but WITHOUT ANY WARRANTY; without even the implied warranty of
88  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
89  * GNU General Public License for more details.
90  */
91 $$;
92
93 CREATE TABLE config.standing (
94         id              SERIAL  PRIMARY KEY,
95         value           TEXT    NOT NULL UNIQUE
96 );
97 COMMENT ON TABLE config.standing IS $$
98 /*
99  * Copyright (C) 2005  Georgia Public Library Service 
100  * Mike Rylander <mrylander@gmail.com>
101  *
102  * Patron Standings
103  *
104  * This table contains the values that can be applied to a patron
105  * by a staff member.  These values should not be changed, other
106  * than for translation, as the ID column is currently a "magic
107  * number" in the source. :(
108  *
109  * ****
110  *
111  * This program is free software; you can redistribute it and/or
112  * modify it under the terms of the GNU General Public License
113  * as published by the Free Software Foundation; either version 2
114  * of the License, or (at your option) any later version.
115  *
116  * This program is distributed in the hope that it will be useful,
117  * but WITHOUT ANY WARRANTY; without even the implied warranty of
118  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
119  * GNU General Public License for more details.
120  */
121 $$;
122
123 CREATE TABLE config.standing_penalty (
124         id                      SERIAL  PRIMARY KEY,
125         name            TEXT    NOT NULL UNIQUE,
126         label           TEXT    NOT NULL,
127         block_list      TEXT,
128         org_depth       INTEGER
129 );
130 INSERT INTO config.standing_penalty (id,name,label,block_list)
131         VALUES (1,'PATRON_EXCEEDS_FINES','Patron exceeds fine threshold','CIRC|HOLD|RENEW');
132 INSERT INTO config.standing_penalty (id,name,label,block_list)
133         VALUES (2,'PATRON_EXCEEDS_OVERDUE_COUNT','Patron exceeds max overdue item threshold','CIRC|HOLD|RENEW');
134 INSERT INTO config.standing_penalty (id,name,label,block_list)
135         VALUES (3,'PATRON_EXCEEDS_CHECKOUT_COUNT','Patron exceeds max checked out item threshold','CIRC');
136 INSERT INTO config.standing_penalty (id,name,label,block_list)
137         VALUES (4,'PATRON_EXCEEDS_COLLECTIONS_WARNING','Patron exceeds pre-collections warning fine threshold','CIRC|HOLD|RENEW');
138
139 INSERT INTO config.standing_penalty (id,name,label) VALUES (20,'ALERT_NOTE','Alerting Note, no blocks');
140 INSERT INTO config.standing_penalty (id,name,label) VALUES (21,'SILENT_NOTE','Note, no blocks');
141 INSERT INTO config.standing_penalty (id,name,label,block_list) VALUES (22,'STAFF_C','Alerting block on Circ','CIRC');
142 INSERT INTO config.standing_penalty (id,name,label,block_list) VALUES (23,'STAFF_CH','Alerting block on Circ and Hold','CIRC|HOLD');
143 INSERT INTO config.standing_penalty (id,name,label,block_list) VALUES (24,'STAFF_CR','Alerting block on Circ and Renew','CIRC|RENEW');
144 INSERT INTO config.standing_penalty (id,name,label,block_list) VALUES (25,'STAFF_CHR','Alerting block on Circ, Hold and Renew','CIRC|HOLD|RENEW');
145 INSERT INTO config.standing_penalty (id,name,label,block_list) VALUES (26,'STAFF_HR','Alerting block on Hold and Renew','HOLD|RENEW');
146 INSERT INTO config.standing_penalty (id,name,label,block_list) VALUES (27,'STAFF_H','Alerting block on Hold','HOLD');
147 INSERT INTO config.standing_penalty (id,name,label,block_list) VALUES (28,'STAFF_R','Alerting block on Renew','RENEW');
148 INSERT INTO config.standing_penalty (id,name,label) VALUES (29,'INVALID_PATRON_ADDRESS','Patron has an invalid address');
149 INSERT INTO config.standing_penalty (id,name,label) VALUES (30,'PATRON_IN_COLLECTIONS','Patron has been referred to a collections agency');
150
151 SELECT SETVAL('config.standing_penalty_id_seq', 100);
152
153 CREATE TABLE config.xml_transform (
154         name            TEXT    PRIMARY KEY,
155         namespace_uri   TEXT    NOT NULL,
156         prefix          TEXT    NOT NULL,
157         xslt            TEXT    NOT NULL
158 );
159
160 CREATE TABLE config.biblio_fingerprint (
161         id                      SERIAL  PRIMARY KEY,
162         name            TEXT    NOT NULL, 
163         xpath           TEXT    NOT NULL,
164     first_word  BOOL    NOT NULL DEFAULT FALSE,
165         format          TEXT    NOT NULL DEFAULT 'marcxml'
166 );
167
168 INSERT INTO config.biblio_fingerprint (name, xpath, format)
169     VALUES (
170         'Title',
171         '//marc:datafield[@tag="700"]/marc:subfield[@code="t"]|' ||
172             '//marc:datafield[@tag="240"]/marc:subfield[@code="a"]|' ||
173             '//marc:datafield[@tag="242"]/marc:subfield[@code="a"]|' ||
174             '//marc:datafield[@tag="246"]/marc:subfield[@code="a"]|' ||
175             '//marc:datafield[@tag="245"]/marc:subfield[@code="a"]',
176         'marcxml'
177     );
178
179 INSERT INTO config.biblio_fingerprint (name, xpath, format, first_word)
180     VALUES (
181         'Author',
182         '//marc:datafield[@tag="700" and ./*[@code="t"]]/marc:subfield[@code="a"]|'
183             '//marc:datafield[@tag="100"]/marc:subfield[@code="a"]|'
184             '//marc:datafield[@tag="110"]/marc:subfield[@code="a"]|'
185             '//marc:datafield[@tag="111"]/marc:subfield[@code="a"]|'
186             '//marc:datafield[@tag="260"]/marc:subfield[@code="b"]',
187         'marcxml',
188         TRUE
189     );
190
191 CREATE TABLE config.metabib_field (
192         id              SERIAL  PRIMARY KEY,
193         field_class     TEXT    NOT NULL CHECK (lower(field_class) IN ('title','author','subject','keyword','series')),
194         name            TEXT    NOT NULL,
195         xpath           TEXT    NOT NULL,
196         weight          INT     NOT NULL DEFAULT 1,
197         format          TEXT    NOT NULL DEFAULT 'mods33',
198         search_field    BOOL    NOT NULL DEFAULT TRUE,
199         facet_field     BOOL    NOT NULL DEFAULT FALSE
200 );
201 COMMENT ON TABLE config.metabib_field IS $$
202 /*
203  * Copyright (C) 2005  Georgia Public Library Service 
204  * Mike Rylander <mrylander@gmail.com>
205  *
206  * XPath used for record indexing ingest
207  *
208  * This table contains the XPath used to chop up MODS into its
209  * indexable parts.  Each XPath entry is named and assigned to
210  * a "class" of either title, subject, author, keyword or series.
211  * 
212  *
213  * ****
214  *
215  * This program is free software; you can redistribute it and/or
216  * modify it under the terms of the GNU General Public License
217  * as published by the Free Software Foundation; either version 2
218  * of the License, or (at your option) any later version.
219  *
220  * This program is distributed in the hope that it will be useful,
221  * but WITHOUT ANY WARRANTY; without even the implied warranty of
222  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
223  * GNU General Public License for more details.
224  */
225 $$;
226
227 CREATE UNIQUE INDEX config_metabib_field_class_name_idx ON config.metabib_field (field_class, name);
228
229 CREATE TABLE config.non_cataloged_type (
230         id              SERIAL          PRIMARY KEY,
231         owning_lib      INT             NOT NULL, -- REFERENCES actor.org_unit (id),
232         name            TEXT            NOT NULL,
233         circ_duration   INTERVAL        NOT NULL DEFAULT '14 days'::INTERVAL,
234         in_house        BOOL            NOT NULL DEFAULT FALSE,
235         CONSTRAINT noncat_once_per_lib UNIQUE (owning_lib,name)
236 );
237 COMMENT ON TABLE config.non_cataloged_type IS $$
238 /*
239  * Copyright (C) 2005  Georgia Public Library Service 
240  * Mike Rylander <mrylander@gmail.com>
241  *
242  * Types of valid non-cataloged items.
243  *
244  *
245  * ****
246  *
247  * This program is free software; you can redistribute it and/or
248  * modify it under the terms of the GNU General Public License
249  * as published by the Free Software Foundation; either version 2
250  * of the License, or (at your option) any later version.
251  *
252  * This program is distributed in the hope that it will be useful,
253  * but WITHOUT ANY WARRANTY; without even the implied warranty of
254  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
255  * GNU General Public License for more details.
256  */
257 $$;
258
259 CREATE TABLE config.identification_type (
260         id              SERIAL  PRIMARY KEY,
261         name            TEXT    NOT NULL UNIQUE
262 );
263 COMMENT ON TABLE config.identification_type IS $$
264 /*
265  * Copyright (C) 2005  Georgia Public Library Service 
266  * Mike Rylander <mrylander@gmail.com>
267  *
268  * Types of valid patron identification.
269  *
270  * Each patron must display at least one valid form of identification
271  * in order to get a library card.  This table lists those forms.
272  * 
273  *
274  * ****
275  *
276  * This program is free software; you can redistribute it and/or
277  * modify it under the terms of the GNU General Public License
278  * as published by the Free Software Foundation; either version 2
279  * of the License, or (at your option) any later version.
280  *
281  * This program is distributed in the hope that it will be useful,
282  * but WITHOUT ANY WARRANTY; without even the implied warranty of
283  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
284  * GNU General Public License for more details.
285  */
286 $$;
287
288 CREATE TABLE config.rule_circ_duration (
289         id              SERIAL          PRIMARY KEY,
290         name            TEXT            NOT NULL UNIQUE CHECK ( name ~ E'^\\w+$' ),
291         extended        INTERVAL        NOT NULL,
292         normal          INTERVAL        NOT NULL,
293         shrt            INTERVAL        NOT NULL,
294         max_renewals    INT             NOT NULL
295 );
296 COMMENT ON TABLE config.rule_circ_duration IS $$
297 /*
298  * Copyright (C) 2005  Georgia Public Library Service 
299  * Mike Rylander <mrylander@gmail.com>
300  *
301  * Circulation Duration rules
302  *
303  * Each circulation is given a duration based on one of these rules.
304  * 
305  *
306  * ****
307  *
308  * This program is free software; you can redistribute it and/or
309  * modify it under the terms of the GNU General Public License
310  * as published by the Free Software Foundation; either version 2
311  * of the License, or (at your option) any later version.
312  *
313  * This program is distributed in the hope that it will be useful,
314  * but WITHOUT ANY WARRANTY; without even the implied warranty of
315  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
316  * GNU General Public License for more details.
317  */
318 $$;
319
320 CREATE TABLE config.rule_max_fine (
321     id          SERIAL          PRIMARY KEY,
322     name        TEXT            NOT NULL UNIQUE CHECK ( name ~ E'^\\w+$' ),
323     amount      NUMERIC(6,2)    NOT NULL,
324     is_percent  BOOL            NOT NULL DEFAULT FALSE
325 );
326 COMMENT ON TABLE config.rule_max_fine IS $$
327 /*
328  * Copyright (C) 2005  Georgia Public Library Service 
329  * Mike Rylander <mrylander@gmail.com>
330  *
331  * Circulation Max Fine rules
332  *
333  * Each circulation is given a maximum fine based on one of
334  * these rules.
335  * 
336  *
337  * ****
338  *
339  * This program is free software; you can redistribute it and/or
340  * modify it under the terms of the GNU General Public License
341  * as published by the Free Software Foundation; either version 2
342  * of the License, or (at your option) any later version.
343  *
344  * This program is distributed in the hope that it will be useful,
345  * but WITHOUT ANY WARRANTY; without even the implied warranty of
346  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
347  * GNU General Public License for more details.
348  */
349 $$;
350
351 CREATE TABLE config.rule_recurring_fine (
352         id                      SERIAL          PRIMARY KEY,
353         name                    TEXT            NOT NULL UNIQUE CHECK ( name ~ E'^\\w+$' ),
354         high                    NUMERIC(6,2)    NOT NULL,
355         normal                  NUMERIC(6,2)    NOT NULL,
356         low                     NUMERIC(6,2)    NOT NULL,
357         recurrence_interval     INTERVAL        NOT NULL DEFAULT '1 day'::INTERVAL
358 );
359 COMMENT ON TABLE config.rule_recurring_fine IS $$
360 /*
361  * Copyright (C) 2005  Georgia Public Library Service 
362  * Mike Rylander <mrylander@gmail.com>
363  *
364  * Circulation Recurring Fine rules
365  *
366  * Each circulation is given a recurring fine amount based on one of
367  * these rules.  The recurrence_interval should not be any shorter
368  * than the interval between runs of the fine_processor.pl script
369  * (which is run from CRON), or you could miss fines.
370  * 
371  *
372  * ****
373  *
374  * This program is free software; you can redistribute it and/or
375  * modify it under the terms of the GNU General Public License
376  * as published by the Free Software Foundation; either version 2
377  * of the License, or (at your option) any later version.
378  *
379  * This program is distributed in the hope that it will be useful,
380  * but WITHOUT ANY WARRANTY; without even the implied warranty of
381  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
382  * GNU General Public License for more details.
383  */
384 $$;
385
386
387 CREATE TABLE config.rule_age_hold_protect (
388         id      SERIAL          PRIMARY KEY,
389         name    TEXT            NOT NULL UNIQUE CHECK ( name ~ E'^\\w+$' ),
390         age     INTERVAL        NOT NULL,
391         prox    INT             NOT NULL
392 );
393 COMMENT ON TABLE config.rule_age_hold_protect IS $$
394 /*
395  * Copyright (C) 2005  Georgia Public Library Service 
396  * Mike Rylander <mrylander@gmail.com>
397  *
398  * Hold Item Age Protection rules
399  *
400  * A hold request can only capture new(ish) items when they are
401  * within a particular proximity of the home_ou of the requesting
402  * user.  The proximity ('prox' column) is calculated by counting
403  * the number of tree edges between the user's home_ou and the owning_lib
404  * of the copy that could fulfill the hold.
405  * 
406  *
407  * ****
408  *
409  * This program is free software; you can redistribute it and/or
410  * modify it under the terms of the GNU General Public License
411  * as published by the Free Software Foundation; either version 2
412  * of the License, or (at your option) any later version.
413  *
414  * This program is distributed in the hope that it will be useful,
415  * but WITHOUT ANY WARRANTY; without even the implied warranty of
416  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
417  * GNU General Public License for more details.
418  */
419 $$;
420
421 CREATE TABLE config.copy_status (
422         id              SERIAL  PRIMARY KEY,
423         name            TEXT    NOT NULL UNIQUE,
424         holdable        BOOL    NOT NULL DEFAULT FALSE,
425         opac_visible    BOOL    NOT NULL DEFAULT FALSE
426 );
427 COMMENT ON TABLE config.copy_status IS $$
428 /*
429  * Copyright (C) 2005  Georgia Public Library Service 
430  * Mike Rylander <mrylander@gmail.com>
431  *
432  * Copy Statuses
433  *
434  * The available copy statuses, and whether a copy in that
435  * status is available for hold request capture.  0 (zero) is
436  * the only special number in this set, meaning that the item
437  * is available for immediate checkout, and is counted as available
438  * in the OPAC.
439  *
440  * Statuses with an ID below 100 are not removable, and have special
441  * meaning in the code.  Do not change them except to translate the
442  * textual name.
443  *
444  * You may add and remove statuses above 100, and these can be used
445  * to remove items from normal circulation without affecting the rest
446  * of the copy's values or its location.
447  *
448  * ****
449  *
450  * This program is free software; you can redistribute it and/or
451  * modify it under the terms of the GNU General Public License
452  * as published by the Free Software Foundation; either version 2
453  * of the License, or (at your option) any later version.
454  *
455  * This program is distributed in the hope that it will be useful,
456  * but WITHOUT ANY WARRANTY; without even the implied warranty of
457  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
458  * GNU General Public License for more details.
459  */
460 $$;
461
462 CREATE TABLE config.net_access_level (
463         id      SERIAL          PRIMARY KEY,
464         name    TEXT            NOT NULL UNIQUE
465 );
466 COMMENT ON TABLE config.net_access_level IS $$
467 /*
468  * Copyright (C) 2005  Georgia Public Library Service 
469  * Mike Rylander <mrylander@gmail.com>
470  *
471  * Patron Network Access level
472  *
473  * This will be used to inform the in-library firewall of how much
474  * internet access the using patron should be allowed.
475  *
476  * ****
477  *
478  * This program is free software; you can redistribute it and/or
479  * modify it under the terms of the GNU General Public License
480  * as published by the Free Software Foundation; either version 2
481  * of the License, or (at your option) any later version.
482  *
483  * This program is distributed in the hope that it will be useful,
484  * but WITHOUT ANY WARRANTY; without even the implied warranty of
485  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
486  * GNU General Public License for more details.
487  */
488 $$;
489
490
491 CREATE TABLE config.remote_account (
492     id          SERIAL  PRIMARY KEY,
493     label       TEXT    NOT NULL,
494     host        TEXT    NOT NULL,   -- name or IP, :port optional
495     username    TEXT,               -- optional, since we could default to $USER
496     password    TEXT,               -- optional, since we could use SSH keys, or anonymous login.
497     account     TEXT,               -- aka profile or FTP "account" command
498     path        TEXT,               -- aka directory
499     owner       INT     NOT NULL,   -- REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
500     last_activity TIMESTAMP WITH TIME ZONE
501 );
502
503 CREATE TABLE config.audience_map (
504         code            TEXT    PRIMARY KEY,
505         value           TEXT    NOT NULL,
506         description     TEXT
507 );
508
509 CREATE TABLE config.lit_form_map (
510         code            TEXT    PRIMARY KEY,
511         value           TEXT    NOT NULL,
512         description     TEXT
513 );
514
515 CREATE TABLE config.language_map (
516         code    TEXT    PRIMARY KEY,
517         value   TEXT    NOT NULL
518 );
519
520 CREATE TABLE config.item_form_map (
521         code    TEXT    PRIMARY KEY,
522         value   TEXT    NOT NULL
523 );
524
525 CREATE TABLE config.item_type_map (
526         code    TEXT    PRIMARY KEY,
527         value   TEXT    NOT NULL
528 );
529
530 CREATE TABLE config.bib_level_map (
531         code    TEXT    PRIMARY KEY,
532         value   TEXT    NOT NULL
533 );
534
535 CREATE TABLE config.marc21_rec_type_map (
536     code        TEXT    PRIMARY KEY,
537     type_val    TEXT    NOT NULL,
538     blvl_val    TEXT    NOT NULL
539 );
540
541 CREATE TABLE config.marc21_ff_pos_map (
542     id          SERIAL  PRIMARY KEY,
543     fixed_field TEXT    NOT NULL,
544     tag         TEXT    NOT NULL,
545     rec_type    TEXT    NOT NULL,
546     start_pos   INT     NOT NULL,
547     length      INT     NOT NULL,
548     default_val TEXT    NOT NULL DEFAULT ' '
549 );
550
551 CREATE TABLE config.marc21_physical_characteristic_type_map (
552     ptype_key   TEXT    PRIMARY KEY,
553     label       TEXT    NOT NULL -- I18N
554 );
555
556 CREATE TABLE config.marc21_physical_characteristic_subfield_map (
557     id          SERIAL  PRIMARY KEY,
558     ptype_key   TEXT    NOT NULL REFERENCES config.marc21_physical_characteristic_type_map (ptype_key) ON DELETE CASCADE ON UPDATE CASCADE,
559     subfield    TEXT    NOT NULL,
560     start_pos   INT     NOT NULL,
561     length      INT     NOT NULL,
562     label       TEXT    NOT NULL -- I18N
563 );
564
565 CREATE TABLE config.marc21_physical_characteristic_value_map (
566     id              SERIAL  PRIMARY KEY,
567     value           TEXT    NOT NULL,
568     ptype_subfield  INT     NOT NULL REFERENCES config.marc21_physical_characteristic_subfield_map (id),
569     label           TEXT    NOT NULL -- I18N
570 );
571
572
573 CREATE TABLE config.z3950_source (
574     name                TEXT    PRIMARY KEY,
575     label               TEXT    NOT NULL UNIQUE,
576     host                TEXT    NOT NULL,
577     port                INT     NOT NULL,
578     db                  TEXT    NOT NULL,
579     record_format       TEXT    NOT NULL DEFAULT 'FI',
580     transmission_format TEXT    NOT NULL DEFAULT 'usmarc',
581     auth                BOOL    NOT NULL DEFAULT TRUE
582 );
583
584 COMMENT ON TABLE config.z3950_source IS $$
585 Z39.50 Sources
586
587 Each row in this table represents a database searchable via Z39.50.
588 $$;
589
590 COMMENT ON COLUMN config.z3950_source.record_format IS $$
591 Z39.50 element set.
592 $$;
593
594 COMMENT ON COLUMN config.z3950_source.transmission_format IS $$
595 Z39.50 preferred record syntax..
596 $$;
597
598
599 CREATE TABLE config.z3950_attr (
600     id          SERIAL  PRIMARY KEY,
601     source      TEXT    NOT NULL REFERENCES config.z3950_source (name) DEFERRABLE INITIALLY DEFERRED,
602     name        TEXT    NOT NULL,
603     label       TEXT    NOT NULL,
604     code        INT     NOT NULL,
605     format      INT     NOT NULL,
606     truncation  INT     NOT NULL DEFAULT 0,
607     CONSTRAINT z_code_format_once_per_source UNIQUE (code,format,source)
608 );
609
610 CREATE TABLE config.i18n_locale (
611     code        TEXT    PRIMARY KEY,
612     marc_code   TEXT    NOT NULL REFERENCES config.language_map (code) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
613     name        TEXT    UNIQUE NOT NULL,
614     description TEXT
615 );
616
617 CREATE TABLE config.i18n_core (
618     id              BIGSERIAL   PRIMARY KEY,
619     fq_field        TEXT        NOT NULL,
620     identity_value  TEXT        NOT NULL,
621     translation     TEXT        NOT NULL    REFERENCES config.i18n_locale (code) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
622     string          TEXT        NOT NULL
623 );
624
625 CREATE UNIQUE INDEX i18n_identity ON config.i18n_core (fq_field,identity_value,translation);
626
627 CREATE TABLE config.billing_type (
628     id              SERIAL  PRIMARY KEY,
629     name            TEXT    NOT NULL,
630     owner           INT     NOT NULL, -- REFERENCES actor.org_unit (id)
631     default_price   NUMERIC(6,2),
632     CONSTRAINT billing_type_once_per_lib UNIQUE (name, owner)
633 );
634
635 CREATE TABLE config.org_unit_setting_type (
636     name            TEXT    PRIMARY KEY,
637     label           TEXT    UNIQUE NOT NULL,
638     description     TEXT,
639     datatype        TEXT    NOT NULL DEFAULT 'string',
640     fm_class        TEXT,
641     view_perm       INT,
642     update_perm     INT,
643     --
644     -- define valid datatypes
645     --
646     CONSTRAINT coust_valid_datatype CHECK ( datatype IN
647     ( 'bool', 'integer', 'float', 'currency', 'interval',
648       'date', 'string', 'object', 'array', 'link' ) ),
649     --
650     -- fm_class is meaningful only for 'link' datatype
651     --
652     CONSTRAINT coust_no_empty_link CHECK
653     ( ( datatype =  'link' AND fm_class IS NOT NULL ) OR
654       ( datatype <> 'link' AND fm_class IS NULL ) )
655 );
656
657 CREATE TABLE config.usr_setting_type (
658
659     name TEXT PRIMARY KEY,
660     opac_visible BOOL NOT NULL DEFAULT FALSE,
661     label TEXT UNIQUE NOT NULL,
662     description TEXT,
663     datatype TEXT NOT NULL DEFAULT 'string',
664     fm_class TEXT,
665
666     --
667     -- define valid datatypes
668     --
669     CONSTRAINT coust_valid_datatype CHECK ( datatype IN
670     ( 'bool', 'integer', 'float', 'currency', 'interval',
671         'date', 'string', 'object', 'array', 'link' ) ),
672
673     --
674     -- fm_class is meaningful only for 'link' datatype
675     --
676     CONSTRAINT coust_no_empty_link CHECK
677     ( ( datatype = 'link' AND fm_class IS NOT NULL ) OR
678         ( datatype <> 'link' AND fm_class IS NULL ) )
679
680 );
681
682 -- Some handy functions, based on existing ones, to provide optional ingest normalization
683
684 CREATE OR REPLACE FUNCTION public.left_trunc( TEXT, INT ) RETURNS TEXT AS $func$
685         SELECT SUBSTRING($1,$2);
686 $func$ LANGUAGE SQL STRICT IMMUTABLE;
687
688 CREATE OR REPLACE FUNCTION public.right_trunc( TEXT, INT ) RETURNS TEXT AS $func$
689         SELECT SUBSTRING($1,1,$2);
690 $func$ LANGUAGE SQL STRICT IMMUTABLE;
691
692 CREATE OR REPLACE FUNCTION public.split_date_range( TEXT ) RETURNS TEXT AS $func$
693         SELECT REGEXP_REPLACE( $1, E'(\\d{4})-(\\d{4})', E'\\1 \\2', 'g' );
694 $func$ LANGUAGE SQL STRICT IMMUTABLE;
695
696 -- And ... a table in which to register them
697
698 CREATE TABLE config.index_normalizer (
699         id              SERIAL  PRIMARY KEY,
700         name            TEXT    UNIQUE NOT NULL,
701         description     TEXT,
702         func            TEXT    NOT NULL,
703         param_count     INT     NOT NULL DEFAULT 0
704 );
705
706 CREATE TABLE config.metabib_field_index_norm_map (
707         id      SERIAL  PRIMARY KEY,
708         field   INT     NOT NULL REFERENCES config.metabib_field (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
709         norm    INT     NOT NULL REFERENCES config.index_normalizer (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
710         params  TEXT,
711         pos     INT     NOT NULL DEFAULT 0
712 );
713
714 CREATE OR REPLACE FUNCTION oils_tsearch2 () RETURNS TRIGGER AS $$
715 DECLARE
716         normalizer      RECORD;
717         value           TEXT := '';
718 BEGIN
719         value := NEW.value;
720
721         IF TG_TABLE_NAME::TEXT ~ 'field_entry$' THEN
722                 FOR normalizer IN
723                         SELECT  n.func AS func,
724                                 n.param_count AS param_count,
725                                 m.params AS params
726                           FROM  config.index_normalizer n
727                                 JOIN config.metabib_field_index_norm_map m ON (m.norm = n.id)
728                           WHERE field = NEW.field
729                           ORDER BY m.pos
730                 LOOP
731                         EXECUTE 'SELECT ' || normalizer.func || '(' ||
732                                         quote_literal( value ) ||
733                                         CASE
734                                                 WHEN normalizer.param_count > 0 THEN ',' || BTRIM(normalizer.params,'[]')
735                                                 ELSE ''
736                                         END ||
737                                 ')' INTO value;
738
739                 END LOOP;
740         END IF;
741
742         IF REGEXP_REPLACE(VERSION(),E'^.+?(\\d+\\.\\d+).*?$',E'\\1')::FLOAT > 8.2 THEN
743                 NEW.index_vector = to_tsvector((TG_ARGV[0])::regconfig, value);
744         ELSE
745                 NEW.index_vector = to_tsvector(TG_ARGV[0], value);
746         END IF;
747
748         RETURN NEW;
749 END;
750 $$ LANGUAGE PLPGSQL;
751
752 COMMIT;