別シリーズではNode-REDの裏側でSQLiteを使わせていただいてます。Node-RED(JavaScript)からは勿論、コマンドラインからGUIからもSQLを操作してます。なんといってもSQLiteは簡便でお楽。この辺でC言語プログラムからもSQLite3してみるかと思い立ちました。これがまたお楽?ホントか?
※「ソフトな忘却力」投稿順 Index はこちら
※実行確認はWindows11上のWSL2にのせてあるUbuntu20.04LTSで行ってます。
ラズパイからWSL2にデータベースをコピー
実験用のデータベースは普段Node-REDの裏側で使っているものをそのまま用いてみることにいたしました。Node-REDサーバーなどはRaspberry Pi 3 model B+上で動いています。チマチマと末端のマイコン類から収集した温度データなどがMQTT経由でラズパイに飛んできてこのデータベースに書き込まれるのであります。今回、CからのSQLite3操作の実験、ということで「壊して泣かないように」WSL2上のUbuntuにデータベースをコピーして用いることにしました。
ファイルを1個コピーすればそれでOK
SQLiteのなんとお楽なことか。
C言語からどうやってSQLiteにアクセスしたらよいのか?
Ubuntuの上に、libsqlite3-devなどインストールした後で御本家 sqlite.org 様の以下のページを見に行ったのですが、一瞬にしてめげました。
C-language Interface Specification for SQLite
とんでもない分量のオブジェクトに定数に関数に。これを読んで使えるようになる前に寿命が尽きそうです。しかし、よく見れば先頭近くに、
というリンクがあるじゃありませんか。3分間クッキング?3分くらいならなんとかなるでしょう(細かいところに突っ込み入れると、上記のリンクは3分なのに該当ページのタブを見れば5分です、いつの間に2分増えたのよ?)
ともあれ、このページにごくごく短い(35行)サンプル・ソースがあり、これくらいなら「真似っこ」して理解するのはなんとかなりそうです。とりあえず、そのままサンプル・ソースを sample.c というお名前でビルドして動かしてみん、と。すると必然的に以下のリンクに目が行きます。
Makeだったり、CMakeだったり、あるいは他のビルドツールだったり、世にはびこる「何か」を予想して上記のページに行ったらば肩透かしをくらいました。
Amalgamation
たった2つ、sqlite3.c と sqlite3.h を用意すればコンパイルはできるのだ、と。SQLite3のほぼほぼすべてが sqlite3.c なるひとつのファイルに収まっているようなのです。その分巨大。こんな感じ。
ツールで多数のソースコードから自動生成されたファイルなので、人間が読んでどうこういじるようなファイルではないのですが、上記2つがあればコンパイルはできてしまう、と。当然、いいことも悪いこともあるので上記のページで「議論」されてもいるのですが、私は大賛成。お楽なので。実際、コンパイルしてみるとファイルの巨大さにもかかわらず一瞬。SQLiteらしいデス。
なお、Amalgamationの方法にもいろいろあるのですが、以下のページの中にある “Download Copies Of The Amalgamation” から持ってくれば上記が即、手に入ります。手抜きよのう。
コンパイルして実行
以下のコマンドラインで、サンプルプログラムのコンパイルはOKでした。
gcc sample.c sqlite3.c -lpthread -ldl -lm -o sample
そしてラズパイ3からコピーしたデータベースのマイコン名の管理テーブルをselect してみればこんな感じ。
何も考えずにできちゃいますな。Amalgamation、恐るべし。