2012年3月26日

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

丸山さん、

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

From: Shinichi Maruyama <marya@xxxxx>
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@xxxxx>');"

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

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

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

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

Message-ID:
<0123456789ABCDEF@xxxxx>

=> blob

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

Message-ID: <0123456789ABCDEF@xxxxx>

=> text

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

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

--
ktsuji

----Next_Part(Mon_Mar_26_16_23_44_2012_344)--
Content-Type: Message/Rfc822
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Message-ID: <0123456789ABCDEF@xxxxx>
MIME-Version: 1.0
Subject: test
From: <test@xxxxx>
To: <ktsuji@xxxxx>
Date: Fri, 23 Mar 2012 18:05:06 +0000

Hello,

this is a test.

Thanks!

----Next_Part(Mon_Mar_26_16_23_44_2012_344)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="test1.rb"

#!/usr/bin/env ruby

require 'sqlite3'

# "insert into mew(id) values ('<0123456789ABCDEF0123456789ABCDEF012345@xxxxx>');"
def test_insert
db = SQLite3::Database.new("test.db")
db.transaction
id = "<0123456789ABCDEF0123456789ABCDEF012345@xxxxx>"
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(Mon_Mar_26_16_23_44_2012_344)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="test2.rb"

#!/usr/bin/env ruby

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


# "insert into mew(id) values ('<0123456789ABCDEF0123456789ABCDEF012345@xxxxx>');"
def test_insert(id)
db = SQLite3::Database.new("test.db")
db.transaction
#id = "<0123456789ABCDEF0123456789ABCDEF012345@xxxxx>"
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

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




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