1 package OpenSRF::Application::Persist;
2 use base qw/OpenSRF::Application/;
3 use OpenSRF::Application;
5 use OpenSRF::Utils::SettingsClient;
6 use OpenSRF::EX qw/:try/;
7 use OpenSRF::Utils::Logger;
11 use vars qw/$dbh $sc $log/;
14 $log = 'OpenSRF::Utils::Logger';
18 $sc = OpenSRF::Utils::SettingsClient->new;
20 my $dbfile = $sc->config_value( apps => persist => app_settings => 'dbfile');
22 throw OpenSRF::EX::PANIC ("Can't find my dbfile for SQLite!");
25 $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","","");
26 $dbh->{AutoCommit} = 1;
27 $dbh->{RaiseError} = 1;
31 CREATE TABLE storage (
39 CREATE TABLE store_name (
51 my $name = shift || '';
54 my $sth = $dbh->prepare("INSERT INTO store_name (name) VALUES (?)");
59 throw OpenSRF::EX::WARN ("Duplicate key: object name [$name] already exists! " . $dbh->errstr);
63 my $last_id = $dbh->last_insert_id();
64 $name = 'AUTOGENERATED!!'.$last_id;
65 $dbh->do("UPDATE store_name SET name = '$name' WHERE id = '$last_id';");
70 __PACKAGE__->register_method(
71 api_name => 'opensrf.persist.slot.create',
72 method => 'create_store',
82 my $name = shift or throw OpenSRF::EX::WARN ("No queue name specified!");
83 my $value = shift || '';
85 my $name_id = _get_name_id($name);
87 if ($self->api_name =~ /object/) {
88 $dbh->do('DELETE FROM storage WHERE name_id = ?', {}, $name_id);
91 $dbh->do('INSERT INTO storage (name_id,value) VALUES (?,?);', {}, $name_id, JSON->perl2JSON($value));
93 return 0 if ($dbh->err);
96 __PACKAGE__->register_method(
97 api_name => 'opensrf.persist.object.set',
101 __PACKAGE__->register_method(
102 api_name => 'opensrf.persist.queue.push',
103 method => 'add_item',
106 __PACKAGE__->register_method(
107 api_name => 'opensrf.persist.stack.push',
108 method => 'add_item',
113 my $name = shift or throw OpenSRF::EX::WARN ("No queue name specified!");
115 my $name_id = $dbh->selectcol_arrayref("SELECT id FROM store_name WHERE name = ?", {}, $name)->[0];
118 throw OpenSRF::EX::WARN ("Object name [$name] does not exist!");
130 my $name_id = _get_name_id($name);
132 $dbh->do("DELETE FROM storage WHERE name_id = ?", {}, $name_id);
133 $dbh->do("DELETE FROM store_name WHERE id = ?", {}, $name_id);
135 __PACKAGE__->register_method(
136 api_name => 'opensrf.persist.slot.destroy',
137 method => 'destroy_store',
143 if ($name =~ /^AUTOGENERATED!!/) {
144 my $count = $dbh->selectrow_arrayref("SELECT COUNT(*) FROM storage WHERE name = ?", {}, $name);
145 if (!ref($count) || $$count[0] == 0) {
146 $dbh->do("DELETE FROM store_name WHERE name = ?", {}, $name);
155 my $name = shift or throw OpenSRF::EX::WARN ("No queue name specified!");
156 my $name_id = _get_name_id($name);
158 my $value = $dbh->selectrow_arrayref('SELECT id, value FROM storage WHERE name_id = ? ORDER BY id ASC LIMIT 1', {}, $name_id);
159 $dbh->do('DELETE FROM storage WHERE id = ?',{}, $value->[0]);
161 _flush_by_name($name);
162 return JSON->JSON2perl( $value->[1] );
164 __PACKAGE__->register_method(
165 api_name => 'opensrf.persist.queue.pop',
166 method => 'pop_queue',
175 my $name = shift or throw OpenSRF::EX::WARN ("No queue name specified!");
176 my $name_id = _get_name_id($name);
178 my $value = $dbh->selectrow_arrayref('SELECT id, value FROM storage WHERE name_id = ? ORDER BY id DESC LIMIT 1', {}, $name_id);
179 $dbh->do('DELETE FROM storage WHERE id = ?',{}, $value->[0]);
181 _flush_by_name($name);
182 return JSON->JSON2perl( $value->[1] );
184 __PACKAGE__->register_method(
185 api_name => 'opensrf.persist.stack.pop',
186 method => 'shift_stack',
194 my $name = shift or throw OpenSRF::EX::WARN ("No queue name specified!");
195 my $name_id = _get_name_id($name);
197 my $value = $dbh->selectrow_arrayref('SELECT name_id, value FROM storage WHERE name_id = ? ORDER BY id DESC LIMIT 1', {}, $name_id);
198 $dbh->do('DELETE FROM storage WHERE name_id = ?',{}, $value->[0]);
200 _flush_by_name($name);
201 return JSON->JSON2perl( $value->[1] );
203 __PACKAGE__->register_method(
204 api_name => 'opensrf.persist.object.get',
205 method => 'shift_stack',