maya's blog

About programming, aws and ubuntu

C/C++からSQLiteを操作する

SQLiteとは

公式より引用*1

SQLite is an in-process library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine. The code for SQLite is in the public domain and is thus free for use for any purpose, commercial or private. SQLite is the most widely deployed database in the world with more applications than we can count, including several high-profile projects.

SQLiteとは、自己完結式でサーバ不要、設定不要なトランザクションSQLデータベースエンジンを実装したインプロセスライブラリです。SQLiteで書かれたコードはパブリックドメインに属しており、したがって商用または個人の目的に無料で使用できます。SQLiteは数多の重要なプロジェクトの内、世界で最も多く用いられているデータベースです。

Railsではtest, development環境のデフォルトDBとして用いられている。 db/development.sqliteのようなファイルを見たことあるかもしれないが、そのファイルにデータが保存されている。 MySQLPostgresqlと違い、sqliteはデータを1つのファイルに保存するため、データを消したければファイルを削除するだけで良いし、バックアップも同じくファイルをコピーするだけで済む。

実際にテーブル作成、追加、参照、削除するには、主に以下の2つの方法がある。

  1. sqlite3コマンド
  2. アプリから

今回は2.のアプリで、C++で試してみる。

C++SQLite操作

基本的には、SQLiteライブラリをリンクして、提供されている関数を実行する。そもそもC/C++言語両方で使えるようになっているので、C言語で対応できる関数・構造体等でAPIが提供される。クラスや例外はない。

公式のquickstartサンプルコード*2

#include <stdio.h>
#include <sqlite3.h>

static int callback(void *NotUsed, int argc, char **argv, char **azColName){
  int i;
  for(i=0; i<argc; i++){
    printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  }
  printf("\n");
  return 0;
}

int main(int argc, char **argv){
  sqlite3 *db;
  char *zErrMsg = 0;
  int rc;

  if( argc!=3 ){
    fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
    return(1);
  }
  rc = sqlite3_open(argv[1], &db);
  if( rc ){
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    return(1);
  }
  rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
  if( rc!=SQLITE_OK ){
    fprintf(stderr, "SQL error: %s\n", zErrMsg);
    sqlite3_free(zErrMsg);
  }
  sqlite3_close(db);
  return 0;
}

実行ファイルのオプションにデータベース名, SQL文を書くと、データベース名でDBが作成され、SQL文も実行される。