File Coverage

blib/lib/DJabberd/Delivery/OfflineStorage/SQLite.pm
Criterion Covered Total %
statement 6 6 100.0
branch n/a
condition n/a
subroutine 2 2 100.0
pod n/a
total 8 8 100.0


line stmt bran cond sub pod time code
1             package DJabberd::Delivery::OfflineStorage::SQLite;
2 1     1   1032 use strict;
  1         2  
  1         44  
3 1     1   6 use base 'DJabberd::Delivery::OfflineStorage';
  1         2  
  1         667  
4             use warnings;
5             use DBI;
6              
7             use vars qw($VERSION);
8             $VERSION = '0.04';
9              
10             our $logger = DJabberd::Log->get_logger();
11              
12             sub set_config_database {
13             my ($self, $dbfile) = @_;
14             $self->{dbfile} = $dbfile;
15             }
16              
17             sub blocking { 1 };
18              
19             sub finalize {
20             my $self = shift;
21              
22             $logger->error_die("No 'Database' configured'") unless $self->{dbfile};
23              
24             my $dbh = DBI->connect_cached("dbi:SQLite:dbname=$self->{dbfile}","","",
25             { RaiseError => 1, PrintError => 0, AutoCommit => 1 });
26             $self->{dbh} = $dbh;
27             $self->check_install_schema;
28             $logger->info("Loaded SQLite OfflineStorage using file '$self->{dbfile}'");
29              
30             $self->SUPER::finalize;
31             }
32              
33              
34             sub load_offline_messages {
35             my ($self, $user) = @_;
36              
37             # collect packets for user
38             my @packets = ();
39             eval {
40             my $sth = $self->{dbh}->prepare("SELECT id, jid, timestamp, packet FROM offline WHERE jid=? ORDER BY id");
41             $sth->execute($user);
42             while (my $packet = $sth->fetchrow_hashref()){
43             push(@packets, $packet);
44             }
45             };
46             if ($@) {
47             $logger->warn("SELECT against user '$user' on dbfile '$self->{dbfile}' failed with: $@");
48             }
49             return \@packets;
50             }
51              
52              
53             sub delete_offline_message {
54             my ($self, $id) = @_;
55              
56             # delete packet by id
57             eval {
58             $self->{dbh}->do("DELETE FROM offline WHERE id=?", undef, $id);
59             };
60             if ($@) {
61             $logger->warn("DELETE for '$id' on dbfile '$self->{dbfile}' failed with: $@");
62             }
63             }
64              
65              
66             sub store_offline_message {
67             my ($self, $user, $packet) = @_;
68              
69             eval {
70             $self->{dbh}->do("INSERT INTO offline (jid, timestamp, packet) VALUES (?,datetime('now'),?)",
71             undef, $user, $packet);
72             };
73             if ($@) {
74             $logger->warn("INSERT for user '$user' on dbfile '$self->{dbfile}' failed with: $@");
75             }
76             }
77              
78             sub check_install_schema {
79             my $self = shift;
80             my $dbh = $self->{dbh};
81              
82             eval {
83             $dbh->do(qq{
84             CREATE TABLE offline (
85             id INTEGER PRIMARY KEY AUTOINCREMENT,
86             jid VARCHAR(255) NOT NULL,
87             timestamp VARCHAR(255) NOT NULL,
88             packet BLOB,
89             UNIQUE (jid, id)
90             )})
91             };
92             if ($@ && $@ !~ /table \w+ already exists/) {
93             $logger->logdie("SQL error $@");
94             }
95              
96             }
97              
98              
99             1;