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