]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/perlmods/OpenILS/Application/Storage.pm
bug fixes for transaction interface
[Evergreen.git] / Open-ILS / src / perlmods / OpenILS / Application / Storage.pm
1 package OpenILS::Application::Storage;
2 use OpenSRF::Application;
3 use base qw/OpenSRF::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;
10
11 use OpenILS::Application::Storage::FTS;
12
13 # Suck in the method publishing modules
14 use OpenILS::Application::Storage::Publisher;
15
16 # the easy way to get to the logger...
17 my $log = "OpenSRF::Utils::Logger";
18
19 sub DESTROY {};
20
21 sub initialize {
22
23         my $conf = OpenSRF::Utils::SettingsClient->new;
24
25         $log->debug('Initializing ' . __PACKAGE__ . '...', DEBUG);
26
27         my $driver = "OpenILS::Application::Storage::Driver::".
28                 $conf->config_value( apps => 'open-ils.storage' => app_settings => databases => 'driver');
29
30
31         $log->debug("Attempting to load $driver ...", DEBUG);
32
33         eval "use $driver;";
34         throw OpenILS::EX::PANIC ( "Can't load $driver!  :  $@" ) if ($@);
35
36         $log->debug("$driver loaded successfully", DEBUG);
37
38         @OpenILS::Application::Storage::CDBI::ISA = ( $driver );
39 }
40
41 sub child_init {
42
43         my $conf = OpenSRF::Utils::SettingsClient->new;
44
45         $log->debug('Running child_init for ' . __PACKAGE__ . '...', DEBUG);
46
47         OpenILS::Application::Storage::CDBI->child_init(
48                 $conf->config_value( apps => 'open-ils.storage' => app_settings => databases => 'database')
49         );
50         
51         return 1 if (OpenILS::Application::Storage::CDBI->db_Main());
52         return 0;
53 }
54
55 sub begin_xaction {
56         my $self = shift;
57         my $client = shift;
58
59         my $dbh = OpenILS::Application::Storage::CDBI->db_Main;
60
61         $client->session->registger_callback( disconnect => sub { shift()->session_data('dbh')->commit; } )
62                 if ($self->api_name =~ /autocommit$/o);
63
64         $client->session->registger_callback( death => sub { shift()->session_data('dbh')->rollback; } );
65
66         $client->session->session_data( dbh => $dbh );
67                 
68         $dbh->begin_work;
69
70         return 1;
71 }
72 __PACKAGE__->register_method(
73         method          => 'begin_xaction',
74         api_name        => 'open-ils.storage.transaction.begin',
75         api_level       => 1,
76         argc            => 0,
77 );
78 __PACKAGE__->register_method(
79         method          => 'begin_xaction',
80         api_name        => 'open-ils.storage.transaction.begin.autocommit',
81         api_level       => 1,
82         argc            => 0,
83 );
84
85 sub commit_xaction {
86         my $self = shift;
87         my $client = shift;
88
89         try {
90                 $client->session->session_data('dbh')->commit;
91         } catch Error with {
92                 $client->session->session_data('dbh')->rollback;
93         };
94 }
95 __PACKAGE__->register_method(
96         method          => 'commit_xaction',
97         api_name        => 'open-ils.storage.transaction.commit',
98 );
99
100
101 sub rollback_xaction {
102         my $self = shift;
103         my $client = shift;
104
105         $client->session->session_data('dbh')->rollback;
106 }
107 __PACKAGE__->register_method(
108         method          => 'rollback_xaction',
109         api_name        => 'open-ils.storage.transaction.rollback',
110 );
111
112
113 sub _cdbi2Hash {
114         my $self = shift;
115         my $obj = shift;
116         return { map { ( $_ => $obj->$_ ) } ($obj->columns('All')) };
117 }
118
119 sub _cdbi_list2AoH {
120         my $self = shift;
121         my @objs = @_;
122         return [ map { $self->_cdbi2Hash($_) } @objs ];
123 }
124
125 1;