[mew-dist 28313] Re: "ki"

Hideyuki SHIRAI ( 白井秀行 ) shirai at example.com
2008年 4月 10日 (木) 17:28:29 JST


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

From: Kazu Yamamoto (山本和彦) <kazu at example.com> さん曰く
Subject: [mew-dist 28307] Re: "ki"
Message-ID: <20080408.174923.114585141.kazu at example.com>
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 at example.com)

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
 



Mew-dist メーリングリストの案内