2008年4月10日

[mew-dist 28313] Re: "ki"

日夜 cmew のチェックに勤しんでいる白井です。(うそ)

From: Kazu Yamamoto (山本和彦) <kazu@xxxxx> さん曰く
Subject: [mew-dist 28307] Re: "ki"
Message-ID: <20080408.174923.114585141.kazu@xxxxx>
Date: Tue, 08 Apr 2008 17:49:23 +0900 (JST)

> 山本です。

>
> > "ki" で、1つのフォルダに対して ID データベース更新すると、タイムスタン
> > プが変わってしまいます。なので、次に "kI" で全体を更新しようとすると、
> > 間違いますね。orz
> >
> > "ki" では、タイムスタンプの更新を止めましょうか?
>
> やりました。

cmew 関係で何点かまとめて報告&パッチです。

(1) ki(target付き) のときのデータベースタイムスタンプ

これ、どうやら NG のようです。

一度 ki をしたあとに target なしで cmew を動かすと、すべてのフォ
ルダ/ファイルに対してデータベースを作り直しています。

=> SQLite がわからないのだけど、同じタイムスタンプ(last_mod)を
登録すれば大丈夫。理由は聞かないでね。

また、このとき元の DB にすでに登録されていても二重に登録され
るので、どんどん DB が太っていきます。使用前:50MB、何回か使用
後:100MB という感じです。

=> 登録済みに path が同じものがあったら登録をしなければ OK。
target 付きの場合にも有効。


(2) cmew の複数起動
ki はお気楽に動かせるので、ついつい cmew が動いているのに何度も
動かして DB をぶっ壊してしまうので、ガードをかけた方がよいでしょ
う。

=> cmew 起動時に id.db.new があったら exit。
なんらかのエラーで id.db.new が残ったままのときは手動削除でよ
いかな。


(3) ki/kI のときの終了メッセージ
折角なので、cmew が終了時したときに DB が更新されたメッセージの
数ぐらい出した方が便利。

=> ちょっと手抜きだけどつくった。正常終了と複数起動エラーのメッ
セージはちゃんと拾えたけど、あとのエラーはわかんない。


という『=>』部分のパッチを付けておきます。

--
白井秀行 (mailto:shirai@xxxxx)

Index: mew-search.el
===================================================================
RCS file: /cvsmew/mew/mew-search.el,v
retrieving revision 1.84
diff -u -r1.84 mew-search.el
--- mew-search.el 7 Apr 2008 08:31:40 -0000 1.84
+++ mew-search.el 10 Apr 2008 08:23:34 -0000
@@ -738,9 +738,11 @@
(mew-path-to-folder
(mew-expand-folder (mew-summary-folder-name 'ext)))))
(options (list dbfile path regex target))
+ (buf (generate-new-buffer (concat mew-buffer-prefix "cmew")))
pro)
(message "Updating ID database...")
- (setq pro (apply 'start-process "cmew" nil mew-prog-cmew options))
+ (setq pro (apply 'start-process "cmew" buf mew-prog-cmew options))
+ (set-process-filter pro 'mew-summary-make-id-index-filter)
(set-process-sentinel pro 'mew-summary-make-id-index-sentinel))))))

(defun mew-summary-make-id-index-all (&optional full-update)
@@ -753,14 +755,30 @@
(let* ((dbfile (expand-file-name mew-id-db-file mew-mail-path))
(path (expand-file-name mew-mail-path))
(options (list dbfile path mew-id-db-ignore-regex))
+ (buf (generate-new-buffer (concat mew-buffer-prefix "cmew")))
pro)
(if full-update (setq options (cons "-f" options)))
(message "Updating ID database...")
- (setq pro (apply 'start-process "cmew" nil mew-prog-cmew options))
+ (setq pro (apply 'start-process "cmew" buf mew-prog-cmew options))
+ (set-process-filter pro 'mew-summary-make-id-index-filter)
(set-process-sentinel pro 'mew-summary-make-id-index-sentinel))))

+(defun mew-summary-make-id-index-filter (process string)
+ (save-excursion
+ (mew-filter
+ (goto-char (point-max))
+ (insert string))))
+
(defun mew-summary-make-id-index-sentinel (process event)
- (message "Updating ID database...done"))
+ (save-excursion
+ (mew-filter
+ (let (str)
+ (goto-char (point-max))
+ (forward-line -1)
+ (setq str (mew-buffer-substring (line-beginning-position)
+ (line-end-position)))
+ (mew-remove-buffer pbuf)
+ (message "Updating ID database...done (%s)" str)))))

(provide 'mew-search)

Index: bin/cmew
===================================================================
RCS file: /cvsmew/mew/bin/cmew,v
retrieving revision 1.16
diff -u -r1.16 cmew
--- bin/cmew 8 Apr 2008 07:26:30 -0000 1.16
+++ bin/cmew 10 Apr 2008 08:23:34 -0000
@@ -22,13 +22,17 @@

def open_db(db_file, fullupdate)
db_new_file = db_file + '.new'
+
if fullupdate == true
File.unlink(db_file, db_new_file) if FileTest.exist?(db_new_file)
+ elsif FileTest.exist?(db_new_file)
+ print "Error: another cmew running.\n"
+ exit
else
FileUtils.copy_file(db_file, db_new_file) if FileTest.exist?(db_file)
end

- db = SQLite3::Database.new(db_file + '.new')
+ db = SQLite3::Database.new(db_new_file)
db.results_as_hash = true
sql = 'CREATE TABLE IF NOT EXISTS mew(id TEXT, path TEXT, parid TEXT, date TEXT);'
db.execute(sql)
@@ -156,6 +160,7 @@
parid = get_parid(m)
date = get_date(m)
path = get_path(fpath)
+ newpath = true
if last_mod > 0
get_entry.execute!(id) do |row|
past_path = row['path']
@@ -163,10 +168,13 @@
del_entry.execute(id, past_path)
deleted = deleted + 1
end
+ newpath = nil if path == past_path
end
end
- add_entry.execute('id' => id, 'path' => path, 'parid' => parid, 'date' => date)
- registred = registred + 1
+ if newpath
+ add_entry.execute('id' => id, 'path' => path, 'parid' => parid, 'date' => date)
+ registred = registred + 1
+ end
# next
end
end
@@ -214,7 +222,11 @@
db.execute('CREATE INDEX IF NOT EXISTS mew_id ON mew (id, parid);')
db.execute('REINDEX mew_id;')
ensure
- set_ctime(db, curr_mod) if ctime_save
+ if ctime_save
+ set_ctime(db, curr_mod)
+ else
+ set_ctime(db, last_mod)
+ end
close_db(db_file, db)
end

投稿者 xml-rpc : 2008年4月10日 17:28
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/71976
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。