sol2: SQLite3を扱うC関数を呼び出して結果をコンテナvectorで返す
sol2を使う練習として、LuaからSQLite3を操作するプログラムを作成した。
実装の概要
SQLite3を操作するクラス
今回は、sqlite3.cをプロジェクトに取り込む方法で使う。
一部抜粋:
class CLuaSQLite { private: sqlite3* _db; sqlite3_stmt* _stmt; public: CLuaSQLite(); void debug(const std::string& msg); int open(const std::string& filename); void close(); void exec(const std::string& query); ResultData select(const std::string& query); };
上記のクラスをユーザデータとして登録する
lua.new_usertype<CLuaSQLite>("sqlite3", sol::constructors<CLuaSQLite()>(), "debugPrint", &CLuaSQLite::debug, // "open", &CLuaSQLite::open, "close", &CLuaSQLite::close, "exec", &CLuaSQLite::exec, "select", &CLuaSQLite::select );
Luaからの呼び出し
function runMain() local sq = sqlite3.new(); sq:debugPrint("runMain() from Lua"); -- SQLite3の操作をテストする local ret = sq:open("test.sqlite"); if ret == 1 then -- error print("データベースのオープンに失敗した"); end -- 書き込み sq:exec("create table personal(id, name, age);"); --[[ sq:exec("insert into personal values ('aaa', 'bbb', 99);"); --]] -- 読み込み local selStmt = "select * from personal;"; local selResult = sq:select(selStmt); -- 結果を出力してみる print("[Lua] 結果を出力してみる"); for i, v in pairs(selResult) do -- v : rowdata print("select......"..i); for ri, rv in pairs(v) do print(" rowdata......type: "..rv:getType()..", "..rv:getColName()); if (rv:getType() == 1) then print(" data: "..rv:getInteger()); elseif (rv:getType() == 3) then print(" data: "..rv:getText()); end end end sq:close(); sq:debugPrint("end."); end
戻り値をコンテナ: vectorで返す
ユーザデータとするクラスを作り、クラス内に戻り値にするvectorを定義する。 ネストも可能。
ソースコードの一部抜粋
struct ResultData { private: // 戻り値 std::vector<rowData> _record; public: ResultData(){} // row set void setRow(rowData rd){ _record.emplace_back(rd); } using value_type = decltype(_record)::value_type; using iterator = decltype(_record)::iterator; using size_type = decltype(_record)::size_type; iterator begin() { return iterator(_record.begin()); } iterator end() { return iterator(_record.end()); } size_type size() const noexcept { return _record.size(); } size_type max_size() const noexcept { return _record.max_size(); } void push_back(rowData value) { _record.push_back(value); } bool empty() const noexcept { return _record.empty(); } };
上記ユーザデータの登録
lua.new_usertype<ResultData>("result_data", sol::constructors<ResultData()>(), "iterable", [](ResultData& rd) { return sol::as_container(rd); } );
一応の実行結果
参考
はてなで、ソースコードを載せる
Markdown記法で、ソースコードを記事に載せるテスト
参照: ソースコードを色付けして表示する(シンタックスハイライト) - はてなブログ ヘルプ
Markdown
``` で囲む
#include <iostream> void main(){ std::cout << "Hello World !!!" << std::endl; }
GitHub
スクリプトを貼り付ける
<pre>
#includevoid main(){ std::cout << "Hello World !!!" << std::endl; }
SDL2のチュートリアルを勉強している投稿記事を改善しよう
2017/10/13現在、ゲームを制作したいと思って勉強しています。 プログラミングの経験はあるので軽い気持ちではじめたのは事実でございます。 がしかし、必要な知識は多岐にわたり、かつ深淵のごとく深い。 かるく絶望をいだきはしましたが、少しずつ出来ることからやっていこうと 思う次第です。
まずは、プログラムに使う言語とライブラリを決めました。 C++とSDL2の組み合わせでゲームを作る上での勘どころが感じられればと。
SDL2のチュートリアルが公開されているのですが、自分が別に運営しているサイトで 軽くまとめながら勉強&投稿しています。
これが本題なのですが記事を見直してみると、これがまたヒドイ。 内容がナイヨー・・・。あまりに見苦しいので、改善点をまとめて次に活かしたいと思います。
画像を入れよう
文字のみだとイメージを掴みにくいし、見栄えが悪いので 積極的に入れていきたい。
- アイキャッチ
- 動作イメージ
- チャート
語句、概念などの説明を入れよう
今は分かっているつもりでも、時間を忘れてしまうのが人というもの。 ひっかかりがあったものを中心として丁寧に文章で残しておこう。
サンプルプログラムを自分で書こう
チュートリアルでは解説に使われているソースコードがダウンロードできるところが 多いです。しかしながら、これを動かしただけで出来るつもりになるのが怖いです。 そのまま自分の記事にコードを載せるのも問題がありますしね。
ある程度参考にしながら、自分なりにコードを書き説明を残す。コードが長くなったら ダウンロード出来るように、GitHubを使う予定です。
運営しているサイトのリンクです。user1になっていますが、これテストで自分でやったものです お恥ずかしい・・・。