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