]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/perlmods/OpenILS/Application/Storage/Driver/Pg.pm
EETS ALIVE!!!!!!!
[Evergreen.git] / Open-ILS / src / perlmods / OpenILS / Application / Storage / Driver / Pg.pm
1 { # Based on the change to Class::DBI in OpenILS::Application::Storage.  This will
2   # allow us to use TSearch2 via a simple cdbi "search" interface.
3         #-------------------------------------------------------------------------------
4         use Class::DBI;
5         package Class::DBI;
6
7         sub search_fti {
8                 my $self = shift;
9                 my @args = @_;
10                 if (ref($args[-1]) eq 'HASH') {
11                         $args[-1]->{_placeholder} = "to_tsquery('default',?)";
12                 } else {
13                         push @args, {_placeholder => "to_tsquery('default',?)"};
14                 }
15                 $self->_do_search("@@"  => @args);
16         }
17 }
18
19 { # Every driver needs to provide a 'compile()' method to OpenILS::Application::Storage::FTS.
20   # If that driver wants to support FTI, that is...
21         #-------------------------------------------------------------------------------
22         package OpenILS::Application::Storage::FTS;
23         use OpenSRF::Utils::Logger qw/:level/;
24         my $log = 'OpenSRF::Utils::Logger';
25
26         sub compile {
27                 my $self = shift;
28                 my $term = shift;
29
30                 $self = ref($self) || $self;
31                 $self = bless {} => $self;
32
33                 $self->decompose($term);
34
35                 my $newterm = join('&', $self->words);
36
37                 if ($self->nots) {
38                         $newterm = '('.$newterm.')&('. join('|', $self->nots) . ')';
39                 }
40
41                 $newterm = OpenILS::Application::Storage->driver->quote($newterm);
42
43                 $self->{fts_query} = ["to_tsquery('default',$newterm)"];
44                 $self->{fts_query_nots} = [];
45                 $self->{fts_op} = '@@';
46
47                 return $self;
48         }
49 }
50
51
52 { # The driver package itself just needs a db_Main method for Class::DBI to call.
53   # any other fixups can go in here too... Also, the drivers should subclass the
54   # DBI driver that they are wrapping, or provide a 'quote()' method that calls
55   # the DBD::xxx::quote() method on FTI's behalf.
56   #
57   # The dirver MUST be a subclass of Class::DBI and OpenILS::Application::Storage.
58         #-------------------------------------------------------------------------------
59         package OpenILS::Application::Storage::Driver::Pg;
60         use base qw/Class::DBI OpenILS::Application::Storage/;
61         use DBI;
62         use OpenSRF::Utils::Logger qw/:level/;
63         my $log = 'OpenSRF::Utils::Logger';
64
65         __PACKAGE__->set_sql( retrieve_limited => 'SELECT * FROM __TABLE__ ORDER BY id LIMIT ?' );
66
67         my $_db_params;
68         sub child_init {
69                 my $self = shift;
70                 $_db_params = shift;
71
72                 $log->debug("Running child_init inside ".__PACKAGE__, INTERNAL);
73         }
74
75         my $_dbh;
76         sub db_Main {   
77                 my $self = shift;
78
79                 return $_dbh if (defined $_dbh and $_dbh->ping);
80
81                 my %attrs = (   %{$self->_default_attributes},
82                                 RootClass => 'DBIx::ContextualFetch',
83                                 ShowErrorStatement => 1,
84                                 RaiseError => 1,
85                                 AutoCommit => 1,
86                                 PrintError => 1,
87                                 Taint => 1,
88                                 pg_enable_utf8 => 1,
89                                 FetchHashKeyName => 'NAME_lc',
90                                 ChopBlanks => 1,
91                 );
92
93                 $log->debug(" Default connect info for this DB is:\n\t".join("\n\t",map { "$_\t==> $$_db_params{$_}" } keys %$_db_params), INTERNAL);
94                 $log->debug(" Default attributes for this DB connection are:\n\t".join("\n\t",map { "$_\t==> $attrs{$_}" } keys %attrs), INTERNAL);
95
96                 $_dbh = DBI->connect( "dbi:Pg:host=$$_db_params{host};dbname=$$_db_params{db}",$$_db_params{user},$$_db_params{pw}, \%attrs );
97                 $_dbh->do("SET CLIENT_ENCODING TO 'SQL_ASCII';");
98
99                 return $_dbh;
100         }
101
102         sub quote {
103                 return $_dbh->quote(@_)
104         }
105
106         sub tsearch2_trigger {
107                 my $self = shift;
108                 return unless ($self->value);
109                 $self->index_vector(
110                         $self->db_Main->selectrow_array(
111                                 "SELECT to_tsvector('default',?);",
112                                 {},
113                                 $self->value
114                         )
115                 );
116         }
117 }
118
119 {
120         #---------------------------------------------------------------------
121         package asset::call_number;
122         
123         asset::call_number->table( 'asset.call_number' );
124         asset::call_number->sequence( 'asset.call_number_id_seq' );
125         
126         #---------------------------------------------------------------------
127         package asset::copy;
128         
129         asset::copy->table( 'asset.copy' );
130         asset::copy->sequence( 'asset.copy_id_seq' );
131         
132         #---------------------------------------------------------------------
133         package biblio::record_entry;
134         
135         biblio::record_entry->table( 'biblio.record_entry' );
136         biblio::record_entry->sequence( 'biblio.record_entry_id_seq' );
137
138         #---------------------------------------------------------------------
139         package biblio::record_node;
140         
141         biblio::record_node->table( 'biblio.record_data' );
142         biblio::record_node->sequence( 'biblio.record_data_id_seq' );
143         
144         #---------------------------------------------------------------------
145         package biblio::record_note;
146         
147         biblio::record_note->table( 'biblio.record_note' );
148         biblio::record_note->sequence( 'biblio.record_note_id_seq' );
149         
150         #---------------------------------------------------------------------
151         package actor::user;
152         
153         actor::user->table( 'actor.usr' );
154         actor::user->sequence( 'actor.usr_id_seq' );
155         
156         #---------------------------------------------------------------------
157         package actor::org_unit_type;
158         
159         actor::org_unit_type->table( 'actor.org_unit_type' );
160         actor::org_unit_type->sequence( 'actor.org_unit_type_id_seq' );
161         
162         #---------------------------------------------------------------------
163         
164         #-------------------------------------------------------------------------------
165         package metabib::metarecord;
166
167         metabib::metarecord->table( 'metabib.metarecord' );
168         metabib::metarecord->sequence( 'metabib.metarecord_id_seq' );
169
170         #-------------------------------------------------------------------------------
171
172         #-------------------------------------------------------------------------------
173         package metabib::title_field_entry;
174
175         metabib::title_field_entry->table( 'metabib.title_field_entry' );
176         metabib::title_field_entry->sequence( 'metabib.title_field_entry_id_seq' );
177         metabib::title_field_entry->columns( Primary => qw/id/ );
178         metabib::title_field_entry->columns( Others => qw/field index_vector/ );
179         metabib::title_field_entry->columns( TEMP => qw/value/ );
180
181         metabib::title_field_entry->add_trigger(
182                 before_create => \&OpenILS::Application::Storage::Driver::Pg::tsearch2_trigger
183         );
184         metabib::title_field_entry->add_trigger(
185                 before_update => \&OpenILS::Application::Storage::Driver::Pg::tsearch2_trigger
186         );
187
188         #-------------------------------------------------------------------------------
189
190         #-------------------------------------------------------------------------------
191         package metabib::author_field_entry;
192
193         metabib::author_field_entry->table( 'metabib.author_field_entry' );
194         metabib::author_field_entry->sequence( 'metabib.author_field_entry_id_seq' );
195         metabib::author_field_entry->columns( Primary => qw/id/ );
196         metabib::author_field_entry->columns( Others => qw/field index_vector/ );
197         metabib::author_field_entry->columns( TEMP => qw/value/ );
198
199         metabib::author_field_entry->add_trigger(
200                 before_create => \&OpenILS::Application::Storage::Driver::Pg::tsearch2_trigger
201         );
202         metabib::author_field_entry->add_trigger(
203                 before_update => \&OpenILS::Application::Storage::Driver::Pg::tsearch2_trigger
204         );
205
206         #-------------------------------------------------------------------------------
207
208         #-------------------------------------------------------------------------------
209         package metabib::subject_field_entry;
210
211         metabib::subject_field_entry->table( 'metabib.subject_field_entry' );
212         metabib::subject_field_entry->sequence( 'metabib.subject_field_entry_id_seq' );
213         metabib::subject_field_entry->columns( Primary => qw/id/ );
214         metabib::subject_field_entry->columns( Others => qw/field index_vector/ );
215         metabib::subject_field_entry->columns( TEMP => qw/value/ );
216
217         metabib::subject_field_entry->add_trigger(
218                 before_create => \&OpenILS::Application::Storage::Driver::Pg::tsearch2_trigger
219         );
220         metabib::subject_field_entry->add_trigger(
221                 before_update => \&OpenILS::Application::Storage::Driver::Pg::tsearch2_trigger
222         );
223
224         #-------------------------------------------------------------------------------
225
226         #-------------------------------------------------------------------------------
227         package metabib::keyword_field_entry;
228
229         metabib::keyword_field_entry->table( 'metabib.keyword_field_entry' );
230         metabib::keyword_field_entry->sequence( 'metabib.keyword_field_entry_id_seq' );
231         metabib::keyword_field_entry->columns( Primary => qw/id/ );
232         metabib::keyword_field_entry->columns( Others => qw/field index_vector/ );
233         metabib::keyword_field_entry->columns( TEMP => qw/value/ );
234
235         metabib::keyword_field_entry->add_trigger(
236                 before_create => \&OpenILS::Application::Storage::Driver::Pg::tsearch2_trigger
237         );
238         metabib::keyword_field_entry->add_trigger(
239                 before_update => \&OpenILS::Application::Storage::Driver::Pg::tsearch2_trigger
240         );
241
242         #-------------------------------------------------------------------------------
243
244         #-------------------------------------------------------------------------------
245         package metabib::title_field_entry_source_map;
246
247         metabib::title_field_entry_source_map->table( 'metabib.title_field_entry_source_map' );
248         metabib::title_field_entry_source_map->table( 'metabib.title_field_entry_source_map_id_seq' );
249
250         #-------------------------------------------------------------------------------
251
252         #-------------------------------------------------------------------------------
253         package metabib::author_field_entry_source_map;
254
255         metabib::author_field_entry_source_map->table( 'metabib.author_field_entry_source_map' );
256         metabib::author_field_entry_source_map->sequence( 'metabib.author_field_entry_source_map_id_seq' );
257
258         #-------------------------------------------------------------------------------
259
260         #-------------------------------------------------------------------------------
261         package metabib::subject_field_entry_source_map;
262
263         metabib::subject_field_entry_source_map->table( 'metabib.subject_field_entry_source_map' );
264         metabib::subject_field_entry_source_map->sequence( 'metabib.subject_field_entry_source_map_id_seq' );
265
266         #-------------------------------------------------------------------------------
267 }
268
269 1;