SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

SQLiteで組み込みDB体験

手軽にデータベース機能を実装できるC言語ライブラリ「SQLite」の利用

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

サンプルプログラムをのぞいてみる

 では、「sample.c」の中身をのぞいてみましょう。

 まず最初に、ライブラリの関数や定義を使うので、「sqlite3.h」のincludeが必要になります。

 DBの使い方は

  1. DBのオープン
  2. DBに対するCRUD操作
  3. DBのクローズ

 の手順となります。DBのオープンにはsqlite3_open()、クローズにはsqlite3_close()を使います。

 sqlite3_open()では、第1引数に、データを保存する、もしくは以前にSQLiteで保存済みのファイル名を指定して、DBとの接続を確立します。作成された接続は、第2引数のsqlite3型の構造体によって保持されます。一種のハンドルと考えればよいでしょう。「sample.c」では、「:memory:」という怪しげな名前が与えられていますが、この指定によって、DBを、ファイルシステム上ではなく、メモリ上に作ることができます。メモリ上のDBは、プログラムが終了すると消えてしまいますが、ファイルシステム上のDBよりも高速に動作します。データ処理のための一時的なDBであれば、メモリ上に作るメリットがあります。

 CRUD操作とは、create、(select文による)read、update、deleteという、一般的なDB操作のことです。こうした操作は、DBのためのドメイン特化言語であるSQLで表現され、実行されることが一般的です。SQLiteにおいても、一般的なDBと同様に、SQLによるデータ操作を行います。SQL文の実行にはsqlite3_exec()を使います。

 sqlite3_exec()は5つの引数を取ります。順に、sqlite3型のDBのハンドル、実行するSQL文、結果を取得する際に呼び出されるコールバック関数、拡張用ポインタ、メッセージ受け取り用のバッファ、を渡します。DBのハンドル、実行するSQL文の説明は必要ないでしょう。メッセージ受け取り用のバッファとは、関数の実行が正常終了しなかった場合に、状況の説明文を受け取るためのものです。

 ここで重要なのはコールバックの仕組みです。DB操作のうち、create、update、deleteでは、成功か失敗かが分かれば良いのですが、select文によるread操作では、取得したデータを受け取らなければなりません。そこで、取得したデータ1行ごとに、そのデータをどう処理するか記述できる、コールバック関数を指定できるようになっています。コールバック関数は、sqlite3_exec()に渡された拡張用ポインタ、1行に含まれる要素数、各要素の文字列表現による配列、要素名の配列、の4つの引数を取ります。「sample.c」のcallback()では、大域変数として用意されたsqlResultに、各行のデータを追加していく処理を行っています。

 この仕組みでは、取得されるデータ1行ごとに、順に処理を適用できます。SQLiteはマルチスレッドにも対応している(コンパイル時にTHREADSAFEの定義が必要)ので、行ごとに行う処理を並列処理させて良いなら、スレッドを立てることも可能です。

さいごに

 select文の結果を得る部分が、コールバック関数を経由したものになるため、使う前にちょっとした下準備は必要になりますが、ある程度汎用性のある結果を受け取る仕組みを作ってしまえば、簡単にDBを利用することができます。今回はCによるサンプルを用意しましたが、普段、私はvector<map<string, string> > sqlResultな感じで使っています。C++であれば、もう少しマシな実装ができるでしょう。

 これまで、C/C++を使う分野と、SQL文を使う分野は、それほど近くはありませんでした。しかし、C/C++を使う分野でも、複雑なデータ処理の求められる局面は増えています。実行速度優先でフルスクラッチな実装をするばかりでなく、開発速度優先でSQLiteなどを使う選択肢も考慮してはいかがでしょう?

 とはいえ、SQLは一般的なプログラミング言語と異なる点が多く、C/C++/JavaなどC系のコード書きに、なじみやすくはありません。C系の言語で書くのが本職だと割り切って自分の理解の範囲でSQL文を書き、より複雑な処理はSQL文の結果をC系のコードで処理する、という考え方も、開発速度優先であればアリだと思います。

SQLiteのライセンス
 SQLiteは、多くのオープンソースとは異なり、最近では珍しいpublic domainとなっています。
 ・原文
 The original author of SQLite has dedicated the code to the public domain. Anyone is free to copy, modify, publish, use, compile, sell, or distribute the original SQLite code, either in source code form or as a compiled binary, for any purpose, commerical or non-commerical, and by any means.
 ・参考訳(内容は無保証です)
 SQLiteの原作者はコードを公共の場に寄付しました。オリジナルのSQLiteのコードを、ソースだろうがコンパイルされたバイナリだろうが、商用だろうが非商用だろうが、誰でもどんな目的のためでも自由に改変、出版、使用、コンパイル、販売、配布できます。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

長久 勝(ナガク マサル)

1972年1月10日生まれ。京都府出身。1994年龍谷大学理工学部数理情報学科卒業。ゲーム会社に入社。「ワンダースワンゲームプログラミング」「Javaゲームプログラミング」等を執筆。早稲田大学MNC非常勤講師。神楽坂酔っ払い研究所所長。ホームページはhttp://www6.plala.or.jp/mnagaku/。blog「mnagakuのx86_64地獄」も毎日更新中。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/374 2006/05/02 00:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング