mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-12-22 09:24:54 +01:00
vim: refactor database handling
To minimize memory usage we need to destroy the queries and the databases, so we should keep track of them. Each buffer gets a database connection that is destroyed when the buffer is destroyed, and all the queries along with it. Ideally notmuch should destroy the queries when the database is destroyed, but it's not doing that at the moment. Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
This commit is contained in:
parent
47e1f39c56
commit
85b3dc9f0f
1 changed files with 72 additions and 53 deletions
|
@ -80,6 +80,7 @@ function! s:new_file_buffer(type, fname)
|
|||
exec printf('edit %s', a:fname)
|
||||
execute printf('set filetype=notmuch-%s', a:type)
|
||||
execute printf('set syntax=notmuch-%s', a:type)
|
||||
ruby $curbuf.init(VIM::evaluate('a:type'))
|
||||
ruby $buf_queue.push($curbuf.number)
|
||||
endfunction
|
||||
|
||||
|
@ -195,6 +196,7 @@ function! s:search_search_prompt()
|
|||
setlocal modifiable
|
||||
ruby << EOF
|
||||
$cur_search = VIM::evaluate('text')
|
||||
$curbuf.reopen
|
||||
search_render($cur_search)
|
||||
EOF
|
||||
setlocal nomodifiable
|
||||
|
@ -206,6 +208,7 @@ endfunction
|
|||
|
||||
function! s:search_refresh()
|
||||
setlocal modifiable
|
||||
ruby $curbuf.reopen
|
||||
ruby search_render($cur_search)
|
||||
setlocal nomodifiable
|
||||
endfunction
|
||||
|
@ -227,6 +230,7 @@ endfunction
|
|||
|
||||
function! s:folders_refresh()
|
||||
setlocal modifiable
|
||||
ruby $curbuf.reopen
|
||||
ruby folders_render()
|
||||
setlocal nomodifiable
|
||||
endfunction
|
||||
|
@ -254,6 +258,7 @@ function! s:show_next_thread()
|
|||
endfunction
|
||||
|
||||
function! s:kill_this_buffer()
|
||||
ruby $curbuf.close
|
||||
bdelete!
|
||||
ruby << EOF
|
||||
$buf_queue.pop
|
||||
|
@ -276,6 +281,7 @@ function! s:new_buffer(type)
|
|||
keepjumps 0d
|
||||
execute printf('set filetype=notmuch-%s', a:type)
|
||||
execute printf('set syntax=notmuch-%s', a:type)
|
||||
ruby $curbuf.init(VIM::evaluate('a:type'))
|
||||
ruby $buf_queue.push($curbuf.number)
|
||||
endfunction
|
||||
|
||||
|
@ -295,8 +301,7 @@ ruby << EOF
|
|||
$cur_thread = thread_id
|
||||
$messages.clear
|
||||
$curbuf.render do |b|
|
||||
do_read do |db|
|
||||
q = db.query(get_cur_view)
|
||||
q = $curbuf.query(get_cur_view)
|
||||
q.sort = 0
|
||||
msgs = q.search_messages
|
||||
msgs.each do |msg|
|
||||
|
@ -322,7 +327,6 @@ ruby << EOF
|
|||
end
|
||||
b.delete(b.count)
|
||||
end
|
||||
end
|
||||
$messages.each_with_index do |msg, i|
|
||||
VIM::command("syntax region nmShowMsg#{i}Desc start='\\%%%il' end='\\%%%il' contains=@nmShowMsgDesc" % [msg.start, msg.start + 1])
|
||||
VIM::command("syntax region nmShowMsg#{i}Head start='\\%%%il' end='\\%%%il' contains=@nmShowMsgHead" % [msg.start + 1, msg.body_start])
|
||||
|
@ -469,24 +473,6 @@ ruby << EOF
|
|||
end
|
||||
end
|
||||
|
||||
def do_write
|
||||
db = Notmuch::Database.new($db_name, :mode => Notmuch::MODE_READ_WRITE)
|
||||
begin
|
||||
yield db
|
||||
ensure
|
||||
db.close
|
||||
end
|
||||
end
|
||||
|
||||
def do_read
|
||||
db = Notmuch::Database.new($db_name)
|
||||
begin
|
||||
yield db
|
||||
ensure
|
||||
db.close
|
||||
end
|
||||
end
|
||||
|
||||
def open_reply(orig)
|
||||
help_lines = [
|
||||
'Notmuch-Help: Type in your message here; to help you use these bindings:',
|
||||
|
@ -559,21 +545,18 @@ ruby << EOF
|
|||
folders = VIM::evaluate('g:notmuch_rb_folders')
|
||||
count_threads = VIM::evaluate('g:notmuch_rb_folders_count_threads')
|
||||
$searches.clear
|
||||
do_read do |db|
|
||||
folders.each do |name, search|
|
||||
q = db.query(search)
|
||||
q = $curbuf.query(search)
|
||||
$searches << search
|
||||
count = count_threads ? q.search_threads.count : q.search_messages.count
|
||||
b << "%9d %-20s (%s)" % [count, name, search]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def search_render(search)
|
||||
date_fmt = VIM::evaluate('g:notmuch_rb_date_format')
|
||||
db = Notmuch::Database.new($db_name)
|
||||
q = db.query(search)
|
||||
q = $curbuf.query(search)
|
||||
$threads.clear
|
||||
t = q.search_threads
|
||||
|
||||
|
@ -593,7 +576,7 @@ ruby << EOF
|
|||
end
|
||||
|
||||
def do_tag(filter, tags)
|
||||
do_write do |db|
|
||||
$curbuf.do_write do |db|
|
||||
q = db.query(filter)
|
||||
q.search_messages.each do |e|
|
||||
e.freeze
|
||||
|
@ -610,6 +593,40 @@ ruby << EOF
|
|||
e.thaw
|
||||
e.tags_to_maildir_flags
|
||||
end
|
||||
q.destroy!
|
||||
end
|
||||
end
|
||||
|
||||
module DbHelper
|
||||
def init(name)
|
||||
@name = name
|
||||
@db = Notmuch::Database.new($db_name)
|
||||
@queries = []
|
||||
end
|
||||
|
||||
def query(*args)
|
||||
q = @db.query(*args)
|
||||
@queries << q
|
||||
q
|
||||
end
|
||||
|
||||
def close
|
||||
@queries.delete_if { |q| ! q.destroy! }
|
||||
@db.close
|
||||
end
|
||||
|
||||
def reopen
|
||||
close if @db
|
||||
@db = Notmuch::Database.new($db_name)
|
||||
end
|
||||
|
||||
def do_write
|
||||
db = Notmuch::Database.new($db_name, :mode => Notmuch::MODE_READ_WRITE)
|
||||
begin
|
||||
yield db
|
||||
ensure
|
||||
db.close
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -658,6 +675,8 @@ ruby << EOF
|
|||
end
|
||||
|
||||
class VIM::Buffer
|
||||
include DbHelper
|
||||
|
||||
def <<(a)
|
||||
append(count(), a)
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue