mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

C++ - MariaDB(MySQL) への接続!

[ プログラミング ] [ C言語, MariaDB, MySQL ]

こんばんは。

C++ から MariaDB(MySQL) へ接続する方法についての記録です。

(C++ にそれほど精通している訳でもありません。ご承知おきください)

0. 前提条件

  • Linux Mint 17 での作業を想定。
  • libmysqlclient-dev パッケージを使用するのでインストール済みであること。
  • g++(c++) のバージョンは 4.8.2
  • MySQL 5.6.19 へ接続することを想定。(MariaDB も同様)
  • MySQL サーバのポートはデフォルトの 3306 を想定。

1. C++ ソースコード作成

以下のようにソースコードを作成してみた。(最低限これだけ知っていれば大丈夫であろうという基本的なコーディング)
他に知りたいことがあれば後述の参考サイト等で調べてみればよい。

(ちなみに、以下のソースコードでは “mysql” スキーマに存在するテーブル名を取得している)

Mysql.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/*
 * Example to connect to MariaDB(MySQL)
 */
#include <iostream>
#include <mysql/mysql.h>
#include <string>

using namespace std;

/*
 * [CLASS] Process
 */
class Proc
{
    const char* MY_HOSTNAME;
    const char* MY_DATABASE;
    const char* MY_USERNAME;
    const char* MY_PASSWORD;
    const char* MY_SOCKET;
    enum {
        MY_PORT_NO = 3306,
        MY_OPT     = 0
    };
    MYSQL     *conn;
    MYSQL_RES *res;
    MYSQL_ROW row;

public:
    Proc();           // Constructor
    bool execMain();  // Main Process
};

/*
 * Proc - Constructor
 */
Proc::Proc()
{
    // Initialize constants
    MY_HOSTNAME = "localhost";
    MY_DATABASE = "mysql";
    MY_USERNAME = "root";
    MY_PASSWORD = "7621mizuiko3701";
    MY_SOCKET   = NULL;
}

/*
 * Main Process
 */
bool Proc::execMain()
{
    try {
        // Format a MySQL object
        conn = mysql_init(NULL);

        // Establish a MySQL connection
        if (!mysql_real_connect(
                conn,
                MY_HOSTNAME, MY_USERNAME,
                MY_PASSWORD, MY_DATABASE,
                MY_PORT_NO, MY_SOCKET, MY_OPT)) {
            cerr << mysql_error(conn) << endl;
            return false;
        }

        // Execute a sql statement
        if (mysql_query(conn, "SHOW TABLES")) {
            cerr << mysql_error(conn) << endl;
            return false;
        }

        // Get a result set
        res = mysql_use_result(conn);

        // Fetch a result set
        cout << "* MySQL - SHOW TABLES in `"
             << MY_DATABASE << "`" << endl;
        while ((row = mysql_fetch_row(res)) != NULL)
            cout << row[0] << endl;

        // Release memories
        mysql_free_result(res);

        // Close a MySQL connection
        mysql_close(conn);
    } catch (char *e) {
        cerr << "[EXCEPTION] " << e << endl;
        return false;
    }
    return true;
}

/*
 * Execution
 */
int main(){
    try {
        Proc objMain;
        bool bRet = objMain.execMain();
        if (!bRet) cout << "ERROR!" << endl;
    } catch (char *e) {
        cerr << "[EXCEPTION] " << e << endl;
        return 1;
    }
    return 0;
}

2. C++ ソースコードのコンパイル

以下のようにしてコンパイルする。

1
$ g++ -Wall -O2 -o Mysql Mysql.cpp -I/usr/local/mysql/include -L/usr/local/mysql/lib -lmysqlclient

もしくは、以下のように mysql_config を使用して include, lib ディレクトリのオプション文字列を取得してもよい。

1
$ g++ -Wall -O2 -o Mysql Mysql.cpp $(mysql_config --cflags) $(mysql_config --libs)

エラーが出力されなければ成功である。

3. 実行

実際に実行してみる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$ ./Mysql
* MySQL - SHOW TABLES in `mysql`
columns_priv
db
event
func
general_log
help_category
help_keyword
help_relation
help_topic
innodb_index_stats
innodb_table_stats
ndb_binlog_index
plugin
proc
procs_priv
proxies_priv
servers
slave_master_info
slave_relay_log_info
slave_worker_info
slow_log
tables_priv
time_zone
time_zone_leap_second
time_zone_name
time_zone_transition
time_zone_transition_type
user

4. 参考サイト


 

以上。

Comments