c++でSQLite3を読み込む(Firefoxの履歴検索)

はじめに

こんにちは、野村です。

今回は、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を使って同じようなものを作ってみます。

Firefoxの履歴検索の結果をw3mで表示する(Python3使用)
今回は、Python3を使ってFirefoxの履歴検索の結果をw3mに表示する方法を紹介します。ちなみに、w3mの「-T」というオプションの使い方を初めて知りました。便利かも?

というわけで今回はこれにて。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

野村 野村のプロフィール
メインPCはWindows10のVirtualBox上のFreeBSD。Linux/Unixの小ネタを求めて日々右往左往してたりする。