메뉴 건너뛰기

Hodol's Blog

Documents C언어 MariaDB 라이브러리 예제

2015.04.21 23:20

Hodol 조회 수:2355

C언어 MariaDB 라이브러리 예제

목차
준비
  • GCC 컴파일러
  • MariaDB 데몬이 설치되어 실행되고 있어야 한다.
  • MariaDB 라이브러리가 설치되어야 한다. 설치되어 있지 않다면 다음 명령으로 설치를 하자.
    # yum install mariadb-devel
    그런데 이렇게 설치할 경우, .so 파일들이 시스템 기본 라이브러리 디렉토리 안의 mysql 디렉토리 안에 따로 모여 있다. 그래서 gcc.so 파일들을 찾지 못하는 경우가 있다. 이 mysql을 따로 라이브러리 디렉토리로 지정해 주던가 아니면 다음 명령처럼 .so파일들을 심볼릭 링크를 걸어서 사용하던가 하자. 필자는 후자를 택하였다.
    # ln -s /usr/lib64/mysql/libmysqlclient.so /usr/lib64/libmysqlclient.so
    # ln -s /usr/lib64/mysql/libmysqlclient.so.18 /usr/lib64/libmysqlclient.so.18
    # ln -s /usr/lib64/mysql/libmysqlclient.so.18.0.0 /usr/lib64/libmysqlclient.so.18.0.0
    # ln -s /usr/lib64/mysql/libmysqlclient_r.so /usr/lib64/libmysqlclient_r.so
  • MariaDB에 테스트용 데이터베이스와 테이블을 만들자. 알아서 만드시길...(무책임). 필자는 DB명을 hodoldb, 테이블 이름을 hodoltable로 대충 만들었다.
C 언어로 MariaDB에 쿼리문 보내기
#include <stdio.h>
#include <my_global.h>
#include <mysql.h>

int main(int argc, char **argv)
{
    MYSQL *con = mysql_init(NULL);
    MYSQL_RES *sql_result;
    MYSQL_ROW sql_row;
    int query_stat;

    if (con == NULL)
    {
        fprintf(stderr,"%s\n", mysql_error(con));
        exit(1);
    }

    if (mysql_real_connect(con, "localhost", "myId", "myPassword!", "dbName", 3306, NULL, 0) == NULL)
    {
        fprintf(stderr, "%s\n", mysql_error(con));
        mysql_close(con);
        exit(1);
    }

    if (!mysql_set_character_set(con,"utf8"))
    {
        printf("New client character set : %s\n",mysql_character_set_name(con));
    }

    if(query_stat = mysql_query(con, "select tag from hodoltable"))
    {
        fprintf(stderr, "%s\n", mysql_error(con));
        mysql_close(con);
        exit(1);
    }

    sql_result = mysql_store_result(con);

    while((sql_row = mysql_fetch_row(sql_result))!=NULL)
    {
        printf("%s\n",sql_row[0]);
    }
    mysql_free_result(sql_result);

    mysql_close(con);
    exit(0);
}
  1. my_global.hmysql.h를 인클루드 한다.
  2. MYSQL은 데이터베이스와의 연결을 다루기 위한 구조체이다. 선언과 동시에 mysql_init()함수로 초기화 하였다.
  3. MYSQL_RES는 쿼리를 보낸 결과를 저장하는 구조체이다.
  4. MYSQL_ROW는 결과 데이터의 한 행(ROW) 즉, 하나의 레코드를 가리킨다.
  5. mysql_real_connect() 함수로 데이터베이스에 연결한다. 인자는 순서대로 MYSQL 구조체 포인터, 서버 주소, 사용자명, 비밀번호, DB명, 포트 등 이다.
  6. mysql_set_character_set() 함수로 쿼리의 문자셋을 설정해 준다. 바뀐 설정값은 다음 줄에서처럼 mysql_character_set_name()으로 확인할 수 있다.
  7. mysql_query() 함수로 SQL 구문을 데이터베이스로 보낸다.
  8. mysql_store_result() 함수로 결과를 MYSQL_RES 포인터가 가리키는 구조체에 저장한다.
  9. mysql_fetch_row() 함수를 통해 결과로부터 한줄씩 읽어 출력한다. mysql_fetch_row() 함수가 호출될 때마다 MYSQL_RES 포인터가 1씩 증가하여 다음 ROW를 가리키게 된다. 따라서, while 반복문이 호출될 때마다 결과를 차례대로 하나씩 출력하게 된다.
  10. 모든 작업이 끝나면 동적으로 할당된 메모리들을 해제하고 종료한다.
PHP로 작성하는 것과 비교했을 때 변수 메모리를 관리하는 부분을 제외하면 큰 차이가 없다.
컴파일 및 실행하기
$ gcc mariadbtest.c -o mariadbtest -I/usr/include/mysql -lmysqlclient
$ ./mariadbtest
gcc 옵션은 -o(오) -I(아이) -l(엘) 순이다. 영어 대문자 i와 소문자 L이 비슷하게 보이니 주의하자.