[1019] in BarnOwl Developers

home help back first fref pref prev next nref lref last post

[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 {


home help back first fref pref prev next nref lref last post