| /trunk/CHANGELOG.txt |
|---|
| 1,4 → 1,200 |
| ------------------------------------------------------------------------ |
| r151 | jblyberg | 2010-02-28 20:55:40 -0500 (Sun, 28 Feb 2010) | 3 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| Removed titlelength as a keyword search rank criteria. |
| Added hook code into history function. |
| ------------------------------------------------------------------------ |
| r150 | jblyberg | 2010-02-26 15:27:12 -0500 (Fri, 26 Feb 2010) | 2 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| M /trunk/sphinx/sphinx.conf |
| Additional bugfixes in limit-to-avail. |
| ------------------------------------------------------------------------ |
| r149 | jblyberg | 2010-02-26 11:03:48 -0500 (Fri, 26 Feb 2010) | 4 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| M /trunk/locum-server.php |
| M /trunk/sql/locum_init.sql |
| Fixed an issue with the facet heap initialization. |
| Fixed a related rebuild_facet_heap() issue. |
| Bug a bug in how totals for available items are tallied. |
| ------------------------------------------------------------------------ |
| r148 | jblyberg | 2010-02-25 16:11:50 -0500 (Thu, 25 Feb 2010) | 3 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| Fixed result count for limit-by-available. |
| Small changes to checkout history functions. |
| ------------------------------------------------------------------------ |
| r146 | jblyberg | 2010-02-24 17:19:53 -0500 (Wed, 24 Feb 2010) | 2 lines |
| Changed paths: |
| M /trunk/sql/scas_locum.sql |
| One last SQL schema update. |
| ------------------------------------------------------------------------ |
| r145 | jblyberg | 2010-02-24 17:19:36 -0500 (Wed, 24 Feb 2010) | 2 lines |
| Changed paths: |
| M /trunk/tools/upgrades/1.1/upgrade.sql |
| Small update to SQL schema added to SQL upgrade and SQL schema file. |
| ------------------------------------------------------------------------ |
| r144 | jblyberg | 2010-02-24 17:08:45 -0500 (Wed, 24 Feb 2010) | 2 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| Finished work on "limit to available" |
| ------------------------------------------------------------------------ |
| r143 | jblyberg | 2010-02-23 18:09:00 -0500 (Tue, 23 Feb 2010) | 3 lines |
| Changed paths: |
| M /trunk/config/locum.ini.sample |
| M /trunk/locum-client.php |
| Finished multi-branch implementation in get_item_status(). |
| Began work on "limit by available" in search(). |
| ------------------------------------------------------------------------ |
| r142 | jblyberg | 2010-02-19 17:43:26 -0500 (Fri, 19 Feb 2010) | 2 lines |
| Changed paths: |
| M /trunk/config/locum.ini.sample |
| M /trunk/locum-client.php |
| M /trunk/tools/upgrades/1.1/upgrade.sql |
| Continued work on branch/consortia code. |
| ------------------------------------------------------------------------ |
| r141 | jblyberg | 2010-02-12 17:16:25 -0500 (Fri, 12 Feb 2010) | 2 lines |
| Changed paths: |
| M /contrib/plugins/locum-covers/cache-covers.php |
| M /contrib/plugins/locum-covers/locum-covers.ini.sample |
| M /trunk/config/locum.ini.sample |
| M /trunk/locum-client.php |
| M /trunk/locum.php |
| M /trunk/tools/upgrades/1.1/upgrade.sql |
| Restructuring of consortia/multi-branch support. |
| ------------------------------------------------------------------------ |
| r140 | jblyberg | 2010-02-08 09:26:40 -0500 (Mon, 08 Feb 2010) | 2 lines |
| Changed paths: |
| M /trunk/config/locum.ini.sample |
| M /trunk/locum-client.php |
| M /trunk/tools/upgrades/1.1/upgrade.sql |
| Reworking some of the availability/item level routines. |
| ------------------------------------------------------------------------ |
| r139 | jblyberg | 2010-02-06 09:14:36 -0500 (Sat, 06 Feb 2010) | 2 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| Small bugfixes and code cleanup. |
| ------------------------------------------------------------------------ |
| r138 | jblyberg | 2010-02-05 17:33:23 -0500 (Fri, 05 Feb 2010) | 4 lines |
| Changed paths: |
| D /contrib/plugins/locum-covers/locum-covers.ini |
| A /contrib/plugins/locum-covers/locum-covers.ini.sample (from /contrib/plugins/locum-covers/locum-covers.ini:137) |
| D /trunk/config/locum.ini |
| A /trunk/config/locum.ini.sample (from /trunk/config/locum.ini:137) |
| M /trunk/locum-client.php |
| M /trunk/sql/scas_locum.sql |
| M /trunk/tools/upgrades/1.1/upgrade.sql |
| Fixed some facet issues. |
| Updated facet output to accomidate "decade" |
| Updated SQL schema files. |
| ------------------------------------------------------------------------ |
| r137 | jblyberg | 2010-02-04 18:12:22 -0500 (Thu, 04 Feb 2010) | 5 lines |
| Changed paths: |
| M /trunk/config/locum.ini |
| M /trunk/locum-client.php |
| A /trunk/tools/upgrades/1.1 (from /trunk/tools/upgrades/2.1:131) |
| R /trunk/tools/upgrades/1.1/upgrade.sql (from /trunk/tools/upgrades/2.1/upgrade.sql:135) |
| D /trunk/tools/upgrades/2.1 |
| Small changes to get_bib_item() to support new SOPAC features (Docs reflect changes) |
| stdnum is now scrubbed before passed back. |
| Moved upgrade folder from 2.1 to 1.1 to reflect reality. |
| Updated SQL upgrade script to include chages to locum_bib_items table. |
| ------------------------------------------------------------------------ |
| r136 | jblyberg | 2010-02-02 17:34:51 -0500 (Tue, 02 Feb 2010) | 3 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| M /trunk/locum-server.php |
| M /trunk/tools/maint.php |
| Slight structural change to maint script. |
| Small tweaks and bugfixes to the syndetics-related functions. |
| ------------------------------------------------------------------------ |
| r135 | jblyberg | 2010-02-01 17:20:45 -0500 (Mon, 01 Feb 2010) | 3 lines |
| Changed paths: |
| M /trunk/locum-server.php |
| M /trunk/tools/upgrades/2.1/upgrade.sql |
| Changed harvester to incorporate download_link information. |
| Updated SQL schema to store download_link if available. |
| ------------------------------------------------------------------------ |
| r134 | jblyberg | 2010-01-29 15:45:19 -0500 (Fri, 29 Jan 2010) | 2 lines |
| Changed paths: |
| M /trunk/locum.php |
| Updated crc32 function to accomidate 32 bit integer overflow wrap-around. |
| ------------------------------------------------------------------------ |
| r133 | jblyberg | 2010-01-28 18:25:35 -0500 (Thu, 28 Jan 2010) | 2 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| Fixes to get_item_status() -- was not returning total available correctly. |
| ------------------------------------------------------------------------ |
| r132 | jblyberg | 2010-01-27 14:22:17 -0500 (Wed, 27 Jan 2010) | 5 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| M /trunk/locum.php |
| M /trunk/sphinx/sphinx.conf |
| M /trunk/sql/locum_init.sql |
| M /trunk/tools/upgrades/2.1/upgrade.sql |
| Updated some SQL issues with the upgrade manifest. |
| Fixed the facet heap table SQL structure to use UTF-8 |
| Fixed a compatibility issue with locum-client and Sphinx 0.9.9 |
| Updated Sphinx conf to do better single-word title matching |
| ------------------------------------------------------------------------ |
| r130 | jblyberg | 2009-12-28 11:39:57 -0500 (Mon, 28 Dec 2009) | 2 lines |
| Changed paths: |
| A /trunk/COPYRIGHT.txt |
| A /trunk/INSTALL.txt |
| A /trunk/LICENSE.txt |
| A /trunk/MAINTAINERS.txt |
| Added Distribution documents. |
| ------------------------------------------------------------------------ |
| r129 | jblyberg | 2009-12-28 11:33:46 -0500 (Mon, 28 Dec 2009) | 2 lines |
| Changed paths: |
| M /trunk/CHANGELOG.txt |
| M /trunk/sql/scas_locum.sql |
| Updated SQL schema, Changelog. |
| ------------------------------------------------------------------------ |
| r128 | jblyberg | 2009-12-15 16:37:41 -0500 (Tue, 15 Dec 2009) | 2 lines |
| Changed paths: |
| M /trunk/sphinx/sphinx.conf |
| /tags/1.1.0-rc3/sql/locum_init.sql |
|---|
| New file |
| 0,0 → 1,22 |
| -- |
| -- You need to put something like this in your my.cnf file under [mysqld] : |
| -- |
| -- max_heap_table_size = 200M |
| -- init_file = /path/to/locum_init.sql |
| -- |
| -- Change this to whatever your DB name is |
| USE scas; |
| -- No need to change anything below here |
| DROP TABLE IF EXISTS locum_facet_heap; |
| CREATE TABLE locum_facet_heap ENGINE=MEMORY CHARACTER SET utf8 COLLATE utf8_general_ci SELECT locum_bib_items.bnum, series, mat_code, loc_code, lang, pub_year, TRUNCATE(pub_year/10,0)*10 AS pub_decade, bib_lastupdate FROM locum_bib_items LEFT JOIN locum_availability on locum_bib_items.bnum = locum_availability.bnum WHERE active = '1'; |
| ALTER TABLE locum_facet_heap ADD PRIMARY KEY (bnum); |
| ALTER TABLE locum_facet_heap ADD INDEX USING BTREE (series); |
| ALTER TABLE locum_facet_heap ADD INDEX USING BTREE (mat_code); |
| ALTER TABLE locum_facet_heap ADD INDEX USING BTREE (loc_code); |
| ALTER TABLE locum_facet_heap ADD INDEX USING BTREE (lang); |
| ALTER TABLE locum_facet_heap ADD INDEX USING BTREE (pub_year); |
| ALTER TABLE locum_facet_heap ADD INDEX USING BTREE (pub_decade); |
| ALTER TABLE locum_facet_heap ADD INDEX USING BTREE (bib_lastupdate); |
| /tags/1.1.0-rc3/sql/scas_locum.sql |
|---|
| New file |
| 0,0 → 1,159 |
| -- phpMyAdmin SQL Dump |
| -- version 2.11.8.1deb5+lenny3 |
| -- http://www.phpmyadmin.net |
| -- |
| -- Host: localhost |
| -- Generation Time: Feb 24, 2010 at 05:29 PM |
| -- Server version: 5.0.51 |
| -- PHP Version: 5.2.6-1+lenny4 |
| SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; |
| -- |
| -- Database: `scas` |
| -- |
| -- -------------------------------------------------------- |
| CREATE DATABASE IF NOT EXISTS `scas`; |
| USE scas; |
| -- -------------------------------------------------------- |
| -- |
| -- Table structure for table `locum_availability` |
| -- |
| CREATE TABLE IF NOT EXISTS `locum_availability` ( |
| `bnum` int(12) unsigned NOT NULL, |
| `available` text, |
| `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, |
| PRIMARY KEY (`bnum`), |
| KEY `timestamp` (`timestamp`) |
| ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
| -- -------------------------------------------------------- |
| -- |
| -- Table structure for table `locum_avail_ages` |
| -- |
| CREATE TABLE IF NOT EXISTS `locum_avail_ages` ( |
| `bnum` int(12) NOT NULL, |
| `age` char(12) NOT NULL, |
| `count_avail` int(6) NOT NULL default '0', |
| `count_total` int(6) NOT NULL default '0', |
| `timestamp` datetime NOT NULL, |
| KEY `bnum` (`bnum`,`age`,`count_avail`,`timestamp`) |
| ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
| -- -------------------------------------------------------- |
| -- |
| -- Table structure for table `locum_avail_branches` |
| -- |
| CREATE TABLE IF NOT EXISTS `locum_avail_branches` ( |
| `bnum` int(12) NOT NULL, |
| `branch` char(12) NOT NULL, |
| `count_avail` int(6) NOT NULL default '0', |
| `count_total` int(6) NOT NULL default '0', |
| `timestamp` datetime NOT NULL, |
| KEY `bnum` (`bnum`,`branch`,`count_avail`,`timestamp`) |
| ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
| -- -------------------------------------------------------- |
| -- |
| -- Table structure for table `locum_bib_items` |
| -- |
| CREATE TABLE IF NOT EXISTS `locum_bib_items` ( |
| `bnum` int(12) NOT NULL, |
| `author` char(254) default NULL, |
| `addl_author` mediumtext, |
| `title` varchar(512) NOT NULL, |
| `title_medium` char(64) default NULL, |
| `edition` char(64) default NULL, |
| `series` char(254) default NULL, |
| `callnum` char(48) default NULL, |
| `pub_info` char(254) default NULL, |
| `pub_year` smallint(4) default NULL, |
| `stdnum` char(32) default NULL, |
| `upc` bigint(20) unsigned zerofill NOT NULL, |
| `lccn` char(32) default NULL, |
| `descr` mediumtext, |
| `notes` mediumtext, |
| `subjects` mediumtext, |
| `lang` char(12) default NULL, |
| `loc_code` char(7) NOT NULL, |
| `mat_code` char(7) NOT NULL, |
| `cover_img` char(254) default NULL, |
| `download_link` text, |
| `modified` datetime NOT NULL, |
| `bib_created` date NOT NULL, |
| `bib_lastupdate` date NOT NULL, |
| `bib_prevupdate` date NOT NULL, |
| `bib_revs` int(4) NOT NULL, |
| `active` enum('0','1') NOT NULL default '1', |
| PRIMARY KEY (`bnum`), |
| KEY `modified` (`modified`), |
| KEY `mat_code` (`mat_code`), |
| KEY `pub_year` (`pub_year`), |
| KEY `active` (`active`), |
| KEY `bib_lastupdate` (`bib_lastupdate`) |
| ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Item table for Bib records'; |
| -- -------------------------------------------------------- |
| -- |
| -- Table structure for table `locum_bib_items_subject` |
| -- |
| CREATE TABLE IF NOT EXISTS `locum_bib_items_subject` ( |
| `bnum` int(12) NOT NULL, |
| `subjects` char(254) NOT NULL, |
| KEY `bnum` (`bnum`), |
| KEY `subjects` (`subjects`) |
| ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Table for bibliographic subject headings'; |
| -- -------------------------------------------------------- |
| -- |
| -- Table structure for table `locum_holds_count` |
| -- |
| CREATE TABLE IF NOT EXISTS `locum_holds_count` ( |
| `bnum` int(12) NOT NULL, |
| `hold_count_week` int(6) NOT NULL default '0', |
| `hold_count_month` int(6) NOT NULL default '0', |
| `hold_count_year` int(6) NOT NULL default '0', |
| `hold_count_total` int(6) NOT NULL default '0', |
| PRIMARY KEY (`bnum`) |
| ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
| -- -------------------------------------------------------- |
| -- |
| -- Table structure for table `locum_holds_placed` |
| -- |
| CREATE TABLE IF NOT EXISTS `locum_holds_placed` ( |
| `bnum` int(12) NOT NULL, |
| `hold_date` date NOT NULL, |
| KEY `bnum` (`bnum`,`hold_date`) |
| ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
| -- -------------------------------------------------------- |
| -- |
| -- Table structure for table `locum_syndetics_links` |
| -- |
| CREATE TABLE IF NOT EXISTS `locum_syndetics_links` ( |
| `isbn` char(32) NOT NULL, |
| `links` char(254) NOT NULL, |
| `updated` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, |
| PRIMARY KEY (`isbn`) |
| ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Caches Syndetics content availability'; |
| /tags/1.1.0-rc3/LICENSE.txt |
|---|
| New file |
| 0,0 → 1,674 |
| GNU GENERAL PUBLIC LICENSE |
| Version 3, 29 June 2007 |
| Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> |
| Everyone is permitted to copy and distribute verbatim copies |
| of this license document, but changing it is not allowed. |
| Preamble |
| The GNU General Public License is a free, copyleft license for |
| software and other kinds of works. |
| The licenses for most software and other practical works are designed |
| to take away your freedom to share and change the works. By contrast, |
| the GNU General Public License is intended to guarantee your freedom to |
| share and change all versions of a program--to make sure it remains free |
| software for all its users. We, the Free Software Foundation, use the |
| GNU General Public License for most of our software; it applies also to |
| any other work released this way by its authors. You can apply it to |
| your programs, too. |
| When we speak of free software, we are referring to freedom, not |
| price. Our General Public Licenses are designed to make sure that you |
| have the freedom to distribute copies of free software (and charge for |
| them if you wish), that you receive source code or can get it if you |
| want it, that you can change the software or use pieces of it in new |
| free programs, and that you know you can do these things. |
| To protect your rights, we need to prevent others from denying you |
| these rights or asking you to surrender the rights. Therefore, you have |
| certain responsibilities if you distribute copies of the software, or if |
| you modify it: responsibilities to respect the freedom of others. |
| For example, if you distribute copies of such a program, whether |
| gratis or for a fee, you must pass on to the recipients the same |
| freedoms that you received. You must make sure that they, too, receive |
| or can get the source code. And you must show them these terms so they |
| know their rights. |
| Developers that use the GNU GPL protect your rights with two steps: |
| (1) assert copyright on the software, and (2) offer you this License |
| giving you legal permission to copy, distribute and/or modify it. |
| For the developers' and authors' protection, the GPL clearly explains |
| that there is no warranty for this free software. For both users' and |
| authors' sake, the GPL requires that modified versions be marked as |
| changed, so that their problems will not be attributed erroneously to |
| authors of previous versions. |
| Some devices are designed to deny users access to install or run |
| modified versions of the software inside them, although the manufacturer |
| can do so. This is fundamentally incompatible with the aim of |
| protecting users' freedom to change the software. The systematic |
| pattern of such abuse occurs in the area of products for individuals to |
| use, which is precisely where it is most unacceptable. Therefore, we |
| have designed this version of the GPL to prohibit the practice for those |
| products. If such problems arise substantially in other domains, we |
| stand ready to extend this provision to those domains in future versions |
| of the GPL, as needed to protect the freedom of users. |
| Finally, every program is threatened constantly by software patents. |
| States should not allow patents to restrict development and use of |
| software on general-purpose computers, but in those that do, we wish to |
| avoid the special danger that patents applied to a free program could |
| make it effectively proprietary. To prevent this, the GPL assures that |
| patents cannot be used to render the program non-free. |
| The precise terms and conditions for copying, distribution and |
| modification follow. |
| TERMS AND CONDITIONS |
| 0. Definitions. |
| "This License" refers to version 3 of the GNU General Public License. |
| "Copyright" also means copyright-like laws that apply to other kinds of |
| works, such as semiconductor masks. |
| "The Program" refers to any copyrightable work licensed under this |
| License. Each licensee is addressed as "you". "Licensees" and |
| "recipients" may be individuals or organizations. |
| To "modify" a work means to copy from or adapt all or part of the work |
| in a fashion requiring copyright permission, other than the making of an |
| exact copy. The resulting work is called a "modified version" of the |
| earlier work or a work "based on" the earlier work. |
| A "covered work" means either the unmodified Program or a work based |
| on the Program. |
| To "propagate" a work means to do anything with it that, without |
| permission, would make you directly or secondarily liable for |
| infringement under applicable copyright law, except executing it on a |
| computer or modifying a private copy. Propagation includes copying, |
| distribution (with or without modification), making available to the |
| public, and in some countries other activities as well. |
| To "convey" a work means any kind of propagation that enables other |
| parties to make or receive copies. Mere interaction with a user through |
| a computer network, with no transfer of a copy, is not conveying. |
| An interactive user interface displays "Appropriate Legal Notices" |
| to the extent that it includes a convenient and prominently visible |
| feature that (1) displays an appropriate copyright notice, and (2) |
| tells the user that there is no warranty for the work (except to the |
| extent that warranties are provided), that licensees may convey the |
| work under this License, and how to view a copy of this License. If |
| the interface presents a list of user commands or options, such as a |
| menu, a prominent item in the list meets this criterion. |
| 1. Source Code. |
| The "source code" for a work means the preferred form of the work |
| for making modifications to it. "Object code" means any non-source |
| form of a work. |
| A "Standard Interface" means an interface that either is an official |
| standard defined by a recognized standards body, or, in the case of |
| interfaces specified for a particular programming language, one that |
| is widely used among developers working in that language. |
| The "System Libraries" of an executable work include anything, other |
| than the work as a whole, that (a) is included in the normal form of |
| packaging a Major Component, but which is not part of that Major |
| Component, and (b) serves only to enable use of the work with that |
| Major Component, or to implement a Standard Interface for which an |
| implementation is available to the public in source code form. A |
| "Major Component", in this context, means a major essential component |
| (kernel, window system, and so on) of the specific operating system |
| (if any) on which the executable work runs, or a compiler used to |
| produce the work, or an object code interpreter used to run it. |
| The "Corresponding Source" for a work in object code form means all |
| the source code needed to generate, install, and (for an executable |
| work) run the object code and to modify the work, including scripts to |
| control those activities. However, it does not include the work's |
| System Libraries, or general-purpose tools or generally available free |
| programs which are used unmodified in performing those activities but |
| which are not part of the work. For example, Corresponding Source |
| includes interface definition files associated with source files for |
| the work, and the source code for shared libraries and dynamically |
| linked subprograms that the work is specifically designed to require, |
| such as by intimate data communication or control flow between those |
| subprograms and other parts of the work. |
| The Corresponding Source need not include anything that users |
| can regenerate automatically from other parts of the Corresponding |
| Source. |
| The Corresponding Source for a work in source code form is that |
| same work. |
| 2. Basic Permissions. |
| All rights granted under this License are granted for the term of |
| copyright on the Program, and are irrevocable provided the stated |
| conditions are met. This License explicitly affirms your unlimited |
| permission to run the unmodified Program. The output from running a |
| covered work is covered by this License only if the output, given its |
| content, constitutes a covered work. This License acknowledges your |
| rights of fair use or other equivalent, as provided by copyright law. |
| You may make, run and propagate covered works that you do not |
| convey, without conditions so long as your license otherwise remains |
| in force. You may convey covered works to others for the sole purpose |
| of having them make modifications exclusively for you, or provide you |
| with facilities for running those works, provided that you comply with |
| the terms of this License in conveying all material for which you do |
| not control copyright. Those thus making or running the covered works |
| for you must do so exclusively on your behalf, under your direction |
| and control, on terms that prohibit them from making any copies of |
| your copyrighted material outside their relationship with you. |
| Conveying under any other circumstances is permitted solely under |
| the conditions stated below. Sublicensing is not allowed; section 10 |
| makes it unnecessary. |
| 3. Protecting Users' Legal Rights From Anti-Circumvention Law. |
| No covered work shall be deemed part of an effective technological |
| measure under any applicable law fulfilling obligations under article |
| 11 of the WIPO copyright treaty adopted on 20 December 1996, or |
| similar laws prohibiting or restricting circumvention of such |
| measures. |
| When you convey a covered work, you waive any legal power to forbid |
| circumvention of technological measures to the extent such circumvention |
| is effected by exercising rights under this License with respect to |
| the covered work, and you disclaim any intention to limit operation or |
| modification of the work as a means of enforcing, against the work's |
| users, your or third parties' legal rights to forbid circumvention of |
| technological measures. |
| 4. Conveying Verbatim Copies. |
| You may convey verbatim copies of the Program's source code as you |
| receive it, in any medium, provided that you conspicuously and |
| appropriately publish on each copy an appropriate copyright notice; |
| keep intact all notices stating that this License and any |
| non-permissive terms added in accord with section 7 apply to the code; |
| keep intact all notices of the absence of any warranty; and give all |
| recipients a copy of this License along with the Program. |
| You may charge any price or no price for each copy that you convey, |
| and you may offer support or warranty protection for a fee. |
| 5. Conveying Modified Source Versions. |
| You may convey a work based on the Program, or the modifications to |
| produce it from the Program, in the form of source code under the |
| terms of section 4, provided that you also meet all of these conditions: |
| a) The work must carry prominent notices stating that you modified |
| it, and giving a relevant date. |
| b) The work must carry prominent notices stating that it is |
| released under this License and any conditions added under section |
| 7. This requirement modifies the requirement in section 4 to |
| "keep intact all notices". |
| c) You must license the entire work, as a whole, under this |
| License to anyone who comes into possession of a copy. This |
| License will therefore apply, along with any applicable section 7 |
| additional terms, to the whole of the work, and all its parts, |
| regardless of how they are packaged. This License gives no |
| permission to license the work in any other way, but it does not |
| invalidate such permission if you have separately received it. |
| d) If the work has interactive user interfaces, each must display |
| Appropriate Legal Notices; however, if the Program has interactive |
| interfaces that do not display Appropriate Legal Notices, your |
| work need not make them do so. |
| A compilation of a covered work with other separate and independent |
| works, which are not by their nature extensions of the covered work, |
| and which are not combined with it such as to form a larger program, |
| in or on a volume of a storage or distribution medium, is called an |
| "aggregate" if the compilation and its resulting copyright are not |
| used to limit the access or legal rights of the compilation's users |
| beyond what the individual works permit. Inclusion of a covered work |
| in an aggregate does not cause this License to apply to the other |
| parts of the aggregate. |
| 6. Conveying Non-Source Forms. |
| You may convey a covered work in object code form under the terms |
| of sections 4 and 5, provided that you also convey the |
| machine-readable Corresponding Source under the terms of this License, |
| in one of these ways: |
| a) Convey the object code in, or embodied in, a physical product |
| (including a physical distribution medium), accompanied by the |
| Corresponding Source fixed on a durable physical medium |
| customarily used for software interchange. |
| b) Convey the object code in, or embodied in, a physical product |
| (including a physical distribution medium), accompanied by a |
| written offer, valid for at least three years and valid for as |
| long as you offer spare parts or customer support for that product |
| model, to give anyone who possesses the object code either (1) a |
| copy of the Corresponding Source for all the software in the |
| product that is covered by this License, on a durable physical |
| medium customarily used for software interchange, for a price no |
| more than your reasonable cost of physically performing this |
| conveying of source, or (2) access to copy the |
| Corresponding Source from a network server at no charge. |
| c) Convey individual copies of the object code with a copy of the |
| written offer to provide the Corresponding Source. This |
| alternative is allowed only occasionally and noncommercially, and |
| only if you received the object code with such an offer, in accord |
| with subsection 6b. |
| d) Convey the object code by offering access from a designated |
| place (gratis or for a charge), and offer equivalent access to the |
| Corresponding Source in the same way through the same place at no |
| further charge. You need not require recipients to copy the |
| Corresponding Source along with the object code. If the place to |
| copy the object code is a network server, the Corresponding Source |
| may be on a different server (operated by you or a third party) |
| that supports equivalent copying facilities, provided you maintain |
| clear directions next to the object code saying where to find the |
| Corresponding Source. Regardless of what server hosts the |
| Corresponding Source, you remain obligated to ensure that it is |
| available for as long as needed to satisfy these requirements. |
| e) Convey the object code using peer-to-peer transmission, provided |
| you inform other peers where the object code and Corresponding |
| Source of the work are being offered to the general public at no |
| charge under subsection 6d. |
| A separable portion of the object code, whose source code is excluded |
| from the Corresponding Source as a System Library, need not be |
| included in conveying the object code work. |
| A "User Product" is either (1) a "consumer product", which means any |
| tangible personal property which is normally used for personal, family, |
| or household purposes, or (2) anything designed or sold for incorporation |
| into a dwelling. In determining whether a product is a consumer product, |
| doubtful cases shall be resolved in favor of coverage. For a particular |
| product received by a particular user, "normally used" refers to a |
| typical or common use of that class of product, regardless of the status |
| of the particular user or of the way in which the particular user |
| actually uses, or expects or is expected to use, the product. A product |
| is a consumer product regardless of whether the product has substantial |
| commercial, industrial or non-consumer uses, unless such uses represent |
| the only significant mode of use of the product. |
| "Installation Information" for a User Product means any methods, |
| procedures, authorization keys, or other information required to install |
| and execute modified versions of a covered work in that User Product from |
| a modified version of its Corresponding Source. The information must |
| suffice to ensure that the continued functioning of the modified object |
| code is in no case prevented or interfered with solely because |
| modification has been made. |
| If you convey an object code work under this section in, or with, or |
| specifically for use in, a User Product, and the conveying occurs as |
| part of a transaction in which the right of possession and use of the |
| User Product is transferred to the recipient in perpetuity or for a |
| fixed term (regardless of how the transaction is characterized), the |
| Corresponding Source conveyed under this section must be accompanied |
| by the Installation Information. But this requirement does not apply |
| if neither you nor any third party retains the ability to install |
| modified object code on the User Product (for example, the work has |
| been installed in ROM). |
| The requirement to provide Installation Information does not include a |
| requirement to continue to provide support service, warranty, or updates |
| for a work that has been modified or installed by the recipient, or for |
| the User Product in which it has been modified or installed. Access to a |
| network may be denied when the modification itself materially and |
| adversely affects the operation of the network or violates the rules and |
| protocols for communication across the network. |
| Corresponding Source conveyed, and Installation Information provided, |
| in accord with this section must be in a format that is publicly |
| documented (and with an implementation available to the public in |
| source code form), and must require no special password or key for |
| unpacking, reading or copying. |
| 7. Additional Terms. |
| "Additional permissions" are terms that supplement the terms of this |
| License by making exceptions from one or more of its conditions. |
| Additional permissions that are applicable to the entire Program shall |
| be treated as though they were included in this License, to the extent |
| that they are valid under applicable law. If additional permissions |
| apply only to part of the Program, that part may be used separately |
| under those permissions, but the entire Program remains governed by |
| this License without regard to the additional permissions. |
| When you convey a copy of a covered work, you may at your option |
| remove any additional permissions from that copy, or from any part of |
| it. (Additional permissions may be written to require their own |
| removal in certain cases when you modify the work.) You may place |
| additional permissions on material, added by you to a covered work, |
| for which you have or can give appropriate copyright permission. |
| Notwithstanding any other provision of this License, for material you |
| add to a covered work, you may (if authorized by the copyright holders of |
| that material) supplement the terms of this License with terms: |
| a) Disclaiming warranty or limiting liability differently from the |
| terms of sections 15 and 16 of this License; or |
| b) Requiring preservation of specified reasonable legal notices or |
| author attributions in that material or in the Appropriate Legal |
| Notices displayed by works containing it; or |
| c) Prohibiting misrepresentation of the origin of that material, or |
| requiring that modified versions of such material be marked in |
| reasonable ways as different from the original version; or |
| d) Limiting the use for publicity purposes of names of licensors or |
| authors of the material; or |
| e) Declining to grant rights under trademark law for use of some |
| trade names, trademarks, or service marks; or |
| f) Requiring indemnification of licensors and authors of that |
| material by anyone who conveys the material (or modified versions of |
| it) with contractual assumptions of liability to the recipient, for |
| any liability that these contractual assumptions directly impose on |
| those licensors and authors. |
| All other non-permissive additional terms are considered "further |
| restrictions" within the meaning of section 10. If the Program as you |
| received it, or any part of it, contains a notice stating that it is |
| governed by this License along with a term that is a further |
| restriction, you may remove that term. If a license document contains |
| a further restriction but permits relicensing or conveying under this |
| License, you may add to a covered work material governed by the terms |
| of that license document, provided that the further restriction does |
| not survive such relicensing or conveying. |
| If you add terms to a covered work in accord with this section, you |
| must place, in the relevant source files, a statement of the |
| additional terms that apply to those files, or a notice indicating |
| where to find the applicable terms. |
| Additional terms, permissive or non-permissive, may be stated in the |
| form of a separately written license, or stated as exceptions; |
| the above requirements apply either way. |
| 8. Termination. |
| You may not propagate or modify a covered work except as expressly |
| provided under this License. Any attempt otherwise to propagate or |
| modify it is void, and will automatically terminate your rights under |
| this License (including any patent licenses granted under the third |
| paragraph of section 11). |
| However, if you cease all violation of this License, then your |
| license from a particular copyright holder is reinstated (a) |
| provisionally, unless and until the copyright holder explicitly and |
| finally terminates your license, and (b) permanently, if the copyright |
| holder fails to notify you of the violation by some reasonable means |
| prior to 60 days after the cessation. |
| Moreover, your license from a particular copyright holder is |
| reinstated permanently if the copyright holder notifies you of the |
| violation by some reasonable means, this is the first time you have |
| received notice of violation of this License (for any work) from that |
| copyright holder, and you cure the violation prior to 30 days after |
| your receipt of the notice. |
| Termination of your rights under this section does not terminate the |
| licenses of parties who have received copies or rights from you under |
| this License. If your rights have been terminated and not permanently |
| reinstated, you do not qualify to receive new licenses for the same |
| material under section 10. |
| 9. Acceptance Not Required for Having Copies. |
| You are not required to accept this License in order to receive or |
| run a copy of the Program. Ancillary propagation of a covered work |
| occurring solely as a consequence of using peer-to-peer transmission |
| to receive a copy likewise does not require acceptance. However, |
| nothing other than this License grants you permission to propagate or |
| modify any covered work. These actions infringe copyright if you do |
| not accept this License. Therefore, by modifying or propagating a |
| covered work, you indicate your acceptance of this License to do so. |
| 10. Automatic Licensing of Downstream Recipients. |
| Each time you convey a covered work, the recipient automatically |
| receives a license from the original licensors, to run, modify and |
| propagate that work, subject to this License. You are not responsible |
| for enforcing compliance by third parties with this License. |
| An "entity transaction" is a transaction transferring control of an |
| organization, or substantially all assets of one, or subdividing an |
| organization, or merging organizations. If propagation of a covered |
| work results from an entity transaction, each party to that |
| transaction who receives a copy of the work also receives whatever |
| licenses to the work the party's predecessor in interest had or could |
| give under the previous paragraph, plus a right to possession of the |
| Corresponding Source of the work from the predecessor in interest, if |
| the predecessor has it or can get it with reasonable efforts. |
| You may not impose any further restrictions on the exercise of the |
| rights granted or affirmed under this License. For example, you may |
| not impose a license fee, royalty, or other charge for exercise of |
| rights granted under this License, and you may not initiate litigation |
| (including a cross-claim or counterclaim in a lawsuit) alleging that |
| any patent claim is infringed by making, using, selling, offering for |
| sale, or importing the Program or any portion of it. |
| 11. Patents. |
| A "contributor" is a copyright holder who authorizes use under this |
| License of the Program or a work on which the Program is based. The |
| work thus licensed is called the contributor's "contributor version". |
| A contributor's "essential patent claims" are all patent claims |
| owned or controlled by the contributor, whether already acquired or |
| hereafter acquired, that would be infringed by some manner, permitted |
| by this License, of making, using, or selling its contributor version, |
| but do not include claims that would be infringed only as a |
| consequence of further modification of the contributor version. For |
| purposes of this definition, "control" includes the right to grant |
| patent sublicenses in a manner consistent with the requirements of |
| this License. |
| Each contributor grants you a non-exclusive, worldwide, royalty-free |
| patent license under the contributor's essential patent claims, to |
| make, use, sell, offer for sale, import and otherwise run, modify and |
| propagate the contents of its contributor version. |
| In the following three paragraphs, a "patent license" is any express |
| agreement or commitment, however denominated, not to enforce a patent |
| (such as an express permission to practice a patent or covenant not to |
| sue for patent infringement). To "grant" such a patent license to a |
| party means to make such an agreement or commitment not to enforce a |
| patent against the party. |
| If you convey a covered work, knowingly relying on a patent license, |
| and the Corresponding Source of the work is not available for anyone |
| to copy, free of charge and under the terms of this License, through a |
| publicly available network server or other readily accessible means, |
| then you must either (1) cause the Corresponding Source to be so |
| available, or (2) arrange to deprive yourself of the benefit of the |
| patent license for this particular work, or (3) arrange, in a manner |
| consistent with the requirements of this License, to extend the patent |
| license to downstream recipients. "Knowingly relying" means you have |
| actual knowledge that, but for the patent license, your conveying the |
| covered work in a country, or your recipient's use of the covered work |
| in a country, would infringe one or more identifiable patents in that |
| country that you have reason to believe are valid. |
| If, pursuant to or in connection with a single transaction or |
| arrangement, you convey, or propagate by procuring conveyance of, a |
| covered work, and grant a patent license to some of the parties |
| receiving the covered work authorizing them to use, propagate, modify |
| or convey a specific copy of the covered work, then the patent license |
| you grant is automatically extended to all recipients of the covered |
| work and works based on it. |
| A patent license is "discriminatory" if it does not include within |
| the scope of its coverage, prohibits the exercise of, or is |
| conditioned on the non-exercise of one or more of the rights that are |
| specifically granted under this License. You may not convey a covered |
| work if you are a party to an arrangement with a third party that is |
| in the business of distributing software, under which you make payment |
| to the third party based on the extent of your activity of conveying |
| the work, and under which the third party grants, to any of the |
| parties who would receive the covered work from you, a discriminatory |
| patent license (a) in connection with copies of the covered work |
| conveyed by you (or copies made from those copies), or (b) primarily |
| for and in connection with specific products or compilations that |
| contain the covered work, unless you entered into that arrangement, |
| or that patent license was granted, prior to 28 March 2007. |
| Nothing in this License shall be construed as excluding or limiting |
| any implied license or other defenses to infringement that may |
| otherwise be available to you under applicable patent law. |
| 12. No Surrender of Others' Freedom. |
| If conditions are imposed on you (whether by court order, agreement or |
| otherwise) that contradict the conditions of this License, they do not |
| excuse you from the conditions of this License. If you cannot convey a |
| covered work so as to satisfy simultaneously your obligations under this |
| License and any other pertinent obligations, then as a consequence you may |
| not convey it at all. For example, if you agree to terms that obligate you |
| to collect a royalty for further conveying from those to whom you convey |
| the Program, the only way you could satisfy both those terms and this |
| License would be to refrain entirely from conveying the Program. |
| 13. Use with the GNU Affero General Public License. |
| Notwithstanding any other provision of this License, you have |
| permission to link or combine any covered work with a work licensed |
| under version 3 of the GNU Affero General Public License into a single |
| combined work, and to convey the resulting work. The terms of this |
| License will continue to apply to the part which is the covered work, |
| but the special requirements of the GNU Affero General Public License, |
| section 13, concerning interaction through a network will apply to the |
| combination as such. |
| 14. Revised Versions of this License. |
| The Free Software Foundation may publish revised and/or new versions of |
| the GNU General Public License from time to time. Such new versions will |
| be similar in spirit to the present version, but may differ in detail to |
| address new problems or concerns. |
| Each version is given a distinguishing version number. If the |
| Program specifies that a certain numbered version of the GNU General |
| Public License "or any later version" applies to it, you have the |
| option of following the terms and conditions either of that numbered |
| version or of any later version published by the Free Software |
| Foundation. If the Program does not specify a version number of the |
| GNU General Public License, you may choose any version ever published |
| by the Free Software Foundation. |
| If the Program specifies that a proxy can decide which future |
| versions of the GNU General Public License can be used, that proxy's |
| public statement of acceptance of a version permanently authorizes you |
| to choose that version for the Program. |
| Later license versions may give you additional or different |
| permissions. However, no additional obligations are imposed on any |
| author or copyright holder as a result of your choosing to follow a |
| later version. |
| 15. Disclaimer of Warranty. |
| THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY |
| APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT |
| HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY |
| OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, |
| THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM |
| IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF |
| ALL NECESSARY SERVICING, REPAIR OR CORRECTION. |
| 16. Limitation of Liability. |
| IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS |
| THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY |
| GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE |
| USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF |
| DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD |
| PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), |
| EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF |
| SUCH DAMAGES. |
| 17. Interpretation of Sections 15 and 16. |
| If the disclaimer of warranty and limitation of liability provided |
| above cannot be given local legal effect according to their terms, |
| reviewing courts shall apply local law that most closely approximates |
| an absolute waiver of all civil liability in connection with the |
| Program, unless a warranty or assumption of liability accompanies a |
| copy of the Program in return for a fee. |
| END OF TERMS AND CONDITIONS |
| How to Apply These Terms to Your New Programs |
| If you develop a new program, and you want it to be of the greatest |
| possible use to the public, the best way to achieve this is to make it |
| free software which everyone can redistribute and change under these terms. |
| To do so, attach the following notices to the program. It is safest |
| to attach them to the start of each source file to most effectively |
| state the exclusion of warranty; and each file should have at least |
| the "copyright" line and a pointer to where the full notice is found. |
| <one line to give the program's name and a brief idea of what it does.> |
| Copyright (C) <year> <name of author> |
| This program is free software: you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation, either version 3 of the License, or |
| (at your option) any later version. |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| You should have received a copy of the GNU General Public License |
| along with this program. If not, see <http://www.gnu.org/licenses/>. |
| Also add information on how to contact you by electronic and paper mail. |
| If the program does terminal interaction, make it output a short |
| notice like this when it starts in an interactive mode: |
| <program> Copyright (C) <year> <name of author> |
| This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
| This is free software, and you are welcome to redistribute it |
| under certain conditions; type `show c' for details. |
| The hypothetical commands `show w' and `show c' should show the appropriate |
| parts of the General Public License. Of course, your program's commands |
| might be different; for a GUI interface, you would use an "about box". |
| You should also get your employer (if you work as a programmer) or school, |
| if any, to sign a "copyright disclaimer" for the program, if necessary. |
| For more information on this, and how to apply and follow the GNU GPL, see |
| <http://www.gnu.org/licenses/>. |
| The GNU General Public License does not permit incorporating your program |
| into proprietary programs. If your program is a subroutine library, you |
| may consider it more useful to permit linking proprietary applications with |
| the library. If this is what you want to do, use the GNU Lesser General |
| Public License instead of this License. But first, please read |
| <http://www.gnu.org/philosophy/why-not-lgpl.html>. |
| /tags/1.1.0-rc3/tools/update-holds.php |
|---|
| New file |
| 0,0 → 1,17 |
| #!/usr/bin/php5 -q |
| <?php |
| // Init scripts, library locations, and binaries |
| $locum_lib_dir = '/usr/local/lib/locum'; |
| $mysql_init_script = '/etc/init.d/mysql'; |
| $sphinx_init_script = '/etc/init.d/sphinx'; |
| $sphinx_indexer = '/usr/local/sphinx/bin/indexer'; |
| // Include Locum libraries |
| require_once($locum_lib_dir . '/locum-server.php'); |
| $locum = new locum_server; |
| $locum->rebuild_holds_cache(); |
| // Restart services, reindex, etc. |
| $locum->index(); |
| /tags/1.1.0-rc3/tools/harvest.php |
|---|
| New file |
| 0,0 → 1,44 |
| #!/usr/bin/php5 -q |
| <?php |
| // You'll need to change these: |
| $first_record = 1000000; |
| $last_record = 1300000; |
| $large_record_split = 10; |
| // Init scripts, library locations, and binaries |
| $locum_lib_dir = '/usr/local/lib/locum'; |
| $mysql_init_script = '/etc/init.d/mysql'; |
| $sphinx_init_script = '/etc/init.d/sphinx'; |
| $sphinx_indexer = '/usr/local/sphinx/bin/indexer'; |
| // Include Locum libraries |
| require_once($locum_lib_dir . '/locum-server.php'); |
| // Data Set repair |
| $locum = new locum_server; |
| // Older records tend to be much more weeded, so the child processes |
| // that handle the higher bib nums often work much harder and longer. |
| // This is a way around that. |
| if (($last_record - $first_record) > 1000) { |
| $split_amount = ceil(($last_record - $first_record) / $large_record_split); |
| $begin_at_bib = $first_record; |
| for ($i = 0; $i < $large_record_split; $i++){ |
| $split_bib_arr[$i]['first'] = $begin_at_bib; |
| $split_bib_arr[$i]['last'] = $begin_at_bib + $split_amount; |
| $begin_at_bib = $begin_at_bib + $split_amount + 1; |
| } |
| foreach ($split_bib_arr as $split_bib) { |
| $locum->harvest_bibs($split_bib['first'], $split_bib['last']); |
| } |
| } else { |
| $locum->harvest_bibs($first_record, $last_record); |
| } |
| $locum->rebuild_holds_cache(); |
| // Restart services, reindex, etc. |
| shell_exec($mysql_init_script . ' restart'); |
| sleep(2); |
| shell_exec($sphinx_indexer . ' --all --rotate'); |
| /tags/1.1.0-rc3/tools/repair.php |
|---|
| New file |
| 0,0 → 1,40 |
| #!/usr/bin/php5 -q |
| <?php |
| // Init scripts, library locations, and binaries |
| $locum_lib_dir = '/usr/local/lib/locum'; |
| $mysql_init_script = '/etc/init.d/mysql'; |
| $sphinx_init_script = '/etc/init.d/sphinx'; |
| $sphinx_indexer = '/usr/local/sphinx/bin/indexer'; |
| // Include Locum libraries |
| require_once($locum_lib_dir . '/locum-server.php'); |
| // Data Set repair |
| $locum = new locum_server; |
| $db =& MDB2::connect($locum->dsn); |
| $min_bib_result =& $db->query('SELECT MIN(bnum) FROM locum_bib_items'); |
| $min_bib = $min_bib_result->fetchOne(); |
| $max_bib_result =& $db->query('SELECT MAX(bnum) FROM locum_bib_items'); |
| $max_bib = $max_bib_result->fetchOne(); |
| $bnum_result =& $db->query("SELECT bnum FROM locum_bib_items WHERE bnum >= $min_bib AND bnum <= $max_bib"); |
| $bnum_arr = $bnum_result->fetchCol(); |
| $bib_range = array(); |
| for ($i = $min_bib; $i < $max_bib; $i++) { |
| $bib_range[] = $i; |
| } |
| $empty_bibs = array_diff($bib_range, $bnum_arr); |
| foreach ($empty_bibs as $empty_bib) { |
| $locum->harvest_bibs($empty_bib, $empty_bib); |
| } |
| $locum->rebuild_holds_cache(); |
| // Restart services, reindex, etc. |
| shell_exec($mysql_init_script . ' restart'); |
| sleep(2); |
| shell_exec($sphinx_indexer . ' --all --rotate'); |
| /tags/1.1.0-rc3/tools/upgrades/1.1/upgrade.sql |
|---|
| New file |
| 0,0 → 1,52 |
| USE scas; |
| DROP TABLE IF EXISTS `locum_availability`; |
| CREATE TABLE IF NOT EXISTS `locum_availability` ( |
| `bnum` int(12) unsigned NOT NULL, |
| `available` text, |
| `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, |
| PRIMARY KEY (`bnum`), |
| KEY `timestamp` (`timestamp`) |
| ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
| DROP TABLE IF EXISTS `locum_avail_branches`; |
| CREATE TABLE IF NOT EXISTS `locum_avail_branches` ( |
| `bnum` int(12) NOT NULL, |
| `branch` char(12) NOT NULL, |
| `count_avail` int(6) NOT NULL default '0', |
| `count_total` int(6) NOT NULL default '0', |
| `timestamp` datetime NOT NULL, |
| KEY `bnum` (`bnum`,`branch`,`count_avail`,`timestamp`) |
| ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
| DROP TABLE IF EXISTS `locum_avail_ages`; |
| CREATE TABLE IF NOT EXISTS `locum_avail_ages` ( |
| `bnum` int(12) NOT NULL, |
| `age` char(12) NOT NULL, |
| `count_avail` int(6) NOT NULL default '0', |
| `count_total` int(6) NOT NULL default '0', |
| `timestamp` datetime NOT NULL, |
| KEY `bnum` (`bnum`,`age`,`count_avail`,`timestamp`) |
| ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
| CREATE TABLE IF NOT EXISTS `locum_syndetics_links` ( |
| `isbn` char(32) NOT NULL, |
| `links` char(254) NOT NULL, |
| `updated` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, |
| PRIMARY KEY (`isbn`) |
| ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Caches Syndetics content availability'; |
| ALTER TABLE `locum_bib_items` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; |
| ALTER TABLE `locum_bib_items_subject` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; |
| ALTER TABLE `locum_facet_heap` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; |
| ALTER TABLE `locum_holds_count` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; |
| ALTER TABLE `locum_holds_placed` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; |
| ALTER TABLE `locum_bib_items` ADD `upc` BIGINT UNSIGNED ZEROFILL NOT NULL AFTER `stdnum`; |
| ALTER TABLE `locum_bib_items` ADD `download_link` TEXT NULL AFTER `cover_img`; |
| ALTER TABLE `insurge_index` CHANGE `bnum` `bnum` INT( 12 ) NOT NULL; |
| ALTER TABLE `locum_bib_items` CHANGE `bnum` `bnum` INT( 12 ) NOT NULL; |
| ALTER TABLE `locum_bib_items_subject` CHANGE `bnum` `bnum` INT( 12 ) NOT NULL; |
| ALTER TABLE `locum_facet_heap` CHANGE `bnum` `bnum` INT( 12 ) NOT NULL; |
| /tags/1.1.0-rc3/tools/upgrades/1.1/upgrade.php |
|---|
| New file |
| 0,0 → 1,35 |
| #!/usr/bin/php5 -q |
| <?php |
| // You may want/need to change this |
| ini_set('memory_limit', '400M'); |
| // Where is Locum? |
| $locum_lib_dir = '/usr/local/lib/locum'; |
| // Include Locum libraries |
| require_once($locum_lib_dir . '/locum-server.php'); |
| // Fire it up |
| $locum = new locum_server; |
| // Force all records to be updated |
| $db = $locum->db_query("UPDATE locum_bib_items SET bib_last_update = '1970-01-01' WHERE active = '1'"); |
| // Rebuild Facet Heap - first pass |
| $locum->rebuild_facet_heap(); |
| // Data maintenance |
| $locum->verify_bibs(); |
| $locum->new_bib_scan(); |
| $locum->rebuild_holds_cache(); |
| // Rebuild Facet Heap - second pass |
| $locum->rebuild_facet_heap(); |
| // Restart services, reindex, etc. |
| $locum->index(); |
| // This can all be done in situ |
| $locum->verify_status(); |
| $locum->verify_syndetics(); |
| /tags/1.1.0-rc3/tools/maint.php |
|---|
| New file |
| 0,0 → 1,29 |
| #!/usr/bin/php5 -q |
| <?php |
| // You may want/need to change this |
| ini_set('memory_limit', '400M'); |
| // Init scripts, library locations, and binaries |
| $locum_lib_dir = '/usr/local/lib/locum'; |
| // Include Locum libraries |
| require_once($locum_lib_dir . '/locum-server.php'); |
| // Instantiate Locum Server |
| $locum = new locum_server; |
| // Data maintenance |
| $locum->verify_bibs(); |
| $locum->new_bib_scan(); |
| $locum->rebuild_holds_cache(); |
| // Rebuild Facet Heap |
| $locum->rebuild_facet_heap(); |
| // Restart services, reindex, etc. |
| $locum->index(); |
| // This can all be done in situ |
| $locum->verify_status(); |
| $locum->verify_syndetics(); |
| Property changes: |
| Added: svn:executable |
| + * |
| /tags/1.1.0-rc3/locum-client.php |
|---|
| New file |
| 0,0 → 1,969 |
| <?php |
| /** |
| * Locum is a software library that abstracts ILS functionality into a |
| * catalog discovery layer for use with such things as bolt-on OPACs like |
| * SOPAC. |
| * @package Locum |
| * @author John Blyberg |
| */ |
| require_once('locum.php'); |
| /** |
| * The Locum Client class represents the "front end" of Locum. IE, the interactive piece. |
| * This is the class you would use to do searches, place holds, get patron info, etc. |
| * Ideally, this code should never have to be touched. |
| */ |
| class locum_client extends locum { |
| /** |
| * Does an index search via Sphinx and returns the results |
| * |
| * @param string $type Search type. Valid types are: author, title, series, subject, keyword (default) |
| * @param string $term Search term/phrase |
| * @param int $limit Number of results to return |
| * @param int $offset Where to begin result set -- for pagination purposes |
| * @param array $sort_array Numerically keyed array of sort parameters. Valid options are: newest, oldest |
| * @param array $location_array Numerically keyed array of location params. NOT IMPLEMENTED YET |
| * @param array $facet_args String-keyed array of facet parameters. See code below for array structure |
| * @return array String-keyed result set |
| */ |
| public function search($type, $term, $limit, $offset, $sort_opt = NULL, $format_array = array(), $location_array = array(), $facet_args = array(), $override_search_filter = FALSE, $limit_available = FALSE) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($type, $term, $limit, $offset, $sort_opt, $format_array, $location_array, $facet_args, $override_search_filter, $limit_available); |
| } |
| require_once($this->locum_config['sphinx_config']['api_path'] . '/sphinxapi.php'); |
| $db =& MDB2::connect($this->dsn); |
| $term_arr = explode('?', trim(preg_replace('/\//', ' ', $term))); |
| $term = trim($term_arr[0]); |
| if ($term == '*' || $term == '**') { |
| $term = ''; |
| } else { |
| $term_prestrip = $term; |
| //$term = preg_replace('/[^A-Za-z0-9*\- ]/iD', '', $term); |
| $term = preg_replace('/\*\*/','*', $term); |
| } |
| $final_result_set['term'] = $term; |
| $final_result_set['type'] = trim($type); |
| $cl = new SphinxClient(); |
| $cl->SetServer($this->locum_config['sphinx_config']['server_addr'], (int) $this->locum_config['sphinx_config']['server_port']); |
| // Defaults to 'keyword', non-boolean |
| $bool = FALSE; |
| $cl->SetMatchMode(SPH_MATCH_ALL); |
| if(!$term) { |
| // Searches for everything (usually for browsing purposes--Hot/New Items, etc..) |
| $cl->SetMatchMode(SPH_MATCH_ANY); |
| } else { |
| // Is it a boolean search? |
| if(preg_match("/ \| /i", $term) || preg_match("/ \-/i", $term) || preg_match("/ \!/i", $term)) { |
| $cl->SetMatchMode(SPH_MATCH_BOOLEAN); |
| $bool = TRUE; |
| } |
| if(preg_match("/ OR /i", $term)) { |
| $cl->SetMatchMode(SPH_MATCH_BOOLEAN); |
| $term = preg_replace('/ OR /i',' | ',$term); |
| $bool = TRUE; |
| } |
| // Is it a phrase search? |
| if(preg_match("/\"/i", $term) || preg_match("/\@/i", $term)) { |
| $cl->SetMatchMode(SPH_MATCH_EXTENDED2); |
| $bool = TRUE; |
| } |
| } |
| // Set up for the various search types |
| switch ($type) { |
| case 'author': |
| $cl->SetFieldWeights(array('author' => 50, 'addl_author' => 30)); |
| $idx = 'bib_items_author'; |
| break; |
| case 'title': |
| $cl->SetFieldWeights(array('title' => 50, 'title_medium' => 50, 'series' => 30)); |
| $idx = 'bib_items_title'; |
| break; |
| case 'series': |
| $cl->SetFieldWeights(array('title' => 5, 'series' => 80)); |
| $idx = 'bib_items_title'; |
| break; |
| case 'subject': |
| $idx = 'bib_items_subject'; |
| break; |
| case 'callnum': |
| $cl->SetFieldWeights(array('callnum' => 100)); |
| $idx = 'bib_items_callnum'; |
| //$cl->SetMatchMode(SPH_MATCH_ANY); |
| break; |
| case 'tags': |
| $cl->SetFieldWeights(array('tag_idx' => 100)); |
| $idx = 'bib_items_tags'; |
| $cl->SetMatchMode(SPH_MATCH_PHRASE); |
| break; |
| case 'reviews': |
| $cl->SetFieldWeights(array('review_idx' => 100)); |
| $idx = 'bib_items_reviews'; |
| break; |
| case 'keyword': |
| default: |
| $cl->SetFieldWeights(array('title' => 50, 'title_medium' => 50, 'author' => 70, 'addl_author' => 40, 'tag_idx' =>35, 'series' => 25, 'review_idx' => 10, 'notes' => 10, 'subjects' => 5 )); |
| $idx = 'bib_items_keyword'; |
| break; |
| } |
| // Filter out the records we don't want shown, per locum.ini |
| if (!$override_search_filter) { |
| if (trim($this->locum_config['location_limits']['no_search'])) { |
| $cfg_filter_arr = parent::csv_parser($this->locum_config['location_limits']['no_search']); |
| foreach ($cfg_filter_arr as $cfg_filter) { |
| $cfg_filter_vals[] = parent::string_poly($cfg_filter); |
| } |
| $cl->SetFilter('loc_code', $cfg_filter_vals, TRUE); |
| } |
| } |
| // Valid sort types are 'newest' and 'oldest'. Default is relevance. |
| switch($sort_opt) { |
| case 'newest': |
| $cl->SetSortMode(SPH_SORT_EXTENDED, 'pub_year DESC, @relevance DESC'); |
| break; |
| case 'oldest': |
| $cl->SetSortMode(SPH_SORT_EXTENDED, 'pub_year ASC, @relevance DESC'); |
| break; |
| case 'catalog_newest': |
| $cl->SetSortMode(SPH_SORT_EXTENDED, 'bib_created DESC, @relevance DESC'); |
| break; |
| case 'catalog_oldest': |
| $cl->SetSortMode(SPH_SORT_EXTENDED, 'bib_created ASC, @relevance DESC'); |
| break; |
| case 'title': |
| $cl->SetSortMode(SPH_SORT_ATTR_ASC, 'title_ord'); |
| break; |
| case 'author': |
| $cl->SetSortMode(SPH_SORT_EXTENDED, 'author_null ASC, author_ord ASC'); |
| break; |
| case 'top_rated': |
| $cl->SetSortMode(SPH_SORT_ATTR_DESC, 'rating_idx'); |
| break; |
| case 'popular_week': |
| $cl->SetSortMode(SPH_SORT_ATTR_DESC, 'hold_count_week'); |
| break; |
| case 'popular_month': |
| $cl->SetSortMode(SPH_SORT_ATTR_DESC, 'hold_count_month'); |
| break; |
| case 'popular_year': |
| $cl->SetSortMode(SPH_SORT_ATTR_DESC, 'hold_count_year'); |
| break; |
| case 'popular_total': |
| $cl->SetSortMode(SPH_SORT_ATTR_DESC, 'hold_count_total'); |
| break; |
| case 'atoz': |
| $cl->SetSortMode(SPH_SORT_ATTR_ASC, 'title_ord'); |
| break; |
| case 'ztoa': |
| $cl->SetSortMode(SPH_SORT_ATTR_DESC, 'title_ord'); |
| break; |
| default: |
| if ($type == 'title') { |
| // We get better results in title matches if we also rank by title length |
| $cl->SetSortMode(SPH_SORT_EXTENDED, 'titlelength ASC, @relevance DESC'); |
| } else { |
| $cl->SetSortMode(SPH_SORT_EXTENDED, '@relevance DESC'); |
| } |
| break; |
| } |
| // Filter by material types |
| if (is_array($format_array)) { |
| foreach ($format_array as $format) { |
| if (strtolower($format) != 'all') { |
| $filter_arr_mat[] = parent::string_poly(trim($format)); |
| } |
| } |
| if (count($filter_arr_mat)) { $cl->SetFilter('mat_code', $filter_arr_mat); } |
| } |
| // Filter by location |
| if (count($location_array)) { |
| foreach ($location_array as $location) { |
| if (strtolower($location) != 'all') { |
| $filter_arr_loc[] = parent::string_poly(trim($location)); |
| } |
| } |
| if (count($filter_arr_loc)) { $cl->SetFilter('loc_code', $filter_arr_loc); } |
| } |
| $cl->SetRankingMode(SPH_RANK_WORDCOUNT); |
| $cl->SetLimits(0, 5000, 5000); |
| $sph_res_all = $cl->Query($term, $idx); // Grab all the data for the facetizer |
| // If original match didn't return any results, try a proximity search |
| if(empty($sph_res_all['matches']) && $bool == FALSE && $term != "*" && $type != "tags") { |
| $term = '"' . $term . '"/1'; |
| $cl->SetMatchMode(SPH_MATCH_EXTENDED2); |
| $sph_res_all = $cl->Query($term, $idx); |
| $forcedchange = 'yes'; |
| } |
| // Paging/browsing through the result set. |
| $cl->SetLimits((int) $offset, (int) $limit); |
| // And finally.... we search. |
| $sph_res = $cl->Query($term, $idx); |
| // Include descriptors |
| $final_result_set['num_hits'] = $sph_res['total']; |
| if ($sph_res['total'] <= $this->locum_config['api_config']['suggestion_threshold']) { |
| if ($this->locum_config['api_config']['use_yahoo_suggest'] == TRUE) { |
| $final_result_set['suggestion'] = self::yahoo_suggest($term_prestrip); |
| } |
| } |
| if (is_array($sph_res['matches'])) { |
| foreach ($sph_res['matches'] as $bnum => $attr) { |
| $bib_hits[] = $bnum; |
| } |
| } |
| if (is_array($sph_res_all['matches'])) { |
| foreach ($sph_res_all['matches'] as $bnum => $attr) { |
| $bib_hits_all[] = $bnum; |
| } |
| } |
| // Limit list to available |
| if ($limit_available && $final_result_set['num_hits'] && (array_key_exists($limit_available, $this->locum_config['branches']) || $limit_available == 'any')) { |
| $limit_available = trim(strval($limit_available)); |
| // Remove bibs that we know are not available |
| $cache_cutoff = date("Y-m-d H:i:00", time() - (60 * $this->locum_config['avail_cache']['cache_cutoff'])); |
| // Remove bibs that are not in this location |
| $utf = "SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'"; |
| $utfprep = $db->query($utf); |
| $sql = "SELECT bnum, branch, count_avail FROM locum_avail_branches WHERE bnum IN (" . implode(", ", $bib_hits_all) . ") AND timestamp > '$cache_cutoff'"; |
| $init_result =& $db->query($sql); |
| if ($init_result) { |
| $branch_info_cache = $init_result->fetchAll(MDB2_FETCHMODE_ASSOC); |
| $bad_bibs = array(); |
| $good_bibs = array(); |
| foreach ($branch_info_cache as $item_binfo) { |
| if (($item_binfo['branch'] == $limit_available || $limit_available == 'any') && $item_binfo['count_avail'] > 0) { |
| if (!in_array($item_binfo['bnum'], $good_bibs)) { |
| $good_bibs[] = $item_binfo['bnum']; |
| } |
| } else { |
| $bad_bibs[] = $item_binfo['bnum']; |
| } |
| } |
| } |
| $unavail_bibs = array_values(array_diff($bad_bibs, $good_bibs)); |
| $bib_hits_all = array_values(array_diff($bib_hits_all, $unavail_bibs)); |
| // rebuild from the full list |
| unset($bib_hits); |
| $available_count = 0; |
| foreach ($bib_hits_all as $key => $bib_hit) { |
| $bib_avail = self::get_item_status($bib_hit); |
| if ($limit_available == 'any') { |
| $available = $bib_avail['avail']; |
| } else { |
| $available = $bib_avail['branches'][$limit_available]['avail']; |
| } |
| if ($available) { |
| $available_count++; |
| if ($available_count > $offset) { |
| $bib_hits[] = $bib_hit; |
| if (count($bib_hits) == $limit) { |
| //found as many as we need for this page |
| break; |
| } |
| } |
| } else { |
| // remove the bib from the bib_hits_all array |
| unset($bib_hits_all[$key]); |
| } |
| } |
| // trim out the rest of the array based on *any* cache value |
| if(!empty($bib_hits_all)) { |
| $sql = "SELECT bnum FROM locum_avail_branches WHERE bnum IN (" . implode(",", $bib_hits_all) . ") AND count_avail > 0"; |
| $init_result =& $db->query($sql); |
| if ($init_result) { |
| $avail_bib_arr = $init_result->fetchCol(); |
| foreach ($bib_hits_all as $bnum_avail_chk) { |
| if (in_array($bnum_avail_chk, $avail_bib_arr)) { |
| $new_bib_hits_all[] = $bnum_avail_chk; |
| } |
| } |
| } |
| $bib_hits_all = $new_bib_hits_all; |
| unset($new_bib_hits_all); |
| } |
| } |
| // Refine by facets |
| if (count($facet_args)) { |
| $where = ''; |
| // Series |
| if ($facet_args['facet_series']) { |
| $where .= ' AND ('; |
| $or = ''; |
| foreach ($facet_args['facet_series'] as $series) { |
| $where .= $or . ' series LIKE \'' . $db->escape($series, 'text') . '%\''; |
| $or = ' OR'; |
| } |
| $where .= ')'; |
| } |
| // Language |
| if ($facet_args['facet_lang']) { |
| foreach ($facet_args['facet_lang'] as $lang) { |
| $lang_arr[] = $db->quote($lang, 'text'); |
| } |
| $where .= ' AND lang IN (' . implode(', ', $lang_arr) . ')'; |
| } |
| // Pub. Year |
| if ($facet_args['facet_year']) { |
| $where .= ' AND pub_year IN (' . implode(', ', $facet_args['facet_year']) . ')'; |
| } |
| // Pub. Decade |
| if ($facet_args['facet_decade']) { |
| $where .= ' AND pub_decade IN (' . implode(', ', $facet_args['facet_decade']) . ')'; |
| } |
| // Ages |
| if (count($facet_args['age'])) { |
| $age_or = ''; |
| $age_sql_cond = ''; |
| foreach ($facet_args['age'] as $facet_age) { |
| $age_sql_cond .= $age_or . "age = '$facet_age'"; |
| $age_or = ' OR '; |
| } |
| $sql = 'SELECT DISTINCT(bnum) FROM locum_avail_ages WHERE bnum IN (' . implode(', ', $bib_hits_all) . ") AND ($age_sql_cond)"; |
| $init_result =& $db->query($sql); |
| $age_hits = $init_result->fetchCol(); |
| foreach ($bib_hits_all as $bnum_age_chk) { |
| if (in_array($bnum_age_chk, $age_hits)) { |
| $new_bib_hits_all[] = $bnum_age_chk; |
| } |
| } |
| $bib_hits_all = $new_bib_hits_all; |
| unset($new_bib_hits_all); |
| } |
| if(!empty($bib_hits_all)) { |
| $sql1 = 'SELECT bnum FROM locum_facet_heap WHERE bnum IN (' . implode(', ', $bib_hits_all) . ')' . $where; |
| $sql2 = 'SELECT bnum FROM locum_facet_heap WHERE bnum IN (' . implode(', ', $bib_hits_all) . ')' . $where . " LIMIT $offset, $limit"; |
| $utf = "SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'"; |
| $utfprep = $db->query($utf); |
| $init_result =& $db->query($sql1); |
| $bib_hits_all = $init_result->fetchCol(); |
| $init_result =& $db->query($sql2); |
| $bib_hits = $init_result->fetchCol(); |
| } |
| } |
| // Get the totals |
| $facet_total = count($bib_hits_all); |
| $final_result_set['num_hits'] = $facet_total; |
| // First, we have to get the values back, unsorted against the Sphinx-sorted array |
| if (count($bib_hits)) { |
| $sql = 'SELECT * FROM locum_bib_items WHERE bnum IN (' . implode(', ', $bib_hits) . ')'; |
| $utf = "SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'"; |
| $utfprep = $db->query($utf); |
| $init_result =& $db->query($sql); |
| $init_bib_arr = $init_result->fetchAll(MDB2_FETCHMODE_ASSOC); |
| foreach ($init_bib_arr as $init_bib) { |
| // Get availability |
| $init_bib['availability'] = self::get_item_status($init_bib['bnum']); |
| // Clean up the Stdnum |
| $init_bib['stdnum'] = preg_replace('/[^\d]/','', $init_bib['stdnum']); |
| $bib_reference_arr[(string) $init_bib['bnum']] = $init_bib; |
| } |
| // Now we reconcile against the sphinx result |
| foreach ($sph_res_all['matches'] as $sph_bnum => $sph_binfo) { |
| if (in_array($sph_bnum, $bib_hits)) { |
| $final_result_set['results'][] = $bib_reference_arr[$sph_bnum]; |
| } |
| } |
| } |
| $db->disconnect(); |
| $final_result_set['facets'] = self::facetizer($bib_hits_all); |
| if($forcedchange == 'yes') { $final_result_set['changed'] = 'yes'; } |
| return $final_result_set; |
| } |
| /** |
| * Formulates the array used to put together the faceted search panel. |
| * This function is called from the search function. |
| * |
| * @param array $bib_hits_all Standard array of bib numbers |
| * @return array Faceted array of information for bib numbers passed. Keyed by: mat, series, loc, lang, pub_year |
| */ |
| public function facetizer($bib_hits_all) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($bib_hits_all); |
| } |
| $db =& MDB2::connect($this->dsn); |
| if (count($bib_hits_all)) { |
| $where_str = 'WHERE bnum IN (' . implode(",", $bib_hits_all) . ')'; |
| $sql['mat'] = 'SELECT DISTINCT mat_code, COUNT(mat_code) AS mat_code_sum FROM locum_facet_heap ' . $where_str . 'GROUP BY mat_code ORDER BY mat_code_sum DESC'; |
| $sql['series'] = 'SELECT DISTINCT series, COUNT(series) AS series_sum FROM locum_facet_heap ' . $where_str . 'GROUP BY series ORDER BY series ASC'; |
| $sql['loc'] = 'SELECT DISTINCT loc_code, COUNT(loc_code) AS loc_code_sum FROM locum_facet_heap ' . $where_str . 'GROUP BY loc_code ORDER BY loc_code_sum DESC'; |
| $sql['lang'] = 'SELECT DISTINCT lang, COUNT(lang) AS lang_sum FROM locum_facet_heap ' . $where_str . 'GROUP BY lang ORDER BY lang_sum DESC'; |
| $sql['pub_year'] = 'SELECT DISTINCT pub_year, COUNT(pub_year) AS pub_year_sum FROM locum_facet_heap ' . $where_str . 'GROUP BY pub_year ORDER BY pub_year DESC'; |
| $sql['pub_decade'] = 'SELECT DISTINCT pub_decade, COUNT(pub_decade) AS pub_decade_sum FROM locum_facet_heap ' . $where_str . ' GROUP BY pub_decade ORDER BY pub_decade DESC'; |
| foreach ($sql AS $fkey => $fquery) { |
| $tmp_res =& $db->query($fquery); |
| $tmp_res_arr = $tmp_res->fetchAll(); |
| foreach ($tmp_res_arr as $values) { |
| if ($values[0] && $values[1]) { $result[$fkey][$values[0]] = $values[1]; } |
| } |
| } |
| // Create non-distinct facets for age |
| foreach ($this->locum_config['ages'] as $age_code => $age_name) { |
| $sql = "SELECT COUNT(bnum) as age_sum FROM locum_avail_ages $where_str AND age = '$age_code'"; |
| $res =& $db->query($sql); |
| $age_count = $res->fetchOne(); |
| if ($age_count) { |
| $result['ages'][$age_code] = $age_count; |
| } |
| } |
| // Create facets from availability cache |
| $result['avail']['any'] = 0; |
| foreach ($this->locum_config['branches'] as $branch_code => $branch_name) { |
| $sql = "SELECT COUNT(DISTINCT(bnum)) FROM locum_avail_branches $where_str AND branch = '$branch_code' AND count_avail > 0"; |
| $res =& $db->query($sql); |
| $avail_count = $res->fetchOne(); |
| if (!$avail_count) { $avail_count = 0; } |
| $result['avail']['any'] = $result['avail']['any'] + $avail_count; |
| if ($avail_count) { |
| $result['avail'][$branch_code] = $avail_count; |
| } |
| } |
| $db->disconnect(); |
| return $result; |
| } |
| } |
| /** |
| * Returns an array of item status info (availability, location, status, etc). |
| * |
| * @param string $bnum Bib number |
| * @return array Detailed item availability |
| */ |
| public function get_item_status($bnum, $force_refresh = FALSE) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($bnum, $force_refresh); |
| } |
| $db = MDB2::connect($this->dsn); |
| if (!$force_refresh && $this->locum_config['avail_cache']['cache']) { |
| $this->locum_config['avail_cache']['cache_cutoff']; |
| $cache_cutoff = date("Y-m-d H:i:s", (time() - (60 * $this->locum_config['avail_cache']['cache_cutoff']))); |
| // check the cache table |
| $sql = "SELECT * FROM locum_availability WHERE bnum = :bnum AND timestamp > '$cache_cutoff'"; |
| $statement = $db->prepare($sql, array('integer')); |
| $dbr = $statement->execute(array('bnum' => $bnum)); |
| if (PEAR::isError($dbr) && $this->cli) { |
| echo "DB connection failed... " . $dbr->getMessage() . "\n"; |
| } |
| $statement->Free(); |
| $cached = $dbr->NumRows(); |
| } |
| if ($cached) { |
| $row = $dbr->fetchRow(MDB2_FETCHMODE_ASSOC); |
| $avail_array = unserialize($row['available']); |
| return $avail_array; |
| } |
| $status = $this->locum_cntl->item_status($bnum); |
| $result['total'] = count($status['items']); |
| $result['avail'] = 0; |
| $result['holds'] = $status['holds']; |
| $result['on_order'] = $status['on_order']; |
| $result['orders'] = count($status['orders']) ? $status['orders'] : array(); |
| $result['nextdue'] = 0; |
| $result['items'] = $status['items']; |
| $result['locations'] = array(); |
| $result['callnums'] = array(); |
| $result['ages'] = array(); |
| $result['branches'] = array(); |
| $loc_codes = array(); |
| if (count($status['items'])) { |
| foreach ($status['items'] as $item) { |
| // Parse Ages |
| $result['locations'][$item['loc_code']][$item['age']]++; |
| if ($result['ages'][$item['age']]) { |
| $result['ages'][$item['age']]['avail'] = $result['ages'][$item['age']]['avail'] + $item['avail']; |
| $result['ages'][$item['age']]['total']++; |
| } else { |
| $result['ages'][$item['age']]['avail'] = $item['avail']; |
| $result['ages'][$item['age']]['total'] = 1; |
| } |
| // Parse Branches |
| if (count($result['branches'][$item['branch']])) { |
| $result['branches'][$item['branch']]['avail'] = $result['branches'][$item['branch']]['avail'] + $item['avail']; |
| $result['branches'][$item['branch']]['total']++; |
| } else { |
| $result['branches'][$item['branch']]['avail'] = $item['avail']; |
| $result['branches'][$item['branch']]['total'] = 1; |
| } |
| // Parse Callnums |
| if (!in_array($item['callnum'], $result['callnums'])) { |
| $result['callnums'][] = $item['callnum']; |
| } |
| // Determine next item due date |
| if ($result['nextdue'] == 0 || $result['nextdue'] > $item['due']) { |
| $result['nextdue'] = $item['due']; |
| } |
| // Parse location code |
| if (!in_array($item['loc_code'], $loc_codes) && trim($item['loc_code'])) { |
| $loc_codes[] = $item['loc_code']; |
| } |
| // Tally availability |
| if ($item['avail']) { |
| $result['avail'] = $result['avail'] + $item['avail']; |
| } |
| } |
| } |
| // Cache the result |
| $bib_item = self::get_bib_item($bnum); |
| // Update Cache |
| $avail_ser = serialize($result); |
| $ages = count($result['ages']) ? "'" . implode(',', $result['ages']) . "'" : 'NULL'; |
| $locs = count($loc_codes) ? "'" . implode(',', $loc_codes) . "'" : 'NULL'; |
| $bib_loc = $bib_item['loc_code'] ? "'" . $bib_item['loc_code'] . "'" : 'NULL'; |
| $sql = "REPLACE INTO locum_availability (bnum, available) VALUES (:bnum, :available)"; |
| $statement = $db->prepare($sql, array('integer', 'text')); |
| $dbr = $statement->execute(array('bnum' => $bnum, 'available' => $avail_ser)); |
| if (PEAR::isError($dbr) && $this->cli) { |
| echo "DB connection failed... " . $dbr->getMessage() . "\n"; |
| } |
| $statement->Free(); |
| // Store age cache |
| $db->query("DELETE FROM locum_avail_ages WHERE bnum = '$bnum'"); |
| if (count($result['ages'])) { |
| $sql = "INSERT INTO locum_avail_ages (bnum, age, count_avail, count_total, timestamp) VALUES (:bnum, :age, :count_avail, :count_total, NOW())"; |
| $statement = $db->prepare($sql, array('integer', 'text', 'integer', 'integer')); |
| foreach ($result['ages'] as $age => $age_info) { |
| $dbr = $statement->execute(array('bnum' => $bnum, 'age' => $age, 'count_avail' => $age_info['avail'], 'count_total' => $age_info['total'])); |
| } |
| $statement->Free(); |
| } |
| // Store branch info cache |
| $db->query("DELETE FROM locum_avail_branches WHERE bnum = '$bnum'"); |
| if (count($result['branches'])) { |
| $sql = "INSERT INTO locum_avail_branches (bnum, branch, count_avail, count_total, timestamp) VALUES (:bnum, :branch, :count_avail, :count_total, NOW())"; |
| $statement = $db->prepare($sql, array('integer', 'text', 'integer', 'integer')); |
| foreach ($result['branches'] as $branch => $branch_info) { |
| $dbr = $statement->execute(array('bnum' => $bnum, 'branch' => $branch, 'count_avail' => $branch_info['avail'], 'count_total' => $branch_info['total'])); |
| } |
| $statement->Free(); |
| } |
| return $result; |
| } |
| /** |
| * Returns information about a bib title. |
| * |
| * @param string $bnum Bib number |
| * @param boolean $get_inactive Return records whose active = 0 |
| * @return array Bib item information |
| */ |
| public function get_bib_item($bnum, $get_inactive = FALSE) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($bnum); |
| } |
| $db = MDB2::connect($this->dsn); |
| $utf = "SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'"; |
| $utfprep = $db->query($utf); |
| if ($get_inactive) { |
| $sql = "SELECT * FROM locum_bib_items WHERE bnum = '$bnum' LIMIT 1"; |
| } else { |
| $sql = "SELECT * FROM locum_bib_items WHERE bnum = '$bnum' AND active = '1' LIMIT 1"; |
| } |
| $res = $db->query($sql); |
| $item_arr = $res->fetchAll(MDB2_FETCHMODE_ASSOC); |
| $db->disconnect(); |
| $item_arr[0]['stdnum'] = preg_replace('/[^\d]/','', $item_arr[0]['stdnum']); |
| return $item_arr[0]; |
| } |
| /** |
| * Returns information about an array of bib titles. |
| * |
| * @param array $bnum_arr Bib number array |
| * @return array Bib item information for $bnum_arr |
| */ |
| public function get_bib_items_arr($bnum_arr) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($bnum_arr); |
| } |
| if (count($bnum_arr)) { |
| $db =& MDB2::connect($this->dsn); |
| $utf = "SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'"; |
| $utfprep = $db->query($utf); |
| $sql = 'SELECT * FROM locum_bib_items WHERE bnum IN (' . implode(', ', $bnum_arr) . ')'; |
| $res =& $db->query($sql); |
| $item_arr = $res->fetchAll(MDB2_FETCHMODE_ASSOC); |
| $db->disconnect(); |
| foreach ($item_arr as $item) { |
| $item['stdnum'] = preg_replace('/[^\d]/','', $item['stdnum']); |
| $bib[(string) $item['bnum']] = $item; |
| } |
| } |
| return $bib; |
| } |
| /** |
| * Returns an array of patron information |
| * |
| * @param string $pid Patron barcode number or record number |
| * @return boolean|array Array of patron information or FALSE if login fails |
| */ |
| public function get_patron_info($pid) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($pid); |
| } |
| $patron_info = $this->locum_cntl->patron_info($pid); |
| return $patron_info; |
| } |
| /** |
| * Returns an array of patron checkouts |
| * |
| * @param string $cardnum Patron barcode/card number |
| * @param string $pin Patron pin/password |
| * @return boolean|array Array of patron checkouts or FALSE if $barcode doesn't exist |
| */ |
| public function get_patron_checkouts($cardnum, $pin = NULL) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($cardnum, $pin); |
| } |
| $patron_checkouts = $this->locum_cntl->patron_checkouts($cardnum, $pin); |
| return $patron_checkouts; |
| } |
| /** |
| * Returns an array of patron checkouts for history |
| * |
| * @param string $cardnum Patron barcode/card number |
| * @param string $pin Patron pin/password |
| * @param array $last_record Array containing: 'bnum' => Bib num, 'date' => Date of last record harvested. |
| * It will return everything after that record if this value is passed |
| * @return boolean|array Array of patron checkouts or FALSE if $barcode doesn't exist |
| */ |
| public function get_patron_checkout_history($cardnum, $pin = NULL, $last_record = NULL) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($cardnum, $pin); |
| } |
| return $this->locum_cntl->patron_checkout_history($cardnum, $pin, $action); |
| } |
| /** |
| * Opts patron in or out of checkout history |
| * |
| * @param string $cardnum Patron barcode/card number |
| * @param string $pin Patron pin/password |
| * @return boolean|array Array of patron checkouts or FALSE if $barcode doesn't exist |
| */ |
| public function set_patron_checkout_history($cardnum, $pin = NULL, $action = NULL) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($cardnum, $pin, $action); |
| } |
| return $this->locum_cntl->patron_checkout_history_toggle($cardnum, $pin, $action); |
| } |
| /** |
| * Deletes patron checkout history off the ILS server |
| * |
| * @param string $cardnum Patron barcode/card number |
| * @param string $pin Patron pin/password |
| * @param string $action NULL = do nothing, 'all' = delete all records, 'selected' = Delete records in $vars array |
| * @param array $vars array of variables referring to records to delete (optional) |
| * @param array $last_record Array containing: 'bnum' => Bib num, 'date' => Date of last record harvested |
| */ |
| public function delete_patron_checkout_history($cardnum, $pin = NULL, $action = NULL, $vars = NULL, $last_record = NULL) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($cardnum, $pin); |
| } |
| } |
| /** |
| * Returns an array of patron holds |
| * |
| * @param string $cardnum Patron barcode/card number |
| * @param string $pin Patron pin/password |
| * @return boolean|array Array of patron holds or FALSE if login fails |
| */ |
| public function get_patron_holds($cardnum, $pin = NULL) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($cardnum, $pin); |
| } |
| $patron_holds = $this->locum_cntl->patron_holds($cardnum, $pin); |
| return $patron_holds; |
| } |
| /** |
| * Renews items and returns the renewal result |
| * |
| * @param string $cardnum Patron barcode/card number |
| * @param string $pin Patron pin/password |
| * @param array Array of varname => item numbers to be renewed, or NULL for everything. |
| * @return boolean|array Array of item renewal statuses or FALSE if it cannot renew for some reason |
| */ |
| public function renew_items($cardnum, $pin = NULL, $items = NULL) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($cardnum, $pin, $items); |
| } |
| $renew_status = $this->locum_cntl->renew_items($cardnum, $pin, $items); |
| return $renew_status; |
| } |
| /** |
| * Updates holds/reserves |
| * |
| * @param string $cardnum Patron barcode/card number |
| * @param string $pin Patron pin/password |
| * @param array $cancelholds Array of varname => item/bib numbers to be cancelled, or NULL for everything. |
| * @param array $holdfreezes_to_update Array of updated holds freezes. |
| * @param array $pickup_locations Array of pickup location changes. |
| * @return boolean TRUE or FALSE if it cannot cancel for some reason |
| */ |
| public function update_holds($cardnum, $pin = NULL, $cancelholds = array(), $holdfreezes_to_update = array(), $pickup_locations = array()) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($cardnum, $pin, $cancelholds, $holdfreezes_to_update, $pickup_locations); |
| } |
| return $this->locum_cntl->update_holds($cardnum, $pin, $cancelholds, $holdfreezes_to_update, $pickup_locations); |
| } |
| /** |
| * Places holds |
| * |
| * @param string $cardnum Patron barcode/card number |
| * @param string $bnum Bib item record number to place a hold on |
| * @param string $varname additional variable name (such as an item number for item-level holds) to place a hold on |
| * @param string $pin Patron pin/password |
| * @param string $pickup_loc Pickup location value |
| * @return boolean TRUE or FALSE if it cannot place the hold for some reason |
| */ |
| public function place_hold($cardnum, $bnum, $varname = NULL, $pin = NULL, $pickup_loc = NULL) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($cardnum, $bnum, $varname, $pin, $pickup_loc); |
| } |
| $request_status = $this->locum_cntl->place_hold($cardnum, $bnum, $varname, $pin, $pickup_loc); |
| if ($request_status['success']) { |
| $db =& MDB2::connect($this->dsn); |
| $db->query("INSERT INTO locum_holds_placed VALUES ('$bnum', NOW())"); |
| } |
| return $request_status; |
| } |
| /** |
| * Returns an array of patron fines |
| * |
| * @param string $cardnum Patron barcode/card number |
| * @param string $pin Patron pin/password |
| * @return boolean|array Array of patron holds or FALSE if login fails |
| */ |
| public function get_patron_fines($cardnum, $pin = NULL) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($cardnum, $pin); |
| } |
| $patron_fines = $this->locum_cntl->patron_fines($cardnum, $pin); |
| return $patron_fines; |
| } |
| /** |
| * Pays patron fines. |
| * $payment_details structure: |
| * [varnames] = An array of varnames to id which fines to pay. |
| * [total] = payment total. |
| * [name] = Name on the credit card. |
| * [address1] = Billing address. |
| * [address2] = Billing address. (opt) |
| * [city] = Billing address city. |
| * [state] = Billing address state. |
| * [zip] = Billing address zip. |
| * [email] = Cardholder email address. |
| * [ccnum] = Credit card number. |
| * [ccexpmonth] = Credit card expiration date. |
| * [ccexpyear] = Credit card expiration year. |
| * [ccseccode] = Credit card security code. |
| * |
| * @param string $cardnum Patron barcode/card number |
| * @param string $pin Patron pin/password |
| * @param array payment_details |
| * @return array Payment result |
| */ |
| public function pay_patron_fines($cardnum, $pin = NULL, $payment_details) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($cardnum, $pin, $payment_details); |
| } |
| $payment_result = $this->locum_cntl->pay_patron_fines($cardnum, $pin, $payment_details); |
| return $payment_result; |
| } |
| /* |
| * Returns an array of random bibs. |
| */ |
| public function get_bib_numbers($limit = 10) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($limit); |
| } |
| $db =& MDB2::connect($this->dsn); |
| $res =& $db->query("SELECT bnum FROM locum_bib_items ORDER BY RAND() LIMIT $limit"); |
| $item_arr = $res->fetchAll(MDB2_FETCHMODE_ASSOC); |
| $db->disconnect(); |
| $bnums = array(); |
| foreach ($item_arr as $item) { |
| $bnums[] = $item['bnum']; |
| } |
| return $bnums; |
| } |
| /************ External Content Functions ************/ |
| /** |
| * Formulates "Did you mean?" I may move to the Yahoo API for this.. |
| * |
| * @param string $str String to check |
| * @return string|boolean Either returns a string suggestion or FALSE |
| */ |
| public function yahoo_suggest($str) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($str); |
| } |
| if (trim($str) && $this->locum_config['api_config']['yahh_app_id']) { |
| $appid = $this->locum_config['api_config']['yahh_app_id']; |
| } else { |
| $appid = 'YahooDemo'; |
| } |
| $url = 'http://boss.yahooapis.com/ysearch/spelling/v1/'.$str.'?format=xml&appid=' . $appid; |
| $suggest_obj = @simplexml_load_file($url); |
| if (trim($suggest_obj->resultset_spell->result->suggestion)) { |
| return trim($suggest_obj->resultset_spell->result->suggestion); |
| } else { |
| return FALSE; |
| } |
| } |
| /* |
| * Client-side version of get_syndetics(). Does not harvest, only checks the database. |
| */ |
| public function get_syndetics($isbn) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($isbn); |
| } |
| $cust_id = $this->locum_config['api_config']['syndetic_custid']; |
| if (!$cust_id) { |
| return NULL; |
| } |
| $valid_hits = array( |
| 'TOC' => 'Table of Contents', |
| 'BNATOC' => 'Table of Contents', |
| 'FICTION' => 'Fiction Profile', |
| 'SUMMARY' => 'Summary / Annotation', |
| 'DBCHAPTER' => 'Excerpt', |
| 'LJREVIEW' => 'Library Journal Review', |
| 'PWREVIEW' => 'Publishers Weekly Review', |
| 'SLJREVIEW' => 'School Library Journal Review', |
| 'CHREVIEW' => 'CHOICE Review', |
| 'BLREVIEW' => 'Booklist Review', |
| 'HORNBOOK' => 'Horn Book Review', |
| 'KIRKREVIEW' => 'Kirkus Book Review', |
| 'ANOTES' => 'Author Notes' |
| ); |
| $db =& MDB2::connect($this->dsn); |
| $res = $db->query("SELECT links FROM locum_syndetics_links WHERE isbn = '$isbn' AND updated > DATE_SUB(NOW(), INTERVAL 2 MONTH) LIMIT 1"); |
| $dbres = $res->fetchAll(MDB2_FETCHMODE_ASSOC); |
| if ($dbres[0]['links']) { |
| $links = explode('|', $dbres[0]['links']); |
| } else { |
| return FALSE; |
| } |
| if ($links) { |
| foreach ($links as $link) { |
| $link_result[$valid_hits[$link]] = 'http://www.syndetics.com/index.aspx?isbn=' . $isbn . '/' . $link . '.html&client=' . $cust_id; |
| } |
| } |
| $db->disconnect(); |
| return $link_result; |
| } |
| } |
| /tags/1.1.0-rc3/INSTALL.txt |
|---|
| New file |
| 0,0 → 1,0 |
| Please visit www.thesocialopac.net for installation instructions and support requests. |
| /tags/1.1.0-rc3/CHANGELOG.txt |
|---|
| New file |
| 0,0 → 1,533 |
| ------------------------------------------------------------------------ |
| r151 | jblyberg | 2010-02-28 20:55:40 -0500 (Sun, 28 Feb 2010) | 3 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| Removed titlelength as a keyword search rank criteria. |
| Added hook code into history function. |
| ------------------------------------------------------------------------ |
| r150 | jblyberg | 2010-02-26 15:27:12 -0500 (Fri, 26 Feb 2010) | 2 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| M /trunk/sphinx/sphinx.conf |
| Additional bugfixes in limit-to-avail. |
| ------------------------------------------------------------------------ |
| r149 | jblyberg | 2010-02-26 11:03:48 -0500 (Fri, 26 Feb 2010) | 4 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| M /trunk/locum-server.php |
| M /trunk/sql/locum_init.sql |
| Fixed an issue with the facet heap initialization. |
| Fixed a related rebuild_facet_heap() issue. |
| Bug a bug in how totals for available items are tallied. |
| ------------------------------------------------------------------------ |
| r148 | jblyberg | 2010-02-25 16:11:50 -0500 (Thu, 25 Feb 2010) | 3 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| Fixed result count for limit-by-available. |
| Small changes to checkout history functions. |
| ------------------------------------------------------------------------ |
| r146 | jblyberg | 2010-02-24 17:19:53 -0500 (Wed, 24 Feb 2010) | 2 lines |
| Changed paths: |
| M /trunk/sql/scas_locum.sql |
| One last SQL schema update. |
| ------------------------------------------------------------------------ |
| r145 | jblyberg | 2010-02-24 17:19:36 -0500 (Wed, 24 Feb 2010) | 2 lines |
| Changed paths: |
| M /trunk/tools/upgrades/1.1/upgrade.sql |
| Small update to SQL schema added to SQL upgrade and SQL schema file. |
| ------------------------------------------------------------------------ |
| r144 | jblyberg | 2010-02-24 17:08:45 -0500 (Wed, 24 Feb 2010) | 2 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| Finished work on "limit to available" |
| ------------------------------------------------------------------------ |
| r143 | jblyberg | 2010-02-23 18:09:00 -0500 (Tue, 23 Feb 2010) | 3 lines |
| Changed paths: |
| M /trunk/config/locum.ini.sample |
| M /trunk/locum-client.php |
| Finished multi-branch implementation in get_item_status(). |
| Began work on "limit by available" in search(). |
| ------------------------------------------------------------------------ |
| r142 | jblyberg | 2010-02-19 17:43:26 -0500 (Fri, 19 Feb 2010) | 2 lines |
| Changed paths: |
| M /trunk/config/locum.ini.sample |
| M /trunk/locum-client.php |
| M /trunk/tools/upgrades/1.1/upgrade.sql |
| Continued work on branch/consortia code. |
| ------------------------------------------------------------------------ |
| r141 | jblyberg | 2010-02-12 17:16:25 -0500 (Fri, 12 Feb 2010) | 2 lines |
| Changed paths: |
| M /contrib/plugins/locum-covers/cache-covers.php |
| M /contrib/plugins/locum-covers/locum-covers.ini.sample |
| M /trunk/config/locum.ini.sample |
| M /trunk/locum-client.php |
| M /trunk/locum.php |
| M /trunk/tools/upgrades/1.1/upgrade.sql |
| Restructuring of consortia/multi-branch support. |
| ------------------------------------------------------------------------ |
| r140 | jblyberg | 2010-02-08 09:26:40 -0500 (Mon, 08 Feb 2010) | 2 lines |
| Changed paths: |
| M /trunk/config/locum.ini.sample |
| M /trunk/locum-client.php |
| M /trunk/tools/upgrades/1.1/upgrade.sql |
| Reworking some of the availability/item level routines. |
| ------------------------------------------------------------------------ |
| r139 | jblyberg | 2010-02-06 09:14:36 -0500 (Sat, 06 Feb 2010) | 2 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| Small bugfixes and code cleanup. |
| ------------------------------------------------------------------------ |
| r138 | jblyberg | 2010-02-05 17:33:23 -0500 (Fri, 05 Feb 2010) | 4 lines |
| Changed paths: |
| D /contrib/plugins/locum-covers/locum-covers.ini |
| A /contrib/plugins/locum-covers/locum-covers.ini.sample (from /contrib/plugins/locum-covers/locum-covers.ini:137) |
| D /trunk/config/locum.ini |
| A /trunk/config/locum.ini.sample (from /trunk/config/locum.ini:137) |
| M /trunk/locum-client.php |
| M /trunk/sql/scas_locum.sql |
| M /trunk/tools/upgrades/1.1/upgrade.sql |
| Fixed some facet issues. |
| Updated facet output to accomidate "decade" |
| Updated SQL schema files. |
| ------------------------------------------------------------------------ |
| r137 | jblyberg | 2010-02-04 18:12:22 -0500 (Thu, 04 Feb 2010) | 5 lines |
| Changed paths: |
| M /trunk/config/locum.ini |
| M /trunk/locum-client.php |
| A /trunk/tools/upgrades/1.1 (from /trunk/tools/upgrades/2.1:131) |
| R /trunk/tools/upgrades/1.1/upgrade.sql (from /trunk/tools/upgrades/2.1/upgrade.sql:135) |
| D /trunk/tools/upgrades/2.1 |
| Small changes to get_bib_item() to support new SOPAC features (Docs reflect changes) |
| stdnum is now scrubbed before passed back. |
| Moved upgrade folder from 2.1 to 1.1 to reflect reality. |
| Updated SQL upgrade script to include chages to locum_bib_items table. |
| ------------------------------------------------------------------------ |
| r136 | jblyberg | 2010-02-02 17:34:51 -0500 (Tue, 02 Feb 2010) | 3 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| M /trunk/locum-server.php |
| M /trunk/tools/maint.php |
| Slight structural change to maint script. |
| Small tweaks and bugfixes to the syndetics-related functions. |
| ------------------------------------------------------------------------ |
| r135 | jblyberg | 2010-02-01 17:20:45 -0500 (Mon, 01 Feb 2010) | 3 lines |
| Changed paths: |
| M /trunk/locum-server.php |
| M /trunk/tools/upgrades/2.1/upgrade.sql |
| Changed harvester to incorporate download_link information. |
| Updated SQL schema to store download_link if available. |
| ------------------------------------------------------------------------ |
| r134 | jblyberg | 2010-01-29 15:45:19 -0500 (Fri, 29 Jan 2010) | 2 lines |
| Changed paths: |
| M /trunk/locum.php |
| Updated crc32 function to accomidate 32 bit integer overflow wrap-around. |
| ------------------------------------------------------------------------ |
| r133 | jblyberg | 2010-01-28 18:25:35 -0500 (Thu, 28 Jan 2010) | 2 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| Fixes to get_item_status() -- was not returning total available correctly. |
| ------------------------------------------------------------------------ |
| r132 | jblyberg | 2010-01-27 14:22:17 -0500 (Wed, 27 Jan 2010) | 5 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| M /trunk/locum.php |
| M /trunk/sphinx/sphinx.conf |
| M /trunk/sql/locum_init.sql |
| M /trunk/tools/upgrades/2.1/upgrade.sql |
| Updated some SQL issues with the upgrade manifest. |
| Fixed the facet heap table SQL structure to use UTF-8 |
| Fixed a compatibility issue with locum-client and Sphinx 0.9.9 |
| Updated Sphinx conf to do better single-word title matching |
| ------------------------------------------------------------------------ |
| r130 | jblyberg | 2009-12-28 11:39:57 -0500 (Mon, 28 Dec 2009) | 2 lines |
| Changed paths: |
| A /trunk/COPYRIGHT.txt |
| A /trunk/INSTALL.txt |
| A /trunk/LICENSE.txt |
| A /trunk/MAINTAINERS.txt |
| Added Distribution documents. |
| ------------------------------------------------------------------------ |
| r129 | jblyberg | 2009-12-28 11:33:46 -0500 (Mon, 28 Dec 2009) | 2 lines |
| Changed paths: |
| M /trunk/CHANGELOG.txt |
| M /trunk/sql/scas_locum.sql |
| Updated SQL schema, Changelog. |
| ------------------------------------------------------------------------ |
| r128 | jblyberg | 2009-12-15 16:37:41 -0500 (Tue, 15 Dec 2009) | 2 lines |
| Changed paths: |
| M /trunk/sphinx/sphinx.conf |
| Updates sphinx.conf file to handle diacritics and new data structures. |
| ------------------------------------------------------------------------ |
| r125 | jblyberg | 2009-11-02 11:25:48 -0500 (Mon, 02 Nov 2009) | 2 lines |
| Changed paths: |
| M /contrib/plugins/locum-covers/locum-covers.sql |
| M /trunk/tools/upgrades/2.1/upgrade.sql |
| Slight SQL updates |
| ------------------------------------------------------------------------ |
| r124 | reby | 2009-10-28 14:00:49 -0400 (Wed, 28 Oct 2009) | 1 line |
| Changed paths: |
| M /trunk/locum-server.php |
| changed subject assignment in update functions to use var instead of array_pop in case array is modded and subject isn't last |
| ------------------------------------------------------------------------ |
| r123 | reby | 2009-10-21 10:12:42 -0400 (Wed, 21 Oct 2009) | 1 line |
| Changed paths: |
| M /trunk/locum-client.php |
| Changed yahoo suggest to use BOSS api url. Same appid works but with no query limit, diff output |
| ------------------------------------------------------------------------ |
| r122 | jblyberg | 2009-10-12 10:21:45 -0400 (Mon, 12 Oct 2009) | 2 lines |
| Changed paths: |
| M /trunk/locum.php |
| No need for hooks in the parent functions. Plus, it breaks them downstream. |
| ------------------------------------------------------------------------ |
| r121 | jblyberg | 2009-10-09 17:22:18 -0400 (Fri, 09 Oct 2009) | 2 lines |
| Changed paths: |
| M /trunk/locum-server.php |
| Moved eby's function and added hook code. |
| ------------------------------------------------------------------------ |
| r120 | jblyberg | 2009-10-09 16:46:22 -0400 (Fri, 09 Oct 2009) | 2 lines |
| Changed paths: |
| M /trunk/locum.php |
| Fixed an issue where file_exists() didn't find the connector config file. |
| ------------------------------------------------------------------------ |
| r119 | reby | 2009-10-09 15:19:12 -0400 (Fri, 09 Oct 2009) | 1 line |
| Changed paths: |
| M /trunk/locum-server.php |
| removed an echo |
| ------------------------------------------------------------------------ |
| r118 | reby | 2009-10-09 15:19:11 -0400 (Fri, 09 Oct 2009) | 1 line |
| Changed paths: |
| M /trunk/config/locum.ini |
| M /trunk/locum-server.php |
| M /trunk/tools/maint.php |
| M /trunk/tools/update-holds.php |
| changed scripts to use index function and finished first pass at function |
| ------------------------------------------------------------------------ |
| r117 | reby | 2009-10-09 15:19:10 -0400 (Fri, 09 Oct 2009) | 1 line |
| Changed paths: |
| M /trunk/config/locum.ini |
| added bin_path to sphinx config in locum.ini |
| ------------------------------------------------------------------------ |
| r116 | jblyberg | 2009-10-07 15:44:47 -0400 (Wed, 07 Oct 2009) | 3 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| Fixed a bug in several hook "preambles" |
| Applied holds modification changes within locum-client. |
| ------------------------------------------------------------------------ |
| r115 | jblyberg | 2009-10-06 18:00:28 -0400 (Tue, 06 Oct 2009) | 1 line |
| Changed paths: |
| M /trunk/config/locum.ini |
| M /trunk/locum.php |
| ------------------------------------------------------------------------ |
| r114 | jblyberg | 2009-10-05 14:31:18 -0400 (Mon, 05 Oct 2009) | 2 lines |
| Changed paths: |
| M /trunk/locum-server.php |
| Added tracking for skipped records. |
| ------------------------------------------------------------------------ |
| r113 | jblyberg | 2009-10-02 17:44:39 -0400 (Fri, 02 Oct 2009) | 2 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| Completed implementation of locum-hooks into locum_client |
| ------------------------------------------------------------------------ |
| r112 | jblyberg | 2009-10-02 17:36:17 -0400 (Fri, 02 Oct 2009) | 4 lines |
| Changed paths: |
| A /trunk/locum-hooks.php |
| M /trunk/locum-server.php |
| M /trunk/locum.php |
| Updated locum_server class to use the hook system. |
| Added an empty prototypical locum-hooks.php file. |
| Added a variable flag to tell locum whether the contructor hook should replace or precede the locum constructor. |
| ------------------------------------------------------------------------ |
| r111 | jblyberg | 2009-10-02 16:52:49 -0400 (Fri, 02 Oct 2009) | 2 lines |
| Changed paths: |
| M /contrib/plugins/locum-covers/locum-covers.php |
| M /trunk/config/locum.ini |
| M /trunk/locum-client.php |
| M /trunk/locum-server.php |
| M /trunk/locum.php |
| M /trunk/sphinx/sphinx.conf |
| M /trunk/tools/harvest.php |
| M /trunk/tools/repair.php |
| Changed whitespace standard to match Drupal coding standards. |
| ------------------------------------------------------------------------ |
| r110 | jblyberg | 2009-09-28 22:35:56 -0400 (Mon, 28 Sep 2009) | 2 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| M /trunk/locum-server.php |
| Fixed some issues with data preparation for insert into locum_availability. |
| ------------------------------------------------------------------------ |
| r109 | jblyberg | 2009-09-28 17:48:53 -0400 (Mon, 28 Sep 2009) | 2 lines |
| Changed paths: |
| M /trunk/config/locum.ini |
| M /trunk/locum-client.php |
| M /trunk/locum-server.php |
| Finished work on availability cache. |
| ------------------------------------------------------------------------ |
| r108 | jblyberg | 2009-09-28 00:11:53 -0400 (Mon, 28 Sep 2009) | 2 lines |
| Changed paths: |
| M /trunk/locum-server.php |
| Fixed small bug with suppression. |
| ------------------------------------------------------------------------ |
| r107 | jblyberg | 2009-09-25 18:10:17 -0400 (Fri, 25 Sep 2009) | 4 lines |
| Changed paths: |
| M /trunk/config/locum.ini |
| M /trunk/locum-client.php |
| M /trunk/locum.php |
| Added built-in hook/override functionality. |
| Added age group to .ini file |
| The burden on loaded connector ini files is not left to the locum parent class. |
| ------------------------------------------------------------------------ |
| r106 | jblyberg | 2009-09-24 18:05:29 -0400 (Thu, 24 Sep 2009) | 2 lines |
| Changed paths: |
| M /trunk/config/locum.ini |
| Movied connector-specific options out of the locum.ini file into the connector's ini file. |
| ------------------------------------------------------------------------ |
| r105 | jblyberg | 2009-09-23 23:46:50 -0400 (Wed, 23 Sep 2009) | 2 lines |
| Changed paths: |
| M /trunk/sql/locum_init.sql |
| Fixed a SQL error in the facet heap init script |
| ------------------------------------------------------------------------ |
| r104 | jblyberg | 2009-09-23 23:13:50 -0400 (Wed, 23 Sep 2009) | 3 lines |
| Changed paths: |
| M /trunk/config/locum.ini |
| M /trunk/tools/harvest.php |
| M /trunk/tools/maint.php |
| Updated maintenance and harvest scripts for 2.1 |
| Additional documentation added to locum.ini |
| ------------------------------------------------------------------------ |
| r103 | jblyberg | 2009-09-23 17:53:04 -0400 (Wed, 23 Sep 2009) | 4 lines |
| Changed paths: |
| M /trunk/config/locum.ini |
| M /trunk/locum-client.php |
| M /trunk/locum-server.php |
| M /trunk/sql/locum_init.sql |
| M /trunk/tools/upgrades/2.1/upgrade.sql |
| Touched up the upgrade scripts for 2.1. |
| Added locum config option for suppression in iii. |
| Code clean-up. |
| ------------------------------------------------------------------------ |
| r99 | jblyberg | 2009-09-18 23:52:03 -0400 (Fri, 18 Sep 2009) | 4 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| M /trunk/locum-server.php |
| M /trunk/tools/upgrades/2.1/upgrade.sql |
| Numerous search optimizations. |
| Continued work on multi-branch/item level support. |
| Merged syndetics content support. |
| ------------------------------------------------------------------------ |
| r98 | jblyberg | 2009-09-18 17:35:07 -0400 (Fri, 18 Sep 2009) | 4 lines |
| Changed paths: |
| M /trunk/locum-server.php |
| M /trunk/sql/locum_init.sql |
| A /trunk/tools/upgrades |
| A /trunk/tools/upgrades/2.1 |
| A /trunk/tools/upgrades/2.1/upgrade.sql |
| Partial incorporation of multi-branch/item avail code. |
| Numerous bugfixes. |
| ------------------------------------------------------------------------ |
| r90 | jblyberg | 2009-09-10 11:31:04 -0400 (Thu, 10 Sep 2009) | 3 lines |
| Changed paths: |
| M /contrib/locum-covers/locum-covers.ini |
| M /contrib/locum-covers/locum-covers.php |
| A /contrib/plugins |
| A /trunk/plugins |
| Adding plugin structure |
| Changes to covers plugin |
| ------------------------------------------------------------------------ |
| r88 | jblyberg | 2009-09-09 17:26:37 -0400 (Wed, 09 Sep 2009) | 3 lines |
| Changed paths: |
| M /contrib/locum-covers/cache-covers.php |
| M /contrib/locum-covers/locum-covers.ini |
| M /contrib/locum-covers/locum-covers.php |
| M /trunk/locum-client.php |
| M /trunk/locum-server.php |
| Started work on item-level location |
| locum cover cache updates |
| ------------------------------------------------------------------------ |
| r87 | jblyberg | 2009-08-21 12:40:45 -0400 (Fri, 21 Aug 2009) | 1 line |
| Changed paths: |
| M /trunk/config/locum.ini |
| M /trunk/locum-client.php |
| ------------------------------------------------------------------------ |
| r86 | jblyberg | 2009-08-19 15:27:12 -0400 (Wed, 19 Aug 2009) | 2 lines |
| Changed paths: |
| M /trunk/locum-server.php |
| Fixed a fairly critical bug that was causing unweeded bibs to be weeded. |
| ------------------------------------------------------------------------ |
| r85 | smaskit | 2009-07-29 15:41:31 -0400 (Wed, 29 Jul 2009) | 1 line |
| Changed paths: |
| M /trunk/CHANGELOG.txt |
| M /trunk/locum-client.php |
| add support for checkout history, and for freezing holds |
| ------------------------------------------------------------------------ |
| r84 | jblyberg | 2009-07-19 23:10:38 -0400 (Sun, 19 Jul 2009) | 2 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| Fixed a small sorting issue. |
| ------------------------------------------------------------------------ |
| r83 | jblyberg | 2009-06-28 23:14:44 -0400 (Sun, 28 Jun 2009) | 2 lines |
| Changed paths: |
| M /trunk/locum-client.php |
| M /trunk/locum-server.php |
| M /trunk/locum.php |
| M /trunk/tools/harvest.php |
| Code clean-up |
| ------------------------------------------------------------------------ |
| r82 | smaskit | 2009-06-26 00:17:27 -0400 (Fri, 26 Jun 2009) | 1 line |
| Changed paths: |
| M /trunk/CHANGELOG.txt |
| M /trunk/locum-client.php |
| updated preg in google_suggest to work with changed html returned by google |
| ------------------------------------------------------------------------ |
| r81 | smaskit | 2009-04-14 15:11:29 -0400 (Tue, 14 Apr 2009) | 1 line |
| Changed paths: |
| M /trunk/CHANGELOG.txt |
| M /trunk/locum-server.php |
| update syndetics urls |
| ------------------------------------------------------------------------ |
| r80 | smaskit | 2009-04-14 15:01:47 -0400 (Tue, 14 Apr 2009) | 1 line |
| Changed paths: |
| M /trunk/CHANGELOG.txt |
| M /trunk/locum.php |
| modified __construct so it calls locum_constructor_override() if it exists. |
| ------------------------------------------------------------------------ |
| r79 | smaskit | 2009-03-26 06:50:38 -0400 (Thu, 26 Mar 2009) | 1 line |
| Changed paths: |
| A /trunk/CHANGELOG.txt |
| M /trunk/locum-client.php |
| updated locum-client.php to assist in handling multi-branch holds |
| ------------------------------------------------------------------------ |
| r74 | jblyberg | 2009-03-23 14:37:44 -0400 (Mon, 23 Mar 2009) | 2 lines |
| Changed paths: |
| M /trunk/sql/locum_init.sql |
| Replaced non-valid comment systax with valid mysql comments. |
| ------------------------------------------------------------------------ |
| r72 | jblyberg | 2009-03-17 21:56:45 -0400 (Tue, 17 Mar 2009) | 1 line |
| Changed paths: |
| D /config |
| D /locum-client.php |
| D /locum-server.php |
| D /locum.php |
| D /sphinx |
| D /sql |
| A /tags |
| D /tools |
| A /trunk |
| A /trunk/config (from /config:71) |
| A /trunk/locum-client.php (from /locum-client.php:71) |
| A /trunk/locum-server.php (from /locum-server.php:71) |
| A /trunk/locum.php (from /locum.php:71) |
| A /trunk/sphinx (from /sphinx:71) |
| A /trunk/sql (from /sql:71) |
| A /trunk/tools (from /tools:71) |
| Moved base directory to newly created trunk directory |
| ------------------------------------------------------------------------ |
| /tags/1.1.0-rc3/config/locum.ini.sample |
|---|
| New file |
| 0,0 → 1,538 |
| ; This is the Locum configuration file |
| ; Basic setup |
| [locum_config] |
| dsn_file = "/usr/local/etc/locum.php" |
| log_file = "/usr/local/var/log/locum.log" |
| run_quiet = FALSE |
| ; Sphinx information |
| ; bin_path is location of indexer binary |
| [sphinx_config] |
| bin_path = "/usr/local/sphinx/bin" |
| api_path = "/usr/local/sphinx/lib" |
| server_addr = "localhost" |
| server_port = 3312 |
| ; Only if you need to ssh off to another server |
| pubkey_path = "/usr/local/etc/sphinx_key.pub" |
| privkey_path = "/usr/local/etc/sphinx_key" |
| key_pass = "yoursecret" |
| key_user = "username" |
| ; Locum uses this section to decide how to behave while doing the |
| ; initial harvest as well as when it runs the maintenance scripts. |
| ; harvest_with_children takes advantage of PHP's pcntl library to |
| ; spawn multiple harvest processes. HIGHLY RECOMMENDED. |
| ; max_children tells Locum how many child processes to spawn. |
| ; harvest_reach tells Locum how far beyond the last known bib to |
| ; scan for new records during the maintenance run. |
| [harvest_config] |
| harvest_with_children = TRUE |
| max_children = 10 |
| harvest_reach = 1000 |
| ; This is where you configure your external data sources. The built-in |
| ; cover image functionality is very basic, and it's recommended that you |
| ; use the locum-covers plugin instead. If you set skip_covers to TRUE, |
| ; your harvest and maintenance runtimes will be much smaller. |
| [api_config] |
| skip_covers = TRUE |
| use_amazon_images = TRUE |
| amazon_access_key = "11XTD5952SADG133T7G2" |
| amazon_img_prio = 2 |
| use_syndetic_images = TRUE |
| syndetic_custid = "darip" |
| syndetic_img_prio = 1 |
| use_yahoo_suggest = TRUE |
| ;yahoo_app_id = "Your application id goes here - https://developer.apps.yahoo.com/wsregapp/" |
| suggestion_threshold = 10 |
| ; Locum uses this section to determine which ILS connector to invoke |
| [ils_config] |
| ils = "iii"; |
| ils_version = "2007" |
| ; Tells Locum whether or not you want to cache availability information, |
| ; If so, then you can configure how long (in minutes) cached availability |
| ; is kept. Caching availability improves performance and lets you add |
| ; availability facets, but availability will not be real-time. |
| [avail_cache] |
| cache = TRUE |
| cache_cutoff = 60 |
| ; This is where you provide a list of key-to-value pairs for material codes so, |
| ; for insteance, if the material code for books is "a", you would do: |
| ; a = "Books" |
| ; Do one-per-line. Codes ARE case sensitive. |
| [formats] |
| 1 = "Book" |
| 2 = "Reference" |
| 3 = "Magazine" |
| 4 = "VHS" |
| 5 = "Book on Tape" |
| 6 = "CD" |
| 9 = "CDROM" |
| a = "Express Book" |
| b = "Book on CD" |
| c = "Leappad Game" |
| d = "DVD" |
| g = "Book in a Bag" |
| h = "Computer Equipment" |
| k = "Read-along Tape" |
| m = "Playaway" |
| n = "Newspaper" |
| x = "Audio Download" |
| ; This section is used when searching by material types. Often there is more than |
| ; one material code for the same type of material. Locum uses these options to |
| ; scope a search for, say "books" to material code a, b, and c if a, b, and c |
| ; are print/books |
| ; in that case, the option would be, books = "a, b, c" |
| [format_groups] |
| everything = "all" |
| books = "1, 2, a, g" |
| movies = "4, d" |
| music = "6" |
| audiobooks = "5, b, k, m" |
| periodicals = "3, n" |
| software = "9, c" |
| electronics = "e" |
| ; This section is used to define special groups of material formats that can be used |
| ; in programatic logic further up the chain. For example, "download" denotes a group of |
| ; material formats that are downloaded. "skip_avail" tells applications to skip availability |
| ; display for those items. Custom entries can be added here as well if you need to |
| ; handle format groups in a certain way. |
| [format_special] |
| download = "x" |
| skip_avail = "3, n, x" |
| ; Age Groups |
| [ages] |
| adult = "Adult" |
| teen = "Teen" |
| child = "Children" |
| ; These are pairings of branch codes with full branch names. These settings will |
| ; parsed if you enabled the "multi_branch" setting in locum.ini. |
| ; Branch codes can are arbitrary and can be anything within the context of locum, |
| ; but your library probably already has branch codes in use and it would make sense |
| ; to use those codes here to avoid confusion. Otherwise, you can just make them up. |
| [branches] |
| dl = "Darien Library" |
| hs = "Darien Historical Society" |
| nc = "Darien Nature Center" |
| ; These are pairings of consortia member codes with their full names--usually a |
| ; library or library system. In other words, all members of a consortia. |
| ; These settings will parsed if you enabled the "consortia" setting in locum.ini. |
| ; Consortia member codes are arbitrary and can be anything within the context of |
| ; locum, but it may be that your consortium already employs some kind of member |
| ; code, in which case, it would make sense to use it here. Otherwise, you can |
| ; just make them up. |
| [consortia_members] |
| darpl = "Darien Library System" |
| ; This is where you assign branches to consortia members. You will pair the |
| ; consortia_member codes from [consortia_members] with branch code values |
| ; from the [branches] section. |
| ; Essentially, you are going to specify a consortia_member code and provide |
| ; either a regular expression match (enclosed in slashes - //) or a comma- |
| ; separated list of all the branches belonging to a consortia member. |
| ; member_code = "/[regex]/" or "branch1,branch2,branch3,..." |
| [consortia_member_assignments] |
| darpl = "dl,hs,nc" |
| ; These let you define "collections" within the catalog. Useful for narrowing |
| ; searches to, say, a named gift collection, These are sometimes called "scopes" |
| ; These are special "views" of the collection that reside outside the |
| ; Library > Branch > Consortia hierarchy. |
| ; The values for these parameters will be the item-level location codes provided |
| ; up from the connector. You may need to check with your cataloging staff |
| ; to find out what these are. |
| ; this is a name-to-values format. See Examples. |
| ; ****** Currently unimplemented ****** |
| [collections] |
| Adult = "a, adabi, adadm, adaf, adanf, asvff, asvfn, attg, attlp, azamh, bagbk, bocd, cd, dvd, libst, magar, r" |
| Children = "j, jsamp, jsbjp, jstt" |
| Historical Society = "hs" |
| ; These settings allow you to limit and determine how records behave within your |
| ; applications. These settings change how locum behaves during searches and transactions |
| [location_limits] |
| no_request = "libst, magar, r, t, techs" |
| no_search = "t, techs" |
| ; These will probably need to come from your ILS. The III connector supplies you with a script |
| ; to help you parse and format this information, others may as well. |
| [languages] |
| ace = "Achinese" |
| ach = "Acholi" |
| ada = "Adangme" |
| afa = "Afro-Asiatic" |
| afh = "Afrihili" |
| afr = "Afrikaans" |
| ajm = "Aljamia" |
| aka = "Akan" |
| akk = "Akkadian" |
| alb = "Albanian" |
| ale = "Aleut" |
| alg = "Algonquian languages" |
| amh = "Amharic" |
| ang = "Anglo-Saxon" |
| apa = "Apache" |
| ara = "Arabic" |
| arc = "Aramaic" |
| arm = "Armenian" |
| arn = "Araucanian" |
| arp = "Arapaho" |
| art = "Artificial" |
| arw = "Arawak" |
| asm = "Assamese" |
| ath = "Athapascan" |
| ava = "Avaric" |
| ave = "Avesta" |
| awa = "Awadhi" |
| aym = "Aymara" |
| aze = "Azerbaijani" |
| bad = "Banda" |
| bai = "Bamileke languages" |
| bak = "Bashkir" |
| bam = "Bambara" |
| ban = "Balinese" |
| baq = "Basque" |
| bas = "Basa" |
| bat = "Baltic" |
| bej = "Beja" |
| bel = "Belorussian" |
| bem = "Bemba" |
| ben = "Bengali" |
| ber = "Berber languages" |
| bho = "Bhojpuri" |
| bik = "Bikol" |
| bin = "Bini" |
| bla = "Blackfoot" |
| bra = "Braj" |
| bre = "Breton" |
| bug = "Buginese" |
| bul = "Bulgarian" |
| bur = "Burmese" |
| cad = "Caddo" |
| cai = "Central American Indian" |
| cam = "Cambodian" |
| car = "Carib" |
| cat = "Catalan" |
| cau = "Caucasian" |
| ceb = "Cebuano" |
| cel = "Celtic Group" |
| cha = "Chamorro" |
| chb = "Chibcha" |
| che = "Chechen" |
| chg = "Chagatai" |
| chi = "Chinese" |
| chn = "Chinook Jargon" |
| cho = "Choctaw" |
| chr = "Cherokee" |
| chu = "Church Slavic" |
| chv = "Chuvash" |
| chy = "Cheyenne" |
| cop = "Coptic" |
| cor = "Cornish" |
| cpe = "Creoles & Pidgins, English" |
| cpf = "Creoles & Pidgins, French" |
| cpp = "Creoles & Pidgins, Port." |
| cre = "Cree" |
| crp = "Creoles & Pidgins, Other" |
| cus = "Cushitic" |
| cze = "Czech" |
| dak = "Dakota" |
| dan = "Danish" |
| del = "Delaware" |
| din = "Dinka" |
| doi = "Dogri" |
| dra = "Dravidian" |
| dua = "Duala" |
| dum = "Dutch, Middle" |
| dut = "Dutch" |
| dyu = "Dyula" |
| efi = "Efik" |
| egy = "Egyptian" |
| eka = "Ekajuk" |
| elx = "Elamite" |
| eng = "English" |
| enm = "English, Middle" |
| esk = "Eskimo" |
| esp = "Esperanto" |
| est = "Estonian" |
| eth = "Ethiopic" |
| ewe = "Ewe" |
| ewo = "Ewondo" |
| fan = "Fang" |
| far = "Faroese" |
| fat = "Fanti" |
| fij = "Fijian" |
| fin = "Finnish" |
| fiu = "Finno-Ugrian" |
| fon = "Fon" |
| fre = "French" |
| fri = "Frisian" |
| frm = "French, Middle" |
| fro = "French, Old" |
| ful = "Fulah" |
| gaa = "Ga" |
| gae = "Gaelic (Scots)" |
| gag = "Gallegan" |
| gal = "Galla" |
| gay = "Gayo" |
| gem = "Germanic (Other)" |
| geo = "Georgian" |
| ger = "German" |
| gil = "Gilbertese" |
| gmh = "German, Mid. High" |
| goh = "German, Old High" |
| gon = "Gondi" |
| got = "Gothic" |
| grb = "Grebo" |
| grc = "Greek, Ancient (to 1453)" |
| gre = "Greek, Modern (1453-)" |
| gua = "Guarani" |
| guj = "Gujarati" |
| hai = "Haida" |
| hau = "Hausa" |
| haw = "Hawaiin" |
| heb = "Hebrew" |
| her = "Herero" |
| hil = "Hiligaynon" |
| him = "Himachali" |
| hin = "Hindi" |
| hmo = "Hiri Motu" |
| hun = "Hungarian" |
| hup = "Hupa" |
| iba = "Iban" |
| ibo = "Igbo" |
| ice = "Icelandic" |
| ijo = "Ijo" |
| ilo = "Ilocano" |
| inc = "Indic" |
| ine = "Indo-European" |
| int = "Interlingua" |
| ira = "Iranian" |
| iri = "Irish" |
| iro = "Iroquoian languages" |
| ita = "Italian" |
| jav = "Javanese" |
| jpn = "Japanese" |
| jpr = "Judaeo-Persian" |
| jrb = "Judaeo-Arabic" |
| kaa = "Karakalpak" |
| kab = "Kabyle" |
| kac = "kachin" |
| kam = "Kamba" |
| kan = "Kannada" |
| kar = "Karen" |
| kas = "Kashmiri" |
| kau = "Kanuri" |
| kaw = "Kawi" |
| kaz = "Kazakh" |
| kha = "Khasi" |
| khi = "Khoisan (Other)" |
| kho = "Khotanese" |
| kik = "Kikuyu" |
| kin = "Kinyarwanda" |
| kir = "Kirghiz" |
| kok = "Konkani" |
| kon = "Kongo" |
| kor = "Korean" |
| kpe = "Kpelle" |
| kro = "Kru" |
| kru = "Kurukh" |
| kua = "Kuanyama" |
| kur = "Kurdish" |
| kus = "Kusaie" |
| kut = "Kutenai" |
| lad = "Ladino" |
| lah = "Lahnda" |
| lam = "Lamba" |
| lan = "Langue d'oc" |
| lao = "Lao" |
| lap = "Lapp" |
| lat = "Latin" |
| lav = "Latvian" |
| lin = "Lingala" |
| lit = "Lithuanian" |
| lol = "Mongo" |
| loz = "Lozi" |
| lub = "Luba" |
| lug = "Luganda" |
| lui = "Luiseno" |
| lun = "Lunda" |
| luo = "Luo" |
| mac = "Macedonian" |
| mad = "Madurese" |
| mag = "Magahi" |
| mah = "Marshall" |
| mai = "Maithili" |
| mak = "Makasar" |
| mal = "Malayalam" |
| man = "Mandingo" |
| mao = "Maori" |
| map = "Austronesian (Other)" |
| mar = "Marathi" |
| mas = "Masai" |
| max = "Manx" |
| may = "Malay" |
| men = "Mende" |
| mic = "Micmac" |
| min = "Minangkabau" |
| mis = "Miscellaneous" |
| mkh = "Mon Khmer" |
| mla = "Malagasy" |
| mlt = "Maltese" |
| mni = "Manipuri" |
| mno = "Manobo" |
| moh = "Mohawk" |
| mol = "Moldavian" |
| mon = "Mongol" |
| mos = "Mossi" |
| mul = "Multilingual" |
| mun = "Munda (Other)" |
| mus = "Muskogee" |
| mwr = "Marwari" |
| myn = "Mayan languages" |
| nah = "Nahuatlan" |
| nai = "North Amer. Indian (Other)" |
| nav = "Navajo" |
| nde = "Ndebele (Zimbabwe)" |
| ndo = "Ndonga" |
| nep = "Nepali" |
| new = "Newari" |
| nic = "Niger-Kordofanian (Other)" |
| niu = "Niuean" |
| nor = "Norwegian" |
| nso = "Northern Sotho" |
| nub = "Nubian" |
| nya = "Nyanja" |
| nym = "Nyamwezi" |
| nyn = "Nyankole" |
| nyo = "Nyoro" |
| nzi = "Nzima" |
| oji = "Ojibwa" |
| ori = "Oriya" |
| osa = "Osage" |
| oss = "Ossetic" |
| ota = "Ottoman Turkish" |
| oto = "Otomian languages" |
| paa = "Papuan-Australian (Other)" |
| pag = "Pangasinan" |
| pal = "Pahlavi" |
| pam = "Pampanga" |
| pan = "Panjabi" |
| pap = "Papiamento" |
| pau = "Palauan" |
| peo = "Persian, Old" |
| per = "Persian, Modern" |
| pli = "Pali" |
| pol = "Polish" |
| pon = "Ponape" |
| por = "Portuguese" |
| pra = "Prakrit" |
| pro = "Provencal" |
| pus = "Pushto" |
| que = "Quechua" |
| raj = "Rajasthani" |
| rar = "Rarotongan" |
| roa = "Romance (Other)" |
| roh = "Rhaeto-Romance" |
| rom = "Romany" |
| rum = "Romanian" |
| run = "Rundi" |
| rus = "Russian" |
| sad = "Sandawe" |
| sag = "Sango" |
| sai = "South Amer. Indian (Other)" |
| sal = "Salishan languages" |
| sam = "Samaritan Aramaic" |
| san = "Sanskrit" |
| sao = "Samoan" |
| scc = "Serbo-Croatian (Cyrillic)" |
| sco = "Scots" |
| scr = "Serbo-Croatian (Roman)" |
| sel = "Selkup" |
| sem = "Semitic (Other)" |
| shn = "Shan" |
| sho = "Shona" |
| sid = "Sidamo" |
| sio = "Siouan languages" |
| sit = "Sino-Tibetan (Other)" |
| sla = "Slavic (Other)" |
| slo = "Slovak" |
| slv = "Slovenian" |
| snd = "Sindhi" |
| snh = "Sinhalese" |
| sog = "Sogdian" |
| som = "Somali" |
| son = "Songhai" |
| spa = "Spanish" |
| srr = "Serer" |
| ssa = "Nilo-Saharan" |
| sso = "Southern Sotho" |
| suk = "Sukuma" |
| sun = "Sundanese" |
| sus = "Susu" |
| sux = "Sumerian" |
| swa = "Swahili" |
| swe = "Swedish" |
| swz = "Swazi" |
| syr = "Syriac" |
| tag = "Tagalog" |
| tah = "Tahitian" |
| taj = "Tajik" |
| tam = "Tamil" |
| tar = "Tatar" |
| tel = "Telugu" |
| tem = "Temne" |
| ter = "Tereno" |
| tha = "Thai" |
| tib = "Tibetan" |
| tig = "Tigre" |
| tir = "Tigrina" |
| tiv = "Tivi" |
| tli = "Tlingit" |
| tog = "Tonga" |
| ton = "Tonga (Tonga Islands)" |
| tru = "Truk" |
| tsi = "Tsimshian" |
| tso = "Tsonga" |
| tsw = "Tswana" |
| tuk = "Turkmen" |
| tum = "Tumbuka" |
| tur = "Turkish" |
| tut = "Turko-Tataric (Other)" |
| twi = "Twi" |
| uga = "Ugaritic" |
| uig = "Uigar" |
| ukr = "Ukrainian" |
| umb = "Umbundu" |
| und = "Undetermined" |
| urd = "Urdu" |
| uzb = "Uzbek" |
| vai = "Vai" |
| ven = "Venda" |
| vie = "Vietnamese" |
| vot = "Votic" |
| wak = "Wakashan languages" |
| wal = "Walamo" |
| war = "Waray" |
| was = "Washo" |
| wel = "Welsh" |
| wen = "Wendic" |
| wol = "Wolof" |
| xho = "Xhosa" |
| yao = "Yao (Bantu)" |
| yap = "Yap" |
| yid = "Yiddish" |
| yor = "Yoruba" |
| zap = "Zapotec" |
| zen = "Zenaga" |
| zul = "Zulu" |
| zun = "Zuni" |
| /tags/1.1.0-rc3/locum.php |
|---|
| New file |
| 0,0 → 1,162 |
| <?php |
| /** |
| * Locum is a software library that abstracts ILS functionality into a |
| * catalog discovery layer for use with such things as bolt-on OPACs like |
| * SOPAC. |
| * @package Locum |
| * @author John Blyberg |
| */ |
| /** |
| * This is the parent Locum class for all locum-related activity. |
| * This is called as the parent by either the client or the server piece. |
| */ |
| class locum { |
| public $locum_config; |
| public $locum_cntl; |
| public $db; |
| public $dsn; |
| /** |
| * Locum constructor. |
| * This function prepares Locum for activity. |
| */ |
| public function __construct() { |
| if (file_exists('locum-hooks.php')) { |
| require_once('locum-hooks.php'); |
| } |
| if (is_callable(array('locum_hook', 'constructor_override'))) { |
| $hook = new locum_client_hook; |
| $hook->constructor_override($this); |
| if ($this->replace_constructor) { |
| return; |
| } |
| } |
| ini_set('memory_limit','128M'); |
| $this->locum_config = parse_ini_file('config/locum.ini', true); |
| $script_dir = realpath(dirname(__FILE__)); |
| // Take care of requirements |
| require_once('MDB2.php'); |
| require($this->locum_config['locum_config']['dsn_file']); |
| $this->dsn = $dsn; |
| $connector_type = 'locum_' |
| . $this->locum_config['ils_config']['ils'] . '_' |
| . $this->locum_config['ils_config']['ils_version']; |
| require_once('connectors/' . $connector_type . '/' . $connector_type . '.php'); |
| // Fire up the Locum connector |
| $locum_class_name = 'locum_' . $this->locum_config['ils_config']['ils'] . '_' . $this->locum_config['ils_config']['ils_version']; |
| $this->locum_cntl =& new $locum_class_name; |
| if (file_exists($script_dir . '/connectors/' . $connector_type . '/config/' . $connector_type . '.ini')) { |
| $this->locum_config = array_merge($this->locum_config, parse_ini_file('connectors/' . $connector_type . '/config/' . $connector_type . '.ini', true)); |
| } |
| $this->locum_cntl->locum_config = $this->locum_config; |
| } |
| /** |
| * Instead of using stdout, Locum will handle output via this logging transaction. |
| * |
| * @param string $msg Log message |
| * @param int $severity Loglevel/severity of the message |
| * @param boolean $silent Output to stdout. Default: yes |
| */ |
| public function putlog($msg, $severity = 1, $silent = TRUE) { |
| if ($severity > 5) { $severity = 5; } |
| $logfile = $this->locum_config['locum_config']['log_file']; |
| $quiet = $this->locum_config['locum_config']['run_quiet']; |
| for ($i = 0; $i < $severity; $i++) { $indicator .= '*'; } |
| $indicator = '[' . str_pad($indicator, 5) . ']'; |
| file_put_contents($logfile, $indicator . ' ' . $msg . "\n", FILE_APPEND); |
| if (!$quiet && !$silent) { print $indicator . ' ' . $msg . "\n"; } |
| } |
| /** |
| * Returns a specifically formatted array or string based on locum config values passed. This is primarily used internally, |
| * for instance, with custom search handlers. |
| * |
| * @param string $csv Comma (or otherwise) separated values |
| * @param string $implode Optional implode character. If not provided, the function will return an array of values |
| * @param string $separator Optional separator string for the values. Defaults to comma. |
| * @return string|array Formatted values |
| */ |
| public function csv_parser($csv, $implode = FALSE, $separator = ',') { |
| $csv_array = explode($separator, trim($csv)); |
| $cleaned = array(); |
| foreach ($csv_array as $csv_value) { |
| $cleaned[] = trim($csv_value); |
| } |
| if ($implode) { |
| $cleaned = implode($implode, $cleaned); |
| } |
| return $cleaned; |
| } |
| public function db_query($query, $query_only = TRUE, $return_type = 'all', $assoc = TRUE) { |
| $db =& MDB2::connect($this->dsn); |
| $db_result =& $db->query($query); |
| if ($query_only) { |
| return TRUE; |
| } else { |
| switch (trim(strtolower($return_type))) { |
| case 'row': |
| if ($assoc) { |
| return $db_result->fetchRow(MDB2_FETCHMODE_ASSOC); |
| } else { |
| return $db_result->fetchRow(); |
| } |
| break; |
| case 'col': |
| return $db_result->fetchCol(); |
| break; |
| case 'all': |
| default: |
| if ($assoc) { |
| return $db_result->fetchAll(MDB2_FETCHMODE_ASSOC); |
| } else { |
| return $db_result->fetchAll(); |
| } |
| break; |
| } |
| } |
| } |
| /** |
| * Checks $query_value against $ini_value to see a) if its a regex or csv match. |
| * It will then return TRUE if it is a match or FALSE if not. |
| * |
| * @param string $ini_value INI file value |
| * @param string $query_value Value to be matched against $ini_value |
| * @return boolean TRUE = match / FALSE = no match |
| */ |
| public function match_ini_value($ini_value, $query_value) { |
| if (preg_match('/^\//', $ini_value)) { |
| if (preg_match($ini_value, $query_value)) { return TRUE; } |
| } else { |
| if (in_array($query_value, locum::csv_parser($match_crit))) { return TRUE; } |
| } |
| return FALSE; |
| } |
| /** |
| * Returns a CRC32 value that is compatible with MySQL (>=4.1) CRC32() function |
| * |
| * @param string $str String to be converted |
| * @return int a CRC32 polynomial of the string |
| */ |
| public function string_poly($str) { |
| if (crc32($str) < 0) { |
| return crc32($str) + 4294967296; |
| } else { |
| return crc32($str); |
| } |
| } |
| } |
| /tags/1.1.0-rc3/COPYRIGHT.txt |
|---|
| New file |
| 0,0 → 1,21 |
| All SOPAC code is Copyright 2001 - 2009 by the original author(s). |
| This program is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation. |
| This program is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
| or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| for more details. |
| You should have received a copy of the GNU General Public License |
| along with this program as the file LICENSE.txt; if not, please see |
| http://www.gnu.org/licenses/gpl-3.0.txt. |
| SOPAC includes works under other copyright notices and distributed |
| according to the terms of the GNU General Public License or a compatible |
| license, including: |
| jQuery - Copyright (c) 2008 John Resig |
| /tags/1.1.0-rc3/locum-hooks.php |
|---|
| New file |
| 0,0 → 1,35 |
| <?php |
| /** |
| * Locum is a software library that abstracts ILS functionality into a |
| * catalog discovery layer for use with such things as bolt-on OPACs like |
| * SOPAC. |
| * |
| * This file allows developers to hook in to the Locum framework and replace existing class |
| * functions without altering the core project files. This file is not required for operation |
| * and can safely be removed if you wish. For more inormation, read the Locum Developer's |
| * Guide on http://thesocialopac.net |
| * |
| * @package Locum |
| * @author John Blyberg |
| */ |
| /** |
| * Override class for locum |
| */ |
| class locum_hook extends locum { |
| } |
| /** |
| * Override class for locum_server |
| */ |
| class locum_server_hook extends locum { |
| } |
| /** |
| * Override class for locum_client |
| */ |
| class locum_client_hook extends locum { |
| } |
| /tags/1.1.0-rc3/MAINTAINERS.txt |
|---|
| New file |
| 0,0 → 1,20 |
| List of maintainers |
| -------------------------------------------------------------------------------- |
| LEGEND |
| ====== |
| - M: the maintainer |
| - S: status: |
| "supported" : someone is actually paid to look after this. |
| "maintained" : someone actually looks after it. |
| "fixes/patches" : it has a maintainer but they don't have time to |
| do much other than throw the odd patch in. |
| "orphan" : no current maintainer, but maybe you could take |
| the role as you write new code? |
| -------------------------------------------------------------------------------- |
| GENERAL DEVELOPMENT AND PROJECT MANAGEMENT |
| M: John Blyberg <john@blyberg.net> |
| S: maintained |
| /tags/1.1.0-rc3/locum-server.php |
|---|
| New file |
| 0,0 → 1,807 |
| <?php |
| /** |
| * Locum is a software library that abstracts ILS functionality into a |
| * catalog discovery layer for use with such things as bolt-on OPACs like |
| * SOPAC. |
| * @package Locum |
| * @author John Blyberg |
| */ |
| require_once('locum.php'); |
| /** |
| * This class is the server component of Locum. It is separated from the client piece because the functionality |
| * in this class should never need to be used in any front-end pieces. This class does all the harvesting and |
| * data preparation. |
| */ |
| class locum_server extends locum { |
| /** |
| * This function initiates the harvest of bib records from the catalog. |
| * |
| * @param int $start Bib number to start with |
| * @param int $end Bib number to end with |
| * @param boolean $quiet quietly harvest or not. Default: TRUE |
| */ |
| public function harvest_bibs($start, $end, $quiet = TRUE) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($start, $end, $quiet); |
| } |
| if ($start > $end) { return 0; } |
| $num_children = $this->locum_config['harvest_config']['max_children']; |
| $num_to_process = $end - $start; |
| $increment = ceil($num_to_process / $num_children); |
| if (extension_loaded('pcntl') && $this->locum_config['harvest_config']['harvest_with_children'] && ($num_to_process >= (2 * $num_children))) { |
| for ($i = 0; $i < $num_children; ++$i) { |
| $end = $start + ($increment - 1); |
| $new_start = $end + 1; |
| $pid = pcntl_fork(); |
| if ($pid != -1) { |
| if ($pid) { |
| parent::putlog("Spawning child harvester to scan records $start - $end. PID is $pid .."); |
| } else { |
| sleep(1); |
| ++$i; |
| if ($i == $num_children) { $end++; } |
| $result = self::import_bibs($start, $end); |
| parent::putlog("Child process complete. Scanned records $start - $end. Imported " . $result['imported'] . " records and skipped $result[skipped] ..", 2); |
| exit($i); |
| } |
| } else { |
| parent::putlog("Unable to spawn harvester: ($i)", 5); |
| } |
| $start = $new_start; |
| } |
| if ($pid) { |
| while ($i > 0) { |
| pcntl_waitpid(-1, &$status); |
| $val = pcntl_wexitstatus($status); |
| --$i; |
| } |
| parent::putlog("Harvest complete!", 3); |
| } |
| } else { |
| $result = self::import_bibs($start, $end); |
| } |
| } |
| /** |
| * Does the actual import of bib records. Called by the harvester. |
| * It uses start and end parameters because this function can potentially be called by a |
| * child process. |
| * |
| * @param int $start Bib number to start with |
| * @param int $end Bib number to end with |
| * @return array Array of information about the bibs imported |
| */ |
| public function import_bibs($start, $end) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($start, $end); |
| } |
| $db =& MDB2::connect($this->dsn); |
| $process_report['skipped'] = 0; |
| $process_report['imported'] = 0; |
| $utf = "SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'"; |
| $utfprep = $db->query($utf); |
| for ($i = $start; $i <= $end; $i++) { |
| $sql = "SELECT bnum FROM locum_bib_items WHERE bnum = $i"; |
| $init_result = $db->query($sql); |
| $init_bib_arr = $init_result->fetchAll(MDB2_FETCHMODE_ASSOC); |
| if(empty($init_bib_arr)) { |
| $bib = $this->locum_cntl->scrape_bib($i, $this->locum_config['api_config']['skip_covers']); |
| if ($bib == FALSE || $bib == 'skip' || $bib['suppress'] == 1) { |
| $process_report['skipped']++; |
| } else { |
| $subj = $bib['subjects']; |
| $valid_vals = array('bib_created', 'bib_lastupdate', 'bib_prevupdate', 'bib_revs', 'lang', 'loc_code', 'mat_code', 'author', 'addl_author', 'title', 'title_medium', 'edition', 'series', 'callnum', 'pub_info', 'pub_year', 'stdnum', 'upc', 'lccn', 'descr', 'notes', 'bnum', 'cover_img', 'download_link'); |
| foreach ($bib as $bkey => $bval) { |
| if (in_array($bkey, $valid_vals)) { $bib_values[$bkey] = $bval; } |
| } |
| $bib_values['subjects_ser'] = serialize($subj); |
| $types = array('date', 'date', 'date', 'integer', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'integer', 'text', 'text', 'integer', 'text', 'text', 'text', 'integer', 'text', 'text'); |
| $sql_prep = $db->prepare('INSERT INTO locum_bib_items VALUES (:bnum, :author, :addl_author, :title, :title_medium, :edition, :series, :callnum, :pub_info, :pub_year, :stdnum, :upc, :lccn, :descr, :notes, :subjects_ser, :lang, :loc_code, :mat_code, :cover_img, :download_link, NOW(), :bib_created, :bib_lastupdate, :bib_prevupdate, :bib_revs, \'1\')'); |
| $affrows = $sql_prep->execute($bib_values); |
| parent::putlog("Importing bib # $i - $bib[title]"); |
| $sql_prep->free(); |
| if (is_array($subj) && count($subj)) { |
| foreach ($subj as $subj_heading) { |
| $insert_data = array($bib['bnum'], $subj_heading); |
| $types = array('integer', 'text'); |
| $sql_prep = $db->prepare('INSERT INTO locum_bib_items_subject VALUES (?, ?)', $types, MDB2_PREPARE_MANIP); |
| $affrows = $sql_prep->execute($insert_data); |
| $sql_prep->free(); |
| } |
| } |
| $process_report['imported']++; |
| } |
| } |
| } |
| $db->disconnect(); |
| return $process_report; |
| } |
| /** |
| * Does the actual update of the bib record if something has changed. |
| * This function is called by verify_bibs() |
| * |
| * @param array $bib_arr Array of bibs like: key => val is bnum => last update date |
| * @return array Array of # updated and # retired |
| */ |
| public function update_bib($bib_arr) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($bib_arr); |
| } |
| $db = MDB2::connect($this->dsn); |
| $updated = 0; |
| $retired = 0; |
| $skipped = 0; |
| foreach ($bib_arr as $bnum => $init_bib_date) { |
| if(!$firstbib) { |
| $firstbib = $bnum; |
| } |
| $lastbib = $bnum; |
| $bib = $this->locum_cntl->scrape_bib($bnum, $this->locum_config['api_config']['skip_covers']); |
| $utf = "SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'"; |
| $utfprep = $db->query($utf); |
| if ($bib == FALSE) { |
| // Weed this record |
| // TODO add a verification of weed in here somehow |
| $sql_prep =& $db->prepare('UPDATE locum_bib_items SET active = ? WHERE bnum = ?', array('text', 'integer')); |
| $sql_prep->execute(array('0', $bnum)); |
| $sql_prep =& $db->prepare('DELETE FROM locum_bib_items_subject WHERE bnum = ?', array('integer')); |
| $sql_prep->execute(array($bnum)); |
| $sql_prep->free(); |
| $retired++; |
| } else if ($bib == 'skip') { |
| // Do nothing. This might happen if the ILS server is down. |
| $skipped++; |
| } else if ($bib['bnum'] && $bib['bib_lastupdate'] != $init_bib_date) { |
| $subj = $bib['subjects']; |
| $valid_vals = array('bib_created', 'bib_lastupdate', 'bib_prevupdate', 'bib_revs', 'lang', 'loc_code', 'mat_code', 'author', 'addl_author', 'title', 'title_medium', 'edition', 'series', 'callnum', 'pub_info', 'pub_year', 'stdnum', 'upc', 'lccn', 'descr', 'notes', 'bnum', 'download_link'); |
| foreach ($bib as $bkey => $bval) { |
| if (in_array($bkey, $valid_vals)) { $bib_values[$bkey] = $bval; } |
| } |
| $bib_values['subjects_ser'] = serialize($subj); |
| $types = array('date', 'date', 'date', 'integer', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'integer', 'text', 'text', 'integer', 'text', 'text', 'text', 'text'); |
| $setlist = |
| "bib_created = :bib_created, " . |
| "bib_lastupdate = :bib_lastupdate, " . |
| "bib_prevupdate = :bib_prevupdate, " . |
| "bib_revs = :bib_revs, " . |
| "lang = :lang, " . |
| "loc_code = :loc_code, " . |
| "mat_code = :mat_code, " . |
| "author = :author, " . |
| "addl_author = :addl_author, " . |
| "title = :title, " . |
| "title_medium = :title_medium, " . |
| "edition = :edition, " . |
| "series = :series, " . |
| "callnum = :callnum, " . |
| "pub_info = :pub_info, " . |
| "pub_year = :pub_year, " . |
| "stdnum = :stdnum, " . |
| "upc = :upc, " . |
| "lccn = :lccn, " . |
| "descr = :descr, " . |
| "notes = :notes, " . |
| "subjects = :subjects_ser, " . |
| "download_link = :download_link, " . |
| "modified = NOW()"; |
| $sql_prep =& $db->prepare('UPDATE locum_bib_items SET ' . $setlist . ' WHERE bnum = :bnum', $types, MDB2_PREPARE_MANIP); |
| $res = $sql_prep->execute($bib_values); |
| $sql_prep =& $db->prepare('DELETE FROM locum_bib_items_subject WHERE bnum = ?', array('integer')); |
| $sql_prep->execute(array($bnum)); |
| $sql_prep->free(); |
| if (is_array($subj) && count($subj)) { |
| foreach ($subj as $subj_heading) { |
| $insert_data = array($bnum, $subj_heading); |
| $types = array('integer', 'text'); |
| $sql_prep =& $db->prepare('INSERT INTO locum_bib_items_subject VALUES (?, ?)', $types, MDB2_PREPARE_MANIP); |
| $affrows = $sql_prep->execute($insert_data); |
| $sql_prep->free(); |
| } |
| } |
| parent::putlog("Updated record # $bnum - $bib[title]", 2, TRUE); |
| $updated++; |
| } |
| } |
| $db->disconnect(); |
| parent::putlog("Processed $firstbib - $lastbib"); |
| return array('retired' => $retired, 'updated' => $updated, 'skipped' => $skipped); |
| } |
| /** |
| * Scans for newly cataloged bib records. |
| * Uses the ini "harvest_reach" param to determine how far forward to seek. |
| */ |
| public function new_bib_scan() { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}(); |
| } |
| $db = MDB2::connect($this->dsn); |
| $sql = 'SELECT MAX(bnum) FROM locum_bib_items'; |
| $max_bib_result =& $db->query($sql); |
| $max_bib = $max_bib_result->fetchOne(); |
| $next_bib = $max_bib + 1; |
| $last_bib = $next_bib + $this->locum_config['harvest_config']['harvest_reach']; |
| $db->disconnect(); |
| parent::putlog("Harvesting bibs # $next_bib - $last_bib", 2, TRUE); |
| self::harvest_bibs($next_bib, $last_bib); |
| } |
| /** |
| * Flushes the holds_count table and rebuilds it. Useful for keeping popularity information |
| * up-to-date. It's needed in this format so that the sphinx index can be rebuilt with |
| * dortable popularity data. |
| */ |
| public function rebuild_holds_cache() { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}(); |
| } |
| $db = MDB2::connect($this->dsn); |
| $db->query('DELETE FROM locum_holds_count'); |
| $db->query('INSERT INTO locum_holds_count (bnum) SELECT locum_bib_items.bnum FROM locum_bib_items'); |
| $counts = array('week', 'month', 'year', 'total'); |
| $sql_week = 'SELECT bnum, COUNT(bnum) AS total FROM locum_holds_placed WHERE hold_date >= DATE_SUB(CURDATE(), INTERVAL 1 WEEK) GROUP BY bnum'; |
| $sql_month = 'SELECT bnum, COUNT(bnum) AS total FROM locum_holds_placed WHERE hold_date >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH) GROUP BY bnum'; |
| $sql_year = 'SELECT bnum, COUNT(bnum) AS total FROM locum_holds_placed WHERE hold_date >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR) GROUP BY bnum'; |
| $sql_total = 'SELECT bnum, COUNT(bnum) AS total FROM locum_holds_placed GROUP BY bnum'; |
| foreach ($counts as $count_type) { |
| $dbq =& $db->query(${'sql_' . $count_type}); |
| $result_arr = $dbq->fetchAll(MDB2_FETCHMODE_ASSOC); |
| foreach ($result_arr as $result) { |
| $db->query('UPDATE locum_holds_count SET hold_count_' . $count_type . ' = ' . $result['total'] . ' WHERE bnum = ' . $result['bnum']); |
| } |
| } |
| } |
| public function rebuild_facet_heap() { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}(); |
| } |
| $db = MDB2::connect($this->dsn); |
| $db->exec("DELETE FROM locum_facet_heap"); |
| $db->exec("INSERT INTO locum_facet_heap (bnum, series, mat_code, loc_code, lang, pub_year, pub_decade, bib_lastupdate) " . |
| "SELECT locum_bib_items.bnum, series, mat_code, loc_code, lang, pub_year, TRUNCATE(pub_year/10,0)*10 AS pub_decade, bib_lastupdate " . |
| "FROM locum_bib_items " . |
| "LEFT JOIN locum_availability on locum_bib_items.bnum = locum_availability.bnum " . |
| "WHERE active = '1'"); |
| } |
| /** |
| * Tells sphinx indexer to index |
| * Supports specific indexes |
| * |
| * @param string $index index to index |
| * @param boolean $new TRUE or FALSE on whether it is initial index. Default is FALSE - reindex |
| * @return string Status Success or Failure |
| */ |
| public function index($index = 'all', $new = FALSE) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($index, $new); |
| } |
| $binpath = $this->locum_config['sphinx_config']['bin_path']; |
| $server = $this->locum_config['sphinx_config']['server_addr']; |
| $pubkey = $this->locum_config['sphinx_config']['pubkey_path']; |
| $privkey = $this->locum_config['sphinx_config']['privkey_path']; |
| $secret = $this->locum_config['sphinx_config']['key_pass']; |
| $username = $this->locum_config['sphinx_config']['key_user']; |
| switch ($index) { |
| case "keyword": |
| $options = "bib_items_keyword"; |
| break; |
| case "author": |
| $options = "bib_items_author"; |
| break; |
| case "title": |
| $options = "bib_items_title"; |
| break; |
| case "callnum": |
| $options = "bib_items_callnum"; |
| break; |
| case "subject": |
| $options = "bib_items_subject"; |
| break; |
| case "tags": |
| $options = "bib_items_tags"; |
| break; |
| case "reviews": |
| $options = "bib_items_reviews"; |
| break; |
| case "social": |
| $options = "bib_items_tags bib_items_reviews"; |
| break; |
| case "bib": |
| $options = "bib_items_keyword bib_items_author bib_items_title bib_items_callnum bib_items_subject"; |
| break; |
| default: |
| $options = "--all"; |
| } |
| $command = $binpath . "/indexer " . $options; |
| if(!$new) { |
| $command .= " --rotate"; |
| } |
| if($server == 'localhost' || $server == '127.0.0.1') { |
| $cmdout = shell_exec($command); |
| } else { |
| $connection = ssh2_connect($server, 22, array('hostkey'=>'ssh-rsa')); |
| if (ssh2_auth_pubkey_file($connection, $username, $pubkey, $privkey, $secret)) { |
| $stream = ssh2_exec($connection, $command); |
| stream_set_blocking($stream, true); |
| $cmdout = stream_get_contents($stream); |
| } |
| } |
| $success = "succesfully sent SIGHUP"; |
| $check = strpos($cmdout,$success); |
| if ($pos === FALSE) { |
| return FALSE; |
| } |
| else { |
| return TRUE; |
| } |
| } |
| /************ Verification / Maintenance Functions ************/ |
| /** |
| * Scans existing imported bibs for changes or weeds and makes the appropriate changes. |
| * |
| * @param boolean $quiet Run this function silently. Default: TRUE |
| */ |
| public function verify_bibs($quiet = TRUE) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($quiet); |
| } |
| $limit = 1000; |
| $offset = 0; |
| parent::putlog("Collecting current data keys .."); |
| $db = MDB2::connect($this->dsn); |
| $sql = "SELECT bnum, bib_lastupdate FROM locum_bib_items WHERE active = '1' ORDER BY bnum LIMIT $limit"; |
| $init_result = $db->query($sql); |
| $init_bib_arr = $init_result->fetchAll(MDB2_FETCHMODE_ASSOC); |
| while(!empty($init_bib_arr)) { |
| $num_children = $this->locum_config['harvest_config']['max_children']; |
| $num_to_process = count($init_bib_arr); |
| $bib_arr = array(); |
| foreach ($init_bib_arr as $init_bib_arr_vals) { |
| $bib_arr[$init_bib_arr_vals['bnum']] = $init_bib_arr_vals['bib_lastupdate']; |
| } |
| $db->disconnect(); |
| parent::putlog("Finished collecting data keys."); |
| if (extension_loaded('pcntl') && $this->locum_config['harvest_config']['harvest_with_children'] && ($num_to_process >= (2 * $num_children))) { |
| $increment = ceil($num_to_process / $num_children); |
| $split_offset = 0; |
| for ($i = 0; $i < $num_children; ++$i) { |
| $end = $start + ($increment - 1); |
| $new_start = $end + 1; |
| $pid = pcntl_fork(); |
| if ($pid != -1) { |
| if ($pid) { |
| parent::putlog("Spawning child harvester to verify records of $start - $end. PID is $pid .."); |
| } else { |
| sleep(1); |
| ++$i; |
| if ($i == $num_children) { $end++; } |
| $bib_arr_sliced = array_slice($bib_arr, $split_offset, $increment, TRUE); |
| $num_bibs = count($bib_arr_sliced); |
| $tmp = self::update_bib($bib_arr_sliced); |
| $updated = $tmp['updated']; |
| $retired = $tmp['retired']; |
| parent::putlog("Child process complete. Checked $num_bibs records, updated $updated records, retired $retired records.", 2); |
| exit($i); |
| } |
| } else { |
| parent::putlog("Unable to spawn harvester: ($i)", 5); |
| } |
| $start = $new_start; |
| $split_offset = $split_offset + $increment; |
| } |
| if ($pid) { |
| while ($i > 0) { |
| pcntl_waitpid(-1, &$status); |
| $val = pcntl_wexitstatus($status); |
| --$i; |
| } |
| parent::putlog("Verification complete!", 3); |
| } |
| } else { |
| // TODO - Bib verification for those poor saps w/o pcntl |
| } |
| $offset = $offset + $limit; |
| parent::putlog("Collecting current data keys starting at $offset"); |
| $db = MDB2::connect($this->dsn); |
| $sql = "SELECT bnum, bib_lastupdate FROM locum_bib_items WHERE active = '1' ORDER BY bnum LIMIT $limit OFFSET $offset"; |
| $init_result = $db->query($sql); |
| $init_bib_arr = $init_result->fetchAll(MDB2_FETCHMODE_ASSOC); |
| } |
| } |
| /** |
| * Scans existing imported bibs for changes to the availability cache. |
| * |
| * @param boolean $quiet Run this function silently. Default: TRUE |
| */ |
| public function verify_status($quiet = TRUE) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($quiet); |
| } |
| require_once('locum-client.php'); |
| $limit = 1000; |
| $offset = 0; |
| parent::putlog("Collecting current data keys .."); |
| $db = MDB2::connect($this->dsn); |
| $sql = "SELECT bnum, bib_lastupdate FROM locum_bib_items WHERE active = '1' ORDER BY bnum LIMIT $limit"; |
| $init_result = $db->query($sql); |
| $init_bib_arr = $init_result->fetchAll(MDB2_FETCHMODE_ASSOC); |
| $locumclient = new locum_client; |
| while(!empty($init_bib_arr)) { |
| $num_children = $this->locum_config['harvest_config']['max_children']; |
| $num_to_process = count($init_bib_arr); |
| $bib_arr = array(); |
| foreach ($init_bib_arr as $init_bib_arr_vals) { |
| $bib_arr[$init_bib_arr_vals['bnum']] = $init_bib_arr_vals['bib_lastupdate']; |
| } |
| $db->disconnect(); |
| parent::putlog("Finished collecting data keys."); |
| if (extension_loaded('pcntl') && $this->locum_config['harvest_config']['harvest_with_children'] && ($num_to_process >= (2 * $num_children))) { |
| $increment = ceil($num_to_process / $num_children); |
| $split_offset = 0; |
| for ($i = 0; $i < $num_children; ++$i) { |
| $end = $start + ($increment - 1); |
| $new_start = $end + 1; |
| $pid = pcntl_fork(); |
| if ($pid != -1) { |
| if ($pid) { |
| parent::putlog("Spawning child harvester to verify records. PID is $pid .."); |
| } else { |
| sleep(1); |
| ++$i; |
| if ($i == $num_children) { $end++; } |
| $bib_arr_sliced = array_slice($bib_arr, $split_offset, $increment, TRUE); |
| $num_bibs = count($bib_arr_sliced); |
| foreach ($bib_arr_sliced as $bnum => $init_bib_date) { |
| $locumclient->get_item_status($bnum, TRUE); |
| } |
| parent::putlog("Child process complete. Checked $num_bibs records", 2); |
| exit($i); |
| } |
| } else { |
| parent::putlog("Unable to spawn harvester: ($i)", 5); |
| } |
| $start = $new_start; |
| $split_offset = $split_offset + $increment; |
| } |
| if ($pid) { |
| while ($i > 0) { |
| pcntl_waitpid(-1, &$status); |
| $val = pcntl_wexitstatus($status); |
| --$i; |
| } |
| parent::putlog("Verification complete!", 3); |
| } |
| } else { |
| // TODO - Bib verification for those poor saps w/o pcntl |
| } |
| $offset = $offset + $limit; |
| parent::putlog("Collecting current data keys starting at $offset"); |
| $db = MDB2::connect($this->dsn); |
| $sql = "SELECT bnum, bib_lastupdate FROM locum_bib_items WHERE active = '1' ORDER BY bnum LIMIT $limit OFFSET $offset"; |
| $init_result = $db->query($sql); |
| $init_bib_arr = $init_result->fetchAll(MDB2_FETCHMODE_ASSOC); |
| } |
| } |
| /** |
| * Scans existing imported bibs for changes to the syndetics links. |
| * |
| * @param boolean $quiet Run this function silently. Default: TRUE |
| */ |
| public function verify_syndetics($quiet = TRUE) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($quiet); |
| } |
| $limit = 1000; |
| $offset = 0; |
| parent::putlog("Collecting current data keys .."); |
| $db = MDB2::connect($this->dsn); |
| $sql = "SELECT stdnum,bib_lastupdate FROM locum_bib_items WHERE stdnum IS NOT NULL ORDER BY bib_lastupdate DESC LIMIT $limit"; |
| $init_result = $db->query($sql); |
| $init_bib_arr = $init_result->fetchAll(MDB2_FETCHMODE_ASSOC); |
| while(!empty($init_bib_arr)) { |
| $num_children = $this->locum_config['harvest_config']['max_children']; |
| $num_to_process = count($init_bib_arr); |
| $bib_arr = array(); |
| foreach ($init_bib_arr as $init_bib_arr_vals) { |
| $bib_arr[$init_bib_arr_vals['stdnum']] = $init_bib_arr_vals['bib_lastupdate']; |
| } |
| $db->disconnect(); |
| parent::putlog("Finished collecting data keys."); |
| if (extension_loaded('pcntl') && $this->locum_config['harvest_config']['harvest_with_children'] && ($num_to_process >= (2 * $num_children))) { |
| $increment = ceil($num_to_process / $num_children); |
| $split_offset = 0; |
| for ($i = 0; $i < $num_children; ++$i) { |
| $end = $start + ($increment - 1); |
| $new_start = $end + 1; |
| $pid = pcntl_fork(); |
| if ($pid != -1) { |
| if ($pid) { |
| parent::putlog("Spawning child harvester to verify records. PID is $pid .."); |
| } else { |
| sleep(1); |
| ++$i; |
| if ($i == $num_children) { $end++; } |
| $bib_arr_sliced = array_slice($bib_arr, $split_offset, $increment, TRUE); |
| $num_bibs = count($bib_arr_sliced); |
| foreach ($bib_arr_sliced as $stdnum => $init_bib_date) { |
| if (preg_match('/ /', $stdnum)) { |
| $stdnum_arr = explode(' ', $stdnum); |
| $stdnum = $stdnum_arr[0]; |
| } else { |
| $stdnum = $stdnum; |
| } |
| parent::putlog("Checking syndetics for $stdnum", 2); |
| $tmp = self::get_syndetics($stdnum); |
| } |
| parent::putlog("Child process complete. Checked $num_bibs records", 2); |
| exit($i); |
| } |
| } else { |
| parent::putlog("Unable to spawn harvester: ($i)", 5); |
| } |
| $start = $new_start; |
| $split_offset = $split_offset + $increment; |
| } |
| if ($pid) { |
| while ($i > 0) { |
| pcntl_waitpid(-1, &$status); |
| $val = pcntl_wexitstatus($status); |
| --$i; |
| } |
| parent::putlog("Verification complete!", 3); |
| } |
| } else { |
| // TODO - Bib verification for those poor saps w/o pcntl |
| } |
| $offset = $offset + $limit; |
| parent::putlog("Collecting current data keys starting at $offset"); |
| $db = MDB2::connect($this->dsn); |
| $sql = "SELECT stdnum,bib_lastupdate FROM locum_bib_items WHERE stdnum IS NOT NULL ORDER BY bib_lastupdate DESC LIMIT $limit OFFSET $offset"; |
| $init_result = $db->query($sql); |
| $init_bib_arr = $init_result->fetchAll(MDB2_FETCHMODE_ASSOC); |
| } |
| } |
| /************ External Content Functions ************/ |
| /** |
| * Grabs the cover image URL for caching (much faster on the front-end to do it this way). |
| * Will try amazon if the ini says so. |
| * |
| * @param string $stdnum_raw - stdnum/ISBN from the bib record |
| * @return string Image URL or NULL |
| */ |
| public function get_cover_img($stdnum_raw) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($stdnum_raw); |
| } |
| // Format stdnum as best we can |
| if (preg_match('/ /', $stdnum_raw)) { |
| $stdnum_arr = explode(' ', $stdnum_raw); |
| $stdnum = trim($stdnum_arr[0]); |
| } else { |
| $stdnum = trim($stdnum_raw); |
| } |
| $api_cfg = $this->locum_config['api_config']; |
| $image_url = ''; |
| if ($api_cfg['use_amazon_images'] && $api_cfg['use_syndetic_images']) { |
| if ($api_cfg['amazon_img_prio'] >= $api_cfg['syndetic_img_prio']) { |
| $image_url = self::get_amazon_image($stdnum, $api_cfg['amazon_access_key']); |
| if (!$image_url) { $image_url = self::get_syndetic_image($stdnum, $api_cfg['syndetic_custid']); } |
| } else { |
| $image_url = self::get_syndetic_image($stdnum, $api_cfg['syndetic_custid']); |
| if (!$image_url) { $image_url = self::get_amazon_image($stdnum, $api_cfg['amazon_access_key']); } |
| } |
| } else if ($api_cfg['use_amazon_images']) { |
| $image_url = self::get_amazon_image($stdnum, $api_cfg['amazon_access_key']); |
| } else if ($api_cfg['use_syndetic_images']) { |
| $image_url = self::get_syndetic_image($stdnum, $api_cfg['syndetic_custid']); |
| } |
| return $image_url; |
| } |
| /** |
| * Used by get_cover_img to get the Amazon cover image URL. |
| * You'll need to put in your own Amazon API key into the ini. |
| * |
| * @param string $stdnum Stdnum/ISBN |
| * @param string $api_key Amazon API key - they're free. Go git one. |
| * @return string Cover image URL |
| */ |
| public function get_amazon_image($stdnum, $api_key) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($stdnum, $api_key); |
| } |
| $url = 'http://webservices.amazon.com/onca/xml?Service=AWSECommerceService'; |
| $url.= "&AWSAccessKeyId=$api_key"; |
| $url.= "&Operation=ItemLookup&IdType=ASIN&ItemId=$stdnum"; |
| $url.= '&ResponseGroup=Medium,OfferFull'; |
| $az_dl = @file_get_contents($url); |
| list($version, $status_code, $msg) = explode(' ', $http_response_header[0], 3); |
| if ($status_code == '200') { |
| $az = simplexml_load_string($az_dl); |
| if (is_object($az->Items)) { |
| if ($az->Items->Item->MediumImage->URL) { |
| $image_url = trim($az->Items->Item->MediumImage->URL); |
| } |
| } |
| } |
| return $image_url; |
| } |
| /** |
| * Used by get_cover_img to get the Syndetics cover image URL. |
| * You'll need to put in your own customer ID into the ini. |
| * |
| * @param string $stdnum Stdnum/ISBN |
| * @param string $cust_id Your syndetics ID - it's overpriced. Go git one. |
| * @return string Cover image URL |
| */ |
| public function get_syndetic_image($stdnum, $cust_id) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($stdnum, $cust_id); |
| } |
| $image_url = ''; |
| $url = 'http://www.syndetics.com/index.aspx?isbn=' . $stdnum . '/index.xml&client=' . $cust_id . '&type=xw10'; |
| $syn_dl = @file_get_contents($url); |
| list($version, $status_code, $msg) = explode(' ', $http_response_header[0], 3); |
| if (preg_match('/xml/', $syn_dl) && $status_code == '200') { |
| $syn = simplexml_load_string($syn_dl); |
| if ($syn->SC == 'SC.GIF') { |
| $image_url = 'http://www.syndetics.com/index.php?type=hw7&isbn=' . $stdnum . '/SC.GIF&client=' . $cust_id; |
| $img_size = @getimagesize($image_url); |
| if ($img_size[0] == 1) { $image_url = ''; } |
| } |
| } |
| return $image_url; |
| } |
| public function get_syndetics($isbn) { |
| if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { |
| eval('$hook = new ' . __CLASS__ . '_hook;'); |
| return $hook->{__FUNCTION__}($isbn); |
| } |
| $valid_hits = array( |
| 'TOC' => 'Table of Contents', |
| 'BNATOC' => 'Table of Contents', |
| 'FICTION' => 'Fiction Profile', |
| 'SUMMARY' => 'Summary / Annotation', |
| 'DBCHAPTER' => 'Excerpt', |
| 'LJREVIEW' => 'Library Journal Review', |
| 'PWREVIEW' => 'Publishers Weekly Review', |
| 'SLJREVIEW' => 'School Library Journal Review', |
| 'CHREVIEW' => 'CHOICE Review', |
| 'BLREVIEW' => 'Booklist Review', |
| 'HORNBOOK' => 'Horn Book Review', |
| 'KIRKREVIEW' => 'Kirkus Book Review', |
| 'ANOTES' => 'Author Notes' |
| ); |
| $cust_id = $this->locum_config['api_config']['syndetic_custid']; |
| if (!$cust_id) { |
| return NULL; |
| } |
| $db =& MDB2::connect($this->dsn); |
| $res = $db->query("SELECT links FROM locum_syndetics_links WHERE isbn = '$isbn' AND updated > DATE_SUB(NOW(), INTERVAL 2 MONTH) LIMIT 1"); |
| $dbres = $res->fetchAll(MDB2_FETCHMODE_ASSOC); |
| if ($dbres[0]['links']) { |
| $links = explode('|', $dbres[0]['links']); |
| } else { |
| $xmlurl = "http://www.syndetics.com/index.aspx?isbn=$isbn/index.xml&client=$cust_id&type=xw10"; |
| $xmlraw = file_get_contents($xmlurl); |
| if (!preg_match('/error/', $xmlraw)) { |
| // record found |
| $xmlobj = (array) simplexml_load_string($xmlraw); |
| $delimit = ''; |
| foreach ($xmlobj as $xkey => $xval) { |
| if (array_key_exists($xkey, $valid_hits)) { |
| $sqlfield .= $delimit . $xkey; |
| $delimit = '|'; |
| $links[] = $xkey; |
| } |
| } |
| if ($sqlfield) { |
| $res = $db->query("INSERT INTO locum_syndetics_links VALUES ('$isbn', '$sqlfield', NOW())"); |
| } |
| } |
| } |
| if ($links) { |
| foreach ($links as $link) { |
| $link_result[$valid_hits[$link]] = 'http://www.syndetics.com/index.aspx?isbn=' . $isbn . '/' . $link . '.html&client=' . $cust_id; |
| } |
| } |
| $db->disconnect(); |
| return $link_result; |
| } |
| } |
| /tags/1.1.0-rc3/sphinx/sphinx.conf |
|---|
| New file |
| 0,0 → 1,571 |
| # |
| # Sphinx configuration file sample |
| # |
| # WARNING! While this sample file mentions all available options, |
| # it contains (very) short helper descriptions only. Please refer to |
| # doc/sphinx.html for details. |
| # |
| ############################################################################# |
| ## data source definition |
| ############################################################################# |
| source bib_items_keyword |
| { |
| type = mysql |
| sql_host = localhost |
| sql_user = locum_db_user |
| sql_pass = locum_db_pass |
| sql_db = scas |
| sql_port = 3306 |
| sql_query_pre = SET CHARACTER_SET_RESULTS=utf8 |
| sql_query_pre = SET NAMES utf8 |
| sql_query = \ |
| SELECT locum_bib_items.bnum, author, addl_author, title, title_medium, series, callnum, CRC32(pub_info) AS pub_info, pub_year, pub_year as pubyear, stdnum, notes, subjects, \ |
| CRC32(lang) AS lang, lang as langcode, CRC32(loc_code) AS loc_code, CRC32(mat_code) AS mat_code, \ |
| UNIX_TIMESTAMP(bib_created) AS bib_created, UNIX_TIMESTAMP(bib_lastupdate) AS bib_lastupdate, \ |
| LOWER(title) AS title_ord, LOWER(author) AS author_ord, author IS NULL AS author_null, \ |
| hold_count_week, hold_count_month, hold_count_year, hold_count_total, \ |
| rating_idx, tag_idx, review_idx, LENGTH(title) AS titlelength \ |
| FROM locum_bib_items \ |
| LEFT JOIN locum_holds_count USING (bnum) LEFT JOIN insurge_index USING (bnum) \ |
| WHERE locum_bib_items.active = '1' |
| sql_attr_str2ordinal = title_ord |
| sql_attr_str2ordinal = author_ord |
| sql_attr_uint = author_null |
| sql_attr_uint = pub_info |
| sql_attr_uint = pub_year |
| sql_attr_uint = loc_code |
| sql_attr_uint = mat_code |
| sql_attr_uint = lang |
| sql_attr_uint = hold_count_week |
| sql_attr_uint = hold_count_month |
| sql_attr_uint = hold_count_year |
| sql_attr_uint = hold_count_total |
| sql_attr_uint = rating_idx |
| sql_attr_uint = titlelength |
| sql_attr_timestamp = bib_created |
| sql_attr_timestamp = bib_lastupdate |
| } |
| source bib_items_author |
| { |
| type = mysql |
| sql_host = localhost |
| sql_user = locum_db_user |
| sql_pass = locum_db_pass |
| sql_db = scas |
| sql_port = 3306 |
| sql_query_pre = SET CHARACTER_SET_RESULTS=utf8 |
| sql_query_pre = SET NAMES utf8 |
| sql_query = \ |
| SELECT locum_bib_items.bnum, author, addl_author, CRC32(pub_info) AS pub_info, pub_year, CRC32(lang) AS lang, \ |
| CRC32(loc_code) AS loc_code, CRC32(mat_code) AS mat_code, \ |
| UNIX_TIMESTAMP(bib_created) AS bib_created, UNIX_TIMESTAMP(bib_lastupdate) AS bib_lastupdate, \ |
| LOWER(title) AS title_ord, LOWER(author) AS author_ord, author IS NULL AS author_null,\ |
| hold_count_week, hold_count_month, hold_count_year, hold_count_total, \ |
| rating_idx, LENGTH(title) AS titlelength \ |
| FROM locum_bib_items \ |
| LEFT JOIN locum_holds_count USING (bnum) LEFT JOIN insurge_index USING (bnum) \ |
| WHERE locum_bib_items.active = '1' |
| sql_attr_str2ordinal = title_ord |
| sql_attr_str2ordinal = author_ord |
| sql_attr_uint = author_null |
| sql_attr_uint = pub_info |
| sql_attr_uint = pub_year |
| sql_attr_uint = loc_code |
| sql_attr_uint = mat_code |
| sql_attr_uint = lang |
| sql_attr_uint = hold_count_week |
| sql_attr_uint = hold_count_month |
| sql_attr_uint = hold_count_year |
| sql_attr_uint = hold_count_total |
| sql_attr_uint = rating_idx |
| sql_attr_uint = titlelength |
| sql_attr_timestamp = bib_created |
| sql_attr_timestamp = bib_lastupdate |
| } |
| source bib_items_title |
| { |
| type = mysql |
| sql_host = localhost |
| sql_user = locum_db_user |
| sql_pass = locum_db_pass |
| sql_db = scas |
| sql_port = 3306 |
| sql_query_pre = SET CHARACTER_SET_RESULTS=utf8 |
| sql_query_pre = SET NAMES utf8 |
| sql_query = \ |
| SELECT locum_bib_items.bnum, title, title_medium, CRC32(pub_info) AS pub_info, pub_year, CRC32(lang) AS lang, CRC32(loc_code) AS loc_code, \ |
| CRC32(mat_code) AS mat_code, \ |
| UNIX_TIMESTAMP(bib_created) AS bib_created, UNIX_TIMESTAMP(bib_lastupdate) AS bib_lastupdate, \ |
| LOWER(title) AS title_ord, LOWER(author) AS author_ord, author IS NULL AS author_null, hold_count_week, hold_count_month, \ |
| hold_count_year, hold_count_total, \ |
| rating_idx, LENGTH(title) AS titlelength \ |
| FROM locum_bib_items \ |
| LEFT JOIN locum_holds_count USING (bnum) LEFT JOIN insurge_index USING (bnum) \ |
| WHERE locum_bib_items.active = '1' |
| sql_attr_str2ordinal = title_ord |
| sql_attr_str2ordinal = author_ord |
| sql_attr_uint = author_null |
| sql_attr_uint = pub_info |
| sql_attr_uint = pub_year |
| sql_attr_uint = loc_code |
| sql_attr_uint = mat_code |
| sql_attr_uint = lang |
| sql_attr_uint = hold_count_week |
| sql_attr_uint = hold_count_month |
| sql_attr_uint = hold_count_year |
| sql_attr_uint = hold_count_total |
| sql_attr_uint = rating_idx |
| sql_attr_uint = titlelength |
| sql_attr_timestamp = bib_created |
| sql_attr_timestamp = bib_lastupdate |
| } |
| source bib_items_subject |
| { |
| type = mysql |
| sql_host = localhost |
| sql_user = locum_db_user |
| sql_pass = locum_db_pass |
| sql_db = scas |
| sql_port = 3306 |
| sql_query_pre = SET CHARACTER_SET_RESULTS=utf8 |
| sql_query_pre = SET NAMES utf8 |
| sql_query = \ |
| SELECT locum_bib_items.bnum, subjects, CRC32(pub_info) AS pub_info, pub_year, CRC32(lang) AS lang, CRC32(loc_code) AS loc_code, \ |
| CRC32(mat_code) AS mat_code, \ |
| UNIX_TIMESTAMP(bib_created) AS bib_created, UNIX_TIMESTAMP(bib_lastupdate) AS bib_lastupdate, \ |
| LOWER(title) AS title_ord, LOWER(author) AS author_ord, author IS NULL AS author_null, \ |
| hold_count_week, hold_count_month, hold_count_year, hold_count_total, \ |
| rating_idx, LENGTH(title) AS titlelength \ |
| FROM locum_bib_items \ |
| LEFT JOIN locum_holds_count USING (bnum) LEFT JOIN insurge_index USING (bnum) \ |
| WHERE locum_bib_items.active = '1' |
| sql_attr_str2ordinal = title_ord |
| sql_attr_str2ordinal = author_ord |
| sql_attr_uint = author_null |
| sql_attr_uint = pub_info |
| sql_attr_uint = pub_year |
| sql_attr_uint = loc_code |
| sql_attr_uint = mat_code |
| sql_attr_uint = lang |
| sql_attr_uint = hold_count_week |
| sql_attr_uint = hold_count_month |
| sql_attr_uint = hold_count_year |
| sql_attr_uint = hold_count_total |
| sql_attr_uint = rating_idx |
| sql_attr_uint = titlelength |
| sql_attr_timestamp = bib_created |
| sql_attr_timestamp = bib_lastupdate |
| } |
| source bib_items_callnum |
| { |
| type = mysql |
| sql_host = localhost |
| sql_user = locum_db_user |
| sql_pass = locum_db_pass |
| sql_db = scas |
| sql_port = 3306 |
| sql_query_pre = SET CHARACTER_SET_RESULTS=utf8 |
| sql_query_pre = SET NAMES utf8 |
| sql_query = \ |
| SELECT locum_bib_items.bnum, callnum, CRC32(pub_info) AS pub_info, pub_year, CRC32(lang) AS lang, CRC32(loc_code) AS loc_code, \ |
| CRC32(mat_code) AS mat_code, \ |
| UNIX_TIMESTAMP(bib_created) AS bib_created, UNIX_TIMESTAMP(bib_lastupdate) AS bib_lastupdate, \ |
| LOWER(title) AS title_ord, LOWER(author) AS author_ord, author IS NULL AS author_null, \ |
| hold_count_week, hold_count_month, hold_count_year, hold_count_total, \ |
| rating_idx, LENGTH(title) AS titlelength \ |
| FROM locum_bib_items \ |
| LEFT JOIN locum_holds_count USING (bnum) LEFT JOIN insurge_index USING (bnum) \ |
| WHERE locum_bib_items.active = '1' |
| sql_attr_str2ordinal = title_ord |
| sql_attr_str2ordinal = author_ord |
| sql_attr_uint = author_null |
| sql_attr_uint = pub_info |
| sql_attr_uint = pub_year |
| sql_attr_uint = loc_code |
| sql_attr_uint = mat_code |
| sql_attr_uint = lang |
| sql_attr_uint = hold_count_week |
| sql_attr_uint = hold_count_month |
| sql_attr_uint = hold_count_year |
| sql_attr_uint = hold_count_total |
| sql_attr_uint = rating_idx |
| sql_attr_uint = titlelength |
| sql_attr_timestamp = bib_created |
| sql_attr_timestamp = bib_lastupdate |
| } |
| source bib_items_tags |
| { |
| type = mysql |
| sql_host = localhost |
| sql_user = locum_db_user |
| sql_pass = locum_db_pass |
| sql_db = scas |
| sql_port = 3306 |
| sql_query_pre = SET CHARACTER_SET_RESULTS=utf8 |
| sql_query_pre = SET NAMES utf8 |
| sql_query = \ |
| SELECT locum_bib_items.bnum, CRC32(pub_info) AS pub_info, pub_year, CRC32(lang) AS lang, CRC32(loc_code) AS loc_code, \ |
| CRC32(mat_code) AS mat_code, \ |
| UNIX_TIMESTAMP(bib_created) AS bib_created, UNIX_TIMESTAMP(bib_lastupdate) AS bib_lastupdate, \ |
| LOWER(title) AS title_ord, LOWER(author) AS author_ord, author IS NULL AS author_null, hold_count_week, hold_count_month, \ |
| hold_count_year, hold_count_total, \ |
| rating_idx, tag_idx, LENGTH(title) AS titlelength \ |
| FROM locum_bib_items \ |
| LEFT JOIN locum_holds_count USING (bnum) LEFT JOIN insurge_index USING (bnum) \ |
| WHERE locum_bib_items.active = '1' |
| sql_attr_str2ordinal = title_ord |
| sql_attr_str2ordinal = author_ord |
| sql_attr_uint = author_null |
| sql_attr_uint = pub_info |
| sql_attr_uint = pub_year |
| sql_attr_uint = loc_code |
| sql_attr_uint = mat_code |
| sql_attr_uint = lang |
| sql_attr_uint = hold_count_week |
| sql_attr_uint = hold_count_month |
| sql_attr_uint = hold_count_year |
| sql_attr_uint = hold_count_total |
| sql_attr_uint = rating_idx |
| sql_attr_uint = titlelength |
| sql_attr_timestamp = bib_created |
| sql_attr_timestamp = bib_lastupdate |
| } |
| source bib_items_reviews |
| { |
| type = mysql |
| sql_host = localhost |
| sql_user = locum_db_user |
| sql_pass = locum_db_pass |
| sql_db = scas |
| sql_port = 3306 |
| sql_query_pre = SET CHARACTER_SET_RESULTS=utf8 |
| sql_query_pre = SET NAMES utf8 |
| sql_query = \ |
| SELECT locum_bib_items.bnum, CRC32(pub_info) AS pub_info, pub_year, CRC32(lang) AS lang, CRC32(loc_code) AS loc_code, \ |
| CRC32(mat_code) AS mat_code, \ |
| UNIX_TIMESTAMP(bib_created) AS bib_created, UNIX_TIMESTAMP(bib_lastupdate) AS bib_lastupdate, \ |
| LOWER(title) AS title_ord, LOWER(author) AS author_ord, author IS NULL AS author_null, hold_count_week, hold_count_month, \ |
| hold_count_year, hold_count_total, \ |
| rating_idx, review_idx, LENGTH(title) AS titlelength \ |
| FROM locum_bib_items \ |
| LEFT JOIN locum_holds_count USING (bnum) LEFT JOIN insurge_index USING (bnum) \ |
| WHERE locum_bib_items.active = '1' |
| sql_attr_str2ordinal = title_ord |
| sql_attr_str2ordinal = author_ord |
| sql_attr_uint = author_null |
| sql_attr_uint = pub_info |
| sql_attr_uint = pub_year |
| sql_attr_uint = loc_code |
| sql_attr_uint = mat_code |
| sql_attr_uint = lang |
| sql_attr_uint = hold_count_week |
| sql_attr_uint = hold_count_month |
| sql_attr_uint = hold_count_year |
| sql_attr_uint = hold_count_total |
| sql_attr_uint = rating_idx |
| sql_attr_uint = titlelength |
| sql_attr_timestamp = bib_created |
| sql_attr_timestamp = bib_lastupdate |
| } |
| ############################################################################# |
| ## index definition |
| ############################################################################# |
| index bib_items_keyword |
| { |
| source = bib_items_keyword |
| path = /usr/local/sphinx/var/data/bib_items_keyword |
| docinfo = extern |
| mlock = 0 |
| min_word_len = 1 |
| charset_type = utf-8 |
| html_strip = 0 |
| ignore_chars = U+22,U+23,U+24,U+25,U+26,U+27,U+28,U+29,U+2C,U+2E |
| enable_star = 1 |
| min_prefix_len = 1 |
| charset_table = 0..9, a..z, A..Z->a..z,-,U+FE20,U+FE21,U+2032, \ |
| U+00C0->a, U+00C1->a, U+00C2->a, U+00C3->a, U+00C4->a, U+00C5->a, U+00E0->a, U+00E1->a, U+00E2->a, U+00E3->a, U+00E4->a, U+00E5->a, U+0100->a, U+0101->a, U+0102->a, U+0103->a, U+010300->a, U+0104->a, U+0105->a, U+01CD->a, U+01CE->a, U+01DE->a, U+01DF->a, U+01E0->a, U+01E1->a, U+01FA->a, U+01FB->a, U+0200->a, U+0201->a, U+0202->a, U+0203->a, U+0226->a, U+0227->a, U+023A->a, U+0250->a, U+04D0->a, U+04D1->a, U+1D2C->a, U+1D43->a, U+1D44->a, U+1D8F->a, U+1E00->a, U+1E01->a, U+1E9A->a, U+1EA0->a, U+1EA1->a, U+1EA2->a, U+1EA3->a, U+1EA4->a, U+1EA5->a, U+1EA6->a, U+1EA7->a, U+1EA8->a, U+1EA9->a, U+1EAA->a, U+1EAB->a, U+1EAC->a, U+1EAD->a, U+1EAE->a, U+1EAF->a, U+1EB0->a, U+1EB1->a, U+1EB2->a, U+1EB3->a, U+1EB4->a, U+1EB5->a, U+1EB6->a, U+1EB7->a, U+2090->a, U+2C65->a, \ |
| U+0180->b, U+0181->b, U+0182->b, U+0183->b, U+0243->b, U+0253->b, U+0299->b, U+16D2->b, U+1D03->b, U+1D2E->b, U+1D2F->b, U+1D47->b, U+1D6C->b, U+1D80->b, U+1E02->b, U+1E03->b, U+1E04->b, U+1E05->b, U+1E06->b, U+1E07->b, \ |
| U+00C7->c, U+00E7->c, U+0106->c, U+0107->c, U+0108->c, U+0109->c, U+010A->c, U+010B->c, U+010C->c, U+010D->c, U+0187->c, U+0188->c, U+023B->c, U+023C->c, U+0255->c, U+0297->c, U+1D9C->c, U+1D9D->c, U+1E08->c, U+1E09->c, U+212D->c, U+2184->c, \ |
| U+010E->d, U+010F->d, U+0110->d, U+0111->d, U+0189->d, U+018A->d, U+018B->d, U+018C->d, U+01C5->d, U+01F2->d, U+0221->d, U+0256->d, U+0257->d, U+1D05->d, U+1D30->d, U+1D48->d, U+1D6D->d, U+1D81->d, U+1D91->d, U+1E0A->d, U+1E0B->d, U+1E0C->d, U+1E0D->d, U+1E0E->d, U+1E0F->d, U+1E10->d, U+1E11->d, U+1E12->d, U+1E13->d, \ |
| U+00C8->e, U+00C9->e, U+00CA->e, U+00CB->e, U+00E8->e, U+00E9->e, U+00EA->e, U+00EB->e, U+0112->e, U+0113->e, U+0114->e, U+0115->e, U+0116->e, U+0117->e, U+0118->e, U+0119->e, U+011A->e, U+011B->e, U+018E->e, U+0190->e, U+01DD->e, U+0204->e, U+0205->e, U+0206->e, U+0207->e, U+0228->e, U+0229->e, U+0246->e, U+0247->e, U+0258->e, U+025B->e, U+025C->e, U+025D->e, U+025E->e, U+029A->e, U+1D07->e, U+1D08->e, U+1D31->e, U+1D32->e, U+1D49->e, U+1D4B->e, U+1D4C->e, U+1D92->e, U+1D93->e, U+1D94->e, U+1D9F->e, U+1E14->e, U+1E15->e, U+1E16->e, U+1E17->e, U+1E18->e, U+1E19->e, U+1E1A->e, U+1E1B->e, U+1E1C->e, U+1E1D->e, U+1EB8->e, U+1EB9->e, U+1EBA->e, U+1EBB->e, U+1EBC->e, U+1EBD->e, U+1EBE->e, U+1EBF->e, U+1EC0->e, U+1EC1->e, U+1EC2->e, U+1EC3->e, U+1EC4->e, U+1EC5->e, U+1EC6->e, U+1EC7->e, U+2091->e, \ |
| U+0191->f, U+0192->f, U+1D6E->f, U+1D82->f, U+1DA0->f, U+1E1E->f, U+1E1F->f, \ |
| U+011C->g, U+011D->g, U+011E->g, U+011F->g, U+0120->g, U+0121->g, U+0122->g, U+0123->g, U+0193->g, U+01E4->g, U+01E5->g, U+01E6->g, U+01E7->g, U+01F4->g, U+01F5->g, U+0260->g, U+0261->g, U+0262->g, U+029B->g, U+1D33->g, U+1D4D->g, U+1D77->g, U+1D79->g, U+1D83->g, U+1DA2->g, U+1E20->g, U+1E21->g, \ |
| U+0124->h, U+0125->h, U+0126->h, U+0127->h, U+021E->h, U+021F->h, U+0265->h, U+0266->h, U+029C->h, U+02AE->h, U+02AF->h, U+02B0->h, U+02B1->h, U+1D34->h, U+1DA3->h, U+1E22->h, U+1E23->h, U+1E24->h, U+1E25->h, U+1E26->h, U+1E27->h, U+1E28->h, U+1E29->h, U+1E2A->h, U+1E2B->h, U+1E96->h, U+210C->h, U+2C67->h, U+2C68->h, U+2C75->h, U+2C76->h, \ |
| U+00CC->i, U+00CD->i, U+00CE->i, U+00CF->i, U+00EC->i, U+00ED->i, U+00EE->i, U+00EF->i, U+010309->i, U+0128->i, U+0129->i, U+012A->i, U+012B->i, U+012C->i, U+012D->i, U+012E->i, U+012F->i, U+0130->i, U+0131->i, U+0197->i, U+01CF->i, U+01D0->i, U+0208->i, U+0209->i, U+020A->i, U+020B->i, U+0268->i, U+026A->i, U+040D->i, U+0418->i, U+0419->i, U+0438->i, U+0439->i, U+0456->i, U+1D09->i, U+1D35->i, U+1D4E->i, U+1D62->i, U+1D7B->i, U+1D96->i, U+1DA4->i, U+1DA6->i, U+1DA7->i, U+1E2C->i, U+1E2D->i, U+1E2E->i, U+1E2F->i, U+1EC8->i, U+1EC9->i, U+1ECA->i, U+1ECB->i, U+2071->i, U+2111->i, \ |
| U+0134->j, U+0135->j, U+01C8->j, U+01CB->j, U+01F0->j, U+0237->j, U+0248->j, U+0249->j, U+025F->j, U+0284->j, U+029D->j, U+02B2->j, U+1D0A->j, U+1D36->j, U+1DA1->j, U+1DA8->j, \ |
| U+0136->k, U+0137->k, U+0198->k, U+0199->k, U+01E8->k, U+01E9->k, U+029E->k, U+1D0B->k, U+1D37->k, U+1D4F->k, U+1D84->k, U+1E30->k, U+1E31->k, U+1E32->k, U+1E33->k, U+1E34->k, U+1E35->k, U+2C69->k, U+2C6A->k, \ |
| U+0139->l, U+013A->l, U+013B->l, U+013C->l, U+013D->l, U+013E->l, U+013F->l, U+0140->l, U+0141->l, U+0142->l, U+019A->l, U+01C8->l, U+0234->l, U+023D->l, U+026B->l, U+026C->l, U+026D->l, U+029F->l, U+02E1->l, U+1D0C->l, U+1D38->l, U+1D85->l, U+1DA9->l, U+1DAA->l, U+1DAB->l, U+1E36->l, U+1E37->l, U+1E38->l, U+1E39->l, U+1E3A->l, U+1E3B->l, U+1E3C->l, U+1E3D->l, U+2C60->l, U+2C61->l, U+2C62->l, \ |
| U+019C->m, U+026F->m, U+0270->m, U+0271->m, U+1D0D->m, U+1D1F->m, U+1D39->m, U+1D50->m, U+1D5A->m, U+1D6F->m, U+1D86->m, U+1DAC->m, U+1DAD->m, U+1E3E->m, U+1E3F->m, U+1E40->m, U+1E41->m, U+1E42->m, U+1E43->m, \ |
| U+00D1->n, U+00F1->n, U+0143->n, U+0144->n, U+0145->n, U+0146->n, U+0147->n, U+0148->n, U+0149->n, U+019D->n, U+019E->n, U+01CB->n, U+01F8->n, U+01F9->n, U+0220->n, U+0235->n, U+0272->n, U+0273->n, U+0274->n, U+1D0E->n, U+1D3A->n, U+1D3B->n, U+1D70->n, U+1D87->n, U+1DAE->n, U+1DAF->n, U+1DB0->n, U+1E44->n, U+1E45->n, U+1E46->n, U+1E47->n, U+1E48->n, U+1E49->n, U+1E4A->n, U+1E4B->n, U+207F->n, \ |
| U+00D2->o, U+00D3->o, U+00D4->o, U+00D5->o, U+00D6->o, U+00D8->o, U+00F2->o, U+00F3->o, U+00F4->o, U+00F5->o, U+00F6->o, U+00F8->o, U+01030F->o, U+014C->o, U+014D->o, U+014E->o, U+014F->o, U+0150->o, U+0151->o, U+0186->o, U+019F->o, U+01A0->o, U+01A1->o, U+01D1->o, U+01D2->o, U+01EA->o, U+01EB->o, U+01EC->o, U+01ED->o, U+01FE->o, U+01FF->o, U+020C->o, U+020D->o, U+020E->o, U+020F->o, U+022A->o, U+022B->o, U+022C->o, U+022D->o, U+022E->o, U+022F->o, U+0230->o, U+0231->o, U+0254->o, U+0275->o, U+043E->o, U+04E6->o, U+04E7->o, U+04E8->o, U+04E9->o, U+04EA->o, U+04EB->o, U+1D0F->o, U+1D10->o, U+1D11->o, U+1D12->o, U+1D13->o, U+1D16->o, U+1D17->o, U+1D3C->o, U+1D52->o, U+1D53->o, U+1D54->o, U+1D55->o, U+1D97->o, U+1DB1->o, U+1E4C->o, U+1E4D->o, U+1E4E->o, U+1E4F->o, U+1E50->o, U+1E51->o, U+1E52->o, U+1E53->o, U+1ECC->o, U+1ECD->o, U+1ECE->o, U+1ECF->o, U+1ED0->o, U+1ED1->o, U+1ED2->o, U+1ED3->o, U+1ED4->o, U+1ED5->o, U+1ED6->o, U+1ED7->o, U+1ED8->o, U+1ED9->o, U+1EDA->o, U+1EDB->o, U+1EDC->o, U+1EDD->o, U+1EDE->o, U+1EDF->o, U+1EE0->o, U+1EE1->o, U+1EE2->o, U+1EE3->o, U+2092->o, U+2C9E->o, U+2C9F->o, \ |
| U+01A4->p, U+01A5->p, U+1D18->p, U+1D3E->p, U+1D56->p, U+1D71->p, U+1D7D->p, U+1D88->p, U+1E54->p, U+1E55->p, U+1E56->p, U+1E57->p, U+2C63->p, \ |
| U+024A->q, U+024B->q, U+02A0->q, \ |
| U+0154->r, U+0155->r, U+0156->r, U+0157->r, U+0158->r, U+0159->r, U+0210->r, U+0211->r, U+0212->r, U+0213->r, U+024C->r, U+024D->r, U+0279->r, U+027A->r, U+027B->r, U+027C->r, U+027D->r, U+027E->r, U+027F->r, U+0280->r, U+0281->r, U+02B3->r, U+02B4->r, U+02B5->r, U+02B6->r, U+1D19->r, U+1D1A->r, U+1D3F->r, U+1D63->r, U+1D72->r, U+1D73->r, U+1D89->r, U+1DCA->r, U+1E58->r, U+1E59->r, U+1E5A->r, U+1E5B->r, U+1E5C->r, U+1E5D->r, U+1E5E->r, U+1E5F->r, U+211C->r, U+2C64->r, \ |
| U+00DF->s, U+015A->s, U+015B->s, U+015C->s, U+015D->s, U+015E->s, U+015F->s, U+0160->s, U+0161->s, U+017F->s, U+0218->s, U+0219->s, U+023F->s, U+0282->s, U+02E2->s, U+1D74->s, U+1D8A->s, U+1DB3->s, U+1E60->s, U+1E61->s, U+1E62->s, U+1E63->s, U+1E64->s, U+1E65->s, U+1E66->s, U+1E67->s, U+1E68->s, U+1E69->s, U+1E9B->s, \ |
| U+0162->t, U+0163->t, U+0164->t, U+0165->t, U+0166->t, U+0167->t, U+01AB->t, U+01AC->t, U+01AD->t, U+01AE->t, U+021A->t, U+021B->t, U+0236->t, U+023E->t, U+0287->t, U+0288->t, U+1D1B->t, U+1D40->t, U+1D57->t, U+1D75->t, U+1DB5->t, U+1E6A->t, U+1E6B->t, U+1E6C->t, U+1E6D->t, U+1E6E->t, U+1E6F->t, U+1E70->t, U+1E71->t, U+1E97->t, U+2C66->t, \ |
| U+00D9->u, U+00DA->u, U+00DB->u, U+00DC->u, U+00F9->u, U+00FA->u, U+00FB->u, U+00FC->u, U+010316->u, U+0168->u, U+0169->u, U+016A->u, U+016B->u, U+016C->u, U+016D->u, U+016E->u, U+016F->u, U+0170->u, U+0171->u, U+0172->u, U+0173->u, U+01AF->u, U+01B0->u, U+01D3->u, U+01D4->u, U+01D5->u, U+01D6->u, U+01D7->u, U+01D8->u, U+01D9->u, U+01DA->u, U+01DB->u, U+01DC->u, U+0214->u, U+0215->u, U+0216->u, U+0217->u, U+0244->u, U+0289->u, U+1D1C->u, U+1D1D->u, U+1D1E->u, U+1D41->u, U+1D58->u, U+1D59->u, U+1D64->u, U+1D7E->u, U+1D99->u, U+1DB6->u, U+1DB8->u, U+1E72->u, U+1E73->u, U+1E74->u, U+1E75->u, U+1E76->u, U+1E77->u, U+1E78->u, U+1E79->u, U+1E7A->u, U+1E7B->u, U+1EE4->u, U+1EE5->u, U+1EE6->u, U+1EE7->u, U+1EE8->u, U+1EE9->u, U+1EEA->u, U+1EEB->u, U+1EEC->u, U+1EED->u, U+1EEE->u, U+1EEF->u, U+1EF0->u, U+1EF1->u, \ |
| U+01B2->v, U+0245->v, U+028B->v, U+028C->v, U+1D20->v, U+1D5B->v, U+1D65->v, U+1D8C->v, U+1DB9->v, U+1DBA->v, U+1E7C->v, U+1E7D->v, U+1E7E->v, U+1E7F->v, U+2C74->v, \ |
| U+0174->w, U+0175->w, U+028D->w, U+02B7->w, U+1D21->w, U+1D42->w, U+1E80->w, U+1E81->w, U+1E82->w, U+1E83->w, U+1E84->w, U+1E85->w, U+1E86->w, U+1E87->w, U+1E88->w, U+1E89->w, U+1E98->w, \ |
| U+02E3->x, U+1D8D->x, U+1E8A->x, U+1E8B->x, U+1E8C->x, U+1E8D->x, U+2093->x, \ |
| U+00DD->y, U+00FD->y, U+00FF->y, U+0176->y, U+0177->y, U+0178->y, U+01B3->y, U+01B4->y, U+0232->y, U+0233->y, U+024E->y, U+024F->y, U+028E->y, U+028F->y, U+02B8->y, U+1E8E->y, U+1E8F->y, U+1E99->y, U+1EF2->y, U+1EF3->y, U+1EF4->y, U+1EF5->y, U+1EF6->y, U+1EF7->y, U+1EF8->y, U+1EF9->y, \ |
| U+0179->z, U+017A->z, U+017B->z, U+017C->z, U+017D->z, U+017E->z, U+01B5->z, U+01B6->z, U+0224->z, U+0225->z, U+0240->z, U+0290->z, U+0291->z, U+1D22->z, U+1D76->z, U+1D8E->z, U+1DBB->z, U+1DBC->z, U+1DBD->z, U+1E90->z, U+1E91->z, U+1E92->z, U+1E93->z, U+1E94->z, U+1E95->z, U+2128->z, U+2C6B->z, U+2C6C->z, \ |
| U+00C6->U+00E6, U+01E2->U+00E6, U+01E3->U+00E6, U+01FC->U+00E6, U+01FD->U+00E6, U+1D01->U+00E6, U+1D02->U+00E6, U+1D2D->U+00E6, U+1D46->U+00E6, U+00E6 |
| } |
| index bib_items_author |
| { |
| source = bib_items_author |
| path = /usr/local/sphinx/var/data/bib_items_author |
| docinfo = extern |
| mlock = 0 |
| min_word_len = 1 |
| charset_type = utf-8 |
| html_strip = 0 |
| ignore_chars = U+22,U+23,U+24,U+25,U+26,U+27,U+28,U+29,U+2C,U+2E |
| enable_star = 1 |
| min_prefix_len = 1 |
| charset_table = 0..9, a..z, A..Z->a..z,-,U+FE20,U+FE21,U+2032, \ |
| U+00C0->a, U+00C1->a, U+00C2->a, U+00C3->a, U+00C4->a, U+00C5->a, U+00E0->a, U+00E1->a, U+00E2->a, U+00E3->a, U+00E4->a, U+00E5->a, U+0100->a, U+0101->a, U+0102->a, U+0103->a, U+010300->a, U+0104->a, U+0105->a, U+01CD->a, U+01CE->a, U+01DE->a, U+01DF->a, U+01E0->a, U+01E1->a, U+01FA->a, U+01FB->a, U+0200->a, U+0201->a, U+0202->a, U+0203->a, U+0226->a, U+0227->a, U+023A->a, U+0250->a, U+04D0->a, U+04D1->a, U+1D2C->a, U+1D43->a, U+1D44->a, U+1D8F->a, U+1E00->a, U+1E01->a, U+1E9A->a, U+1EA0->a, U+1EA1->a, U+1EA2->a, U+1EA3->a, U+1EA4->a, U+1EA5->a, U+1EA6->a, U+1EA7->a, U+1EA8->a, U+1EA9->a, U+1EAA->a, U+1EAB->a, U+1EAC->a, U+1EAD->a, U+1EAE->a, U+1EAF->a, U+1EB0->a, U+1EB1->a, U+1EB2->a, U+1EB3->a, U+1EB4->a, U+1EB5->a, U+1EB6->a, U+1EB7->a, U+2090->a, U+2C65->a, \ |
| U+0180->b, U+0181->b, U+0182->b, U+0183->b, U+0243->b, U+0253->b, U+0299->b, U+16D2->b, U+1D03->b, U+1D2E->b, U+1D2F->b, U+1D47->b, U+1D6C->b, U+1D80->b, U+1E02->b, U+1E03->b, U+1E04->b, U+1E05->b, U+1E06->b, U+1E07->b, \ |
| U+00C7->c, U+00E7->c, U+0106->c, U+0107->c, U+0108->c, U+0109->c, U+010A->c, U+010B->c, U+010C->c, U+010D->c, U+0187->c, U+0188->c, U+023B->c, U+023C->c, U+0255->c, U+0297->c, U+1D9C->c, U+1D9D->c, U+1E08->c, U+1E09->c, U+212D->c, U+2184->c, \ |
| U+010E->d, U+010F->d, U+0110->d, U+0111->d, U+0189->d, U+018A->d, U+018B->d, U+018C->d, U+01C5->d, U+01F2->d, U+0221->d, U+0256->d, U+0257->d, U+1D05->d, U+1D30->d, U+1D48->d, U+1D6D->d, U+1D81->d, U+1D91->d, U+1E0A->d, U+1E0B->d, U+1E0C->d, U+1E0D->d, U+1E0E->d, U+1E0F->d, U+1E10->d, U+1E11->d, U+1E12->d, U+1E13->d, \ |
| U+00C8->e, U+00C9->e, U+00CA->e, U+00CB->e, U+00E8->e, U+00E9->e, U+00EA->e, U+00EB->e, U+0112->e, U+0113->e, U+0114->e, U+0115->e, U+0116->e, U+0117->e, U+0118->e, U+0119->e, U+011A->e, U+011B->e, U+018E->e, U+0190->e, U+01DD->e, U+0204->e, U+0205->e, U+0206->e, U+0207->e, U+0228->e, U+0229->e, U+0246->e, U+0247->e, U+0258->e, U+025B->e, U+025C->e, U+025D->e, U+025E->e, U+029A->e, U+1D07->e, U+1D08->e, U+1D31->e, U+1D32->e, U+1D49->e, U+1D4B->e, U+1D4C->e, U+1D92->e, U+1D93->e, U+1D94->e, U+1D9F->e, U+1E14->e, U+1E15->e, U+1E16->e, U+1E17->e, U+1E18->e, U+1E19->e, U+1E1A->e, U+1E1B->e, U+1E1C->e, U+1E1D->e, U+1EB8->e, U+1EB9->e, U+1EBA->e, U+1EBB->e, U+1EBC->e, U+1EBD->e, U+1EBE->e, U+1EBF->e, U+1EC0->e, U+1EC1->e, U+1EC2->e, U+1EC3->e, U+1EC4->e, U+1EC5->e, U+1EC6->e, U+1EC7->e, U+2091->e, \ |
| U+0191->f, U+0192->f, U+1D6E->f, U+1D82->f, U+1DA0->f, U+1E1E->f, U+1E1F->f, \ |
| U+011C->g, U+011D->g, U+011E->g, U+011F->g, U+0120->g, U+0121->g, U+0122->g, U+0123->g, U+0193->g, U+01E4->g, U+01E5->g, U+01E6->g, U+01E7->g, U+01F4->g, U+01F5->g, U+0260->g, U+0261->g, U+0262->g, U+029B->g, U+1D33->g, U+1D4D->g, U+1D77->g, U+1D79->g, U+1D83->g, U+1DA2->g, U+1E20->g, U+1E21->g, \ |
| U+0124->h, U+0125->h, U+0126->h, U+0127->h, U+021E->h, U+021F->h, U+0265->h, U+0266->h, U+029C->h, U+02AE->h, U+02AF->h, U+02B0->h, U+02B1->h, U+1D34->h, U+1DA3->h, U+1E22->h, U+1E23->h, U+1E24->h, U+1E25->h, U+1E26->h, U+1E27->h, U+1E28->h, U+1E29->h, U+1E2A->h, U+1E2B->h, U+1E96->h, U+210C->h, U+2C67->h, U+2C68->h, U+2C75->h, U+2C76->h, \ |
| U+00CC->i, U+00CD->i, U+00CE->i, U+00CF->i, U+00EC->i, U+00ED->i, U+00EE->i, U+00EF->i, U+010309->i, U+0128->i, U+0129->i, U+012A->i, U+012B->i, U+012C->i, U+012D->i, U+012E->i, U+012F->i, U+0130->i, U+0131->i, U+0197->i, U+01CF->i, U+01D0->i, U+0208->i, U+0209->i, U+020A->i, U+020B->i, U+0268->i, U+026A->i, U+040D->i, U+0418->i, U+0419->i, U+0438->i, U+0439->i, U+0456->i, U+1D09->i, U+1D35->i, U+1D4E->i, U+1D62->i, U+1D7B->i, U+1D96->i, U+1DA4->i, U+1DA6->i, U+1DA7->i, U+1E2C->i, U+1E2D->i, U+1E2E->i, U+1E2F->i, U+1EC8->i, U+1EC9->i, U+1ECA->i, U+1ECB->i, U+2071->i, U+2111->i, \ |
| U+0134->j, U+0135->j, U+01C8->j, U+01CB->j, U+01F0->j, U+0237->j, U+0248->j, U+0249->j, U+025F->j, U+0284->j, U+029D->j, U+02B2->j, U+1D0A->j, U+1D36->j, U+1DA1->j, U+1DA8->j, \ |
| U+0136->k, U+0137->k, U+0198->k, U+0199->k, U+01E8->k, U+01E9->k, U+029E->k, U+1D0B->k, U+1D37->k, U+1D4F->k, U+1D84->k, U+1E30->k, U+1E31->k, U+1E32->k, U+1E33->k, U+1E34->k, U+1E35->k, U+2C69->k, U+2C6A->k, \ |
| U+0139->l, U+013A->l, U+013B->l, U+013C->l, U+013D->l, U+013E->l, U+013F->l, U+0140->l, U+0141->l, U+0142->l, U+019A->l, U+01C8->l, U+0234->l, U+023D->l, U+026B->l, U+026C->l, U+026D->l, U+029F->l, U+02E1->l, U+1D0C->l, U+1D38->l, U+1D85->l, U+1DA9->l, U+1DAA->l, U+1DAB->l, U+1E36->l, U+1E37->l, U+1E38->l, U+1E39->l, U+1E3A->l, U+1E3B->l, U+1E3C->l, U+1E3D->l, U+2C60->l, U+2C61->l, U+2C62->l, \ |
| U+019C->m, U+026F->m, U+0270->m, U+0271->m, U+1D0D->m, U+1D1F->m, U+1D39->m, U+1D50->m, U+1D5A->m, U+1D6F->m, U+1D86->m, U+1DAC->m, U+1DAD->m, U+1E3E->m, U+1E3F->m, U+1E40->m, U+1E41->m, U+1E42->m, U+1E43->m, \ |
| U+00D1->n, U+00F1->n, U+0143->n, U+0144->n, U+0145->n, U+0146->n, U+0147->n, U+0148->n, U+0149->n, U+019D->n, U+019E->n, U+01CB->n, U+01F8->n, U+01F9->n, U+0220->n, U+0235->n, U+0272->n, U+0273->n, U+0274->n, U+1D0E->n, U+1D3A->n, U+1D3B->n, U+1D70->n, U+1D87->n, U+1DAE->n, U+1DAF->n, U+1DB0->n, U+1E44->n, U+1E45->n, U+1E46->n, U+1E47->n, U+1E48->n, U+1E49->n, U+1E4A->n, U+1E4B->n, U+207F->n, \ |
| U+00D2->o, U+00D3->o, U+00D4->o, U+00D5->o, U+00D6->o, U+00D8->o, U+00F2->o, U+00F3->o, U+00F4->o, U+00F5->o, U+00F6->o, U+00F8->o, U+01030F->o, U+014C->o, U+014D->o, U+014E->o, U+014F->o, U+0150->o, U+0151->o, U+0186->o, U+019F->o, U+01A0->o, U+01A1->o, U+01D1->o, U+01D2->o, U+01EA->o, U+01EB->o, U+01EC->o, U+01ED->o, U+01FE->o, U+01FF->o, U+020C->o, U+020D->o, U+020E->o, U+020F->o, U+022A->o, U+022B->o, U+022C->o, U+022D->o, U+022E->o, U+022F->o, U+0230->o, U+0231->o, U+0254->o, U+0275->o, U+043E->o, U+04E6->o, U+04E7->o, U+04E8->o, U+04E9->o, U+04EA->o, U+04EB->o, U+1D0F->o, U+1D10->o, U+1D11->o, U+1D12->o, U+1D13->o, U+1D16->o, U+1D17->o, U+1D3C->o, U+1D52->o, U+1D53->o, U+1D54->o, U+1D55->o, U+1D97->o, U+1DB1->o, U+1E4C->o, U+1E4D->o, U+1E4E->o, U+1E4F->o, U+1E50->o, U+1E51->o, U+1E52->o, U+1E53->o, U+1ECC->o, U+1ECD->o, U+1ECE->o, U+1ECF->o, U+1ED0->o, U+1ED1->o, U+1ED2->o, U+1ED3->o, U+1ED4->o, U+1ED5->o, U+1ED6->o, U+1ED7->o, U+1ED8->o, U+1ED9->o, U+1EDA->o, U+1EDB->o, U+1EDC->o, U+1EDD->o, U+1EDE->o, U+1EDF->o, U+1EE0->o, U+1EE1->o, U+1EE2->o, U+1EE3->o, U+2092->o, U+2C9E->o, U+2C9F->o, \ |
| U+01A4->p, U+01A5->p, U+1D18->p, U+1D3E->p, U+1D56->p, U+1D71->p, U+1D7D->p, U+1D88->p, U+1E54->p, U+1E55->p, U+1E56->p, U+1E57->p, U+2C63->p, \ |
| U+024A->q, U+024B->q, U+02A0->q, \ |
| U+0154->r, U+0155->r, U+0156->r, U+0157->r, U+0158->r, U+0159->r, U+0210->r, U+0211->r, U+0212->r, U+0213->r, U+024C->r, U+024D->r, U+0279->r, U+027A->r, U+027B->r, U+027C->r, U+027D->r, U+027E->r, U+027F->r, U+0280->r, U+0281->r, U+02B3->r, U+02B4->r, U+02B5->r, U+02B6->r, U+1D19->r, U+1D1A->r, U+1D3F->r, U+1D63->r, U+1D72->r, U+1D73->r, U+1D89->r, U+1DCA->r, U+1E58->r, U+1E59->r, U+1E5A->r, U+1E5B->r, U+1E5C->r, U+1E5D->r, U+1E5E->r, U+1E5F->r, U+211C->r, U+2C64->r, \ |
| U+00DF->s, U+015A->s, U+015B->s, U+015C->s, U+015D->s, U+015E->s, U+015F->s, U+0160->s, U+0161->s, U+017F->s, U+0218->s, U+0219->s, U+023F->s, U+0282->s, U+02E2->s, U+1D74->s, U+1D8A->s, U+1DB3->s, U+1E60->s, U+1E61->s, U+1E62->s, U+1E63->s, U+1E64->s, U+1E65->s, U+1E66->s, U+1E67->s, U+1E68->s, U+1E69->s, U+1E9B->s, \ |
| U+0162->t, U+0163->t, U+0164->t, U+0165->t, U+0166->t, U+0167->t, U+01AB->t, U+01AC->t, U+01AD->t, U+01AE->t, U+021A->t, U+021B->t, U+0236->t, U+023E->t, U+0287->t, U+0288->t, U+1D1B->t, U+1D40->t, U+1D57->t, U+1D75->t, U+1DB5->t, U+1E6A->t, U+1E6B->t, U+1E6C->t, U+1E6D->t, U+1E6E->t, U+1E6F->t, U+1E70->t, U+1E71->t, U+1E97->t, U+2C66->t, \ |
| U+00D9->u, U+00DA->u, U+00DB->u, U+00DC->u, U+00F9->u, U+00FA->u, U+00FB->u, U+00FC->u, U+010316->u, U+0168->u, U+0169->u, U+016A->u, U+016B->u, U+016C->u, U+016D->u, U+016E->u, U+016F->u, U+0170->u, U+0171->u, U+0172->u, U+0173->u, U+01AF->u, U+01B0->u, U+01D3->u, U+01D4->u, U+01D5->u, U+01D6->u, U+01D7->u, U+01D8->u, U+01D9->u, U+01DA->u, U+01DB->u, U+01DC->u, U+0214->u, U+0215->u, U+0216->u, U+0217->u, U+0244->u, U+0289->u, U+1D1C->u, U+1D1D->u, U+1D1E->u, U+1D41->u, U+1D58->u, U+1D59->u, U+1D64->u, U+1D7E->u, U+1D99->u, U+1DB6->u, U+1DB8->u, U+1E72->u, U+1E73->u, U+1E74->u, U+1E75->u, U+1E76->u, U+1E77->u, U+1E78->u, U+1E79->u, U+1E7A->u, U+1E7B->u, U+1EE4->u, U+1EE5->u, U+1EE6->u, U+1EE7->u, U+1EE8->u, U+1EE9->u, U+1EEA->u, U+1EEB->u, U+1EEC->u, U+1EED->u, U+1EEE->u, U+1EEF->u, U+1EF0->u, U+1EF1->u, \ |
| U+01B2->v, U+0245->v, U+028B->v, U+028C->v, U+1D20->v, U+1D5B->v, U+1D65->v, U+1D8C->v, U+1DB9->v, U+1DBA->v, U+1E7C->v, U+1E7D->v, U+1E7E->v, U+1E7F->v, U+2C74->v, \ |
| U+0174->w, U+0175->w, U+028D->w, U+02B7->w, U+1D21->w, U+1D42->w, U+1E80->w, U+1E81->w, U+1E82->w, U+1E83->w, U+1E84->w, U+1E85->w, U+1E86->w, U+1E87->w, U+1E88->w, U+1E89->w, U+1E98->w, \ |
| U+02E3->x, U+1D8D->x, U+1E8A->x, U+1E8B->x, U+1E8C->x, U+1E8D->x, U+2093->x, \ |
| U+00DD->y, U+00FD->y, U+00FF->y, U+0176->y, U+0177->y, U+0178->y, U+01B3->y, U+01B4->y, U+0232->y, U+0233->y, U+024E->y, U+024F->y, U+028E->y, U+028F->y, U+02B8->y, U+1E8E->y, U+1E8F->y, U+1E99->y, U+1EF2->y, U+1EF3->y, U+1EF4->y, U+1EF5->y, U+1EF6->y, U+1EF7->y, U+1EF8->y, U+1EF9->y, \ |
| U+0179->z, U+017A->z, U+017B->z, U+017C->z, U+017D->z, U+017E->z, U+01B5->z, U+01B6->z, U+0224->z, U+0225->z, U+0240->z, U+0290->z, U+0291->z, U+1D22->z, U+1D76->z, U+1D8E->z, U+1DBB->z, U+1DBC->z, U+1DBD->z, U+1E90->z, U+1E91->z, U+1E92->z, U+1E93->z, U+1E94->z, U+1E95->z, U+2128->z, U+2C6B->z, U+2C6C->z, \ |
| U+00C6->U+00E6, U+01E2->U+00E6, U+01E3->U+00E6, U+01FC->U+00E6, U+01FD->U+00E6, U+1D01->U+00E6, U+1D02->U+00E6, U+1D2D->U+00E6, U+1D46->U+00E6, U+00E6 |
| } |
| index bib_items_title |
| { |
| source = bib_items_title |
| path = /usr/local/sphinx/var/data/bib_items_title |
| docinfo = extern |
| mlock = 0 |
| morphology = none |
| min_word_len = 1 |
| charset_type = utf-8 |
| html_strip = 0 |
| ignore_chars = U+22,U+23,U+24,U+25,U+26,U+27,U+28,U+29,U+2C,U+2E |
| enable_star = 1 |
| min_prefix_len = 1 |
| charset_table = 0..9, a..z, A..Z->a..z,-,U+FE20,U+FE21,U+2032,U+FF10..U+FF19->0..9, U+FF21..U+FF3A->a..z, U+FF41..U+FF5A->a..z, \ |
| U+00C0->a, U+00C1->a, U+00C2->a, U+00C3->a, U+00C4->a, U+00C5->a, U+00E0->a, U+00E1->a, U+00E2->a, U+00E3->a, U+00E4->a, U+00E5->a, U+0100->a, U+0101->a, U+0102->a, U+0103->a, U+010300->a, U+0104->a, U+0105->a, U+01CD->a, U+01CE->a, U+01DE->a, U+01DF->a, U+01E0->a, U+01E1->a, U+01FA->a, U+01FB->a, U+0200->a, U+0201->a, U+0202->a, U+0203->a, U+0226->a, U+0227->a, U+023A->a, U+0250->a, U+04D0->a, U+04D1->a, U+1D2C->a, U+1D43->a, U+1D44->a, U+1D8F->a, U+1E00->a, U+1E01->a, U+1E9A->a, U+1EA0->a, U+1EA1->a, U+1EA2->a, U+1EA3->a, U+1EA4->a, U+1EA5->a, U+1EA6->a, U+1EA7->a, U+1EA8->a, U+1EA9->a, U+1EAA->a, U+1EAB->a, U+1EAC->a, U+1EAD->a, U+1EAE->a, U+1EAF->a, U+1EB0->a, U+1EB1->a, U+1EB2->a, U+1EB3->a, U+1EB4->a, U+1EB5->a, U+1EB6->a, U+1EB7->a, U+2090->a, U+2C65->a, \ |
| U+0180->b, U+0181->b, U+0182->b, U+0183->b, U+0243->b, U+0253->b, U+0299->b, U+16D2->b, U+1D03->b, U+1D2E->b, U+1D2F->b, U+1D47->b, U+1D6C->b, U+1D80->b, U+1E02->b, U+1E03->b, U+1E04->b, U+1E05->b, U+1E06->b, U+1E07->b, \ |
| U+00C7->c, U+00E7->c, U+0106->c, U+0107->c, U+0108->c, U+0109->c, U+010A->c, U+010B->c, U+010C->c, U+010D->c, U+0187->c, U+0188->c, U+023B->c, U+023C->c, U+0255->c, U+0297->c, U+1D9C->c, U+1D9D->c, U+1E08->c, U+1E09->c, U+212D->c, U+2184->c, \ |
| U+010E->d, U+010F->d, U+0110->d, U+0111->d, U+0189->d, U+018A->d, U+018B->d, U+018C->d, U+01C5->d, U+01F2->d, U+0221->d, U+0256->d, U+0257->d, U+1D05->d, U+1D30->d, U+1D48->d, U+1D6D->d, U+1D81->d, U+1D91->d, U+1E0A->d, U+1E0B->d, U+1E0C->d, U+1E0D->d, U+1E0E->d, U+1E0F->d, U+1E10->d, U+1E11->d, U+1E12->d, U+1E13->d, \ |
| U+00C8->e, U+00C9->e, U+00CA->e, U+00CB->e, U+00E8->e, U+00E9->e, U+00EA->e, U+00EB->e, U+0112->e, U+0113->e, U+0114->e, U+0115->e, U+0116->e, U+0117->e, U+0118->e, U+0119->e, U+011A->e, U+011B->e, U+018E->e, U+0190->e, U+01DD->e, U+0204->e, U+0205->e, U+0206->e, U+0207->e, U+0228->e, U+0229->e, U+0246->e, U+0247->e, U+0258->e, U+025B->e, U+025C->e, U+025D->e, U+025E->e, U+029A->e, U+1D07->e, U+1D08->e, U+1D31->e, U+1D32->e, U+1D49->e, U+1D4B->e, U+1D4C->e, U+1D92->e, U+1D93->e, U+1D94->e, U+1D9F->e, U+1E14->e, U+1E15->e, U+1E16->e, U+1E17->e, U+1E18->e, U+1E19->e, U+1E1A->e, U+1E1B->e, U+1E1C->e, U+1E1D->e, U+1EB8->e, U+1EB9->e, U+1EBA->e, U+1EBB->e, U+1EBC->e, U+1EBD->e, U+1EBE->e, U+1EBF->e, U+1EC0->e, U+1EC1->e, U+1EC2->e, U+1EC3->e, U+1EC4->e, U+1EC5->e, U+1EC6->e, U+1EC7->e, U+2091->e, \ |
| U+0191->f, U+0192->f, U+1D6E->f, U+1D82->f, U+1DA0->f, U+1E1E->f, U+1E1F->f, \ |
| U+011C->g, U+011D->g, U+011E->g, U+011F->g, U+0120->g, U+0121->g, U+0122->g, U+0123->g, U+0193->g, U+01E4->g, U+01E5->g, U+01E6->g, U+01E7->g, U+01F4->g, U+01F5->g, U+0260->g, U+0261->g, U+0262->g, U+029B->g, U+1D33->g, U+1D4D->g, U+1D77->g, U+1D79->g, U+1D83->g, U+1DA2->g, U+1E20->g, U+1E21->g, \ |
| U+0124->h, U+0125->h, U+0126->h, U+0127->h, U+021E->h, U+021F->h, U+0265->h, U+0266->h, U+029C->h, U+02AE->h, U+02AF->h, U+02B0->h, U+02B1->h, U+1D34->h, U+1DA3->h, U+1E22->h, U+1E23->h, U+1E24->h, U+1E25->h, U+1E26->h, U+1E27->h, U+1E28->h, U+1E29->h, U+1E2A->h, U+1E2B->h, U+1E96->h, U+210C->h, U+2C67->h, U+2C68->h, U+2C75->h, U+2C76->h, \ |
| U+00CC->i, U+00CD->i, U+00CE->i, U+00CF->i, U+00EC->i, U+00ED->i, U+00EE->i, U+00EF->i, U+010309->i, U+0128->i, U+0129->i, U+012A->i, U+012B->i, U+012C->i, U+012D->i, U+012E->i, U+012F->i, U+0130->i, U+0131->i, U+0197->i, U+01CF->i, U+01D0->i, U+0208->i, U+0209->i, U+020A->i, U+020B->i, U+0268->i, U+026A->i, U+040D->i, U+0418->i, U+0419->i, U+0438->i, U+0439->i, U+0456->i, U+1D09->i, U+1D35->i, U+1D4E->i, U+1D62->i, U+1D7B->i, U+1D96->i, U+1DA4->i, U+1DA6->i, U+1DA7->i, U+1E2C->i, U+1E2D->i, U+1E2E->i, U+1E2F->i, U+1EC8->i, U+1EC9->i, U+1ECA->i, U+1ECB->i, U+2071->i, U+2111->i, \ |
| U+0134->j, U+0135->j, U+01C8->j, U+01CB->j, U+01F0->j, U+0237->j, U+0248->j, U+0249->j, U+025F->j, U+0284->j, U+029D->j, U+02B2->j, U+1D0A->j, U+1D36->j, U+1DA1->j, U+1DA8->j, \ |
| U+0136->k, U+0137->k, U+0198->k, U+0199->k, U+01E8->k, U+01E9->k, U+029E->k, U+1D0B->k, U+1D37->k, U+1D4F->k, U+1D84->k, U+1E30->k, U+1E31->k, U+1E32->k, U+1E33->k, U+1E34->k, U+1E35->k, U+2C69->k, U+2C6A->k, \ |
| U+0139->l, U+013A->l, U+013B->l, U+013C->l, U+013D->l, U+013E->l, U+013F->l, U+0140->l, U+0141->l, U+0142->l, U+019A->l, U+01C8->l, U+0234->l, U+023D->l, U+026B->l, U+026C->l, U+026D->l, U+029F->l, U+02E1->l, U+1D0C->l, U+1D38->l, U+1D85->l, U+1DA9->l, U+1DAA->l, U+1DAB->l, U+1E36->l, U+1E37->l, U+1E38->l, U+1E39->l, U+1E3A->l, U+1E3B->l, U+1E3C->l, U+1E3D->l, U+2C60->l, U+2C61->l, U+2C62->l, \ |
| U+019C->m, U+026F->m, U+0270->m, U+0271->m, U+1D0D->m, U+1D1F->m, U+1D39->m, U+1D50->m, U+1D5A->m, U+1D6F->m, U+1D86->m, U+1DAC->m, U+1DAD->m, U+1E3E->m, U+1E3F->m, U+1E40->m, U+1E41->m, U+1E42->m, U+1E43->m, \ |
| U+00D1->n, U+00F1->n, U+0143->n, U+0144->n, U+0145->n, U+0146->n, U+0147->n, U+0148->n, U+0149->n, U+019D->n, U+019E->n, U+01CB->n, U+01F8->n, U+01F9->n, U+0220->n, U+0235->n, U+0272->n, U+0273->n, U+0274->n, U+1D0E->n, U+1D3A->n, U+1D3B->n, U+1D70->n, U+1D87->n, U+1DAE->n, U+1DAF->n, U+1DB0->n, U+1E44->n, U+1E45->n, U+1E46->n, U+1E47->n, U+1E48->n, U+1E49->n, U+1E4A->n, U+1E4B->n, U+207F->n, \ |
| U+00D2->o, U+00D3->o, U+00D4->o, U+00D5->o, U+00D6->o, U+00D8->o, U+00F2->o, U+00F3->o, U+00F4->o, U+00F5->o, U+00F6->o, U+00F8->o, U+01030F->o, U+014C->o, U+014D->o, U+014E->o, U+014F->o, U+0150->o, U+0151->o, U+0186->o, U+019F->o, U+01A0->o, U+01A1->o, U+01D1->o, U+01D2->o, U+01EA->o, U+01EB->o, U+01EC->o, U+01ED->o, U+01FE->o, U+01FF->o, U+020C->o, U+020D->o, U+020E->o, U+020F->o, U+022A->o, U+022B->o, U+022C->o, U+022D->o, U+022E->o, U+022F->o, U+0230->o, U+0231->o, U+0254->o, U+0275->o, U+043E->o, U+04E6->o, U+04E7->o, U+04E8->o, U+04E9->o, U+04EA->o, U+04EB->o, U+1D0F->o, U+1D10->o, U+1D11->o, U+1D12->o, U+1D13->o, U+1D16->o, U+1D17->o, U+1D3C->o, U+1D52->o, U+1D53->o, U+1D54->o, U+1D55->o, U+1D97->o, U+1DB1->o, U+1E4C->o, U+1E4D->o, U+1E4E->o, U+1E4F->o, U+1E50->o, U+1E51->o, U+1E52->o, U+1E53->o, U+1ECC->o, U+1ECD->o, U+1ECE->o, U+1ECF->o, U+1ED0->o, U+1ED1->o, U+1ED2->o, U+1ED3->o, U+1ED4->o, U+1ED5->o, U+1ED6->o, U+1ED7->o, U+1ED8->o, U+1ED9->o, U+1EDA->o, U+1EDB->o, U+1EDC->o, U+1EDD->o, U+1EDE->o, U+1EDF->o, U+1EE0->o, U+1EE1->o, U+1EE2->o, U+1EE3->o, U+2092->o, U+2C9E->o, U+2C9F->o, \ |
| U+01A4->p, U+01A5->p, U+1D18->p, U+1D3E->p, U+1D56->p, U+1D71->p, U+1D7D->p, U+1D88->p, U+1E54->p, U+1E55->p, U+1E56->p, U+1E57->p, U+2C63->p, \ |
| U+024A->q, U+024B->q, U+02A0->q, \ |
| U+0154->r, U+0155->r, U+0156->r, U+0157->r, U+0158->r, U+0159->r, U+0210->r, U+0211->r, U+0212->r, U+0213->r, U+024C->r, U+024D->r, U+0279->r, U+027A->r, U+027B->r, U+027C->r, U+027D->r, U+027E->r, U+027F->r, U+0280->r, U+0281->r, U+02B3->r, U+02B4->r, U+02B5->r, U+02B6->r, U+1D19->r, U+1D1A->r, U+1D3F->r, U+1D63->r, U+1D72->r, U+1D73->r, U+1D89->r, U+1DCA->r, U+1E58->r, U+1E59->r, U+1E5A->r, U+1E5B->r, U+1E5C->r, U+1E5D->r, U+1E5E->r, U+1E5F->r, U+211C->r, U+2C64->r, \ |
| U+00DF->s, U+015A->s, U+015B->s, U+015C->s, U+015D->s, U+015E->s, U+015F->s, U+0160->s, U+0161->s, U+017F->s, U+0218->s, U+0219->s, U+023F->s, U+0282->s, U+02E2->s, U+1D74->s, U+1D8A->s, U+1DB3->s, U+1E60->s, U+1E61->s, U+1E62->s, U+1E63->s, U+1E64->s, U+1E65->s, U+1E66->s, U+1E67->s, U+1E68->s, U+1E69->s, U+1E9B->s, \ |
| U+0162->t, U+0163->t, U+0164->t, U+0165->t, U+0166->t, U+0167->t, U+01AB->t, U+01AC->t, U+01AD->t, U+01AE->t, U+021A->t, U+021B->t, U+0236->t, U+023E->t, U+0287->t, U+0288->t, U+1D1B->t, U+1D40->t, U+1D57->t, U+1D75->t, U+1DB5->t, U+1E6A->t, U+1E6B->t, U+1E6C->t, U+1E6D->t, U+1E6E->t, U+1E6F->t, U+1E70->t, U+1E71->t, U+1E97->t, U+2C66->t, \ |
| U+00D9->u, U+00DA->u, U+00DB->u, U+00DC->u, U+00F9->u, U+00FA->u, U+00FB->u, U+00FC->u, U+010316->u, U+0168->u, U+0169->u, U+016A->u, U+016B->u, U+016C->u, U+016D->u, U+016E->u, U+016F->u, U+0170->u, U+0171->u, U+0172->u, U+0173->u, U+01AF->u, U+01B0->u, U+01D3->u, U+01D4->u, U+01D5->u, U+01D6->u, U+01D7->u, U+01D8->u, U+01D9->u, U+01DA->u, U+01DB->u, U+01DC->u, U+0214->u, U+0215->u, U+0216->u, U+0217->u, U+0244->u, U+0289->u, U+1D1C->u, U+1D1D->u, U+1D1E->u, U+1D41->u, U+1D58->u, U+1D59->u, U+1D64->u, U+1D7E->u, U+1D99->u, U+1DB6->u, U+1DB8->u, U+1E72->u, U+1E73->u, U+1E74->u, U+1E75->u, U+1E76->u, U+1E77->u, U+1E78->u, U+1E79->u, U+1E7A->u, U+1E7B->u, U+1EE4->u, U+1EE5->u, U+1EE6->u, U+1EE7->u, U+1EE8->u, U+1EE9->u, U+1EEA->u, U+1EEB->u, U+1EEC->u, U+1EED->u, U+1EEE->u, U+1EEF->u, U+1EF0->u, U+1EF1->u, \ |
| U+01B2->v, U+0245->v, U+028B->v, U+028C->v, U+1D20->v, U+1D5B->v, U+1D65->v, U+1D8C->v, U+1DB9->v, U+1DBA->v, U+1E7C->v, U+1E7D->v, U+1E7E->v, U+1E7F->v, U+2C74->v, \ |
| U+0174->w, U+0175->w, U+028D->w, U+02B7->w, U+1D21->w, U+1D42->w, U+1E80->w, U+1E81->w, U+1E82->w, U+1E83->w, U+1E84->w, U+1E85->w, U+1E86->w, U+1E87->w, U+1E88->w, U+1E89->w, U+1E98->w, \ |
| U+02E3->x, U+1D8D->x, U+1E8A->x, U+1E8B->x, U+1E8C->x, U+1E8D->x, U+2093->x, \ |
| U+00DD->y, U+00FD->y, U+00FF->y, U+0176->y, U+0177->y, U+0178->y, U+01B3->y, U+01B4->y, U+0232->y, U+0233->y, U+024E->y, U+024F->y, U+028E->y, U+028F->y, U+02B8->y, U+1E8E->y, U+1E8F->y, U+1E99->y, U+1EF2->y, U+1EF3->y, U+1EF4->y, U+1EF5->y, U+1EF6->y, U+1EF7->y, U+1EF8->y, U+1EF9->y, \ |
| U+0179->z, U+017A->z, U+017B->z, U+017C->z, U+017D->z, U+017E->z, U+01B5->z, U+01B6->z, U+0224->z, U+0225->z, U+0240->z, U+0290->z, U+0291->z, U+1D22->z, U+1D76->z, U+1D8E->z, U+1DBB->z, U+1DBC->z, U+1DBD->z, U+1E90->z, U+1E91->z, U+1E92->z, U+1E93->z, U+1E94->z, U+1E95->z, U+2128->z, U+2C6B->z, U+2C6C->z, \ |
| U+00C6->U+00E6, U+01E2->U+00E6, U+01E3->U+00E6, U+01FC->U+00E6, U+01FD->U+00E6, U+1D01->U+00E6, U+1D02->U+00E6, U+1D2D->U+00E6, U+1D46->U+00E6, U+00E6, \ |
| U+0400->U+0435, U+0401->U+0435, U+0402->U+0452, U+0452, U+0403->U+0433, U+0404->U+0454, U+0454, U+0405->U+0455, U+0455, U+0406->U+0456, U+0407->U+0456, U+0457->U+0456, U+0456, U+0408..U+040B->U+0458..U+045B, U+0458..U+045B, U+040C->U+043A, U+040D->U+0438, U+040E->U+0443, U+040F->U+045F, U+045F, U+0450->U+0435, U+0451->U+0435, U+0453->U+0433,\ |
| U+045C->U+043A, U+045D->U+0438, U+045E->U+0443, U+0460->U+0461, U+0461, U+0462->U+0463, U+0463, U+0464->U+0465, U+0465, U+0466->U+0467, U+0467, U+0468->U+0469, U+0469,\ |
| U+046A->U+046B, U+046B, U+046C->U+046D, U+046D, U+046E->U+046F, U+046F, U+0470->U+0471, U+0471, U+0472->U+0473, U+0473, U+0474->U+0475, U+0476->U+0475, U+0477->U+0475,\ |
| U+0475, U+0478->U+0479, U+0479, U+047A->U+047B, U+047B, U+047C->U+047D, U+047D, U+047E->U+047F, U+047F, U+0480->U+0481, U+0481, U+048A->U+0438, U+048B->U+0438, \ |
| U+048C->U+044C, U+048D->U+044C, U+048E->U+0440, U+048F->U+0440, U+0490->U+0433, U+0491->U+0433, U+0490->U+0433, U+0491->U+0433, U+0492->U+0433, U+0493->U+0433, \ |
| U+0494->U+0433, U+0495->U+0433, U+0496->U+0436, U+0497->U+0436, U+0498->U+0437, U+0499->U+0437, U+049A->U+043A, U+049B->U+043A, U+049C->U+043A, U+049D->U+043A, \ |
| U+049E->U+043A, U+049F->U+043A, U+04A0->U+043A, U+04A1->U+043A, U+04A2->U+043D, U+04A3->U+043D, U+04A4->U+043D, U+04A5->U+043D, U+04A6->U+043F, U+04A7->U+043F, \ |
| U+04A8->U+04A9, U+04A9, U+04AA->U+0441, U+04AB->U+0441, U+04AC->U+0442, U+04AD->U+0442, U+04AE->U+0443, U+04AF->U+0443, U+04B0->U+0443, U+04B1->U+0443, \ |
| U+04B2->U+0445, U+04B3->U+0445, U+04B4->U+04B5, U+04B5, U+04B6->U+0447, U+04B7->U+0447, U+04B8->U+0447, U+04B9->U+0447, U+04BA->U+04BB, U+04BB, U+04BC->U+04BD, \ |
| U+04BE->U+04BD, U+04BF->U+04BD, U+04BD, U+04C0->U+04CF, U+04CF, U+04C1->U+0436, U+04C2->U+0436, U+04C3->U+043A, U+04C4->U+043A, U+04C5->U+043B, U+04C6->U+043B, \ |
| U+04C7->U+043D, U+04C8->U+043D, U+04C9->U+043D, U+04CA->U+043D, U+04CB->U+0447, U+04CC->U+0447, U+04CD->U+043C, U+04CE->U+043C, U+04D0->U+0430, U+04D1->U+0430, \ |
| U+04D2->U+0430, U+04D3->U+0430, U+04D4->U+00E6, U+04D5->U+00E6, U+04D6->U+0435, U+04D7->U+0435, U+04D8->U+04D9, U+04DA->U+04D9, U+04DB->U+04D9, U+04D9, \ |
| U+04DC->U+0436, U+04DD->U+0436, U+04DE->U+0437, U+04DF->U+0437, U+04E0->U+04E1, U+04E1, U+04E2->U+0438, U+04E3->U+0438, U+04E4->U+0438, U+04E5->U+0438, \ |
| U+04E6->U+043E, U+04E7->U+043E, U+04E8->U+043E, U+04E9->U+043E, U+04EA->U+043E, U+04EB->U+043E, U+04EC->U+044D, U+04ED->U+044D, U+04EE->U+0443, U+04EF->U+0443, \ |
| U+04F0->U+0443, U+04F1->U+0443, U+04F2->U+0443, U+04F3->U+0443, U+04F4->U+0447, U+04F5->U+0447, U+04F6->U+0433, U+04F7->U+0433, U+04F8->U+044B, U+04F9->U+044B, \ |
| U+04FA->U+0433, U+04FB->U+0433, U+04FC->U+0445, U+04FD->U+0445, U+04FE->U+0445, U+04FF->U+0445, U+0410..U+0418->U+0430..U+0438, U+0419->U+0438, U+0430..U+0438, \ |
| U+041A..U+042F->U+043A..U+044F, U+043A..U+044F |
| } |
| index bib_items_subject |
| { |
| source = bib_items_subject |
| path = /usr/local/sphinx/var/data/bib_items_subject |
| docinfo = extern |
| mlock = 0 |
| morphology = none |
| min_word_len = 1 |
| charset_type = utf-8 |
| html_strip = 0 |
| ignore_chars = U+22,U+23,U+24,U+25,U+26,U+27,U+28,U+29,U+2C,U+2E |
| enable_star = 1 |
| min_prefix_len = 1 |
| charset_table = 0..9, a..z, A..Z->a..z, \ |
| U+00C0->a, U+00C1->a, U+00C2->a, U+00C3->a, U+00C4->a, U+00C5->a, U+00E0->a, U+00E1->a, U+00E2->a, U+00E3->a, U+00E4->a, U+00E5->a, U+0100->a, U+0101->a, U+0102->a, U+0103->a, U+010300->a, U+0104->a, U+0105->a, U+01CD->a, U+01CE->a, U+01DE->a, U+01DF->a, U+01E0->a, U+01E1->a, U+01FA->a, U+01FB->a, U+0200->a, U+0201->a, U+0202->a, U+0203->a, U+0226->a, U+0227->a, U+023A->a, U+0250->a, U+04D0->a, U+04D1->a, U+1D2C->a, U+1D43->a, U+1D44->a, U+1D8F->a, U+1E00->a, U+1E01->a, U+1E9A->a, U+1EA0->a, U+1EA1->a, U+1EA2->a, U+1EA3->a, U+1EA4->a, U+1EA5->a, U+1EA6->a, U+1EA7->a, U+1EA8->a, U+1EA9->a, U+1EAA->a, U+1EAB->a, U+1EAC->a, U+1EAD->a, U+1EAE->a, U+1EAF->a, U+1EB0->a, U+1EB1->a, U+1EB2->a, U+1EB3->a, U+1EB4->a, U+1EB5->a, U+1EB6->a, U+1EB7->a, U+2090->a, U+2C65->a, \ |
| U+0180->b, U+0181->b, U+0182->b, U+0183->b, U+0243->b, U+0253->b, U+0299->b, U+16D2->b, U+1D03->b, U+1D2E->b, U+1D2F->b, U+1D47->b, U+1D6C->b, U+1D80->b, U+1E02->b, U+1E03->b, U+1E04->b, U+1E05->b, U+1E06->b, U+1E07->b, \ |
| U+00C7->c, U+00E7->c, U+0106->c, U+0107->c, U+0108->c, U+0109->c, U+010A->c, U+010B->c, U+010C->c, U+010D->c, U+0187->c, U+0188->c, U+023B->c, U+023C->c, U+0255->c, U+0297->c, U+1D9C->c, U+1D9D->c, U+1E08->c, U+1E09->c, U+212D->c, U+2184->c, \ |
| U+010E->d, U+010F->d, U+0110->d, U+0111->d, U+0189->d, U+018A->d, U+018B->d, U+018C->d, U+01C5->d, U+01F2->d, U+0221->d, U+0256->d, U+0257->d, U+1D05->d, U+1D30->d, U+1D48->d, U+1D6D->d, U+1D81->d, U+1D91->d, U+1E0A->d, U+1E0B->d, U+1E0C->d, U+1E0D->d, U+1E0E->d, U+1E0F->d, U+1E10->d, U+1E11->d, U+1E12->d, U+1E13->d, \ |
| U+00C8->e, U+00C9->e, U+00CA->e, U+00CB->e, U+00E8->e, U+00E9->e, U+00EA->e, U+00EB->e, U+0112->e, U+0113->e, U+0114->e, U+0115->e, U+0116->e, U+0117->e, U+0118->e, U+0119->e, U+011A->e, U+011B->e, U+018E->e, U+0190->e, U+01DD->e, U+0204->e, U+0205->e, U+0206->e, U+0207->e, U+0228->e, U+0229->e, U+0246->e, U+0247->e, U+0258->e, U+025B->e, U+025C->e, U+025D->e, U+025E->e, U+029A->e, U+1D07->e, U+1D08->e, U+1D31->e, U+1D32->e, U+1D49->e, U+1D4B->e, U+1D4C->e, U+1D92->e, U+1D93->e, U+1D94->e, U+1D9F->e, U+1E14->e, U+1E15->e, U+1E16->e, U+1E17->e, U+1E18->e, U+1E19->e, U+1E1A->e, U+1E1B->e, U+1E1C->e, U+1E1D->e, U+1EB8->e, U+1EB9->e, U+1EBA->e, U+1EBB->e, U+1EBC->e, U+1EBD->e, U+1EBE->e, U+1EBF->e, U+1EC0->e, U+1EC1->e, U+1EC2->e, U+1EC3->e, U+1EC4->e, U+1EC5->e, U+1EC6->e, U+1EC7->e, U+2091->e, \ |
| U+0191->f, U+0192->f, U+1D6E->f, U+1D82->f, U+1DA0->f, U+1E1E->f, U+1E1F->f, \ |
| U+011C->g, U+011D->g, U+011E->g, U+011F->g, U+0120->g, U+0121->g, U+0122->g, U+0123->g, U+0193->g, U+01E4->g, U+01E5->g, U+01E6->g, U+01E7->g, U+01F4->g, U+01F5->g, U+0260->g, U+0261->g, U+0262->g, U+029B->g, U+1D33->g, U+1D4D->g, U+1D77->g, U+1D79->g, U+1D83->g, U+1DA2->g, U+1E20->g, U+1E21->g, \ |
| U+0124->h, U+0125->h, U+0126->h, U+0127->h, U+021E->h, U+021F->h, U+0265->h, U+0266->h, U+029C->h, U+02AE->h, U+02AF->h, U+02B0->h, U+02B1->h, U+1D34->h, U+1DA3->h, U+1E22->h, U+1E23->h, U+1E24->h, U+1E25->h, U+1E26->h, U+1E27->h, U+1E28->h, U+1E29->h, U+1E2A->h, U+1E2B->h, U+1E96->h, U+210C->h, U+2C67->h, U+2C68->h, U+2C75->h, U+2C76->h, \ |
| U+00CC->i, U+00CD->i, U+00CE->i, U+00CF->i, U+00EC->i, U+00ED->i, U+00EE->i, U+00EF->i, U+010309->i, U+0128->i, U+0129->i, U+012A->i, U+012B->i, U+012C->i, U+012D->i, U+012E->i, U+012F->i, U+0130->i, U+0131->i, U+0197->i, U+01CF->i, U+01D0->i, U+0208->i, U+0209->i, U+020A->i, U+020B->i, U+0268->i, U+026A->i, U+040D->i, U+0418->i, U+0419->i, U+0438->i, U+0439->i, U+0456->i, U+1D09->i, U+1D35->i, U+1D4E->i, U+1D62->i, U+1D7B->i, U+1D96->i, U+1DA4->i, U+1DA6->i, U+1DA7->i, U+1E2C->i, U+1E2D->i, U+1E2E->i, U+1E2F->i, U+1EC8->i, U+1EC9->i, U+1ECA->i, U+1ECB->i, U+2071->i, U+2111->i, \ |
| U+0134->j, U+0135->j, U+01C8->j, U+01CB->j, U+01F0->j, U+0237->j, U+0248->j, U+0249->j, U+025F->j, U+0284->j, U+029D->j, U+02B2->j, U+1D0A->j, U+1D36->j, U+1DA1->j, U+1DA8->j, \ |
| U+0136->k, U+0137->k, U+0198->k, U+0199->k, U+01E8->k, U+01E9->k, U+029E->k, U+1D0B->k, U+1D37->k, U+1D4F->k, U+1D84->k, U+1E30->k, U+1E31->k, U+1E32->k, U+1E33->k, U+1E34->k, U+1E35->k, U+2C69->k, U+2C6A->k, \ |
| U+0139->l, U+013A->l, U+013B->l, U+013C->l, U+013D->l, U+013E->l, U+013F->l, U+0140->l, U+0141->l, U+0142->l, U+019A->l, U+01C8->l, U+0234->l, U+023D->l, U+026B->l, U+026C->l, U+026D->l, U+029F->l, U+02E1->l, U+1D0C->l, U+1D38->l, U+1D85->l, U+1DA9->l, U+1DAA->l, U+1DAB->l, U+1E36->l, U+1E37->l, U+1E38->l, U+1E39->l, U+1E3A->l, U+1E3B->l, U+1E3C->l, U+1E3D->l, U+2C60->l, U+2C61->l, U+2C62->l, \ |
| U+019C->m, U+026F->m, U+0270->m, U+0271->m, U+1D0D->m, U+1D1F->m, U+1D39->m, U+1D50->m, U+1D5A->m, U+1D6F->m, U+1D86->m, U+1DAC->m, U+1DAD->m, U+1E3E->m, U+1E3F->m, U+1E40->m, U+1E41->m, U+1E42->m, U+1E43->m, \ |
| U+00D1->n, U+00F1->n, U+0143->n, U+0144->n, U+0145->n, U+0146->n, U+0147->n, U+0148->n, U+0149->n, U+019D->n, U+019E->n, U+01CB->n, U+01F8->n, U+01F9->n, U+0220->n, U+0235->n, U+0272->n, U+0273->n, U+0274->n, U+1D0E->n, U+1D3A->n, U+1D3B->n, U+1D70->n, U+1D87->n, U+1DAE->n, U+1DAF->n, U+1DB0->n, U+1E44->n, U+1E45->n, U+1E46->n, U+1E47->n, U+1E48->n, U+1E49->n, U+1E4A->n, U+1E4B->n, U+207F->n, \ |
| U+00D2->o, U+00D3->o, U+00D4->o, U+00D5->o, U+00D6->o, U+00D8->o, U+00F2->o, U+00F3->o, U+00F4->o, U+00F5->o, U+00F6->o, U+00F8->o, U+01030F->o, U+014C->o, U+014D->o, U+014E->o, U+014F->o, U+0150->o, U+0151->o, U+0186->o, U+019F->o, U+01A0->o, U+01A1->o, U+01D1->o, U+01D2->o, U+01EA->o, U+01EB->o, U+01EC->o, U+01ED->o, U+01FE->o, U+01FF->o, U+020C->o, U+020D->o, U+020E->o, U+020F->o, U+022A->o, U+022B->o, U+022C->o, U+022D->o, U+022E->o, U+022F->o, U+0230->o, U+0231->o, U+0254->o, U+0275->o, U+043E->o, U+04E6->o, U+04E7->o, U+04E8->o, U+04E9->o, U+04EA->o, U+04EB->o, U+1D0F->o, U+1D10->o, U+1D11->o, U+1D12->o, U+1D13->o, U+1D16->o, U+1D17->o, U+1D3C->o, U+1D52->o, U+1D53->o, U+1D54->o, U+1D55->o, U+1D97->o, U+1DB1->o, U+1E4C->o, U+1E4D->o, U+1E4E->o, U+1E4F->o, U+1E50->o, U+1E51->o, U+1E52->o, U+1E53->o, U+1ECC->o, U+1ECD->o, U+1ECE->o, U+1ECF->o, U+1ED0->o, U+1ED1->o, U+1ED2->o, U+1ED3->o, U+1ED4->o, U+1ED5->o, U+1ED6->o, U+1ED7->o, U+1ED8->o, U+1ED9->o, U+1EDA->o, U+1EDB->o, U+1EDC->o, U+1EDD->o, U+1EDE->o, U+1EDF->o, U+1EE0->o, U+1EE1->o, U+1EE2->o, U+1EE3->o, U+2092->o, U+2C9E->o, U+2C9F->o, \ |
| U+01A4->p, U+01A5->p, U+1D18->p, U+1D3E->p, U+1D56->p, U+1D71->p, U+1D7D->p, U+1D88->p, U+1E54->p, U+1E55->p, U+1E56->p, U+1E57->p, U+2C63->p, \ |
| U+024A->q, U+024B->q, U+02A0->q, \ |
| U+0154->r, U+0155->r, U+0156->r, U+0157->r, U+0158->r, U+0159->r, U+0210->r, U+0211->r, U+0212->r, U+0213->r, U+024C->r, U+024D->r, U+0279->r, U+027A->r, U+027B->r, U+027C->r, U+027D->r, U+027E->r, U+027F->r, U+0280->r, U+0281->r, U+02B3->r, U+02B4->r, U+02B5->r, U+02B6->r, U+1D19->r, U+1D1A->r, U+1D3F->r, U+1D63->r, U+1D72->r, U+1D73->r, U+1D89->r, U+1DCA->r, U+1E58->r, U+1E59->r, U+1E5A->r, U+1E5B->r, U+1E5C->r, U+1E5D->r, U+1E5E->r, U+1E5F->r, U+211C->r, U+2C64->r, \ |
| U+00DF->s, U+015A->s, U+015B->s, U+015C->s, U+015D->s, U+015E->s, U+015F->s, U+0160->s, U+0161->s, U+017F->s, U+0218->s, U+0219->s, U+023F->s, U+0282->s, U+02E2->s, U+1D74->s, U+1D8A->s, U+1DB3->s, U+1E60->s, U+1E61->s, U+1E62->s, U+1E63->s, U+1E64->s, U+1E65->s, U+1E66->s, U+1E67->s, U+1E68->s, U+1E69->s, U+1E9B->s, \ |
| U+0162->t, U+0163->t, U+0164->t, U+0165->t, U+0166->t, U+0167->t, U+01AB->t, U+01AC->t, U+01AD->t, U+01AE->t, U+021A->t, U+021B->t, U+0236->t, U+023E->t, U+0287->t, U+0288->t, U+1D1B->t, U+1D40->t, U+1D57->t, U+1D75->t, U+1DB5->t, U+1E6A->t, U+1E6B->t, U+1E6C->t, U+1E6D->t, U+1E6E->t, U+1E6F->t, U+1E70->t, U+1E71->t, U+1E97->t, U+2C66->t, \ |
| U+00D9->u, U+00DA->u, U+00DB->u, U+00DC->u, U+00F9->u, U+00FA->u, U+00FB->u, U+00FC->u, U+010316->u, U+0168->u, U+0169->u, U+016A->u, U+016B->u, U+016C->u, U+016D->u, U+016E->u, U+016F->u, U+0170->u, U+0171->u, U+0172->u, U+0173->u, U+01AF->u, U+01B0->u, U+01D3->u, U+01D4->u, U+01D5->u, U+01D6->u, U+01D7->u, U+01D8->u, U+01D9->u, U+01DA->u, U+01DB->u, U+01DC->u, U+0214->u, U+0215->u, U+0216->u, U+0217->u, U+0244->u, U+0289->u, U+1D1C->u, U+1D1D->u, U+1D1E->u, U+1D41->u, U+1D58->u, U+1D59->u, U+1D64->u, U+1D7E->u, U+1D99->u, U+1DB6->u, U+1DB8->u, U+1E72->u, U+1E73->u, U+1E74->u, U+1E75->u, U+1E76->u, U+1E77->u, U+1E78->u, U+1E79->u, U+1E7A->u, U+1E7B->u, U+1EE4->u, U+1EE5->u, U+1EE6->u, U+1EE7->u, U+1EE8->u, U+1EE9->u, U+1EEA->u, U+1EEB->u, U+1EEC->u, U+1EED->u, U+1EEE->u, U+1EEF->u, U+1EF0->u, U+1EF1->u, \ |
| U+01B2->v, U+0245->v, U+028B->v, U+028C->v, U+1D20->v, U+1D5B->v, U+1D65->v, U+1D8C->v, U+1DB9->v, U+1DBA->v, U+1E7C->v, U+1E7D->v, U+1E7E->v, U+1E7F->v, U+2C74->v, \ |
| U+0174->w, U+0175->w, U+028D->w, U+02B7->w, U+1D21->w, U+1D42->w, U+1E80->w, U+1E81->w, U+1E82->w, U+1E83->w, U+1E84->w, U+1E85->w, U+1E86->w, U+1E87->w, U+1E88->w, U+1E89->w, U+1E98->w, \ |
| U+02E3->x, U+1D8D->x, U+1E8A->x, U+1E8B->x, U+1E8C->x, U+1E8D->x, U+2093->x, \ |
| U+00DD->y, U+00FD->y, U+00FF->y, U+0176->y, U+0177->y, U+0178->y, U+01B3->y, U+01B4->y, U+0232->y, U+0233->y, U+024E->y, U+024F->y, U+028E->y, U+028F->y, U+02B8->y, U+1E8E->y, U+1E8F->y, U+1E99->y, U+1EF2->y, U+1EF3->y, U+1EF4->y, U+1EF5->y, U+1EF6->y, U+1EF7->y, U+1EF8->y, U+1EF9->y, \ |
| U+0179->z, U+017A->z, U+017B->z, U+017C->z, U+017D->z, U+017E->z, U+01B5->z, U+01B6->z, U+0224->z, U+0225->z, U+0240->z, U+0290->z, U+0291->z, U+1D22->z, U+1D76->z, U+1D8E->z, U+1DBB->z, U+1DBC->z, U+1DBD->z, U+1E90->z, U+1E91->z, U+1E92->z, U+1E93->z, U+1E94->z, U+1E95->z, U+2128->z, U+2C6B->z, U+2C6C->z, \ |
| U+00C6->U+00E6, U+01E2->U+00E6, U+01E3->U+00E6, U+01FC->U+00E6, U+01FD->U+00E6, U+1D01->U+00E6, U+1D02->U+00E6, U+1D2D->U+00E6, U+1D46->U+00E6, U+00E6 |
| } |
| index bib_items_callnum |
| { |
| source = bib_items_callnum |
| path = /usr/local/sphinx/var/data/bib_items_callnum |
| docinfo = extern |
| mlock = 0 |
| morphology = none |
| min_word_len = 1 |
| charset_type = sbcs |
| html_strip = 0 |
| enable_star = 1 |
| min_prefix_len = 1 |
| ignore_chars = U+22,U+23,U+24,U+25,U+26,U+27,U+28,U+29,U+2C,U+2E |
| charset_table = 0..9, A..Z->a..z, _, a..z, U+A8->U+B8, U+B8, U+C0..U+DF->U+E0..U+FF, U+E0..U+FF,U+2D,- |
| } |
| index bib_items_tags |
| { |
| source = bib_items_tags |
| path = /usr/local/sphinx/var/data/bib_items_tags |
| docinfo = extern |
| mlock = 0 |
| morphology = none |
| min_word_len = 1 |
| charset_type = sbcs |
| html_strip = 0 |
| ignore_chars = U+22,U+23,U+24,U+25,U+26,U+27,U+28,U+29,U+2C,U+2E |
| } |
| index bib_items_reviews |
| { |
| source = bib_items_reviews |
| path = /usr/local/sphinx/var/data/bib_items_reviews |
| docinfo = extern |
| mlock = 0 |
| morphology = none |
| min_word_len = 1 |
| charset_type = sbcs |
| html_strip = 0 |
| ignore_chars = U+22,U+23,U+24,U+25,U+26,U+27,U+28,U+29,U+2C,U+2E |
| } |
| ############################################################################# |
| ## indexer settings |
| ############################################################################# |
| indexer |
| { |
| mem_limit = 32M |
| } |
| ############################################################################# |
| ## searchd settings |
| ############################################################################# |
| searchd |
| { |
| listen = 127.0.0.1:3312 |
| log = /usr/local/sphinx/var/log/searchd.log |
| query_log = /usr/local/sphinx/var/log/query.log |
| read_timeout = 5 |
| max_children = 30 |
| pid_file = /usr/local/sphinx/var/run/searchd.pid |
| max_matches = 5000 |
| seamless_rotate = 1 |
| preopen_indexes = 0 |
| unlink_old = 1 |
| } |