Mysql API / C/C++ 연동하기 강좌 (4. C/C++ Mysql Class 소스)
프로그래밍 언어/C++2009. 12. 4. 15:42
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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 | // CMysql.h //+-------------------------------------------// // Mysql Class ver 1.0 // Written by Copynull // E-mail copynull@nate.com // Date 2009. 12. 07 //+------------------------------------------- #pragma once #include <winsock2.h> #include <iostream> #include <mysql.h> #pragma comment(lib, "libmysql.lib") #pragma warning(disable:4996) using namespace std; class CMysql { MYSQL conn; MYSQL_RES *pres; MYSQL_ROW row; MYSQL_FIELD *pfield; my_ulonglong iRowNum; //레코드셋의 개수 unsigned int iFieldNum; //필드의 개수 my_ulonglong iCurrentPos; //현재 row 의 offset bool bHaveResultQuery; //결과가 있는 쿼리인가요? bool bIsEof; //레코드셋의 처음인가요? bool bIsBof; //레코드셋의 마지막인가요? bool bIsConnect; //연결이 되어 있는가? public: CMysql(); virtual ~CMysql(); bool Connect(const char *host=NULL, const char *username=NULL, const char *password=NULL, const char *database=NULL, const unsigned int port=0, const char *unix_socket=NULL, const unsigned int client_flag=0); void Disconnect(); bool IsConnect() { return bIsConnect; } void IsConnect(bool b) { bIsConnect = b; } bool Query(const char *szString); bool SelectDB(const char *szString); //result navigation bool IsBOF() { return bIsBof; } void IsBOF(bool b) { bIsBof = b; } bool IsEOF() { return bIsEof; } void IsEOF(bool b) { bIsEof = b; } void First(); void Last(); void Next(); void Prev(); void Move(int n=1); char * Field(const char *szFieldName); char * Field(const my_ulonglong iFieldIndex); //operator char * operator[](const my_ulonglong iFieldIndex) { return Field(iFieldIndex); } char * operator[](const char *szFieldName) { return Field(szFieldName); } }; // CMysql.cpp #include "stdafx.h" #include "CMysql.h" //Constructor and Destructor CMysql::CMysql() { iRowNum = 0; iFieldNum = 0; iCurrentPos = 0; bIsBof = false; bIsEof = false; bIsConnect = false; bHaveResultQuery = false; mysql_init(&conn); } CMysql::~CMysql() { if(&conn != NULL) { mysql_close(&conn); } } bool CMysql::Connect(const char *host, const char *username, const char *password, const char *database, const unsigned int port, const char *unix_socket, const unsigned int client_flag) { if(&conn == NULL) { cout << "[Error:" << mysql_errno(&conn) << "] " << mysql_error(&conn) << endl; exit(1); } if(mysql_real_connect(&conn, host, username, password, database, port, unix_socket, client_flag) == NULL) { IsConnect(false); return false; } IsConnect(true); return true; } void CMysql::Disconnect() { if(&conn != NULL) { mysql_close(&conn); iRowNum = 0; iFieldNum = 0; iCurrentPos = 0; bIsBof = false; bIsEof = false; bIsConnect = false; bHaveResultQuery = false; } } bool CMysql::SelectDB(const char *szString) { return !mysql_select_db(&conn, szString); } bool CMysql::Query(const char *szString) { if(&conn == NULL || !IsConnect()) { cout << "[Error:" << mysql_errno(&conn) << "] " << mysql_error(&conn) << endl; exit(1); } if(mysql_query(&conn, szString)) //raise error { return false; } else { pres = mysql_store_result(&conn); //결과를 저장하고 if(pres) { //OK,현재의 오프셋 등을 저장 iRowNum = mysql_num_rows(pres); iFieldNum = mysql_num_fields(pres); row = mysql_fetch_row(pres); pfield = mysql_fetch_fields(pres); //pfield[iFieldNum].name; IsBOF(true); IsEOF(false); bHaveResultQuery = true; return true; } else { //Update, Delete, insert query if( mysql_field_count(&conn) == 0 ) { iRowNum = mysql_affected_rows(&conn); bHaveResultQuery = false; return true; } else { //raise error return false; } } } return true; } char * CMysql::Field(const char *szFieldName) { //결과가 있는 쿼리인지 조사 if(!bHaveResultQuery) { cout << "Exception Field() or [], 결과가 없는 쿼리를 실행했습니다" << endl; cout << "[Error:" << mysql_errno(&conn) << "] " << mysql_error(&conn) << endl; exit(1); } if(iRowNum == 0) { cout << "Exception Field() or [], Query 에 해당하는 레코드셋이 없습니다" << endl; cout << "[Error:" << mysql_errno(&conn) << "] " << mysql_error(&conn) << endl; exit(1); } //필드이름이 있는지 조사 있다면 인덱스를 리턴하자! for(unsigned int i=0; i<iFieldNum; i++) { if( strcmp(pfield[i].name, szFieldName) == 0) { return row[(int)i]; } } return row[-1]; } char * CMysql::Field(const my_ulonglong iFieldIndex) { //결과가 있는 쿼리인지 조사 if(!bHaveResultQuery) { cout << "Exception Field() or [], 결과가 없는 쿼리를 실행했습니다" << endl; cout << "[Error:" << mysql_errno(&conn) << "] " << mysql_error(&conn) << endl; exit(1); } if(iRowNum == 0) { cout << "Exception Field() or [], Query 에 해당하는 레코드셋이 없습니다" << endl; cout << "[Error:" << mysql_errno(&conn) << "] " << mysql_error(&conn) << endl; exit(1); } if(iFieldIndex > iFieldNum) { cout << "Exception field() or [], 필드의 인덱스가 음수이거나 범위를 넘습니다" << endl; cout << "[Error:" << mysql_errno(&conn) << "] " << mysql_error(&conn) << endl; exit(1); } return row[iFieldIndex]; } void CMysql::First() { IsBOF(true); IsEOF(false); iCurrentPos = 0; mysql_data_seek(pres, iCurrentPos); row = mysql_fetch_row(pres); } void CMysql::Last() { IsBOF(false); IsEOF(true); iCurrentPos = iRowNum-1; //row 의index 는 0 부터다 mysql_data_seek(pres, iCurrentPos); row = mysql_fetch_row(pres); } void CMysql::Next() { if(!IsEOF()) { Move(1); if(IsBOF()) { IsBOF(false); //Next() 를 하면 처음은 아니다 } } else { cout << "[EXCEPTION] Exception Next(), 다음 레코드셋이 없습니다. "; exit(1); } } void CMysql::Prev() { if(!IsBOF()) { Move(-1); if(IsEOF()) { IsEOF(false); //Prev() 를 하면 끝은 아니다 } } else { cout << "Exception Prev(), 이전 레코드셋이 없습니다." << endl; cout << "[Error:" << mysql_errno(&conn) << "] " << mysql_error(&conn) << endl; exit(1); } } void CMysql::Move(int n) { //범위가 넘는지 본다. my_ulonglong pos = iCurrentPos+n; if( pos == -1 ) { IsBOF(true); IsEOF(false); } else if( pos == iRowNum) { IsBOF(false); IsEOF(true); } else if( (pos < 0) || (pos > iRowNum) ) { cout << "Exception Prev() or Next() or Move(), 레코드셋범위를 넘습니다" << endl; cout << "[Error:" << mysql_errno(&conn) << "] " << mysql_error(&conn) << endl; exit(1); } iCurrentPos = pos; mysql_data_seek(pres, iCurrentPos); row = mysql_fetch_row(pres); } |
'프로그래밍 언어 > C++' 카테고리의 다른 글
Mysql API / C/C++ 연동하기 강좌 (6. mysql c++클래스 연동 예제 / 도서관리) (4) | 2009.12.15 |
---|---|
Mysql API / C/C++ 연동하기 강좌 (5. mysql_field_count() 깔끔한 Error처리) (0) | 2009.12.15 |
Mysql API / C/C++ 연동하기 강좌 (3. C/C++ Mysql 테스트 Full소스) (2) | 2009.12.02 |
Mysql API / C/C++ 연동하기 강좌 (2. C/C++ Mysql API 알아보기) (0) | 2009.12.02 |
Mysql API / C/C++ 연동하기 강좌 (1. mysql 설치 및 Visual Studio 환경설정) (0) | 2009.12.01 |