CでSQLiteを操作する

防備録として


まずはincludeするヘッダファイルの宣言とcallbackのプロトタイプ

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

int callback(void *,int,char **,char **);

callbackはSQLiteのコマンドの実行後に呼び出される関数 詳細は後で書く

次にメイン

int main(int argc,char *argv[]){
	sqlite3 *db;
	char *err_msg = NULL;
	int check;
	int counter = 0;

	if(argc < 3){
		fprintf(stderr,"Usage: %s database_name command\n",argv[0]);
		return 1;
	}

	check = sqlite3_open_v2(argv[1], &db, SQLITE_OPEN_READWRITE,NULL);

	if(check != SQLITE_OK){
		fprintf(stderr,"Can't open database: %s\n", sqlite3_errmsg(db));
		sqlite3_close(db);
		return 1;
	}

	check = sqlite3_exec(db,argv[2],callback,&counter,&err_msg);

	if (check != SQLITE_OK){
		fprintf(stderr,"SQL error: %s\n", err_msg);
		sqlite3_free(err_msg);
		sqlite3_close(db);
		ret
urn 1;
	}

	printf("%d callback(s) .\n",counter);

	sqlite3_close(db);
	return 0;
}

チェック

これらは見ての通り引数の数とか関数の戻り地をチェックしている

if(argc < 3){
		fprintf(stderr,"Usage: %s database_name command\n",argv[0]);
		return 1;
	}
if(rc != SQLITE_OK){
		fprintf(stderr,"Can't open database: %s\n", sqlite3_errmsg(db));
		sqlite3_close(db);
		return 1;
	}

if (rc != SQLITE_OK){
		fprintf(stderr,"SQL error: %s\n", err_msg);
		sqlite3_free(err_msg);
		sqlite3_close(db);
		return 1;
	}

SQLiteを操作する

肝心のSQLiteを操作しているのは「sqlite3_open_v2」「sqlite3_exec」「sqlite3_free」「sqlite3_errmsg」「sqlite3_close」の5つ
まずは「sqlite3_open_v2」から

check = sqlite3_open_v2(argv[1], &db, SQLITE_OPEN_READWRITE,NULL);

3つ目の引数はオープンするデータベースの権限を設定している
4つ目の引数はネームスペースに関する関する情報が入るらしいがネームスペースとはなんぞや
これはsqlite3_openでもオープンできる というかこっちの方が一般的っぽい

int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);

次は「sqlite3_exec」

check = sqlite3_exec(db,argv[2],callback,&counter,&err_msg);

これはsqliteコマンドを実行する関数 引数の二番目には実行するコマンド、というかSQL文(文字列)へのポインタを指定
3番目の引数にはcallbackへのポインタ 4番目にはユーザーが好きに指定していい これはcallback関数で使ったりする

「sqlite3_errmsg」はその時点での最後のエラーメッセージを返す

fprintf(stderr,"%s",sqlite3_errmsg(db));

「sqlite3_free」は

エラーメッセージのメモリ領域は sqlite3_malloc関数で確保されたものであるから、 メモリリークを避けるために、用済みになったらsqlite3_free関数で解放する。

との事 

最後の「slite3_close」はオープンしたデータベースをクローズする

sqliteを操作するためにはこれらの関数を使うだけではなく、callback関数を用意する必要がある
callback関数はSQLコマンドを実行した後に呼び出される関数でsqlite3_execの三番目の引数に指定した関数はこれである

int callback(void *user_data,int argc,char **argv,char **field){
	int i;
	int *counter = (int*)user_data;

	for(i = 0;i < argc;i++){
		printf("%s = %s\n",field[i],argv[i] ? argv[i] : "NULL");
	}
	printf("\n");

	(*counter)++;
	return 0;
}

callbackの一番目の引数はsqlite3_execで4番目に指定した変数
callbackはsqlite3_execで得られたデータをargvに入れる argcは受け取ったデータの数 fieldはフィールド名
例えばフィールド名がIDとNameでデータが255とhogeだったら、argcは2 argvは"255"と"hoge"を指している事になる fieldは"ID"と"Name"を指している
callbackはsqlコマンドの実行結果を処理する関数という事らしい

プログラムは動いたがメモはざっと書いたので間違ってるところもあるかもしれない



参考にしたもの