炊飯器を一升炊きから5.5合炊きに買い換えた
先日、炊飯器が壊れました。
自己診断のエラー表示によると、故障はフタの開閉部の断線との事。
母が炊事してた頃から使ってたので、ついに来たかー、って感じです。
少なくとも8年くらいは使用してたので悔いはないかな。
念の為、修理の相場を調べたら、費用は1.6〜2万円らしい。
それなら新品買う方が良いよね。
....
次のサイズはどうするかちょっとだけモメました。
田舎なので、以前は季節のイベントの度に一升炊いてたようです。
が、私はそこまでするつもりはなく。
好きで炊事してる訳じゃないので断固拒否です。
モメた割に、近所の家電屋さんでは、ほとんどが5.5合炊きで3合が少々。
一升タイプは各メーカー1種類あるだけでした。これじゃモメ損だよ。
....
結局購入したのは5.5合炊きタイプです。
一人暮らしの頃も敢えて5.5合炊きを使ってたので、慣れたものです。
使い勝手が良くなって、とても満足してます。
無駄にでかい釜が嫌だったのですが・・・
またひとつ、見慣れた母の道具が消えたかと思うと、もの寂しいもんですね。
Ubuntuでodbc-iterクレートを試したら便利だった
前回までで、Rust の odbc クレートから SQL Server 2019 on Linux に接続して、日本語を含むクエリが処理できるようになりました。
次は日付や数値等の評価をしてみようと、データベース型の扱いについて調べてたら、odbc-iter クレートの存在を知りました。
odbc-iter クレートは、内部で odbc クレートを使用しています。
現状では、日付時刻は chrono、数値は rust_decimal の各クレートも併用してるとの事なので、それならば私が自力で寄せ集めなくても済むし、試してみようかと。
サンプルやソースコードを読むと、odbc クレートよりも簡略化して書けそうです。
以下に、比較用に書いたコードと実行結果を貼っておきます。
・Cargo.toml への追記
[dependencies]
libc = "*"
odbc-iter = { version = "0.2.5", features = ["rust_decimal"] }
odbc = "0.13.0"
・ソースコード : main.rs
とりあえず、単一の値を返却するクエリで試してみます。
このコードでは NULL 値を扱いたいので、Option<Value>
で受けてます。
NULL 値が不要なら、odbc-iter クレートのサイトに掲載されているサンプルのように、より簡潔に書けます。サンプルでは型指定になってますが、型を指定したくなければ、Value
で受けるのも可能です。
・実行結果
小数の出力結果が少し異なりますが、ほぼ同じです。
補足
今回の件とは別に、ODBC の評価ではいつも同じようなコードを書いてます。
実は、既に odbc クレート用に評価コード書いて検証を済ませてました。
それを odbc-iter クレート用に書き換えたら、思ってた以上にデータベース操作が楽になりました。
しばらく odbc-iter クレートで過すのもアリかな、と思うくらい気に入ったので、もっと利用者が増える事を願ってます。
UbuntuでodbcクレートとMS版ODBCドライバで日本語を扱う
時折この記事が見られていますが、別の方法があるので紹介します。
2022-05-15 MS版ODBCドライバは odbc-api クレートで
現状 macOS, Linux 環境において、Rust で MS 版 ODBC ドライバを利用したい場合は、odbc クレートではなく、odbc-api クレートをお奨めします。
- odbc-apiクレートに乗り換えたら、MS版ODBCドライバからSQLServerへの接続が色々と捗った
- deadpool-r2d2とr2d2_odbc_apiを組み合わせたら、非同期処理でODBCからRDBを扱えた
std::thread による並列処理には r2d2 / r2d2_odbc_api が利用できます。
また、本来 tokio, async-std ランタイムの非同期タスクには対応していませんが、 deadpool / deadpool_r2d2 / r2d2_odbc_api の組み合わせで利用可能です。
odbc クレートの現状
最終版が 0.17.0 のまま、2年程更新されていません。
接続プールの rd2d_odbc も同様です。
何が困るかというと、関連するクレートの依存関係が解消されていません。
使用するクレート | 依存するバージョン |
---|---|
最終版? | 0.17.0 |
r2d2_odbc | 0.16.1 |
odbc-iter | 0.13.0 |
各バージョンでコンパイルが通らない程度の変更があるので注意が必要です。
私は r2d2_odbc に合わせて、バージョン 0.16.1 固定と割り切りました。
現在も FreeTDS 版 ODBC ドライバ tdsodbc との組み合わせは良好です。
そして、元記事の内容は odbc-api クレートを利用する場合、一切不要です。
既に無意味ですが、私が足掻いた記録として残して置きます。
元記事 ... 既に役割を終えたので、ただの記録
Rust の odbc クレートから SQL Server 2019 on Linux に接続する件ですが、私の環境では MS 版 ODBC ドライバで接続すると期待通りに動作しませんでした。
接続は成功するし、英文のサンプルは動作するのですが、クエリ文字列に日本語が含まれていると、文字化けやパニックが発生してしまいます。
この記事について、とりあえずと言うか、一応の解決策が見つかりました。
データベース接続の前に、次のコードを追加します。
これは C言語でロケール情報を設定する setlocale(LC_ALL, "");
を Rust で記述しているだけです。これで日本語を含むクエリが通るようになりました。
正直なところ、ロケールを設定すると副作用が心配ですが、まずは一歩前進です。
なお、""
の部分は"ja_JP.UTF-8"
、敢えて"C.UTF-8"
や"en_US.UTF-8"
にしても、日本語を含むクエリは通ります。
なので、何かあれば、その都度考える事にしました。
以下に、私が試したコードと実行結果を貼っておきます。
・ソースコード : main.rs
Cargo.toml の [dependencies] には、libc = "*"
とodbc = "*"
を追加しました。
現在のビルドでは、libc-0.2.69
とodbc-0.16.1
が使われてます。
・実行結果
ちなみに、FreeTDS の ODBC ドライバの場合ですが、前述のソースコードの内容であれば、ロケール設定があってもなくても、この画面の結果になります。
※補足
少し残念な事に、MS 版 ODBCドライバから接続すると、ロケール設定をしていても、日本語のカラム名が文字化けします。
Statement::describe_col() でカラム名を取得する際に発生してるのですが、カラム名を英数字にすれば正常動作するので、実務ではほぼ問題ないはずです。
もし、気になるのであれば、文字化けしない FreeTDS の ODBC ドライバで接続する事になります。
※補足の補足 2020.5.24
カラム名の件について、私的な対応で回避してたのを忘れてました。
odbc クレートのコードを 1ヶ所修正すれば、MS 版 ODBC ドライバでも日本語カラム名が表示されます。
私は odbc-0.16.1/src/statement/mod.rs の 299行目、name_length の値を * 4 にして回避しました。
付近に似たようなコードがもう 1 行ありますが、そちらはノータッチです。
これは現在最新版の odbc-0.17.0 で試しても同様でした。
odbc-iter でもこの対応をしないと Segmentation Fault になるので、仕方なしです。
でもまあ .cargo にあるコードを書き換えるくらいなら、素直に FreeTDS を使う方が良さそうですね。
結合文字ではない絵文字の件だけでも何とかなれば良いのですが。
上海(ゲーム)が面白くて飽きない
上海(シャンハイ)というパズルゲームがあります。
昔、PC-9801 用のタイトルで初めて上海に触れて、それ以来どハマりしました。
そんな私が GNOME上海の存在を知ってしまった日は、ひとりで狂喜乱舞。
勢い余って、当時使用していた Unix系OS のデスクトップ環境をすべて GNOME に切り換えました。私、KDE派だったのになー
今でも Ubuntu をインストールする度に取り敢えずプレイするのは、私のお約束です。
私の Ubuntu 歴は 8.04 からなので、既に12年です。飽きる気配がまるでありません。
....
頭をリセットしたい時にプレイしてるのですが、稀にやる気スイッチが入ってしまうと、手が止まらなくなるのが悩ましいです。
シンプルかつ短時間で終わる為、中毒状態だとスコア更新に余念がありません。
2014年には上級で 2分を切るようになり、記念のスナップショットがこちらです。
当時はいろんな意味で悩んでたので、余計に熱が入ってたようです。
ハイスコアは 1m 30s を切った記憶はあるのですが、エビデンスがないので無効ですね。
最近も少し現実逃避気味だったので、ついつい手を出してました。
今はもう落ち着いたので、いろんな意味でも大丈夫です。
....
ある日、元同僚の洋ゲー好きとゲームの話してたら、レトロなPCゲームの話になり、私が何気なく上海の話題を出しました。
そしたら、「何んすか、そのゲーム?初めて聞いたんですけどー」との塩対応。
えー、ソリティアやマインスイーパは知ってるのに!?
さめがめ だって知ってるくせに!?
なのに、上海は知らないって何!
上海は Wikipedia にも記事があるくらいなので、ゲーマーなら誰もが普通に知ってると思ってました。
彼はアラサーだったので、もうその世代では知られてないのかな。
上海、面白いのになー
UbuntuでnanodbcからSQLServerに接続する #3 - 追試編
導入編では nanodbc をビルドして Ubuntu 環境にインストールしました。
ここでは、日本語を含むテーブル・カラム・クエリ等の扱いと、その他、気になる点について追試してみます。
対象は引き続き MS 版 ODBC ドライバです。
1. 追試用プロジェクトの準備
導入編で nanodbc をインストールした状態が前提です。
その続きとして、別途 nanodbc の共有ライブラリを利用する環境を整えます。
(1) 追試用ディレクトリ
既に work ディレクトリが存在するとして、新たに my_test ディレクトリを作成します。
$ cd ~/work
$ mkdir my_test
$ cd my_test
(2) ソースコード
my_test ディレクトリに、CMakeLists.txt
とmain.cpp
を作成します。
・CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(my_test CXX)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
find_package(nanodbc REQUIRED)
add_executable(a.out main.cpp)
target_compile_options(a.out PRIVATE -g -Wall)
target_link_libraries(a.out PRIVATE nanodbc)
・main.cpp
このソースコードは、私が Qt5 で書いたテストコードを部分的に流用してます。
その為、一部に不自然な記述もありますが、今回の追試には影響ないはずです。
(3) ビルド用ディレクトリの準備
my_test ディレクトリにビルド用のディレクトリを作成します。
$ pwd
/home/dareka/work/my_test
$ mkdir build
$ cd build
以降の操作は、このディレクトリで作業します。
2. ビルドと実行
(1) Makefile 生成と make
まずはプロジェクトをコンパイルして実行ファイルを生成します。
$ cmake ..
$ make
(2) 実行
ビルドが成功すると、a.out
が生成されるので、これを実行します。
テスト編と同様に、実行時の接続先データベースは 'my_test_db' です。
$ ./a.out
3. 実行結果の確認
確認したい事を 4 つのブロックに分けて処理しました。
結果は、すべて想定内・期待通り、でした。
(1) 単一の値を返すクエリの確認
std::cout << "確認 #1" << std::endl;
以降のブロックです。
SELECT 文に値を直接指定して nanodbc::result で受けてます。
N' ' で括られた日本語を含む文字列リテラルは暗黙に nvarchar として扱われ、期待通りに動作します。一方、' ' で括られた方は暗黙に varchar として扱われ、文字化けしているように見えます。
(2) 日本語でカラムやテーブルを定義してローを挿入する
std::cout << "確認 #2" << std::endl;
以降のブロックです。
まず、日本語を含むテーブルを作成します。
そこに、日本語を含む値をプレースホルダにバインドして INSERT してます。
全件 SELECT して表示する際、affected_row() の変化にも注目してみました。
(3) nvarchar(max)型で日本語や絵文字を含むテキストを扱う
std::cout << "確認 #3" << std::endl;
以降のブロックです。
生文字列リテラルとstd::stringを連結したテキストデータが期待通りに設定・再取得できる事を確認してます。
敢えて異なる方法でバインドして、それぞれ正常に処理されてます。
Ubuntu では絵文字を含めて期待通りに処理されました。
Windows や macOS 等が混在した状態では試してません。
(4) LIKE 演算子へのパラメータと結果セットの再利用
std::cout << "確認 #4" << std::endl;
以降のブロックです。
LIKE 演算子に対する日本語を含むパラメータバインドのテストが無かったので、試してみました。
結果セットを構造体の動的配列に退避して、値の再利用も試してます。
4. まとめ
とりあえず気になった点については、自分なりに納得できる結果でした。
nanodbc で用意されているテストは網羅する範囲が広く、標準のテストに追加する仕組みも用意されているので、とても助かります。
今回は日本語が絡む為、別途プロジェクトを用意しての追試です。
実際のところ、テーブル名やカラム名に日本語を採用した現場に遭遇した事はありません。それでも、クエリと結果セットに日本語が含まれる可能性が高い為、今回のような日本語を多用するケースを敢えて検証しました。
UTF-8 にしろ UTF-16 にしろ、現在の文字コードの混沌に立ち向かえる程、私は強くないですが、せめて自分の足元くらいは確認しておきたいと思ってます。
記事のリスト
ついつい熱が入った紹介になりましたが、本当に便利だと思います。
私の場合、C++ で ODBC を扱うコードを書くなら Qt5 を最優先にしてましたが、これなら nanodbc も十分選択肢に入ります。
- UbuntuでnanodbcからSQLServerに接続する #1 - 導入編
- UbuntuでnanodbcからSQLServerに接続する #2 - テスト編
- UbuntuでnanodbcからSQLServerに接続する #3 - 追試編 ← 今ここ
UbuntuでnanodbcからSQLServerに接続する #2 - テスト編
前回の記事では Ubuntu 環境下で nanodbc の構築とテストを実施しました。
C++ で ODBC 接続するのに便利な nanodbc は、そのテスト範囲も広かったです。
もう少し nanodbc で用意されているテストについて掘り下げてみます。
1. テスト内容
SQL Server 用のテスト mssql_test.cpp の内容を簡単にまとめてみました。
次の表は MS 版 ODBC ドライバでのmake test
の実行結果です。
# | テスト項目 | 内 容 | 結果 |
---|---|---|---|
1 | test_driver | 接続文字列"DRIVER"の確認 | OK |
2 | test_affected_rows | DDL/DMLを発行してresult::affected_rows()の確認 | OK |
3 | test_batch_insert_integral | int型の配列の値をまとめてINSERTした後、SELECTして確認 | OK |
4 | test_batch_insert_string | std::string型の配列の値をまとめて、varchar(60)にINSERTする | OK |
5 | test_batch_insert_mixed | int, std::string, float型の配列の値をまとめて、int, varchar(60), float に INSERTする | OK |
6 | test_batch_insert_describe _param |
statement::describe_param()で値をまとめてINSERTする | OK |
7 | test_blob | バイト列をvarbinary(max)で格納 | OK |
8 | test_large_blob | ファイルをvarbinary(max)で格納 | OK |
9 | test_large_blob_geometry | STGeomFromText()でgeometryインスタンスを作成して格納 | OK |
10 | test_large_blob_geometry _with_bind_statement |
STGeomFromText()でgeometryインスタンスを作成してプレースホルダを経由 | OK |
11 | test_blob_with_varchar | 文字列をvarbinary(max)で格納 | OK |
12 | test_block_cursor_with _nvarchar |
2行INSERTした後、SELECT時にrowset_size=2として動作確認 | OK |
13 | test_block_cursor_with _nvarchar_and_first_row _null |
1行目がNULL値で2行INSERTした後、SELECT時にrowset_size=2として動作確認 | OK |
14 | test_block_cursor_with _nvarchar_and_second _row_null |
2行目がNULL値で2行INSERTした後、SELECT時にrowset_size=2として動作確認 | OK |
15 | test_blob_retrieve_out_of _order |
"Invalid Description Index"の発生を確認 ※元ネタはこちらとの事。 |
OK |
16 | test_catalog_list_catalogs | catalog::list_catalogs()の確認 データベース一覧 |
OK |
17 | test_catalog_list_schemas | catalog::list_schemas()の確認 スキーマ一覧 |
OK |
18 | test_catalog_columns | calalog::find_columns()の確認 カラム情報 |
OK |
19 | test_catalog_primary_keys | catalog::find_primary_keys()の確認 主キー情報 |
OK |
20 | test_catalog_tables | catalog::find_tables()の確認 テーブル情報 |
OK |
21 | test_catalog_table _privileges |
catalog::find_table_privileges()の確認 テーブルの権限 |
OK |
22 | test_column_descriptor | result::column_name(), result::column_datatype()等の確認 | OK |
23 | test_connection _environment |
connectionオブジェクトと接続環境の情報確認 | OK |
24 | test_dbms_info | connection::dbms_name(), connection::dbms_version()の確認 | OK |
25 | test_get_info | connection::get_info<T>()の確認 | OK |
26 | test_decimal_conversion | decimal型の変換精度の確認 | OK |
27 | test_exception | 実行時例外発生の確認 | OK |
28 | test_execute_multiple _transaction |
statement::prepare()で複数回実行 transaction付き |
OK |
29 | test_execute_multiple | statement::prepare()で複数回実行 | OK |
30 | test_integral | int型, float型, double precision型の確認 double precisionはfloat(53)のシノニム |
OK |
31 | test_move | connectionのstd::move()を確認 | OK |
32 | test_null | NULL値のバインド、NULL値判別の確認 | OK |
33 | test_nullptr_nulls | statement::bind()の第3パラメータにnullptrを指定時の動作確認 | OK |
34 | test_result_iterator | resultの各種イテレーション確認 | OK |
35 | test_simple | 接続から結果解析まで一連のテスト | OK |
36 | test_string | std::stringとvarchar型の確認 | OK |
37 | test_string_with_nvarchar _max |
std::stringとnvarchar(max)型の確認 | OK |
38 | test_string_with_varchar _max |
std::stringとvarchar(max)型の確認 | OK |
39 | test_string_with_ntext | std::stringとntext型の確認 | OK |
40 | test_string_with_text | std::stringとtext型の確認 | OK |
41 | test_string_vector | std::vector<std::string>で用意したパラメータをstatemet::bind_strings()でバインドする | OK |
42 | test_batch_binary | std::vector<std::vector<uint8_t>>で用意した複数行のバイト列をバインドする | OK |
43 | test_time | nanodbc::timeとtime型の確認 | OK |
44 | test_date | nanodbc::dateとdate型の確認 | OK |
45 | test_datetime | nanodbc::timestampとdatetime型の確認 | OK |
46 | test_decimal | decimal(19,4)型の精度確認 | OK |
47 | test_money | money型の精度確認 | OK |
48 | test_datetime2 | datetime2型の精度確認 | OK |
49 | test_datetimeoffset | datetimeoffset型の精度確認 | Failed |
50 | test_statement_with _empty_connection |
statementオブジェクトに空の接続を指定した場合の動作確認 | OK |
51 | test_transaction | transaction付きの一連の動作確認 | OK |
52 | test_while_not_end _iteration |
result::at_end()で判断してからresult::next()して処理 | OK |
53 | test_while_next_iteration | result::next()の戻り値で判断して処理 | OK |
- | test_async | Windowsのみ。 | - |
- | test_bind_variant | Windowsのみ。 | - |
Linux 環境での mssql_tests のテスト内容は、以上の 53 項目です。
意訳/異訳/省略してる箇所もありますが、テストの内容はこんな感じです。
2. test_datetimeoffset の失敗について
ソースコードを読むと、現在の nanodbc の仕様では、datetimeoffset 型の値は SQL_C_SS_TIMESTAMPOFFSET ではなく、SQL_C_TIMESTAMP として扱うようです。
その際、タイムゾーンに基づいたローカルタイムへの変換を引き起こす、との事。
テストでは datetimeoffset 型に '2006-12-30T13:45:12.345-08:00' をINSERTします。
この値は、日本のタイムゾーンに従って変換されると、日付が変わってしまいます。
・datetimeoffset_test.sql :
このクエリの実行結果がこちらです。
$ sqlcmd -Slocalhost -Usa -Pabcd1234$ -i datetimeoffset_test.sql
tz dt
--- ---------------------------------------------
2006-12-30 13:45:12.3450000 -08:00
PST 2006-12-30 13:45:12.3450000 -08:00
UTC 2006-12-30 21:45:12.3450000 +00:00
JST 2006-12-31 06:45:12.3450000 +09:00
これは、nanodbc というより Time Zone / Local Time の解釈の程度問題かと。
テストを通過するには、ソースコードの当該 REQUIRE を改変するしかないです。
3. 補足 : FreeTDS の ODBC ドライバの場合
Ubuntu 18.04 LTS のパッケージ tdsodbc (1.00.82) でも試してみました。
詳細は省きますが、テストの 53 項目中 23 項目が失敗します。
試してませんが、本家 FreeTDS stable版 1.1.26 だと、結果が異なるかもしれません。
....
FreeTDS の名誉の為に書きますが、私はこの結果をあまり問題視していません。
テストの REQUIRE と実行結果の差異は、nanodbc 利用時の挙動を確認する手段でしかない、という認識です。
実際、 tdsodbc は細かい部分で、MS 版 ODBC ドライバとは挙動が異なります。
例えば、#46 test_deciaml の件では、数値型 decimal(19,4) を受ける際、64bit 固定小数で扱える最大値・最小値を評価します。
MS 版 ODBC は文字列と同じですが、tdsodbc では数値として double で丸めた後に文字列化した値と同じになり、評価としては小数部の一部が欠落したように見えます。
C++のプリミティブ型に 64bit 固定小数型が存在しない以上、受けた値をどのように扱うかは Coder 次第かなと。
続きはこちら
- UbuntuでnanodbcからSQLServerに接続する #1 - 導入編
- UbuntuでnanodbcからSQLServerに接続する #2 - テスト編
- UbuntuでnanodbcからSQLServerに接続する #3 - 追試編 ←続き
UbuntuでnanodbcからSQLServerに接続する #1 - 導入編
C++ で ODBC 接続するのに便利な nanodbc (http://nanodbc.io/) という C++ wrapper が MIT ライセンスで公開されています。
nanodbc は Windows だけでなく Linux や macOS 環境にも対応しています。
私も Ubuntu に環境を用意して試してみました。
1. 環境
- Ubuntu Desktop 18.04.4 LTS 日本語Remix (Linux Kernel 5.3.0-46-generic)
- SQL Server 2019 (RTM-CU4) (KB4548597) - 15.0.4033.1 (X64) on Linux
- MS 版 ODBC ドライバ version 17.5.2
- unixODBC 2.3.7
- g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
- git version 2.17.1
- cmake version 3.17.20200324-gc98ec36
次の過去記事も前提としています。
2. 準備
(1) 作業ディレクトリ
$ cd ~
$ mkdir work
$ cd work
(2) リポジトリのクローン
$ git clone https://github.com/nanodbc/nanodbc.git
(3) ビルド用ディレクトリの準備
$ cd nanodbc
$ mkdir build
$ cd build
$ pwd
/home/dareka/work/nanodbc/build
以降の操作は、このディレクトリで作業します。
3. ビルド
(1) Makefile 生成
CMake のオプションで共有ライブラリの構築を指定します。
$ cmake -DBUILD_SHARED_LIBS=ON ..
-- The CXX compiler identification is GNU 7.5.0
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- nanodbc version: 2.13.0
-- nanodbc compile: C++14
-- Performing Test CXX_SUPPORTS_STDLIB
-- Performing Test CXX_SUPPORTS_STDLIB - Failed
-- nanodbc build: Disable linking libc++ - OFF
-- nanodbc feature: ODBC Version Override - OFF
-- nanodbc feature: Disable async features - OFF
-- nanodbc feature: Enable Unicode - OFF
-- nanodbc feature: Enable Boost - OFF
-- nanodbc feature: Enable SQL_NO_DATA bug workaround - OFF
-- nanodbc build: ODBC on Unix - unixODBC
-- ODBC compile flags: -I/usr/include -DHAVE_UNISTD_H -DHAVE_PWD_H -DHAVE_SYS_TYPES_H -DHAVE_LONG_LONG -DSIZEOF_LONG_INT=8
-- ODBC link flags:
-- nanodbc build: Enable nanodbc target - SHARED
-- nanodbc build: Disable install target - OFF
-- nanodbc build: Disable tests target - OFF
-- nanodbc build: Disable examples target - OFF
-- Configuring done
-- Generating done
-- Build files have been written to: /home/dareka/work/nanodbc/build
(2) 共有ライブラリ構築
$ make nanodbc
Scanning dependencies of target nanodbc
[ 50%] Building CXX object CMakeFiles/nanodbc.dir/nanodbc/nanodbc.cpp.o
[100%] Linking CXX shared library lib/libnanodbc.so
[100%] Built target nanodbc
後はインストールすれば完了ですが、念の為、テストを実行します。
テストが不要であれば、「5. インストール」に進みます。
4. テスト
SQL Server に接続してテストを実行します。
テスト内容の都合により、後述のテストは DSN-less で実施します。
なお、実際に nanodbc を使用する際は DSN 指定でも問題ありません。
(1) テスト実行ファイル生成
私が必要なのは mssql_tests だけですが、とりあえず対象をすべてビルドします。
$ make tests
テストを絞るなら~/work/nanodbc/test/CMakeLists.txt
の44行目をset(test_list mssql)
にしてから cmake すると幸せになれるかもしれません。
(2) テスト用データベース作成
nanodbc のテストでは、実行時に必要なテーブルを作成します。(多分48個)
対象は指定されたデータベースコンテキストになります。
特に指定しない場合、既定のデータベースコンテキストは master です。
データベースを汚したくなければ、テスト用データベースを用意した方が無難です。
コマンドラインツールがインストール済みであれば、 sqlcmd コマンドでデータベース 'my_test_db' を作成します。
$ sqlcmd -Slocalhost -Usa -Pabcd1234$ -Q"IF DB_ID (N'my_test_db') IS NULL CREATE DATABASE my_test_db"
または、unixODBC の isql コマンドでも作成できます。
$ echo "IF DB_ID (N'my_test_db') IS NULL CREATE DATABASE my_test_db" | isql -b -k "DRIVER={ODBC Driver 17 for SQL Server};Server=localhost;UID=sa;PWD=abcd1234$"
なお、テスト中にCREATE DATABASE
が存在しますが、すぐにDROP DATABASE
するので流用はできません。
(3) テスト実行
SQLServer 用のテストだけ実行するように、環境変数を調整します。
接続先のデータベースには、先程作成した 'my_test_db' を指定します。
$ export NANODBC_TEST_CONNSTR_MSSQL='DRIVER={ODBC Driver 17 for SQL Server};Server=localhost;UID=sa;PWD=abcd1234$;Database=my_test_db'
$ export CTEST_OUTPUT_ON_FAILURE=1
続いてテストを実行します。
mssql_tests 以外の実行結果は無視します。
$ make test
Running tests...
Test project /home/dareka/work/nanodbc/build
Start 1: utility_tests
1/6 Test #1: utility_tests .................... Passed 0.00 sec
Start 2: mssql_tests
2/6 Test #2: mssql_tests ......................***Failed 25.52 sec
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mssql_tests is a Catch v2.4.2 host application.
Run with -? for options
-------------------------------------------------------------------------------
test_datetimeoffset
-------------------------------------------------------------------------------
/home/dareka/work/nanodbc/test/mssql_test.cpp:765
...............................................................................
/home/dareka/work/nanodbc/test/mssql_test.cpp:792: FAILED:
REQUIRE( t.day == 30 )
with expansion:
31 == 30
===============================================================================
test cases: 53 | 52 passed | 1 failed
assertions: 17491 | 17490 passed | 1 failed
Start 3: mysql_tests
〜(以下、省略)〜
mssql_test のテスト 53 項目中、失敗したテストが1つありますが、これは想定内です。
datetimeoffset 型の値が日本のタイムゾーンに従って変換される際、日付が変わる事を想定していないだけです。よって、このテストはパス済みと見なしました。
MS 版 ODBC ドライバは中々の成績です。
成績と表現しましたが、このテストはドライバの優劣を競うものではないです。
ドライバの特性を確認して、それを考慮した不具合のないコードを書くのが目的なので、想定の範囲や期待値を決定する為の一助だと思ってます。
5. インストール
共有ライブラリやヘッダ等をインストールします。
$ sudo make install
[ 6%] Built target nanodbc
[ 17%] Built target mssql_tests
〜(ざっくり省略)〜
[100%] Built target example_empty
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/lib/libnanodbc.so.2.13.0
-- Installing: /usr/local/lib/libnanodbc.so
-- Installing: /usr/local/include/nanodbc/nanodbc.h
-- Installing: /usr/local/cmake/nanodbc-config.cmake
-- Installing: /usr/local/cmake/nanodbc-config-noconfig.cmake
これで、nanodbc の共有ライブラリが使えるようになりました。
続きはこちら
- UbuntuでnanodbcからSQLServerに接続する #1 - 導入編
- UbuntuでnanodbcからSQLServerに接続する #2 - テスト編 ←続き
- UbuntuでnanodbcからSQLServerに接続する #3 - 追試編