CodeZine(コードジン)

特集ページ一覧

SQLiteで組み込みDB体験

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2006/05/02 00:00

複雑なデータ処理にはデータベースが便利ですが、導入するのに手間がかかります。そこで、本稿で紹介するC言語のライブラリ「SQLite」を使うと、C/C++で書かれたプログラムにライブラリをリンクするだけで、データベースの機能が使えるようになります。

目次

はじめに

 そもそもコンピュータのプログラムとは、データの処理を求められるものです。ファイルコンバータなど、単純なプログラムほど、そうした傾向がはっきり現れます。複雑なデータ処理の実現は、プログラマの腕の見せ所でもありますが、自前で不慣れな複雑なデータ構造を実装して、バグに悩まされた経験はありませんか? 1日でサクっと作ってしまう予定が3日になってしまったり、開発の後期になってバグが顕在化したり、なかなか思い通りにはいかないものです。

 その一方で、複雑なデータ処理を行うために、データベース(以下、DB)を使うことが一般的になりました。多くのプログラムが、DBと通信して処理を行うように作られています。しかし、一般的なDBは、サービスを提供するプロセスとして実装されているので、ちょっとした用途のために、DBをインストールして運用するのは、ムダに大袈裟に思えてしまいます。

 複雑なデータ処理にはDBが便利、だけどDBは導入が面倒というわけです。そこで紹介するのが、C言語のライブラリとして実装されたDB「SQLite」です。SQLiteを使えば、C/C++で書かれたプログラムにライブラリをリンクするだけで、DBの機能が使えるようになります。

対象読者

  • 「ExcelのVBA? ハァ~? 漢はcsvをC/C++で読み込むんじゃい!」という漢気にあふれる方
  • 「AVL木なんて実装できません。ライブラリで何とかさせてください。早く、おうちに帰してください」という軟弱な方
  • 「C/C++をガリガリ書く同僚ばかりで、誰もSQLタソの魅力が理解できないんだよね」というヲタな方
  • 「We Are All One(WindowsでもMacでもLinuxでも1つのソースがコンパイル可能)」という須藤元気

必要な環境

 SQLite自体は、一般的なCコンパイラが動作する環境であれば利用可能です。Windows、Mac、Linux上での動作実績があります。本稿では、Windows上で、Microsoft Visual C++ 2005 Express Edition(以下、VC8EE)をclコマンドで利用できる環境を前提に解説しますが、コマンドラインコンパイラによる解説なので、ちょっと読みかえるだけで他の環境でも同様に利用できるでしょう。

 対象となるSQLiteのバージョンは3.3.5とします。

SQLite、最初の一歩

 まずはSQLite home pageから、ソースのアーカイブ「sqlite-source-3_3_5.zip」をダウンロードしてください。

 ソースを展開して適当なディレクトリに置いたら、DOS窓を開いて、そのディレクトリに移動します。clコマンドを利用できるか確認しておきましょう。

 VC8EEがデフォルトのディレクトリにインストールされていて、clコマンドが使用できない状態なら、

clコマンドを使えるようにする
> call "C:\Program Files\Microsoft Visual Studio\VC\vcvarsall.bat"

 を実行することで、clコマンドが使えるようになるでしょう。

 コンパイラの準備ができたら、ソースをコンパイルして、ライブラリファイルを作ってみましょう。以下の内容のバッチファイル「makelib.bat」を作成し、実行してください。ライブラリ「sqlite335.lib」が作成されるはずです。

makelib.bat
del sqlite335.lib

cl /EHsc /Ot /c /D_CRT_SECURE_NO_DEPRECATE /DTHREADSAFE alter.c analyze.c
 attach.c auth.c btree.c build.c callback.c complete.c date.c delete.c
 expr.c func.c hash.c insert.c legacy.c main.c opcodes.c os.c os_unix.c
 os_win.c pager.c parse.c pragma.c prepare.c printf.c random.c select.c
 table.c tokenize.c trigger.c update.c utf.c util.c vacuum.c vdbe.c
 vdbeapi.c vdbeaux.c vdbefifo.c vdbemem.c where.c > result.txt

lib /OUT:sqlite335.lib alter.obj analyze.obj attach.obj auth.obj btree.obj
 build.obj callback.obj complete.obj date.obj delete.obj expr.obj func.obj
 hash.obj insert.obj legacy.obj main.obj opcodes.obj os.obj os_unix.obj
 os_win.obj pager.obj parse.obj pragma.obj prepare.obj printf.obj
 random.obj select.obj table.obj tokenize.obj trigger.obj update.obj
 utf.obj util.obj vacuum.obj vdbe.obj vdbeapi.obj vdbeaux.obj
 vdbefifo.obj vdbemem.obj where.obj >> result.txt

del *.obj

 このライブラリ化では、ディレクトリ内のすべてのソースを対象とはしていません。対象から外れた「tclsqlite.c」は、スクリプト言語環境Tclへのインターフェイスを提供するもので、本稿では取り扱いません。もう1つ、対象から外れた「shell.c」は、ライブラリを使ったサンプルプログラムですので、コンパイルして動かしてみましょう。

shell.cのコンパイル・実行
> cl /D_CRT_SECURE_NO_DEPRECATE shell.c sqlite335.lib
> shell testdb

 で実行すると、SQL文を入力できるようになります。

shellの実行例
sqlite> create table test_table (id integer primary key, user text, age integer);
sqlite> insert into test_table (id, user, age) values (1, 'mnagaku', 34);
sqlite> insert into test_table (id, user, age) values (2, 'nakaoka', 35);
sqlite> insert into test_table (id, user, age) values (3, 'yamada', 35);
sqlite> insert into test_table (id, user, age) values (4, 'k-ohji', 33);
sqlite> select * from test_table where age > 34;
2|nakaoka|35
3|yamada|35
sqlite> .quit

 データは「testdb」というファイルに保存されます。

 このサンプルプログラムが、SQLで操作できるDBとなっていることが分かっていただけたでしょう。その機能は、「shell.c」のコードではなく、ライブラリから提供されています。

Cにも時代の流れが……
 VC8EEでは、C99標準に従ってソースが解釈されるため、_CRT_SECURE_NO_DEPRECATEを定義しないと、SQLiteのソースが古い書き方になっていると警告されます。該当する古い書き方が破棄された主な理由は、バッファオーバーフロー対策ですので、安全なプログラムのためには無視できない警告です。その点は留意してください。
 とはいえ、コードの可搬性など、悩みは尽きませんが……。

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

あなたにオススメ

著者プロフィール

  • 長久 勝(ナガク マサル)

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

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5