ブックマークをサルベージした件 @Firefox


これの最中にミスって、直近でブックマークしたやつが消えちまってるのに気が付いた。

ブックマークの自動保存されたやつで戻すという手はある(保存期間の15日間には入ってる)のだけれど、moz_places を直接いじったりしてるので、ちょっと不安がある。

幸いにして、ブックマークツールバーの表示が消えてしまった直後の places.sqlite は取ってあったので、そこからサルベージしたよ、というお話。

最近、ブックマークした URL を抽出する

moz_bookmarks.dateAdded は、unix でよく使われる 1970年1月1日からの相対時刻。単位はマイクロ秒。

一方、SQLite には時刻型がないけれど、時刻を扱う関数が用意されている。
相対時刻で使えそうなのがこれ。

A time string can be in any of the following formats:
  ...
 12. DDDDDDDDDD
  ...
Format 12 is the Julian day number expressed as a floating point value.

SQLite Query Language: Date And Time Functions

Julian day number というのは、紀元前4713年1月1日からの相対日らしい。
Unix 時刻への換算式がこちら。

Unix Time
(JD - 2440587.5) × 86400

Julian day - Wikipedia, the free encyclopedia

例えば、2月25日以降を絞り込む条件はこう書ける。

  strftime('%Y-%m-%d',dateAdded/1000/1000/86400+2440587.5) >= '2016-02-25'

moz_bookmarks だけだと URL が分からないので、moz_places と join する。

select * from moz_bookmarks
    left join moz_places on moz_bookmarks.fk = moz_places.id
    where strftime('%Y-%m-%d',dateAdded/1000/1000/86400+2440587.5) >= '2016-02-25'
    order by dateAdded desc

DB Browser for SQLite で 上記の SQL を実行。
うん、こんな感じ :-)

ブックマークの復元

後は手作業。

復元に必要な列だけに絞り込む。

select
    strftime('%Y-%m-%d %H:%M',dateAdded/1000.0/1000/86400+2440587.5) as DATE,
    moz_bookmarks.title,
    moz_places.url
    from moz_bookmarks
    left join moz_places on moz_bookmarks.fk = moz_places.id
    where strftime('%Y-%m-%d',dateAdded/1000/1000/86400+2440587.5) >= '2016-02-25'
    order by dateAdded desc

この結果とブックマークを見比べて、ブックマークされていないものを Firefox でアクセスしてブックマーク。

フォルダ階層も何とか追える。
moz_bookmarks.parent は moz_bookmarks.id を指している。
moz_bookmarks.type = 2 がフォルダか。

Excel へエクスポート

DB Browser for SQLite の「Execute SQL」タブで実行した結果は、メッセージ領域の右側にあるアイコンから「Export to CSV」で、CSV ファイルに保存できる。

Excel の日時は、1900年1月0日からの相対日(浮動小数点)。
moz_bookmarks.dateAdded の値は、マイクロ秒を日に換算して、1970-1-1 と 1900-1-0 の差分を足してあげると、Excel で登録日付が分かる。

=I2/1000/1000/60/60/24+25569

「セルの書式設定」の「表示形式」から、日時を表すような "yyyy/m/d hh:mm" なんかを指定。

前にも書いたけど

やはり、プロファイルのバックアップは取っておくべき。