<span class="line"><span class="keyword">require</span> <span class="string">'sqlite3'</span></span>
<span class="line"><span class="keyword">begin</span></span>
<span class="line"> talker2name = {}</span>
<span class="line"> username2name = {}</span>
<span class="line"> db = <span class="constant">SQLite3::Database</span>.open <span class="string">'/tmp/decrypted_database.db'</span></span>
<span class="line"> db.results_as_hash = <span class="keyword">true</span></span>
<span class="line"> db.execute(<span class="string">'SELECT talker,displayName FROM fmessage_conversation'</span>).each {|row|</span>
<span class="line"> talker2name[row[<span class="string">'talker'</span>]] = row[<span class="string">'displayName'</span>]</span>
<span class="line"> }</span>
<span class="line"> db.execute(<span class="string">'SELECT username,nickname FROM rcontact'</span>).each {|row|</span>
<span class="line"> username = row[<span class="string">'username'</span>]</span>
<span class="line"> nickname = row[<span class="string">'nickname'</span>]</span>
<span class="line"> <span class="keyword">if</span> nickname != <span class="string">''</span></span>
<span class="line"> <span class="keyword">if</span> username =~ <span class="regexp">/@chatroom$/</span></span>
<span class="line"> talker2name[username] = nickname == <span class="string">''</span> ? username <span class="symbol">:</span> nickname</span>
<span class="line"> <span class="keyword">else</span></span>
<span class="line"> username2name[username] = nickname == <span class="string">''</span> ? username <span class="symbol">:</span> nickname</span>
<span class="line"> <span class="keyword">end</span></span>
<span class="line"> <span class="keyword">end</span></span>
<span class="line"> }</span>
<span class="line"> db.execute(<span class="string">'SELECT createTime,talker,content FROM message'</span>).each {|row|</span>
<span class="line"> time,talker,content = row.values_at <span class="string">'createTime'</span>,<span class="string">'talker'</span>,<span class="string">'content'</span></span>
<span class="line"> <span class="keyword">next</span> <span class="keyword">unless</span> content</span>
<span class="line"> <span class="keyword">if</span> talker =~ <span class="regexp">/@chatroom$/</span></span>
<span class="line"> content.sub!(<span class="regexp">/^(\w+):\n/</span>) {|x| <span class="string">"<span class="subst">#{username2name.fetch(<span class="variable">$1</span>,'xx')}</span>: "</span> }</span>
<span class="line"> <span class="keyword">end</span></span>
<span class="line"> <span class="comment">#next if content =~ /^~SEMI_XML~|</</span></span>
<span class="line"> <span class="keyword">next</span> <span class="keyword">if</span> content =~ <span class="regexp">/^~SEMI_XML~/</span></span>
<span class="line"> name = talker2name.fetch talker, talker</span>
<span class="line"> puts <span class="string">"<span class="subst">#{<span class="constant">Time</span>.at(time/<span class="number">1000</span>).strftime('%FT%R')}</span>\t<span class="subst">#{name}</span>\t<span class="subst">#{content}</span>"</span></span>
<span class="line"> }</span>
<span class="line"><span class="keyword">rescue</span> <span class="constant">SQLite3::Exception</span> => e</span>
<span class="line"> puts e</span>
<span class="line"><span class="keyword">ensure</span></span>
<span class="line"> db.close <span class="keyword">if</span> db</span>
<span class="line"><span class="keyword">end</span></span>