3cb1637b936e056ca0b43ce376114f7bbe7eb2bc
[angular-mojolicious.git] / couchdb-changes.pl
1 #!/usr/bin/perl
2
3 # http://wiki.apache.org/couchdb/HTTP_database_API#Changes
4
5 use warnings;
6 use strict;
7
8 use lib 'common/mojo/lib';
9
10 use Mojo::UserAgent;
11 use Mojo::JSON;
12
13 my $url = 'http://localhost:5984/monitor/_changes?feed=continuous;include_docs=true;since=';
14 my $seq = 0;
15
16 my $client = Mojo::UserAgent->new;
17 my $json   = Mojo::JSON->new;
18 my $error;
19
20 $client->keep_alive_timeout(90); # couchdb timeout is 60s
21
22 while( ! $error ) {
23
24         warn "GET $url$seq\n";
25         my $tx = $client->build_tx( GET => $url . $seq );
26         $tx->res->body(sub{
27                 my ( $content, $body ) = @_;
28
29                 warn "## BODY $body\n";
30
31                 if ( length($body) == 0 ) {
32                         warn "# empty chunk, heartbeat?\n";
33                         return;
34                 }
35
36                 foreach my $change ( split(/\r?\n/, $body) ) { # we can get multiple documents in one chunk
37
38                         my $data = $json->decode($change);
39
40                         if ( exists $data->{error} ) {
41                                 $error = $data;
42                         } elsif ( exists $data->{last_seq} ) {
43                                 $seq = $data->{last_seq};
44                         } elsif ( $data->{seq} <= $seq ) {
45                                 warn "# stale $body";
46                         } elsif ( exists $data->{changes} ) {
47
48                                 my $id  = $data->{id} || warn "no id?";
49                                 my $rev = $data->{changes}->[0]->{rev} || warn "no rev?";
50                                    $seq = $data->{seq} || warn "no seq?";
51
52                                 warn "# doc ", $json->encode( $data->{doc} ); # FIXME custom code here
53
54                         } else {
55                                 warn "UNKNOWN", $json->encode($data);
56                         }
57
58                 }
59
60         });
61         $client->start($tx);
62
63 }
64
65 die "ERROR ", $json->encode($error) if $error;