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';
16 $sc = OpenSRF::Utils::SettingsClient->new;
18 my $dbfile = $sc->config_value( apps => persist => app_settings => 'dbfile');
20 throw OpenSRF::EX::PANIC ("Can't find my dbfile for SQLite!");
23 my $init_dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","","");
24 $init_dbh->{AutoCommit} = 1;
25 $init_dbh->{RaiseError} = 0;
27 $init_dbh->do( <<" SQL" );
28 CREATE TABLE storage (
29 id INTEGER PRIMARY KEY,
35 $init_dbh->do( <<" SQL" );
36 CREATE TABLE store_name (
37 id INTEGER PRIMARY KEY,
45 $sc = OpenSRF::Utils::SettingsClient->new;
47 my $dbfile = $sc->config_value( apps => persist => app_settings => 'dbfile');
49 throw OpenSRF::EX::PANIC ("Can't find my dbfile for SQLite!");
52 $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","","");
53 $dbh->{AutoCommit} = 1;
54 $dbh->{RaiseError} = 0;
62 my $name = shift || '';
73 throw OpenSRF::EX::WARN ("Duplicate key: object name [$name] already exists! " . $dbh->errstr)
76 my $sth = $dbh->prepare("INSERT INTO store_name (name) VALUES (?);");
81 my $last_id = $dbh->last_insert_id(undef, undef, 'store_name', 'id');
82 $name = 'AUTOGENERATED!!'.$last_id;
83 $dbh->do("UPDATE store_name SET name = '$name' WHERE id = '$last_id';");
88 __PACKAGE__->register_method(
89 api_name => 'opensrf.persist.slot.create',
90 method => 'create_store',
100 my $name = shift or do {
101 throw OpenSRF::EX::WARN ("No name specified!");
103 my $value = shift || '';
105 my $name_id = _get_name_id($name);
107 if ($self->api_name =~ /object/) {
108 $dbh->do('DELETE FROM storage WHERE name_id = ?;', {}, $name_id);
111 $dbh->do('INSERT INTO storage (name_id,value) VALUES (?,?);', {}, $name_id, JSON->perl2JSON($value));
113 return 0 if ($dbh->err);
116 __PACKAGE__->register_method(
117 api_name => 'opensrf.persist.object.set',
118 method => 'add_item',
121 __PACKAGE__->register_method(
122 api_name => 'opensrf.persist.queue.push',
123 method => 'add_item',
126 __PACKAGE__->register_method(
127 api_name => 'opensrf.persist.stack.push',
128 method => 'add_item',
133 my $name = shift or do {
134 throw OpenSRF::EX::WARN ("No queue name specified!");
138 my $name_id = $dbh->selectrow_arrayref("SELECT id FROM store_name WHERE name = ?;", {}, $name);
140 if (!ref($name_id) || !defined($name_id->[0])) {
141 throw OpenSRF::EX::WARN ("Object name [$name] does not exist!");
144 return $name_id->[0];
153 my $name_id = _get_name_id($name);
155 $dbh->do("DELETE FROM storage WHERE name_id = ?;", {}, $name_id);
156 $dbh->do("DELETE FROM store_name WHERE id = ?;", {}, $name_id);
159 __PACKAGE__->register_method(
160 api_name => 'opensrf.persist.slot.destroy',
161 method => 'destroy_store',
167 if ($name =~ /^AUTOGENERATED!!/) {
168 my $name_id = _get_name_id($name);
169 my $count = $dbh->selectrow_arrayref("SELECT COUNT(*) FROM storage WHERE name_id = ?;", {}, $name_id);
170 if (!ref($count) || $$count[0] == 0) {
171 $dbh->do("DELETE FROM store_name WHERE name = ?;", {}, $name);
180 my $name = shift or do {
181 throw OpenSRF::EX::WARN ("No queue name specified!");
183 my $name_id = _get_name_id($name);
185 my $value = $dbh->selectrow_arrayref('SELECT id, value FROM storage WHERE name_id = ? ORDER BY id ASC LIMIT 1;', {}, $name_id);
186 $dbh->do('DELETE FROM storage WHERE id = ?;',{}, $value->[0]) unless ($self->api_name =~ /peek$/);
188 _flush_by_name($name);
190 return JSON->JSON2perl( $value->[1] );
192 __PACKAGE__->register_method(
193 api_name => 'opensrf.persist.queue.peek',
194 method => 'pop_queue',
197 __PACKAGE__->register_method(
198 api_name => 'opensrf.persist.queue.pop',
199 method => 'pop_queue',
208 my $name = shift or do {
209 throw OpenSRF::EX::WARN ("No queue name specified!");
211 my $name_id = _get_name_id($name);
213 my $value = $dbh->selectrow_arrayref('SELECT SUM(LENGTH(value)) FROM storage WHERE name_id = ?;', {}, $name_id);
215 return JSON->JSON2perl( $value->[0] );
217 __PACKAGE__->register_method(
218 api_name => 'opensrf.persist.queue.size',
219 method => 'shift_stack',
222 __PACKAGE__->register_method(
223 api_name => 'opensrf.persist.stack.size',
224 method => 'shift_stack',
227 __PACKAGE__->register_method(
228 api_name => 'opensrf.persist.object.size',
229 method => 'shift_stack',
237 my $name = shift or do {
238 throw OpenSRF::EX::WARN ("No queue name specified!");
240 my $name_id = _get_name_id($name);
242 my $value = $dbh->selectrow_arrayref('SELECT COUNT(*) FROM storage WHERE name_id = ?;', {}, $name_id);
244 return JSON->JSON2perl( $value->[0] );
246 __PACKAGE__->register_method(
247 api_name => 'opensrf.persist.queue.length',
248 method => 'shift_stack',
251 __PACKAGE__->register_method(
252 api_name => 'opensrf.persist.stack.depth',
253 method => 'shift_stack',
261 my $name = shift or do {
262 throw OpenSRF::EX::WARN ("No queue name specified!");
264 my $name_id = _get_name_id($name);
266 my $value = $dbh->selectrow_arrayref('SELECT id, value FROM storage WHERE name_id = ? ORDER BY id DESC LIMIT 1;', {}, $name_id);
267 $dbh->do('DELETE FROM storage WHERE id = ?;',{}, $value->[0]) unless ($self->api_name =~ /peek$/);
269 _flush_by_name($name);
271 return JSON->JSON2perl( $value->[1] );
273 __PACKAGE__->register_method(
274 api_name => 'opensrf.persist.stack.peek',
275 method => 'shift_stack',
278 __PACKAGE__->register_method(
279 api_name => 'opensrf.persist.stack.pop',
280 method => 'shift_stack',
288 my $name = shift or do {
289 throw OpenSRF::EX::WARN ("No object name specified!");
292 my $name_id = _get_name_id($name);
294 my $value = $dbh->selectrow_arrayref('SELECT name_id, value FROM storage WHERE name_id = ? ORDER BY id DESC LIMIT 1;', {}, $name_id);
295 $dbh->do('DELETE FROM storage WHERE name_id = ?',{}, $value->[0]) unless ($self->api_name =~ /peek$/);
297 _flush_by_name($name);
299 return JSON->JSON2perl( $value->[1] );
301 __PACKAGE__->register_method(
302 api_name => 'opensrf.persist.object.peek',
303 method => 'shift_stack',
306 __PACKAGE__->register_method(
307 api_name => 'opensrf.persist.object.get',
308 method => 'shift_stack',