1. MariaDB, DBeaver 설치 &  사용

더보기

 

2. C/C++ MariaDB 라이브러리 설치

더보기

MariaDB, C++ 헤더 설치 (공식 가이드)

 

1. MariaDB, C/C++ Connectors 다운로드 페이지 이동

 

library
- header 파일과 다르다.
- 컴파일된(기계어로 번역) *.o(오브젝트)파일을 여러개 모아 놓은 것이다.
- 라이브러리를 사용하기 위해서 해당 라이브러리의 헤더파일이 있어야한다.
  링커가 심볼네임으로 라이브러리를 링크한다.

header
- library와 다르다.
- 컴파일 전, 프로그래머가 이해 가능한 선언 집합이다.
- 헤더파일로 컴파일러가 심볼네임을 오브젝트 파일에 넣어준다.
  링커가 해당 심볼네임을 가지고 라이브러리를 뒤져서 링크를 하게 된다.

 


2. 설치 파일 다운로드

 



3. 다운받은 설치 파일 압축 해제

tar -xvzf mariadb-connector-cpp*

 

 

4. 파일 디렉토리 이동

cd mariadb-connector-cpp-*/

 

 

5.  헤더 파일 설치할 디렉터리 지정

  • -d --directory : 대상 디렉터리를 지정을 하고, 지정한 디렉터리가 없다면 만든다.
sudo install -d /usr/include/mariadb/conncpp
sudo install -d /usr/include/mariadb/conncpp/compat

 

 

6. 지정한 디렉터리에 헤더 파일 설치

sudo install include/mariadb/* /usr/include/mariadb/
sudo install include/mariadb/conncpp/* /usr/include/mariadb/conncpp
sudo install include/mariadb/conncpp/compat/* /usr/include/mariadb/conncpp/compat

 

 

7. 지정한 디렉터리에 공유 라이브러리

  • /lib: 커널 모듈 파일과 라이브러리 파일(C, C++등)들이 존재하는 디렉터리
  • /lib64(64bit)와 /lib(32bit)로 하드웨어 아키텍쳐에 따라 구분하여 공유 라이브러리를 저장한다.
sudo install -d /usr/lib/mariadb
sudo install -d /usr/lib/mariadb/plugin
sudo install lib/mariadb/libmariadbcpp.so /usr/lib
sudo install lib/mariadb/plugin/* /usr/lib/mariadb/plugin

 

8. 추가

sudo install -d /usr/lib64/mariadb
sudo install -d /usr/lib64/mariadb/plugin
sudo install lib/mariadb/libmariadbcpp.so /usr/lib64
sudo install lib/mariadb/plugin/* /usr/lib64/mariadb/plugin

 

4. MariaDB, C/C++ 소스코드 빌드 테스트 (VSCode)

더보기

깃허브에서 MariaDB C/C++ 테스트 소스코드 깃허브에서 복사

#include <iostream>
#include <cstring>
#include <mariadb/conncpp.hpp>

// Delete a task record (indicated by id)
void deleteTask(std::unique_ptr<sql::Connection> &conn, int id) {
    try {
        // Create a new PreparedStatement
        std::unique_ptr<sql::PreparedStatement> stmnt(conn->prepareStatement("delete from tasks where id = ?"));
        // Bind values to SQL statement
        stmnt->setInt(1, id);
        // Execute query
        stmnt->executeQuery();
    }
    catch(sql::SQLException& e){
      std::cerr << "Error deleting task: " << e.what() << std::endl;
   }
}

// Update the completed value of a task record (indicated by id)
void updateTaskStatus(std::unique_ptr<sql::Connection> &conn, int id, bool completed) {
    try {
        // Create a new PreparedStatement
        std::unique_ptr<sql::PreparedStatement> stmnt(conn->prepareStatement("update tasks set completed = ? where id = ?"));
        // Bind values to SQL statement
        stmnt->setBoolean(1, completed);
        stmnt->setInt(2, id);
        // Execute query
        stmnt->executeQuery();
    }
    catch(sql::SQLException& e){
      std::cerr << "Error updating task status: " << e.what() << std::endl;
   }
}

// Create a new task record
void addTask(std::unique_ptr<sql::Connection> &conn, std::string description) {
    try {
        // Create a new PreparedStatement
        std::unique_ptr<sql::PreparedStatement> stmnt(conn->prepareStatement("insert into tasks (description) values (?)"));
        // Bind values to SQL statement
        stmnt->setString(1, description);
        // Execute query
        stmnt->executeQuery();
    }
    catch(sql::SQLException& e){
      std::cerr << "Error inserting new task: " << e.what() << std::endl;
   }
}

// Print all records in tasks table 
void showTasks(std::unique_ptr<sql::Connection> &conn) {
    try {
        // Create a new Statement
        std::unique_ptr<sql::Statement> stmnt(conn->createStatement());
        // Execute query
        sql::ResultSet *res = stmnt->executeQuery("select * from tasks");
        // Loop through and print results
        while (res->next()) {
            std::cout << "id = " << res->getInt(1);
            std::cout << ", description = " << res->getString(2);
            std::cout << ", completed = " << res->getBoolean(3) << "\n";
        }
    }
    catch(sql::SQLException& e){
      std::cerr << "Error selecting tasks: " << e.what() << std::endl;
   }
}

// Main Process
int main(int argc, char **argv){
    if (argc==1){
        std::cout << "Please provide an argument.\n";
    }
    else {
        try {
            // Instantiate Driver
            sql::Driver* driver = sql::mariadb::get_driver_instance();

            // Configure Connection
            sql::SQLString url("jdbc:mariadb://localhost:3306/todo");
            sql::Properties properties({{"user", "app_user"}, {"password", "Password123!"}});

            // Establish Connection
            std::unique_ptr<sql::Connection> conn(driver->connect(url, properties));

            // Use arguments to determine execution next steps
            if (!strcmp(argv[1],"showTasks")) {
                showTasks(conn);
            }
            else if (!strcmp(argv[1],"addTask")) {
                if (argc != 3) {
                    std::cout << "Invalid arguments";
                    return 1;
                }
                addTask(conn, argv[2]);
            }
            else if (!strcmp(argv[1],"updateTaskStatus")) {
                if (argc != 4) {
                    std::cout << "Invalid arguments";
                    return 1;
                }
                updateTaskStatus(conn, atoi(argv[2]), argv[3]);
            }
            else if (!strcmp(argv[1],"deleteTask")) {
                if (argc != 3) {
                    std::cout << "Invalid arguments";
                    return 1;
                }
                deleteTask(conn, atoi(argv[2]));
            }

            // Close Connection
            conn->close();
        }
        catch(sql::SQLException& e){
            std::cerr << "Error Connecting to MariaDB Platform: " << e.what() << std::endl;
            // Exit (Failed)
            return 1;
        }
    }

    // Exit (Success)
    return 0;
}

 

 

 

소스코드 예제에서 MariaDB에 접속할 계정의 ID, PW 수정 

 


빌드 명령

g++ -o tasks tasks.cpp -std=c++11 -lmariadbcpp

 


실행 명령 테스트

 

 

DBeaver 에서 소스코드에서 실행한 명령, MariaDB 테이블에서 업데이트 확인


5. MariaDB, C/C++ 소스코드 빌드 테스트 (C++ Qt Creator, qmake 빌드)

더보기

 

pro 파일에 MariaDB, C/C++ connector 라이브러리 경로 추가

LIBS += -L/usr/lib64 -lmariadbcpp

INCLUDEPATH += /usr/include/mariadb -I..include
DEPENDPATH += /usr/include/mariadb -I..include

 

 

깃허브에서 MariaDB C/C++ 테스트 소스코드 복사

 

 

빌드시 에러가 없으면, MariaDB, C/C++ connector 라이브러리가 정상 링크 된것이다.

 

 

6. MariaDB, C/C++ 소스코드 빌드 테스트 (C++ Qt Creator, 터미널 빌드)

더보기

터미널로 빌드가 가능하긴 하다.