[mew-dist 29475] Re: cmew sometimes stores id as blob

Kei Tsuji ktsujister at example.com
2012年 3月 26日 (月) 16:23:44 JST


丸山さん、

辻です。情報共有ありがとうございます。

From: Shinichi Maruyama <marya at example.com>
Subject: [mew-dist 29474] Re: cmew sometimes stores id as blob
Date: Mon, 26 Mar 2012 13:24:09 +0900

>       sqlite は、場合により型変換を行います。blob と null になる
> データを insert した例が載っています。
>
>       http://www.sqlite.org/datatype3.html
>
>       単純な text が blob になるかどうかは、すぐには見当たりません
> でした。今回の元となった、実際の例で試してみてはいかがでしょうか。

実際の例で試してみたところ、

1. sqlite3コマンドに

   % sqlite3 test.db "insert into mew(id) values ('<E2FF7BADA43AEA42BC4907B26603B75E0CBE5D at example.com>');"

というように実行してみても、textとしてinsertされました。

2. cmewのinsert近辺の要素を切り出して、test1.rbにて試してみましたが、こちらも
textとしてinsertされました。

3. もう少し変形して、test2.rbにて、実際のメールを指定してみたところ、以下の事実
が判明しました。

  3.1. message-idが途中で改行しているケース

Message-ID:
 <0123456789ABCDEF at example.com>

 => blob

  3.2. 通常の、message-idが途中で改行していないケース

Message-ID: <0123456789ABCDEF at example.com>

 => text

ただし、改行していても、idは、get_idでは、上記のどちらも
"<0123456789ABCDEF at example.com>"となっていて、改行などは含まれていません。

rubyにて、id.classはstringになっているので、何故このような違いが出てしまうのか、
引き続き調べてみます。

-- 
ktsuji
-------------- next part --------------
添付メールを保管しました...
送信者: <test at example.com>
件名:   test
日付:   Fri, 23 Mar 2012 18:05:06 +0000
サイズ: 235 バイト
URL:    <http://www.mew.org/pipermail/mew-dist/attachments/20120326/6010b474/attachment.mht>
-------------- next part --------------
#!/usr/bin/env ruby

require 'sqlite3'

# "insert into mew(id) values ('<0123456789ABCDEF0123456789ABCDEF012345 at example.com>');"
def test_insert
  db = SQLite3::Database.new("test.db")
  db.transaction
  id = "<0123456789ABCDEF0123456789ABCDEF012345 at example.com>"
  add_entry = db.prepare('INSERT INTO mew(id) VALUES(:id);')
  begin
    add_entry.execute('id' => id)
  ensure
    add_entry.close
  end
  db.commit
end

test_insert
-------------- next part --------------
#!/usr/bin/env ruby

require 'sqlite3'
require 'pp'
require 'logger'


# "insert into mew(id) values ('<0123456789ABCDEF0123456789ABCDEF012345 at example.com>');"
def test_insert(id)
  db = SQLite3::Database.new("test.db")
  db.transaction
  #id = "<0123456789ABCDEF0123456789ABCDEF012345 at example.com>"
  add_entry = db.prepare('INSERT INTO mew(id) VALUES(:id);')
  begin
    $log.info "id: #{id}, id.class: #{id.class}"
    add_entry.execute('id' => id)
  ensure
    add_entry.close
  end
  db.commit
end

def mail_header(path)
  @header = {}
  value = nil
  File.open(path) do |f|
    while l = f.gets.chomp
      next if /^From / =~ l
      break if /^$/ =~ l
      if /^\s+/ !~ l
        (name, value) = l.split(/:\s*/, 2)
        value = '' if value.nil?
        @header[name.downcase] = value
      else
        value << $'
      end
    end
  end
  return @header
end

def check_id(id)
  return nil if id == nil
  if id =~ /\A<[-a-zA-Z0-9!#\$%&\'\*\+\/=\?\^_`{}|~\.@]+>\z/
    return id
  else
    return nil
  end
end

def get_id(msg)
  return check_id(msg['message-id'])
end

$log = Logger.new(STDERR)
begin
  path = ARGV[0]
  $header = mail_header(path)
  pp $header
  id = get_id($header)
  pp "id: '#{id}', class: #{id.class}"
  test_insert(id)
rescue => ex
  $log.fatal ex
end


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