2016년 5월 21일 토요일

C/C++ mysql connector 사용하기

예전에 만들어둔 코드..


우선 처음 사용해보시는 분들을 위해...

사용하시기 위해서는 아래 링크에서 해당 mysql connector API를 설치하시거나,

압축 파일을 받아서 푸시고 경로를 지정하시거나 하나를 선택해서 하시면 됩니다.

https://www.mysql.com/products/connector/


아래에 코드는 멀티 스레드 환경에서 동기화 작업은 고려되지 않았어요 ~_~/


pika_library_mysql_connector.h
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
#ifndef PIKA_LIBRARY_MYSQL_CONNECTOR_H_
#define PIKA_LIBRARY_MYSQL_CONNECTOR_H_
// # MySqlConnector class
// DB 사용을 위한 클래스다.
// 멀티스레드 환경에서 사용에 대한 동기화는 고려되어 있지 않다.
// [NOTICE]
// - MySQL 관련 폴더를 프로젝트 속성 추가 인클루드 폴더에 설정해야된다.
// - time.h 를 사용하는 경우, timesepc 에 대해 redefinition 되었다는 에러가 뜰 수 있다.
// - mysql - connector - c - 6.1.6 - winx64 버전으로 작업 진행함.
#include <tchar.h>
#include "C:\mysql-connector-c-6.1.6-winx64\include\my_global.h"
#include "C:\mysql-connector-c-6.1.6-winx64\include\mysql.h"
#include "C:\mysql-connector-c-6.1.6-winx64\include\errmsg.h"
#pragma comment (lib, "libmysql.lib")
// 일시적으로 연결 오류 또는 끊어질 수 있는 에러들
//CR_SOCKET_CREATE_ERROR
//CR_CONNECTION_ERROR
//CR_CONN_HOST_ERROR
//CR_SERVER_GONE_ERROR
//CR_TCP_CONNECTION
//CR_SERVER_HANDSHAKE_ERR
//CR_SERVER_LOST
//CR_INVALID_CONN_HANDLE
namespace pika_library
{
    const int kQueryMaxLength = 2048;
    class MySqlConnector
    {
    public:
        explicit MySqlConnector(char *db_ip, char *user, char *password, char *db_name, int db_port);
        virtual ~MySqlConnector();
        bool        ConnectDB();
        bool        DisconnectDB();
        bool        Query(WCHAR *QueryFormat, ...);
        MYSQL_ROW   FetchRow();
        void        FreeResult();
    private:
        MYSQL       conn_;
        MYSQL       *conn_pointer_;
        MYSQL_RES   *sql_result_pointer_;
        char    db_ip_[16];
        char    db_user_[64];
        char    db_pw_[64];
        char    db_name_[64];
        int     db_port_;
        bool    connect_flag_;
        WCHAR   wchar_query_[kQueryMaxLength];
        char    char_query_[kQueryMaxLength];
        int     last_error_;
        char    last_error_msg[128];
    };
}
#endif
cs

pika_library_mysql_connector.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
#include "pika_library_common_header.h"
#include "Global.h"
using namespace pika_library;
MySqlConnector::MySqlConnector(char *db_ip, char *user, char *password, char *db_name, int db_port){
    mysql_init(&conn_);
    strcpy_s(db_ip_, 16, db_ip);
    strcpy_s(db_user_, 64, user);
    strcpy_s(db_pw_, 64, password);
    strcpy_s(db_name_, 64, db_name);
    db_port_ = db_port;
}
MySqlConnector::~MySqlConnector(){
}
bool        MySqlConnector::ConnectDB(){    
    if (connect_flag_ == true)
    {
        DisconnectDB();
    }
    conn_pointer_ = mysql_real_connect(&conn_, db_ip_, db_user_, db_pw_, db_name_, db_port_, NULL0);
    mysql_set_character_set(conn_pointer_, "utf8");
    if (conn_pointer_ == NULL
    {
        return false;
    }
    else
    {
        connect_flag_ = true;
        return true;
    }
}
bool        MySqlConnector::DisconnectDB(){
    mysql_close(conn_pointer_);
    connect_flag_ = false;
    return true;
}
bool        MySqlConnector::Query(WCHAR *QueryFormat, ...){
    va_list args;
    va_start(args, QueryFormat);
    _vstprintf_s(wchar_query_, kQueryMaxLength, QueryFormat, args);
    int result = WideCharToMultiByte(CP_UTF8, 0, wchar_query_, static_cast<int>(wcslen(wchar_query_)), char_query_, kQueryMaxLength, NULLNULL);
    if (result < kQueryMaxLength)
    {
        char_query_[result] = '\0';
    }
    while (TRUE) {
        int queryResult = mysql_query(conn_pointer_, char_query_);
        if (queryResult != 0)
        {
            // Query Error.
            // 현재는 화면에 출력하지만, 로그 파일에 따로 에러난 쿼리를 저장하는게 좋다.
            unsigned int error_code = mysql_errno(conn_pointer_);
            //printf("MySQL query error(%d): %s", error_code, mysql_error(conn_pointer_));
            gLogManager->Log(L"QUERY", SystemLog::kErrorLevel, L"MySql Query Error(%d) / Query: %s \n", error_code, wchar_query_);
            //CR_SOCKET_CREATE_ERROR
            //CR_CONNECTION_ERROR
            //CR_CONN_HOST_ERROR
            //CR_SERVER_GONE_ERROR
            //CR_TCP_CONNECTION
            //CR_SERVER_HANDSHAKE_ERR
            //CR_SERVER_LOST
            //CR_INVALID_CONN_HANDLE
            if (error_code == CR_SOCKET_CREATE_ERROR || error_code == CR_CONNECTION_ERROR || error_code == CR_CONN_HOST_ERROR ||
                error_code == CR_SERVER_GONE_ERROR || error_code == CR_TCP_CONNECTION || error_code == CR_SERVER_HANDSHAKE_ERR ||
                error_code == CR_SERVER_LOST || error_code == CR_INVALID_CONN_HANDLE) {
                if (ConnectDB() == false) {
                    gLogManager->Log(L"QUERY", SystemLog::kErrorLevel, L"MySql Connect False. \n");
                    Sleep(10);
                }
            }else{
                return false;
            }
        }
        else 
        {
            break;
        }
    }
    sql_result_pointer_ = mysql_store_result(conn_pointer_);
    return true;
}
MYSQL_ROW   MySqlConnector::FetchRow(){
    return mysql_fetch_row(sql_result_pointer_);
}
void        MySqlConnector::FreeResult(){
    mysql_free_result(sql_result_pointer_);
}
cs

댓글 없음:

댓글 쓰기

A*, JPS 길찾기 알고리즘 시뮬레이션 사이트

https://qiao.github.io/PathFinding.js/visual/ 길 찾기 알고리즘 시행 과정을 보여주는 사이트다. 링크 메모..