Snap.Shot.cx

[前の記事] Squidのアクセスログにquery stringを含める

[アプリケーション] Kobo touchのKoboReader.sqliteを修復する
10/27/2013 14:16 (投稿者:たかの)

楽天のKobo touchを愛用して一年を過ぎた。バックライトの無いE Ink端末で手頃な商品を切望していたので、発表と同時に先行予約で購入した。
以後、通勤時間帯のtext/html/epubリーダとして活用して、おおむね満足していた。
タブレット端末全盛時代ではあるが、それでもE Ink専用端末を購入する理由としては、「安い」「軽い」「電池持ちが良い」「低機能」であることの4点を挙げておこう。

「安い」
僕が購入したのは、初代Kobo touch
発売当初の低下は7,980円だったけれども、予約購入ユーザに対して楽天ポイント3,000ポイントを還元するというキャンペーンを展開していて実質4,980円。
今だったら実売価格はもっと安い。1万円超のガジェットには手を出しづらい貧乏人でも、これなら手を出せる。

「軽い」
前述のとおり、一年以上前の旧世代商品なのだけど、それでも約190gと断トツに軽い。
最新のNexus7でも約290gあるらしいから、重さだけを追求すると、こっちのほうがまだ軽い。
厚みも薄めで、ある程度の強度もあるので、文庫本よりも気軽に持ち歩ける。

「電池持ちが良い」
カバンの中に入れたまま、1週間くらい充電せずスタンバイ状態で放置していても、ちゃんと使える。

「低機能」
今の職場は、ちょっとセキュリティ面で厳しいところがあって、個人PCの社内LAN接続は認められていない。もちろん各種資料やソースコードの事業所外への持ち出しも認められていない。
そんな事業場へ、通勤時私用でしか使わない目的で、高機能なタブレット端末を持ち込むのは躊躇する。もちろんKobo touchもUSB接続ストレージとして機能してしまうのであまり意味はないんだけど、低機能であることから、持ち込む際の心理的抵抗が少ない。


そんなこんなで、おおむね満足して利用していたのだけど、ある時から以下のような症状に悩まされるようになった。

・電源投入時、SDカードの認識までに数分待たされる
・PC接続時、USBストレージとして認識されるようになるまで数分待たされる。
calibre-ebook利用時に、端末のデータベースがmalformedであると警告され、電子書籍端末として認識されない
・KoboストアでダウンロードしたDRM書籍が、電源再投入後に未ダウンロード状態となってしまい、クラウドからの再ダウンロードを促されてしまう

おそらく何らかの理由でKobo touchの書籍DBが壊れて書き込めなくなっているせいだろうと想像はついたのだけど、時間を割けなくて放置していた。


ようやく少し調べてみると、書籍DBの内容は、USBストレージとして接続した際に

     D:\.kobo\KoboReader.sqlite

としてPCから参照できると知った。中身はsqlite3のデータベースファイルなので、sqlite3を扱えるアプリケーションなら中身を参照できるはず。
早速コピーを取って、PupSQLiteで開いてみたが、案の定、一部のテーブルを開こうとしても開けなくなっていた。

sqlite3データベースファイルの修復は、エクスポートしてインポートし直すだけでよいらしい。
なので早速、

     echo .dump | sqlite3 KoboReader.sqlite > kobodump.sql
     sqlite3 -init kobodump.sql newdb.sqlite
     ($はプロンプト)

としてインポートしなおしてみると、案の定、以下のようなエラーが大量に吐き出された。

     -- Loading resources from kobodump.sql
     Error: near line 5822: column ContentID is not unique
     Error: near line 5823: column ContentID is not unique
     Error: near line 14036: column ContentID is not unique
     ...(中略)...
     Error: near line 33755: columns volumeId, shortcoverId are not unique
     Error: near line 33756: columns volumeId, shortcoverId are not unique
     Error: near line 33757: columns volumeId, shortcoverId are not unique
     ...(以下略)

整合性のあるデータとして復旧させるのは困難を極めると予想。
なので、ある程度復旧できたらいいやと判断、不完全でも読み書き可能なDBを書き戻す方針で作業を続けることにした。

この作業は、Ubuntu 12.04 precise (32bit)のsqlite-3.7.9-2ubuntu1.1を使用したのだけど、ダンプ結果の末尾には

     ROLLBACK; -- due to errors

と記述されていて、上記の手順ではnewdb.sqliteが作成されなかった。
おそらくデータベース上の不備が認識されているため、あえて作成されないようにsqlite3がよきにはからってくれているように思うのだけど、不完全でもよいので作成してもらえないと困る。
なので末尾を

     COMMIT;

と変更し、再度インポートを実行。(この手順はSQLite3のバージョンによっては必要ないかもしれない)
PupSQLiteで開けることを確認して、Kobo touchに書き戻した。

以後、発生していた不具合は解消し、問題なく利用できるようになった模様。


KoboReader.sqliteが、そもそも何故壊れてしまったのかは不明なんだけど、そもそものsqliteの仕様として、トランザクションの途中で不慮の電源断やリセットが発生してしまった際の復旧処理が甘いんじゃないかなと思う。

以上、同様の現象で悩まされている方の参考になれば幸いです。

メールでコメント

(Powered by Zope)
リンクはご自由にどうぞ。各記事には記事番号がついていますので、URLは変わりません。
© 2000-2013 Yukimasa TAKANO, all RIGHTs reserved.