File Coverage

blib/lib/Deeme/Backend/Mango.pm
Criterion Covered Total %
statement 12 62 19.3
branch 0 16 0.0
condition 0 6 0.0
subroutine 4 13 30.7
pod 1 9 11.1
total 17 106 16.0


line stmt bran cond sub pod time code
1             package Deeme::Backend::Mango;
2              
3             our $VERSION = '0.02';
4 2     2   19268 use Deeme::Obj 'Deeme::Backend';
  2         5  
  2         15  
5 2     2   3891 use Mango;
  2         523911  
  2         24  
6 2     2   1916 use Deeme::Utils qw(_serialize _deserialize);
  2         685  
  2         119  
7 2     2   13 use Carp 'croak';
  2         4  
  2         1602  
8              
9             #use Carp::Always;
10             has [qw(host database)];
11              
12             sub new {
13 0     0 1   my $self = shift;
14 0           $self = $self->SUPER::new(@_);
15 0 0         croak "No connection string defined, host option missing"
16             if ( !$self->host );
17 0 0         croak "No database string defined, database option missing"
18             if ( !$self->database );
19 0           return $self;
20             }
21              
22             sub mango {
23 0     0 0   my $self = shift;
24 0           return Mango->new( $self->host )->db( $self->database );
25             }
26              
27             sub events_get {
28 0     0 0   my $self = shift;
29 0           my $name = shift;
30 0   0       my $deserialize = shift // 1;
31 0           my $event
32             = $self->mango->collection("Event")->find_one( { name => $name } );
33              
34             #deserializing subs and returning a reference
35 0 0         return undef if ( !$event );
36 0 0         return [ map { _deserialize($_) } @{ $event->{functions} } ]
  0            
  0            
37             if ( $deserialize == 1 );
38 0           return $event->{functions};
39             } #get events
40              
41             sub events_reset {
42 0     0 0   my $self = shift;
43 0           $self->mango->collection("Event")->remove( {} );
44             }
45              
46             sub events_onces {
47 0     0 0   my $self = shift;
48 0           my $name = shift;
49 0           my $event
50             = $self->mango->collection("Event")->find_one( { name => $name } );
51              
52             #deserializing subs and returning a reference
53 0           return @{ $event->{onces} };
  0            
54             } #get events
55              
56             sub once_update {
57 0     0 0   my $self = shift;
58 0           my $name = shift;
59 0           my $onces = shift;
60 0           $self->mango->collection("Event")
61             ->update( { name => $name }, { '$set' => { onces => $onces } } );
62             } #get events
63              
64             sub event_add {
65 0     0 0   my $self = shift;
66 0           my $name = shift;
67 0           my $cb = shift;
68 0   0       my $once = shift // 0;
69 0           $cb = _serialize($cb);
70 0 0         return $cb
71             if ( $self->mango->collection("Event")
72             ->find_one( { name => $name, functions => $cb } ) )
73             ; #return if already existing
74             # serializing sub and adding to db
75 0 0         if ( my $event
76             = $self->mango->collection("Event")->find_one( { name => $name } ) )
77             {
78 0           $self->mango->collection("Event")->update( { name => $name },
79             { '$push' => { onces => $once, functions => $cb } } );
80             }
81             else {
82 0           my $event = $self->mango->collection("Event")->insert(
83             { name => $name,
84             functions => [$cb],
85             onces => [$once]
86             }
87             );
88             }
89 0           return $cb;
90             }
91              
92             sub event_delete {
93 0     0 0   my $self = shift;
94 0           my $name = shift;
95 0           $self->mango->collection("Event")->remove( { name => $name } );
96             } #delete event
97              
98             sub event_update {
99 0     0 0   my $self = shift;
100 0           my $name = shift;
101 0           my $functions = shift;
102 0   0       my $serialize = shift // 1;
103 0 0         return $self->event_delete($name) if ( scalar( @{$functions} ) == 0 );
  0            
104 0           return $self->mango->collection("Event")->update(
105             { name => $name },
106             { '$set' =>
107 0 0         { functions => [ map { _serialize($_) } @{$functions} ] }
  0            
108             }
109             ) if ( $serialize == 1 );
110 0           $self->mango->collection("Event")->update( { name => $name },
111             { '$set' => { functions => $functions } } );
112             } #update event
113              
114             1;
115             __END__
116              
117             =encoding utf-8
118              
119             =head1 NAME
120              
121             Deeme::Backend::Mango - MongoDB Backend using Mango for Deeme
122              
123             =head1 SYNOPSIS
124              
125             use Deeme::Backend::Mango;
126             my $e = Deeme->new( backend => Deeme::Backend::Mango->new(
127             database => "deeme",
128             host => "mongodb://user:pass@localhost:27017",
129             ) );
130              
131             =head1 DESCRIPTION
132              
133             Deeme::Backend::Mango is a MongoDB Deeme database backend using Mango.
134              
135             =head1 AUTHOR
136              
137             mudler E<lt>mudler@dark-lab.netE<gt>
138              
139             =head1 COPYRIGHT
140              
141             Copyright 2014- mudler
142              
143             =head1 LICENSE
144              
145             This library is free software; you can redistribute it and/or modify
146             it under the same terms as Perl itself.
147              
148             =head1 SEE ALSO
149              
150             L<Deeme>
151              
152             =cut