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