◆ Chrome の開発機能使えばブックマーク情報を SQL で検索できます
◆ タグ情報のテーブルが空なので自分でデータを入れてみます 

前にはてブの拡張機能のバグのせいでコードみたり websql で全ブックマーク情報がローカルで持ってると知ったりでちょっと興味出たのでもう少し見てました

はてブ拡張機能

websql が使えると Resources タブの Web SQL 項目が↓みたいに開きます

hatena-websql2

WebSQL ってただの SQLite なので 「hatenabookmark-XXX」 が DB で 「bookmarks」 と 「tags」 がテーブルです
XXX のところにユーザのアカウント名が入っています

bookmarks テーブルには自分が登録したものが コメントや登録した時刻なども含めて保存されています
ですが tags の方のテーブルを見ると上の画像のように空です
タグ自体はいっぱいつけてるので この拡張機能が作りかけで放置なようです

chrome で SQL 直接実行できる

ところで Chrome で SQL を直接実行できました
前に拡張機能の不具合でデータを全部消そうとしたときは直接 SQL 打ってもエラーで使えないものかと思いましたが 今ためしてみると普通に動きました
構文に間違いあるはずないような基本の SELECT 文でもエラーだったので諦めたのですが 拡張機能自体がエラーになってる状況でしたし何か別の原因があったのかもです

結果は console.table のように綺麗な表で表示されています

使われてない tags テーブルを勝手に完成させる

Chrome で SQL を手軽に使えるとわかれば 便利な検索もできそうですしなにかやってみたくなります
特に公式サイトのタグ一覧だとタグが 3000 件までしか出ない仕様だったりしますし できることが限られてます

ただ せっかく 直接 SQL で検索できると言ってもタグ情報が入ってないので 3000 件以上のタグ見るというのはできないです


そこで


勝手に tags テーブルを完成させてしまいます


さっきの上の画像の下半分には 定義済みテーブルやインデックスの情報を表示しています
tags には id, bookmark_id, name の 3 つのカラムがあるとわかります

空テーブルだと table is empty とだけ書かれていて 列のヘッダーすら表示されないのでこうしないとカラム情報はわからないと思います


テーブルに入れる情報はわかりました
はてブのタグはコメントの最初の連続する [] の中身の 1 つ 1 つです
あとは 自分でパースして取り出したタグとそのブックマークの ID と一緒に tags テーブルに登録するだけです


function pickTags(comm){
var tagstr = comm.match(/^(\[.*?\])*/).shift()
return tagstr.slice(1, -1).split("][")
}

var dbname = "hatenabookmark-XXXXX"
var db = openDatabase(dbname, '1.0', dbname, 50 * 1024 * 1024)
read(write)

function read(cb){
var result
db.readTransaction(function(tr){
tr.executeSql("SELECT id, comment FROM bookmarks", [], function(tr, res){
result = [].map.call(res.rows, function(row){
return {
tags: pickTags(row.comment),
id: row.id
}
})
}, function(tr, err){
console.log("sql error", err)
})
}, function(err){
console.log("transaction error", err)
}, function(){
console.log("read done")
cb && cb(result)
})
}

function write(data, cb){
db.transaction(function(tr){
data.forEach(function(e){
e.tags.forEach(function(tag){
tr.executeSql("INSERT INTO tags (bookmark_id, name) VALUES (?, ?)", [e.id, tag])
})
})
}, function(tr, err){
console.log("transaction error", err)
}, function (){
console.log("write done")
cb && cb()
})
}

background ページのコンソールで実行するとこんなふうになりました

hatena-websql

OS が変わった?
そんなこと気にしちゃダメ


データが入ってますね

検索のために
CREATE INDEX tagname_idx ON tags (name)

とインデックスをつけておくといいかもです


これで自由にブックマークを検索できるようになりました


ですが 1 つ問題があります
bookmarks テーブルはブックマークを更新するたびに増えたり変更されたりしますが tags はずっと自分で入れたタイミングのままで 自分で変えないかぎり変わらないです

bookmarks テーブルを書き換えるタイミングで tags も書き換えるようにしてもいいですが 拡張機能を書き換えるとアップデートのタイミングで書き換えたものが全部リセットされます

でもまぁ 使うことってめったにないですし SQL 使ってまで検索したいことがあったら 毎回 tags テーブルを一から構築するのもありかもです