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