9 my ($proto, $search_type, @args) = @_;
10 my $class = ref $proto || $proto;
12 @args = %{ $args[0] } if ref $args[0] eq "HASH";
15 my $search_opts = @args % 2 ? pop @args : {};
17 $search_opts->{offset} = int($search_opts->{page}) * int($search_opts->{page_size}) if ($search_opts->{page_size});
18 $search_opts->{_placeholder} ||= '?';
20 while (my ($col, $val) = splice @args, 0, 2) {
21 my $column = $class->find_column($col)
22 || (List::Util::first { $_->accessor eq $col } $class->columns)
23 || $class->_croak("$col is not a column of $class");
26 push @vals, $class->_deflated_column($column, $val);
29 my $frag = join " AND ",
30 map defined($vals[$_]) ? "$cols[$_] $search_type $$search_opts{_placeholder}" : "$cols[$_] IS NULL",
33 $frag .= " ORDER BY $search_opts->{order_by}"
34 if $search_opts->{order_by};
35 $frag .= " LIMIT $search_opts->{limit}"
36 if $search_opts->{limit};
37 $frag .= " OFFSET $search_opts->{offset}"
38 if ($search_opts->{limit} && defined($search_opts->{offset}));
40 return $class->sth_to_objects($class->sql_Retrieve($frag),
41 [ grep defined, @vals ]);
48 if (ref($args[-1]) eq 'HASH') {
49 $args[-1]->{_placeholder} = "to_tsquery('default',?)";
51 push @args, {_placeholder => "to_tsquery('default',?)"};
53 $self->_do_search("@@" => @args);
58 #-------------------------------------------------------------------------------
59 package OpenILS::Application::Storage;
60 use OpenSRF::Application;
61 use base qw/OpenSRF::Application/;
63 use OpenSRF::EX qw/:try/;
64 use OpenSRF::Utils::Logger qw/:level/;
66 my $log = "OpenSRF::Utils::Logger";
75 return $_db_driver if (defined $_db_driver);
76 my $conf = OpenSRF::Utils::SettingsClieng->new;
78 $log->debug('Initializing ' . __PACKAGE__ . '...', DEBUG);
80 my $driver = $conf->get_value( apps => storage => app_settings => databases => 'driver');
81 my $_db_params = $conf->get_value( apps => storage => app_settings => databases => 'database');
83 $_db_driver = "OpenILS::App::Storage::$driver";
86 eval "use $_db_driver;";
87 throw OpenILS::EX::Config ( "Can't load $_db_driver! : $@" ) if ($@);
89 $_db_driver->initialize if ($_db_driver->can('initialize'));
91 push @OpenILS::Application::Storage::CDBI::ISA, $_db_driver;
97 $log->debug('Running child_init for ' . __PACKAGE__ . '...', DEBUG);
98 $_db_driver->child_init if ($_db_driver->can('child_init'));
100 return 1 if ($_db_driver->db_Main($_db_params));
104 sub getBiblioFieldMaps {
108 $log->debug(" Executing [".$self->method."] as [".$self->api_name."]",INTERNAL);
110 if ($self->api_name =~ /by_class$/) {
112 return _cdbi2Hash( config::metarecord_field_map->search( fieldclass => $id ) );
114 throw OpenSRF::EX::InvalidArg ('Please give me a Class to look up!');
118 return _cdbi2Hash( config::metarecord_field_map->retrieve( $id ) );
120 return _cdbi_list2AoH( config::metarecord_field_map->retrieve_all );
124 __PACKAGE__->register_method(
125 method => 'getBiblioFieldMaps',
126 api_name => 'open-ils.storage.config.metarecord_field',
129 __PACKAGE__->register_method(
130 method => 'getBiblioFieldMaps',
131 api_name => 'open-ils.storage.config.metarecord_field.list',
134 __PACKAGE__->register_method(
135 method => 'getBiblioFieldMaps',
136 api_name => 'open-ils.storage.config.metarecord_field.list.by_class',
141 sub getBiblioFieldMapClasses {
146 $log->debug(" Executing [".$self->method."] as [".$self->api_name."]",INTERNAL);
149 return _cdbi2Hash( config::metarecord_field_class_map->retrieve( $id ) );
151 return _cdbi_list2AoH( config::metarecord_field_class_map->retrieve_all );
154 __PACKAGE__->register_method(
155 method => 'getBiblioFieldMapClasses',
156 api_name => 'open-ils.storage.config.metarecord_field_class',
159 __PACKAGE__->register_method(
160 method => 'getBiblioFieldMapClasses',
161 api_name => 'open-ils.storage.config.metarecord_field_class.list',
167 return { map { ( $_ => $obj->$_ ) } $obj->columns };
172 return [ map { _cdbi2oilsHash($_) } @objs ];
175 #-------------------------------------------------------------------------------
176 package OpenILS::App::Storage::CDBI;