[C] 対話型コマンドでユーザ入力サポート

bashやsqlite3のような対話形式のコマンドでは上下の矢印キーでコマンドの履歴をたどれたり、tabキーでファイル名を補完できたりする。
自分で作った対話型コマンドでも、こんな機能が使えたらいいよね。

readline

こんな時は GNU readline を使うことが多いかもしれない。

https://cnswww.cns.cwru.edu/php/chet/readline/rltop.html

でも、GNU readlineはライセンスがLGPLではなく、GPLなので、ライブラリとしてリンクしてしまうと使用しているアプリケーション側もGPLにしないと、配布できなくなってしまう。

[sqlite] SQLiteでの日付型の扱い その2

前回はSQLiteでの日付の表し方だったけど、今度は日付を用いた計算をしてみよう。

日付の足し引き

1年以上前のデータを削除するような場面では現在から1年前の日付が必要になる。
sqlite> select date('now', 'localtime');
2017-07-09
sqlite> select date('now', 'localtime', '-1 year');
2016-07-09

オプション引数は何個でもつけることができるので、3ヶ月先の月の末日を求めたい場合は以下のようになる。

[sqlite] SQLiteでの日付型の扱い その1

日付型がない

SQLiteは型として日付(Date)型を持っていない。
なので、どうするかというと以下の3つのパターンがある。
  • ISO-8601形式 : TEXT
    ISO-8601の文字列形式で日時を保持する。
  • ユリウス通日 : REAL
    紀元前4713年1月1日の正午からの日数を実数型で保持する。整数部分が日数で小数部分が時刻を表す。
  • Unix時間 : INTEGER
    19070年1月1日真夜中(午前0時0分0秒)からの秒数を整数型で保持する。

[SQLite] SQLiteで実行計画を見てみよう その3

explain

[SQLite] SQLiteで実行計画を見てみよう その2ではテーブル結合の実行計画を取得して、nested loopの様子を見たけど、SQLiteではさらに詳細に内部の実行手順を見ることができる。

今度はexplain query planではなく、explainを使う。

The SQLite Bytecode Engine

[SQLite] SQLiteで実行計画を見てみよう その2で実行したSQLにexplainをつけて、見てみよう。