[1019] in BarnOwl Developers
[D-O-H] r1004 - in branches/barnowl_sqlite/owl: . perl/lib/BarnOwl/MessageList
daemon@ATHENA.MIT.EDU (nelhage@MIT.EDU)
Thu Oct 29 18:12:11 2009
Resent-From: nelhage@mit.edu
Resent-To: barnowl-dev-mtg@charon.mit.edu
X-Original-To: nelhage@nelhage.com
To: dirty-owl-hackers@MIT.EDU
From: nelhage@MIT.EDU
Reply-to: dirty-owl-hackers@MIT.EDU
Date: Tue, 1 Apr 2008 21:47:20 -0400 (EDT)
Author: nelhage
Date: 2008-04-01 21:47:20 -0400 (Tue, 01 Apr 2008)
New Revision: 1004
Modified:
branches/barnowl_sqlite/owl/perl/lib/BarnOwl/MessageList/SQL.pm
branches/barnowl_sqlite/owl/perlwrap.pm
Log:
Change the message list API slightly.
Modified: branches/barnowl_sqlite/owl/perl/lib/BarnOwl/MessageList/SQL.pm
===================================================================
--- branches/barnowl_sqlite/owl/perl/lib/BarnOwl/MessageList/SQL.pm 2008-04-02 01:47:17 UTC (rev 1003)
+++ branches/barnowl_sqlite/owl/perl/lib/BarnOwl/MessageList/SQL.pm 2008-04-02 01:47:20 UTC (rev 1004)
@@ -15,7 +15,7 @@
use base qw(Class::Accessor);
use DBIx::Simple;
-use SQL::Abstract;
+use SQL::Abstract::Limit;
use JSON;
use POSIX qw(ctime);
use Cache::Memory;
@@ -56,6 +56,7 @@
my ($dsn, $user, $pass) = load_dbconfig();
my $db = DBIx::Simple->new($dsn, $user, $pass,
{RaiseError => 1, AutoCommit => 1});
+ $db->abstract = SQL::Abstract::Limit->new(limit_dialect => $db->dbh);
my $cache = Cache::Memory->new(default_expires => '30 sec');
my $self = {db => $db, cache => $cache, deleted => {}};
bless($self, $class);
@@ -141,14 +142,23 @@
$msg->{$key} = $value;
}
-sub start_iterate {
+sub iterate_begin {
my $self = shift;
+ my $id = shift;
+ my $rev = shift;
+ my $dir = $rev ? '<=' : '>=';
+ my @where = $id >= 0 ? ('id', {$dir => $id}) : ();
+ my $order = $rev ? "DESC" : "ASC";
$self->msg_iter($self->db->select($MESSAGES, $message_fields,
- {expunged => 'false'}, [qw(id)]))
+ {expunged => 'false',
+ @where}, ["id $order"]))
or die("Unable to SELECT from messages: " . $self->db->error);
-
+
+ if(@where) {
+ $where[0] = 'message_id';
+ }
$self->attr_iter($self->db->select($ATTRS, $attr_fields,
- {}, [qw(message_id)]))
+ {@where}, ["message_id $order"]))
or die("Unable to SELECT from attrs: " . $self->db->error);
$self->attr_lookahead($self->attr_iter->fetch);
}
@@ -160,10 +170,7 @@
return undef unless $self->msg_iter;
my $next = $self->msg_iter->fetch;
unless($next) {
- $self->msg_iter->finish;
- $self->attr_iter->finish;
- $self->msg_iter(undef);
- $self->attr_iter(undef);
+ $self->iterate_done;
return undef;
}
load_base(\%msg, $next);
@@ -182,6 +189,18 @@
return $msg;
}
+sub iterate_done {
+ my $self = shift;
+ if($self->msg_iter) {
+ $self->msg_iter->finish;
+ $self->msg_iter(undef);
+ }
+ if($self->attr_iter) {
+ $self->attr_iter->finish;
+ $self->attr_iter(undef);
+ }
+}
+
sub get_by_id {
my $self = shift;
my $id = shift;
@@ -222,7 +241,7 @@
id => $msg->id,
msg_time => $msg->{_time},
protocol => $msg->type,
- body => $msg->body,
+ body => $msg->body || "",
direction => $msg->direction
})
or die($self->db->error);
@@ -232,7 +251,7 @@
$self->db->insert($ATTRS, {
message_id => $msg->id,
key => $k,
- value => $v
+ value => $v || ""
})
or die($self->db->error);
}
Modified: branches/barnowl_sqlite/owl/perlwrap.pm
===================================================================
--- branches/barnowl_sqlite/owl/perlwrap.pm 2008-04-02 01:47:17 UTC (rev 1003)
+++ branches/barnowl_sqlite/owl/perlwrap.pm 2008-04-02 01:47:20 UTC (rev 1004)
@@ -306,6 +306,24 @@
package BarnOwl::MessageList;
+sub binsearch {
+ my $list = shift;
+ my $val = shift;
+ my $key = shift || sub {return $_[0]};
+ my $left = 0;
+ my $right = scalar @{$list} - 1;
+ my $mid = $left;
+ while($left <= $right) {
+ $mid = ($left + $right)/2;
+ if($key->($list->[$mid]) < $val) {
+ $left = $mid + 1;
+ } else {
+ $right = $mid - 1;
+ }
+ }
+ return $mid;
+}
+
my $__next_id = 0;
sub next_id {
@@ -318,7 +336,7 @@
use BarnOwl::MessageList::SQL;
$ml = BarnOwl::MessageList::SQL->new;
};
-
+
if($@) {
push @BarnOwl::__startup_errors, "Unable to load SQL message list\n$@";
} else {
@@ -338,10 +356,18 @@
return scalar keys %{$self->{messages}};
}
-sub start_iterate {
+sub iterate_begin {
my $self = shift;
+ my $id = shift;
+ my $rev = shift;
$self->{keys} = [sort {$a <=> $b} keys %{$self->{messages}}];
- $self->{iterator} = 0;
+ if($id < 0) {
+ $self->{iterator} = scalar @{$self->{keys}} - 1;
+ } else {
+ $self->{iterator} = binsearch($self->{keys}, $id);
+ }
+
+ $self->{iterate_direction} = $rev ? -1 : 1;
}
sub iterate_next {
@@ -352,6 +378,10 @@
return $self->get_by_id($self->{keys}->[$self->{iterator}++]);
}
+sub iterate_done {
+ # nop
+}
+
sub get_by_id {
my $self = shift;
my $id = shift;
@@ -409,7 +439,7 @@
sub recalculate {
my $self = shift;
my $ml = BarnOwl::message_list();
- $ml->start_iterate;
+ $ml->iterate_begin(0, 0);
$self->{messages} = [];
while(my $msg = $ml->iterate_next) {
$self->consider_message($msg);
@@ -476,18 +506,7 @@
my $id = shift;
$self->{view} = $view;
my $list = $self->view->messages;
- my $left = 0;
- my $right = scalar @{$list} - 1;
- my $mid;
- while($left <= $right) {
- $mid = ($left + $right)/2;
- if($list->[$mid]->id < $id) {
- $left = $mid + 1;
- } else {
- $right = $mid - 1;
- }
- }
- $self->{index} = $mid;
+ $self->{index} = BarnOwl::MessageList::binsearch($list, $id, sub{shift->id});
}
sub clone {