もともと SQL-Bless って、SELECT 結果を CSV 形式で出力するようになっているんですよね。
で、CSVI はファイルだけでなく、標準入力から CSV データを読み込むことができるようになっている。
これは連結すると便利じゃね?ということで、SQL-Bless に CSVI をページャとして組み込んでみました。
(1) CSVI をどのように連携させるか
CSVI を more/less のようにOSのパイプラインでつないで別プロセスとして呼び出すことも考えたんですが
- CSVI が存在しないとき、どういう振舞いをさせるか
- CSVI.exe のありかをどうユーザに指定させるか
という点を考えると邪魔くさいので、CSVI をGo言語のパッケージ化して静的リンクさせてしまうことにしました。
(2) CSVI をGo言語パッケージ化
CSVI の main 関数は "github.com/hymkor/csvi/cmd/csvi" へ移動して、"github.com/hymkor/csvi" は Go言語のパッケージとして利用できるようにしました。
いろいろ試行錯誤の結果、現在の呼び出し方は次のような形で落ちついています。
// github.com/hymkor/sqlbless/csvi.go より cfg := &csvi.Config{ CellWidth: 14, HeaderLines: 1, FixColumn: true, ReadOnly: true, Message: titleBuf.String(), } // : // pIn io.Reader - CSVソース // out io.Writer - 標準出力など // cfg.Main(&uncsv.Mode{Comma: ','}, pIn, out)
構造体 Config の内容は、旧csvi では "flag"
パッケージで外部から与えていたオプション群が主に入っています。
(3) SQL-Bless側
SQL-Bless 側では SELECT の出力を、csv.Config.Main の入力を io.Pipe によるパイプラインでつなげるだけです。
SELECTの結果を一旦 CSV で出力させて、それを CSV パーサで読みとるなんて、無駄きわまりないところですが、その分、互いのモジュール間の結合が簡単に済みます。つまり、SQL-Bless は必要以上に CSVI の内部仕様に踏み込まなくてよく、CSVI の仕様変更にふりまわされる可能性が低くなるというわけです。 ( 今のところ、入り口関数の csvi.Config.Main の仕様だけをチェックしておけばよい )
では、画面を見てみましょう。
普通の SQL のコマンドラインクライアントだと、列や行が多すぎて多数の折り返しやスクロールで流れていって、まったく見られたものではないことが多いの考えると、カッケーでしょ?
しかも、何行にも長いSQLの編集も go-multiline-ny の複数行のインライン編集機能で無理なく可能。これはもう究極のコマンドラインクライアントと言っても過言ではないのでは?