[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 メーリングリストの案内