mysqliteリファレンス

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
Mysqliteクラス
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
-
Mysqliteの本体です。
関数によっては、専用に用意されたクラスMysqlite_resultに結果を出力します。
-
// exp.mysqliteの変数を用意

Mysqlite mysqlite;

-
-
-

                              • -

Mysqlite::
Mysqlite::(char *dbname)

                              • -

-
コンストラクタです。
dbnameを渡すと、生成時にMysqlite::openを行います。
この場合、戻り値を受け取ることができませんが、openの失敗時には、getLastStatusにて判定できます。
-
-
-

                              • -

int Mysqlite::getLastStatus()

                              • -

-
最後のステータスをintにて受け取ります。
戻り値は、sqliteのステータス(SQLITE_OK他)です。
-
-
-

                              • -

std::string Mysqlite::getLastError()

                              • -

-
最後のエラー内容をstd::stringにて受け取ります。
Mysqlite::getLastStatusや、各種関数のステータスの戻り値がSQLITE_OK以外の場合、
この関数を使用して、詳細なエラー内容を取得できます。
-
-
-

                              • -

std::string Mysqlite::getLastCommand()

                              • -

-
最後のコマンドをstd::stringにて受け取ります。
-
Mysqlite::exec
Mysqlite::exec_format
Mysqlite::get_table
Mysqlite::get_format

以上の関数を実行した際に発行したクエリ―が格納されます。
(※format内容が展開されて表示されるため、デバッグ時に有用です)
-
-
-

                              • -

int Mysqlite::open(char *dbname)

                              • -

-
sqliteをオープンします。
dbnameにオープンしたいデータベース名(データベースファイル)を指定してください。
戻り値は、sqliteのステータスです。
-
-
-

                              • -

int Mysqlite::close()

                              • -

-
sqliteをクローズします。
デストラクタにて、closeを発行していますが、
基本的には、openした際には、任意のタイミングで閉じてください。
戻り値は、sqliteのステータスです。
-
-
-

                              • -

int Mysqlite::exec(const char *sql, int (*callback)(void*,int,char**,char**) = NULL, void *p = NULL)

                              • -

-
sqliteのコマンドを実行します。
int sqlite3_exec(const char *sql, int (*callback)(void*,int,char**,char**), void *p, char **errmsg)
に渡し、メモリ解放箇所を自動化しています。
errmsgは、Mysqlite::getLastErrorにて取得できます。
callback、pはデフォルトではNULLを入れているため、sqlのみで使用可能です。
戻り値は、sqliteのステータスです。
-
-
-

                              • -

int Mysqlite::exec_format(const char * format, ...)

                              • -

-
sqliteのコマンドを実行します。
可変長引数にて渡します。
書式はprintf、sprintf等と同じもので記述できます。
結果取得が必要な場合はMysqlite::get_formatを実行ください。
戻り値は、sqliteのステータスです。
-

// exp.テーブルに値を加える
Mysqlite mysqlite("test.db");
if (mysqlite.getLastStatus() == SQLITE_OK) {
 // テーブルに要素を追加
 mysqlite.exec_format("INSERT INTO %s VALUES(%d, '%s')", table_name, id, name);
 if (mysqlite.getLastStatus() != SQLITE_OK) {
  // エラーの場合はエラーを表示
  puts(mysqlite.getLastError().c_str());
 }
 mysqlite.close();
}

-
-
-

                              • -

int Mysqlite::get_table(const char *aSql, char **pazResult, int *pnRow, int *pnColumn)

                              • -

-
sqliteのコマンドを実行します。
int sqlite3_get_table(const char *aSql, char **pazResult, int *pnRow, int* pnColumn, char **pzErrmsg)
に渡し、メモリ解放箇所を自動化しています。
errmsgは、Mysqlite::getLastErrorにて取得できます。
戻り値は、sqliteのステータスです。
-
-
-

                              • -

int Mysqlite::get_format(Mysqlite_result * result, const char * format, ...)

                              • -

-
sqliteのコマンドを実行し、resultに実行結果を取得します。
可変長引数にて渡します。
書式はprintf、sprintf等と同じもので記述できます。
戻り値は、sqliteのステータスです。
-

// exp.結果を取得してカラムのnameをstdoutに出力
Mysqlite_result result;
Mysqlite mysqlite("test.db");
if (mysqlite.getLastStatus() == SQLITE_OK) {
 if (mysqlite.exec_format(&result, "SELECT * FROM %s", table_name) == SQLITE_OK) {
  for (int i = 0; i < result.size_row(); i++) {
   // カラムのnameをputsにて出力
   puts(result.get_column(i, "name").c_str());
  }
 }
 mysqlite.close();
}

-
-
-

                              • -

int Mysqlite::begin()
int Mysqlite::commit()
int Mysqlite::rollback()

                              • -

-
トランザクション関連を関数にて実行します。
戻り値は、sqliteのステータスです。
-
-
-

                              • -

bool Mysqlite:full_column_names(bool flag)

                              • -

-
デフォルトでは、コマンド実行時に1行目のrowで取得できるカラム名は「カラム名」のみになっています。
「テーブル名.カラム名」としたい場合には、この関数のflagにtrueを渡して実行します。
-
-
-
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
Mysqlite_resultクラス
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
-
Mysqlite::get_format使用時に、結果を受け取るために使用するクラスです。
Mysqliteにて内部使用する関数以外のものを記述します。
-
-
-

                              • -

void Mysqlite_result::clear()

                              • -

-
格納されていた各種要素を除去します。
-
-
-

                              • -

int Mysqlite_result::size_column()

                              • -

-
格納されたカラム数を返します。
戻り値は、カラム数(int)です。
-

// exp.カラム数をstdoutに表示
Mysqlite_result result;
Mysqlite mysqlite("test.db");
if (mysqlite.getLastStatus() == SQLITE_OK) {
 if (mysqlite.exec_format(&result, "SELECT * FROM %s", table_name) == SQLITE_OK) {
  // *にて、すべてのカラムを取得した場合も正常なカラム数がわかる
  printf("カラムの数は%d個", result.size_column());
 }
 mysqlite.close();
}

-
-
-

                              • -

int Mysqlite_result::size_row()

                              • -

-
格納された行数を返します。
この値で取得した分だけforで回せば、すべての結果のテーブルを取得できます。
戻り値は、行数(int)です。
-

// exp.全ての要素をstdoutに表示
Mysqlite_result result;
Mysqlite mysqlite("test.db");
if (mysqlite.getLastStatus() == SQLITE_OK) {
 if (mysqlite.exec_format(&result, "SELECT * FROM %s", table_name) == SQLITE_OK) {
  // 要求したテーブル数
  printf("結果は%d行", result.size_row());
  for (int i = 0; i < result.size_row(); i++) {
   if (i) putc('\n', stdout);
   for (int j = 0; j < result.size_column(); j++) {
    // 要素出力
    printf("%s,", get_column(i, j).c_str());
   }
  }
 }
 mysqlite.close();
}

-
-
-

                              • -

std::string Mysqlite_result::get_column(int position_row, int position_column)

                              • -

-
対応する行と、カラム位置にある値をstd::stringにて取得します。
Mysqlite_result::size_row、Mysqlite_result::size_columnにて取得した以上の値を渡してはいけません。
戻り値は、結果の文字列(std::string)です。
-
// Mysqlite_result::size_rowをご覧ください。
-
-
-

                              • -

std::string Mysqlite_result::get_column(int position_row, std::string name)

                              • -

-
対応する行と、カラム名をstd::stringにて取得します。
Mysqlite_result::size_rowにて取得した以上の値を渡してはいけません。
nameは、CREATE TABLEにて付けたカラム名です。
Mysqlite::full_column_names(true)を実行した際は、
nameに「テーブル名.カラム名」にて要求することも可能です。
戻り値は、結果の文字列(std::string)です。
-

// exp.テーブルの要素name,addressをstdoutに表示
Mysqlite_result result;
Mysqlite mysqlite("test.db");
if (mysqlite.getLastStatus() == SQLITE_OK) {
 if (mysqlite.exec_format(&result, "SELECT name,address FROM %s", table_name) == SQLITE_OK) {
  for (int i = 0; i < result.size_row(); i++) {
   // カラムのnameをputsにて出力
   printf("名前は%s,", result.get_column(i, "name").c_str());
   printf("住所は%sだよ!\n", result.get_column(i, "address").c_str());
  }
 }
 mysqlite.close();
}

-
-
-
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
Mysqlite_rowクラス
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
-
Mysqlite_resultクラス内にて、内部処理するためのクラスです。
ただし、これを利用することにより、結果のカラム名を取得することができます。
ここでは、カラム名を取得するための関数を記述します。
-
-
-

                              • -

std::string Mysqlite_row::get_column(position)

                              • -

-
位置に格納された文字列を取得します。
戻り値は、文字列(std::string)です。
-

// exp.結果のカラム名をstdoutに表示
Mysqlite_result result;
Mysqlite mysqlite("test.db");
if (mysqlite.getLastStatus() == SQLITE_OK) {
 if (mysqlite.exec_format(&result, "SELECT * FROM %s", table_name) == SQLITE_OK) {
  for (int i = 0; i < result.size_column(); i++) {
   // headerには、カラム名が格納されているので、カラム全てを表示
   puts(result.header.get_column(i).c_str());
  }
 }
 mysqlite.close();
}

-
-
-

テーブル名を付加して、カラム名を取得する場合

LEFT OUTER JOIN などを使用して、テーブルを連結する場合、カラム名が重複して困ってしまう時がある。
その場合、テーブル名.カラム名として取得できればいいのだが、デフォルトではカラム名しか取得できない。
で、取得する方法。

PRAGMA full_column_names = ON;

をすればいいというのは、載っているが、何気に、これだけでは、カラム名のみしか出ない罠。
では、実際に、表示させるにはどうしたらよいか……。

PRAGMA short_column_names = OFF;
PRAGMA full_column_names = ON;

これで、うまくいく。
つまり、ショートの機能を殺して、フルの方の機能を活かす……という感じか。
本家の英語をさらっと読んだだけであやふやだけど、やってみたらうまくいったので、多分大丈夫なはず!

sqliteクラス化(改)


ソースを一部修正。
修正した以下の内容にて動作確認をしてみた。
きちんと動く……はず。
利点は、コラム名で、stringのデータをすっぱ抜けるところ……かな。
あと、可変長でコマンドを渡せるから、何かいい感じかも。
newの箇所が若干不安ではある……。
このクラスを利用したサンプルソースを後日に載せる予定。



2010/04/02
仕様変更のため、後悔していたソースをいったん削除……。

つれづれ

Android……やっぱ実機がないと、開発意欲が出ない。><
対応のケータイを買ったら、開発しようという勢い。
まあでも、添付されていたJavaのソースを眺めていたら、いろいろと勉強になった。
overrideで機能を実装していくのがスタンダードなのかな。
いつもC++で、コアの部分から作っているので、
基本的な箇所が用意されているうJavaの開発工程がとても新鮮に感じる。


のんびりと、次のゲームの開発に着手。
作りたいゲームがたくさんあってそのうちの一つだ。
最初にして最大級の山場で躓きそう……ううう。
紙に丸やら四角やらを書いて、ああでもないこうでもないと四苦八苦。
AがBに含まれて、Cを除いて……何だか集合の問題を解いている気分になる……頭痛が痛い。
この手の問題をいともたやすくプログラミング出来たらいいのにな。><


全然関係ないけど、最近、海野十三の小節を読み漁っている。
軍事物やら、SFやら。
この時代の作家は、とても魅力的だね!


あ、あけおめことよろ。

つれづれ

ちょっと、ゆとりができたので、いろいろと模索していた。
Androidというのを教えてもらったので調べてみた。
Googleケータイ用の開発言語。
Windows用の開発キッド(SDK)がフリーで手に入るよ、これはすごい!
iPhoneは、SDKMacOSではないと駄目だったが、
これなら、手が出せそうな気がした……JAVAだけどね!
とりあえず、環境を作ってサンプルソースコンパイルまではしてみたが、
Cしかできないオレにはハードルが高い……うう。
でもまあ、エミュレータも付いているし、
時間がとれたら、関数群を調べつつ、なんか作ってみたいな、コンテストもあるみたいだし。
で、このAndroidを調べていて、自分的にクリティカルな発見。
というのが本題。


それは、SQLite
調べてみると、サーバに依存しない(ファイル一つに対してオープンする)形で、SQLが使用可能らしい。
しかも、パブリックドメイン
こんな便利なものがあったのかと、びっくり。
で、早速、いじってみた。


http://www.dbonline.jp/sqlite/index.html


このサイトで、仕様を斜め読み。
MYSQLのような使い方でいける。
多少違うとはいえ、ほぼ同じ感覚でクエリーを発行できるよ、これはすごい。
しかも、型が緩いから、Luaとの親和性が高いかも。
今まで苦労して、ファイル間の連携処理を作っていたが、
C++のクラスから、クエリーを叩くようにすれば、
バイト位置とか考えずにガンガン書込読込処理が出来そうだ。
と、夢が広がる。


具体的にいうと、武器をテーブルにしておいて、
主人公が、アイテム’鉄の剣’を持っていたなら、
その’鉄の剣’で、クエリーを走らせれば、一発で武器の詳細情報を取得できる。
主人公の所持品テーブルに対してLEFT OUTER JOINしてもいいし、都度読みだしても良い。


ほかの例でいうなら、シューティングのランキング。
エントリーのテーブルを一つこしらえておけば、
得点、日付順でORDER BYのDESCをすれば、一発で、ランキングを作ることができる。


.outputで、いろいろな仕様に吐き出せたり、
トランザクションも出来たりと何かと便利な機能が盛り沢山。


ただ一つ、気になったのが、
今のところ、COLUMNのDROPとCHANGEが出来ないようだ……。
ググってみたら、やはり出来ないという記述を見つけた。
ADDができるのに、なぜか削除が出来ない謎。
まあ、出力と取り込みが容易にできる設計上、
テンポラリのテーブルを介して受け渡し出来るから、問題ない……ということかな……うーん。
今後のバージョンアップで機能が付いてほしいな!


SQLiteは、ググっても日本語の記述が少ないが、いろいろなところで利用可能らしい。
話の糸口となったAndroidはもとより、iPhonePHPPythonとかでも標準対応されているとか。
まあ、これだけ便利なら、さすがに機能として付けるよね、さすがに。
Luaは、最小限をウリにしているから、
きっと、別の人が機能を提供するという形になりそう。
まあ、SQLiteのバージョンの都度、
受け側自身も変えないといけないのは目に見えているから、Luaの姿勢はすばらすい〜。


ながながとなったが、便利この上ないから、自分も積極的に使うよ!
まだ、Cのソース側では、データベースのopenとcloseが成功したというテストしかしてないけどね!

フリクラ結果

IKAROS、1位だった。
プレイしてくださった方どうもありがとう!


コメントを見ると、操作性が悪いという意見がチラホラ。
アクション性とマウス操作の相性が良くなかったのかもしれない……。
貴重なご意見ありがとう。


あと、起動できないというコメントを2ついただいた。
原因は、なんだろう……。
我が家にあるもう一台のパソコン(XP)では、エラーが出なかった。
最新のDirectXを当てていただいたというのに起動出来なかったということは……DirectXの問題ではないのかも。
となると、LuaかPxtoneのdllを読み込んだ際に、失敗してるのかな。
それとも、accessとかのマイナーな関数を使ったからかな?
自分の状況下では発生しないので、どの時点でエラーを吐いているかの検証(ログ出力)が出来ないのが悲しい……。