]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/perlmods/lib/OpenILS/Application/Storage.pm
7401846def64284c4f5c6e4f4137f821a87f9f2e
[working/Evergreen.git] / Open-ILS / src / perlmods / lib / OpenILS / Application / Storage.pm
1 package OpenILS::Application::Storage;
2 use OpenILS::Application;
3 use base qw/OpenILS::Application/;
4
5 use OpenSRF::EX qw/:try/;
6 use OpenSRF::Utils::Logger qw/:level/;
7
8 # Pull this in so we can adjust it's @ISA
9 use OpenILS::Application::Storage::CDBI (1);
10 use OpenILS::Application::Storage::FTS;
11
12
13 # the easy way to get to the logger...
14 my $log = "OpenSRF::Utils::Logger";
15
16 our $QParser;
17 our $WRITE = 0;
18 our $IGNORE_XACT_ID_FAILURE = 0;
19
20 sub DESTROY {};
21
22 sub initialize {
23
24     my $conf = OpenSRF::Utils::SettingsClient->new;
25
26     $log->debug('Initializing ' . __PACKAGE__ . '...', DEBUG);
27
28     my $db_driver = $conf->config_value( apps => 'open-ils.storage' => app_settings => databases => 'driver');
29     my $driver = "OpenILS::Application::Storage::Driver::$db_driver";
30
31     $log->debug("Attempting to load $driver ...", DEBUG);
32
33     $driver->use;
34     if ($@) {
35         $log->debug( "Can't load $driver!  :  $@", ERROR );
36         $log->error( "Can't load $driver!  :  $@");
37         throw OpenSRF::EX::PANIC ( "Can't load $driver!  :  $@" );
38     }
39
40     $log->debug("$driver loaded successfully", DEBUG);
41
42     # Suck in the method publishing modules
43     @OpenILS::Application::Storage::CDBI::ISA = ( $driver );
44
45     OpenILS::Application::Storage::Publisher->use;
46     if ($@) {
47         $log->debug("FAILURE LOADING Publisher!  $@", ERROR);
48         throw OpenSRF::EX::PANIC ( "FAILURE LOADING Publisher!  :  $@" );
49     }
50
51     $log->debug("We seem to be OK...",DEBUG);
52 }
53
54 sub child_init {
55
56     $log->debug('Running child_init for ' . __PACKAGE__ . '...', DEBUG);
57
58     my $conf = OpenSRF::Utils::SettingsClient->new;
59
60     $log->debug('Calling the Driver child_init', DEBUG);
61     OpenILS::Application::Storage::CDBI->child_init(
62         $conf->config_value( apps => 'open-ils.storage' => app_settings => databases => 'database')
63     );
64
65     if (OpenILS::Application::Storage::CDBI->db_Main()) {
66         $log->debug("Success initializing driver!", DEBUG);
67
68         my $db_driver = $conf->config_value( apps => 'open-ils.storage' => app_settings => databases => 'driver');
69         $QParser = 'OpenILS::Application::Storage::Driver::'.$db_driver.'::QueryParser';
70         $QParser->use;
71
72         if($@) {
73             $log->debug( "Can't load $QParser!  :  $@", ERROR );
74             $log->error( "Can't load $QParser!  :  $@");
75         } else {
76             return 1;
77         }
78     }
79
80     $log->debug("FAILURE initializing driver!", ERROR);
81     return 0;
82 }
83
84 sub begin_xaction {
85     my $self = shift;
86     my $client = shift;
87
88     local $WRITE = 1;
89
90     $log->debug(" XACT --> 'BEGIN'ing transaction for session ".$client->session->session_id,DEBUG);
91     try {
92         OpenILS::Application::Storage::CDBI->db_Main->begin_work;
93         $client->session->session_data( xact_id => $client->session->session_id );
94     } catch Error with {
95         throw OpenSRF::DomainObject::oilsException->new(
96             statusCode => 500,
97             status => "Could not BEGIN transaction!",
98         );
99     };
100     return 1;
101
102 }
103 __PACKAGE__->register_method(
104     method      => 'begin_xaction',
105     api_name    => 'open-ils.storage.transaction.begin',
106     api_level   => 1,
107     argc        => 0,
108 );
109
110 sub savepoint_placeholder {
111     return 1;
112 }
113 __PACKAGE__->register_method(
114     method      => 'savepoint_placeholder',
115     api_name    => 'open-ils.storage.savepoint.set',
116     api_level   => 1,
117     argc        => 1,
118 );
119 __PACKAGE__->register_method(
120     method      => 'savepoint_placeholder',
121     api_name    => 'open-ils.storage.savepoint.release',
122     api_level   => 1,
123     argc        => 1,
124 );
125 __PACKAGE__->register_method(
126     method      => 'savepoint_placeholder',
127     api_name    => 'open-ils.storage.savepoint.rollback',
128     api_level   => 1,
129     argc        => 1,
130 );
131
132 sub commit_xaction {
133     my $self = shift;
134     my $client = shift;
135
136     local $WRITE = 1;
137
138     try {
139         OpenILS::Application::Storage::CDBI->db_Main->commit;
140         $client->session->session_data( xact_id => '' );
141     } catch Error with {
142         throw OpenSRF::DomainObject::oilsException->new(
143             statusCode => 500,
144             status => "Could not COMMIT  transaction!",
145         );
146     };
147     return 1;
148 }
149 __PACKAGE__->register_method(
150     method      => 'commit_xaction',
151     api_name    => 'open-ils.storage.transaction.commit',
152     api_level   => 1,
153     argc        => 0,
154 );
155
156
157 sub current_xact {
158     my $self = shift;
159     my $client = shift;
160
161     return $client->session->session_data( 'xact_id' );
162 }
163 __PACKAGE__->register_method(
164     method      => 'current_xact',
165     api_name    => 'open-ils.storage.transaction.current',
166     api_level   => 1,
167     argc        => 0,
168 );
169
170 sub rollback_xaction {
171     my $self = shift;
172     my $client = shift;
173
174     local $WRITE = 1;
175
176     $log->debug(" XACT --> 'ROLLBACK'ing transaction for session ".$client->session->session_id,DEBUG);
177     $client->session->session_data( xact_id => '' );
178     return OpenILS::Application::Storage::CDBI->db_Main->rollback;
179 }
180 __PACKAGE__->register_method(
181     method      => 'rollback_xaction',
182     api_name    => 'open-ils.storage.transaction.rollback',
183     api_level   => 1,
184     argc        => 0,
185 );
186
187
188 sub _cdbi2Hash {
189     my $self = shift;
190     my $obj = shift;
191     return { map { ( $_ => $obj->$_ ) } ($obj->columns('All')) };
192 }
193
194 sub _cdbi_list2AoH {
195     my $self = shift;
196     my @objs = @_;
197     return [ map { $self->_cdbi2Hash($_) } @objs ];
198 }
199
200 1;