山水堂@はてな

2010-04-05

[]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();
}

-

-

-

2010-04-04

2010-04-02

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

LEFT OUTER JOIN などを使用して、テーブルを連結する場合、カラム名が重複して困ってしまう時がある。

その場合、テーブル名.カラム名として取得できればいいのだが、デフォルトではカラム名しか取得できない。

で、取得する方法。

PRAGMA full_column_names = ON;

をすればいいというのは、載っているが、何気に、これだけでは、カラム名のみしか出ない罠。

では、実際に、表示させるにはどうしたらよいか……。

PRAGMA short_column_names = OFF;

PRAGMA full_column_names = ON;

これで、うまくいく。

つまり、ショートの機能を殺して、フルの方の機能を活かす……という感じか。

本家の英語をさらっと読んだだけであやふやだけど、やってみたらうまくいったので、多分大丈夫なはず!

2010-02-16

[][]sqliteクラス化(改)


ソースを一部修正。

修正した以下の内容にて動作確認をしてみた。

きちんと動く……はず。

利点は、コラム名で、stringのデータをすっぱ抜けるところ……かな。

あと、可変長でコマンドを渡せるから、何かいい感じかも。

newの箇所が若干不安ではある……。

このクラスを利用したサンプルソースを後日に載せる予定。



2010/04/02

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

2010-01-14

[]つれづれ

Android……やっぱ実機がないと、開発意欲が出ない。><

対応のケータイを買ったら、開発しようという勢い。

まあでも、添付されていたJavaのソースを眺めていたら、いろいろと勉強になった。

overrideで機能を実装していくのがスタンダードなのかな。

いつもC++で、コアの部分から作っているので、

基本的な箇所が用意されているうJavaの開発工程がとても新鮮に感じる。


のんびりと、次のゲームの開発に着手。

作りたいゲームがたくさんあってそのうちの一つだ。

最初にして最大級の山場で躓きそう……ううう。

紙に丸やら四角やらを書いて、ああでもないこうでもないと四苦八苦。

AがBに含まれて、Cを除いて……何だか集合の問題を解いている気分になる……頭痛が痛い。

この手の問題をいともたやすくプログラミング出来たらいいのにな。><


全然関係ないけど、最近、海野十三の小節を読み漁っている。

軍事物やら、SFやら。

この時代の作家は、とても魅力的だね!


あ、あけおめことよろ