1 package OpenILS::Application::Storage;
2 use OpenILS::Application;
3 use base qw/OpenILS::Application/;
5 use OpenSRF::EX qw/:try/;
6 use OpenSRF::Utils::Logger qw/:level/;
8 # Pull this in so we can adjust it's @ISA
9 use OpenILS::Application::Storage::CDBI (1);
10 use OpenILS::Application::Storage::FTS;
13 # the easy way to get to the logger...
14 my $log = "OpenSRF::Utils::Logger";
18 our $IGNORE_XACT_ID_FAILURE = 0;
24 my $conf = OpenSRF::Utils::SettingsClient->new;
26 $log->debug('Initializing ' . __PACKAGE__ . '...', DEBUG);
28 my $db_driver = $conf->config_value( apps => 'open-ils.storage' => app_settings => databases => 'driver');
29 my $driver = "OpenILS::Application::Storage::Driver::$db_driver";
31 $log->debug("Attempting to load $driver ...", DEBUG);
35 $log->debug( "Can't load $driver! : $@", ERROR );
36 $log->error( "Can't load $driver! : $@");
37 throw OpenSRF::EX::PANIC ( "Can't load $driver! : $@" );
40 $log->debug("$driver loaded successfully", DEBUG);
42 # Suck in the method publishing modules
43 @OpenILS::Application::Storage::CDBI::ISA = ( $driver );
45 OpenILS::Application::Storage::Publisher->use;
47 $log->debug("FAILURE LOADING Publisher! $@", ERROR);
48 throw OpenSRF::EX::PANIC ( "FAILURE LOADING Publisher! : $@" );
51 $log->debug("We seem to be OK...",DEBUG);
58 $args{package} ||= ref($class) || $class;
60 unless ($args{no_tz_force}) {
62 $dup_args{api_name} = 'no_tz.' . $args{api_name};
64 $args{method} = 'force_db_tz';
65 delete $args{package};
67 __PACKAGE__->SUPER::register_method( %dup_args );
71 __PACKAGE__->SUPER::register_method( %args );
80 my ($current_xact) = $self->method_lookup('no_tz.open-ils.storage.transaction.current')->run;
82 if (!$current_xact && $ENV{TZ}) {
84 OpenILS::Application::Storage::CDBI->db_Main->do(
90 $log->error( "Could not set timezone: $ENV{TZ}");
94 my $method = $self->method_lookup('no_tz.' . $self->{api_name});
97 $client->respond( $_ ) for ( $method->run(@args) );
99 if (!$current_xact && $ENV{TZ}) {
101 OpenILS::Application::Storage::CDBI->db_Main->do(
102 'SET timezone TO DEFAULT;',
105 $log->error( "Could not reset default timezone");
114 $log->debug('Running child_init for ' . __PACKAGE__ . '...', DEBUG);
116 my $conf = OpenSRF::Utils::SettingsClient->new;
118 $log->debug('Calling the Driver child_init', DEBUG);
119 OpenILS::Application::Storage::CDBI->child_init(
120 $conf->config_value( apps => 'open-ils.storage' => app_settings => databases => 'database')
123 if (OpenILS::Application::Storage::CDBI->db_Main()) {
124 $log->debug("Success initializing driver!", DEBUG);
126 my $db_driver = $conf->config_value( apps => 'open-ils.storage' => app_settings => databases => 'driver');
127 $QParser = 'OpenILS::Application::Storage::Driver::'.$db_driver.'::QueryParser';
131 $log->debug( "Can't load $QParser! : $@", ERROR );
132 $log->error( "Can't load $QParser! : $@");
138 $log->debug("FAILURE initializing driver!", ERROR);
148 $log->debug(" XACT --> 'BEGIN'ing transaction for session ".$client->session->session_id,DEBUG);
150 OpenILS::Application::Storage::CDBI->db_Main->begin_work;
151 $client->session->session_data( xact_id => $client->session->session_id );
153 throw OpenSRF::DomainObject::oilsException->new(
155 status => "Could not BEGIN transaction!",
161 __PACKAGE__->register_method(
162 method => 'begin_xaction',
163 api_name => 'open-ils.storage.transaction.begin',
168 sub savepoint_placeholder {
171 __PACKAGE__->register_method(
172 method => 'savepoint_placeholder',
173 api_name => 'open-ils.storage.savepoint.set',
177 __PACKAGE__->register_method(
178 method => 'savepoint_placeholder',
179 api_name => 'open-ils.storage.savepoint.release',
183 __PACKAGE__->register_method(
184 method => 'savepoint_placeholder',
185 api_name => 'open-ils.storage.savepoint.rollback',
197 OpenILS::Application::Storage::CDBI->db_Main->commit;
198 $client->session->session_data( xact_id => '' );
200 throw OpenSRF::DomainObject::oilsException->new(
202 status => "Could not COMMIT transaction!",
207 __PACKAGE__->register_method(
208 method => 'commit_xaction',
209 api_name => 'open-ils.storage.transaction.commit',
219 return $client->session->session_data( 'xact_id' );
221 __PACKAGE__->register_method(
222 method => 'current_xact',
223 api_name => 'open-ils.storage.transaction.current',
228 sub rollback_xaction {
234 $log->debug(" XACT --> 'ROLLBACK'ing transaction for session ".$client->session->session_id,DEBUG);
235 $client->session->session_data( xact_id => '' );
236 return OpenILS::Application::Storage::CDBI->db_Main->rollback;
238 __PACKAGE__->register_method(
239 method => 'rollback_xaction',
240 api_name => 'open-ils.storage.transaction.rollback',
249 return { map { ( $_ => $obj->$_ ) } ($obj->columns('All')) };
255 return [ map { $self->_cdbi2Hash($_) } @objs ];