[mew-dist 28117] Re: cmew.rb and smew.rb
Tomoyuki Murakami
tomoyuki at example.com
2008年 2月 23日 (土) 16:01:59 JST
>>> On Fri, 22 Feb 2008 22:29:16 +0900 (JST),
>>> Tomoyuki Murakami <tomoyuki at example.com> wrote:
tomoyuki> というのはちょっと嘘で、自分のテストスクリプトが動いただけでした
tomoyuki> cmewに対しては以下のパッチが必要でした。
tomoyuki> --- cmew.orig 2008-02-19 19:20:38.000000000 +0900
tomoyuki> +++ cmew 2008-02-22 22:23:57.000000000 +0900
tomoyuki> @@ -12,6 +12,7 @@
tomoyuki>
tomoyuki> require 'find'
tomoyuki> require 'mailread'
tomoyuki> +require 'time'
require 'time'はrequire 'sqlite3'で解決されているため不要のようで
した。申し訳ありません。
# 鯖落ちしている間に何しているんだか...
>>> On Fri, 22 Feb 2008 15:09:11 +0900 (JST),
>>> Kazu Yamamoto (山本和彦) <kazu at example.com> wrote:
kazu> > # というか本音を言うと、少々 DB がでかくなっても良いので、差分だ
kazu> > # けアップデートって出来ないのかなぁ。。。なのですが :-)
kazu>
kazu> 課題リストには入っておりまする。。。
課題リストに入っているということで、そのうち出来るとはおもいつつ、
時間があったのでちょっとやってみました。
・id.dbとのctimeを比較
・Refileに簡易対応
残課題
・ctimeのOS依存の問題
・強制的に作り直すオプションも要?
大量にtouch/renameしたときなど
-------------- next part --------------
--- cmew.orig 2008-02-23 15:08:23.000000000 +0900
+++ cmew 2008-02-23 15:41:23.000000000 +0900
@@ -19,10 +19,10 @@
##
def create_db(db_file)
- File.rename(db_file, db_file + '.old') if FileTest.exist?(db_file)
+ # File.rename(db_file, db_file + '.old') if FileTest.exist?(db_file)
db = SQLite3::Database.new(db_file)
- sql = 'CREATE TABLE mew(id TEXT, path TEXT, parid TEXT, date TEXT);'
+ sql = 'CREATE TABLE if not exists mew(id TEXT, path TEXT, parid TEXT, date TEXT);'
db.execute(sql)
db.transaction
return db
@@ -81,9 +81,12 @@
##
##
-def register(db, maildir, ignore_regex)
+def register(db, maildir, ignore_regex, last_mod)
Dir.chdir(maildir)
stmt = db.prepare('INSERT INTO mew VALUES(:id, :path, :parid, :date);')
+ stmt2 = db.prepare('select path from mew where id = ?')
+ stmt3 = db.prepare('delete from mew where id = ? and path = ?')
+ db.results_as_hash = true
Find.find('.') do |fpath|
next if fpath =~ ignore_regex
@@ -93,15 +96,28 @@
next
end
if FileTest.file?(fpath) and fpath =~ /\/[0-9]+(\.mew)?$/
+ next if last_mod > File.ctime(fpath).tv_sec
m = Mail.new(fpath)
id = get_id(m)
parid = get_parid(m)
date = get_date(m)
path = get_path(fpath)
+ if last_mod > 0
+ stmt2.execute!(id) do |row|
+ pp = row['path']
+ ## print "found ", pp, "\n"
+ unless File.exist?(pp)
+ ## print "delete ", pp, "\n"
+ stmt3.execute(id, pp)
+ end
+ end
+ end
stmt.execute('id' => id, 'path' => path, 'parid' => parid, 'date' => date)
end
end
stmt.close
+ stmt2.close
+ stmt3.close
end
################################################################
@@ -113,11 +129,16 @@
maildir = ARGV[1] || File.expand_path('~/Mail')
ignore_regex = Regexp.new(ARGV[2] || '^\./casket$|^\./casket/|/\.')
+last_mod = 0
+if FileTest.exist?(db_file)
+ last_mod = File.ctime(db_file).tv_sec
+end
db = create_db(db_file)
begin
- register(db, maildir, ignore_regex)
+ register(db, maildir, ignore_regex, last_mod)
db.commit
- db.execute('CREATE INDEX mew_id ON mew (id, parid);')
+ db.execute('CREATE INDEX if not exists mew_id ON mew (id, parid);')
+ db.execute('REINDEX mew_id')
ensure
db.close
end
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: 無し
型: application/pgp-signature
サイズ: 305 バイト
説明: 無し
URL: <http://www.mew.org/pipermail/mew-dist/attachments/20080223/508debdf/attachment.bin>
Mew-dist メーリングリストの案内