AnyMongo
view release on metacpan or search on metacpan
lib/AnyMongo/Cursor.pm view on Meta::CPAN
package AnyMongo::Cursor;
BEGIN {
$AnyMongo::Cursor::VERSION = '0.03';
}
#ABSTRACT: A asynchronous cursor/iterator for Mongo query results
use strict;
use warnings;
use namespace::autoclean;
use boolean;
use Tie::IxHash;
use AnyMongo::MongoSupport;
use Any::Moose;
use Carp qw(croak confess);
$AnyMongo::Cursor::slave_okay = 0;
$AnyMongo::Cursor::timeout = 30000;
has _connection => (
is => 'ro',
isa => 'AnyMongo::Connection',
required => 1,
);
has _socket_handle => (
isa => 'Maybe[AnyEvent::Handle]',
is => 'rw',
lazy_build => 1,
);
sub _build__socket_handle {
my ($self) = @_;
$self->_connection->master_handle;
}
has tailable => (
is => 'rw',
isa => 'Bool',
required => 0,
default => 0,
);
has batch_size => (
is => 'rw',
isa => 'Int',
required => 1,
default => 0,
);
has _ns => (
is => 'ro',
isa => 'Str',
required => 1,
);
has _query => (
is => 'rw',
required => 1,
);
has _fields => (
is => 'rw',
isa => 'HashRef',
required => 0,
);
lib/AnyMongo/Cursor.pm view on Meta::CPAN
$self->{cursor_id} = $cursor_id;
push @{$self->{_result_cache}},@{$result} if $result;
$self->{number_received} = $number_received;
$self->{cursor_id} = $cursor_id;
$self->{query_run} = 1;
$self->close_cursor_if_query_complete;
}
sub close_cursor_if_query_complete {
my ($self) = @_;
# warn "#close_cursor_if_query_complete ...\n" if $self->_print_debug;
$self->close if $self->_limit >0 && $self->{number_received} >= $self->_limit;
}
sub num_remaining {
my ($self) = @_;
# warn "#num_remaining ...\n" if $self->_print_debug;
$self->refill_via_get_more if @{$self->{_result_cache}} == 0;
return scalar @{$self->{_result_cache}};
}
sub close {
my ($self) = @_;
# warn "#close ...\n" if $self->_print_debug;
$self->kill_cursor if $self->{cursor_id};
$self->{cursor_id} = 0;
$self->{closed} = 1;
$self->{at} = 0;
}
sub kill_cursor {
my ($self) = @_;
# warn "#kill_cursor ...\n" if $self->_print_debug;
return unless $self->{cursor_id};
my $message = AnyMongo::MongoSupport::build_kill_cursor_message($self->_next_request_id,$self->{cursor_id});
$self->_connection->send_message($message,$self->_socket_handle);
$self->{cursor_id} = 0;
}
sub _check_modifiable {
my ($self) = @_;
confess 'Cannot modify the query once it has been run or closed.'
if $self->{query_run} || $self->{closed};
}
sub _next_request_id {
my ($self) = @_;
$self->_request_id(AnyMongo::MongoSupport::make_request_id());
$self->_request_id;
}
__PACKAGE__->meta->make_immutable;
1;
=pod
=head1 NAME
AnyMongo::Cursor - A asynchronous cursor/iterator for Mongo query results
=head1 VERSION
version 0.03
=head1 SYNOPSIS
=head1 DESCRIPTION
=head1 AUTHORS
=over 4
=item *
Pan Fan(nightsailer) <nightsailer at gmail.com>
=item *
Kristina Chodorow <kristina at 10gen.com>
=back
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2010 by Pan Fan(nightsailer).
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
__END__
( run in 0.803 second using v1.01-cache-2.11-cpan-39bf76dae61 )