はじめに
こんにちは、野村です。
今回は、c++でSQLite3内のデータを取り出してみます。
ただ取り出すだけでは芸がないので「Firefoxの履歴を検索し、その結果をHTMLで吐き出す」という小物を作ってみます。
Firefoxの履歴などはSQLite3で管理されています。
SQLiteの勉強にはもってこいの素材だと思います。
準備
SQLite3がインストールされてなければインストールする(debianの場合)。
# apt install sqlite3 libsqlite3-dev
ソースコード
main.cpp
・9行目、places.sqliteのパスは、各自の環境に合わせて下さい。
#include <iostream> #include <cstdio> #include <sqlite3.h> #include <string> using namespace std; int main(int argc, char* argv[]){ const char* fileName = "/home/jake/.mozilla/firefox/xxxxxxxx.default/places.sqlite"; const char* sql02 = "SELECT * FROM moz_places WHERE title LIKE ? ORDER BY id DESC;"; sqlite3 *pDB = NULL; sqlite3_stmt *pStmt = NULL; int err = 0; string k = argv[1]; k = "%" + k + "%"; err = sqlite3_open(fileName, &pDB); err = sqlite3_prepare_v2(pDB, sql02, -1, &pStmt, NULL); sqlite3_reset(pStmt); sqlite3_bind_text(pStmt, 1, k.c_str(), -1, SQLITE_TRANSIENT); printf("<!DOCTYPE html><html lang=\"ja\"><head><meta charaset=\"UTF-8\"/><title>rireki</title></head><body><ul>\n"); while(SQLITE_ROW == (err = sqlite3_step(pStmt))){ const unsigned char* url = sqlite3_column_text(pStmt, 1); const unsigned char* title = sqlite3_column_text(pStmt, 2); printf("<li><a href=\"%s\">%s</a></li>\n", url, title); } printf("</ul></body></html>\n"); sqlite3_finalize(pStmt); err = sqlite3_close(pDB); return 0; }
ビルド
$ g++ main.cpp `pkg-config --cflags --libs` -lsqlite3
実行
普通に「vim」という文字列で検索すると、
$ ./a.out vim
延々とhtmlを吐き出だす。とっても読みにくい。
なので実行結果を一旦htmlファイルとして書き出してからブラウザで読み込ませる必要がある。
$ ./a.out vim > /tmp/rireki.html; w3m /tmp/rireki.html
最後に
以上、Firefoxの履歴を検索するコマンドラインのアプリをc++で作ってみました。
SQLiteは、この本で勉強しました。
『SQLite ポケットリファレンス』(技術評論社)
丁寧で分かりやすいです。入門書としておすすめ。
さて次回は、Python3を使って同じようなものを作ってみます。
今回は、Python3を使ってFirefoxの履歴検索の結果をw3mに表示する方法を紹介します。ちなみに、w3mの「-T」というオプションの使い方を初めて知りました。便利かも?
というわけで今回はこれにて。