Innovating today, leading tomorrow

OpenSQL_Technical Guide
[OpenSQL] Interface(C++)

[OpenSQL] Interface(C++)

Interface(C++) 개요

Interface(C++) 이란?

postSQL은 C/C++를 이용하여 인터페이스를 구축할 수 있습니다.
C++을 사용하여 postgreSQL과 상호작용하려면 libpqxx 라는 라이브러리를 사용해야 합니다.
– PostgreSQL 공식 문서 –

설치 요구사항

선행 라이브러리 / 패키지OS버전비고
postgresql14-develLinux14.2(pg 버전과 동일)postgresql 개발도구 패키지
g++Linux4.8.5 20150623 (RedHat 4.8.5-44)컴파일러 (Centos 7 에서 지원하는 높은 버전 )
선행 라이브러리 / 패키지OS버전비고
libpqxxLinux7.8.0(latest),
7.7.5(stable),
4.0.1PostgreSQL 드라이버
CentOS 7 한정 4.0.1이 최신버전libpqxx 개발 도구 제공
libpqxx와 일치하는 버전으로 사용
libpqxx-develLinux7.7.5(latest),
4.0.1컴파일러 (Centos 7 에서 지원하는 높은 버전 )

libpqxx의 지원 범위

libpqxxC++g++
4.x144.8 ~ 4.9
7.x176.1 ~

libpqxx의 가장 최신 버전은 23년도 6월 기준 7.8.0 이며 stable은 7.7.5 버전입니다.

https://libpqxx.readthedocs.io/en/latest/
https://libpqxx.readthedocs.io/en/stable/

Connect 시놉시스

libpqxx를 이용해 postgresql에 접속

  • connection 객체를 생성하고 접속정보를 입력한 뒤 disconnect() 메소드를 호출하여 연결을 닫습니다.

pqxx::connection conn(dbname= user= password= host= port=);

conn.disconnect();

Select 시놉시스

std::string selectQuery1 = “SELECT * FROM test”;
pqxx::work txnSelect(conn);
pqxx::result result = txnSelect.exec(selectQuery1);

for (auto row : result) {
  std::cout << "col1: " << row["col1"].c_str() << … << std::endl;
}

txnSelect.commit();

Insert 시놉시스

Select 시놉시스

std::string insertQuery = “INSERT INTO test (col1, col2, col3) VALUES (‘value1’, ‘value2’, ‘value3’)”;

pqxx::work txnInsert(conn);

txnInsert.exec(insertQuery);

txnInsert.commit();

Update 시놉시스

std::string updateQuery = “UPDATE test SET col1 = ‘updated_value’ WHERE col2 = ‘value2′”;

pqxx::work txnUpdate(conn);

txnUpdate.exec(updateQuery);

txnUpdate.commit();

소스코드

  • CRUD 소스코드 예시

#include <iostream>
#include <pqxx/pqxx>

using namespace std;
using namespace pqxx;

int main() {
try {
std::string connString = “dbname=postgres user=postgres password=postgres hostaddr=192.168.137.51 port=5432”;

pqxx::connection conn(connString);

std::string insertQuery = "INSERT INTO test (col1, col2, col3) VALUES ('value1', 'value2', 'value3')";
pqxx::work txnInsert(conn);
txnInsert.exec(insertQuery);
txnInsert.commit();
std::cout << "Data inserted successfully." << std::endl;

std::string selectQuery1 = "SELECT * FROM test";
pqxx::work txnSelect1(conn);
pqxx::result result1 = txnSelect1.exec(selectQuery1);
std::cout << "Reading data from the test table:" << std::endl;
for (auto row : result1) {
  std::cout << "col1: " << row["col1"].c_str() << ", col2: " << row["col2"].c_str() << ", col3: " << row["col3"].c_str() << std::endl;
}
txnSelect1.commit();

std::string updateQuery = “UPDATE test SET col1 = ‘updated_value’ WHERE col2 = ‘value2′”;
pqxx::work txnUpdate(conn);
txnUpdate.exec(updateQuery);
txnUpdate.commit();
std::cout << “Data updated successfully.” << std::endl;

std::string selectQuery2 = "SELECT * FROM test";
pqxx::work txnSelect2(conn);
pqxx::result result2 = txnSelect2.exec(selectQuery2);
std::cout << "Reading data from the test table:" << std::endl;
for (auto row : result2) {
  std::cout << "col1: " << row["col1"].c_str() << ", col2: " << row["col2"].c_str() << ", col3: " << row["col3"].c_str() << std::endl;
}
txnSelect2.commit();

std::string deleteQuery = "DELETE FROM test";
pqxx::work txnDelete(conn);
txnDelete.exec(deleteQuery);
txnDelete.commit();
std::cout << "Data deleted successfully." << std::endl;

std::string selectQuery3 = “SELECT * FROM test”;
pqxx::work txnSelect3(conn);
pqxx::result result3 = txnSelect3.exec(selectQuery3);
std::cout << “Reading data from the test table:” << std::endl;
for (auto row : result3) {
std::cout << “col1: ” << row[“col1”].c_str() << “, col2: ” << row[“col2”].c_str() << “, col3: ” << row[“col3”].c_str() << std::endl;
}
txnSelect3.commit();

conn.disconnect();

} catch (const std::exception &e) {
std::cerr << “Error: ” << e.what() << std::endl;
}

return 0;
}

C++ 활용 실습

  • Windows 활용 실습
    • visual studio 를 실행하여 파일 > 새로만들기 > 프로젝트를 클릭
    • 빈 프로젝트 클릭 후 프로젝트 이름 : cpp_test, 위치 : C:interfacecpp 로 생성

우측의 솔루션 탐색기에서 소스파일 우클릭 > 추가 > 새 항목 클릭 C++ 파일 선택하고, 이름에 testlibpqxx.cpp로 지정하고 추가

testlibpqxx.cpp에 제공받은 C++ 소스 파일의 내용을 붙여넣기 하거나 기존 항목을 이용해 추가

window용 libpqxx를 세팅. 실습에서는 microsoft에서 제공하는 C,C++ 라이브러리 관리 툴인 vcpkg를 이용하여 libpqxx를 세팅
vcpkg의 선행 조건은 다음과 같다

  • vcpkg의 선행 조건은 다음과 같다
선행조건버전비고
windows OS7 or newer7 이상 사용가능
Gitgit 접속 or git clone 사용하여 레포지토리 다운 가능하여야함
Visual Studio2015 update 3 or newer2015 update 3 이후

vcpkg를 git에서 다운. 해당 URL의 최신 버전의 소스 코드 (zip)를 다운

https://github.com/microsoft/vcpkg/releases
//작성일 기준 2023.06.20이 최신버전이라 이 버전으로 다운받아 진행합니다.

C:Program Filesvcpkg 경로를 생성하여 이곳에 압축을 풉니다. 그 후 bootstrap-vcpkg.bat 파일을 명령 프롬프트 창에서 실행합니다.

실행 후 bat 파일과 같은 경로에 생성된 vcpkg.exe 파일을 확인하고 이를 시스템 환경 변수에 등록

vcpkg를 이용해 x64-windows 용 libpqxx와 의존성 패키지들을 같이 다운 & 라이브러리 컴파일

vcpkg install libpqxx:x64-windows

작업 완료 후 생성된 라이브러리들을 해당 경로에서 확인

C:Program Filesvcpkginstalledx64-windowsbin

C:Program Filesvcpkginstalledx64-windowslib

다음 파일들을 C:interfaceCPPlibpqxx 디렉토리를 생성하고 visual studio에서 참조하기 쉽게 옮겨놓습니다.

C:Program Filesvcpkginstalledx64-windowsinclude 폴더 전체
pqxx.lib

  • visual studio로 돌아가서 우측 솔루션 탐색기에서 cpp_test 프로젝트 우클릭하여 속성에서 다음과 같이 설정합니다.
  • C/C++ > 일반에서 추가 포함 디렉터리에서 콤보박스를 눌러 편집에서 방금 생성한 경로와 include 경로를 입력합니다.

링커 > 일반에서 추가 라이브러리 디렉터리를 편집하여 pqxx.lib 폴더가 있는 디렉터리를 입력

링커 > 입력에서 추가 종속성을 편집하여 pgxx.lib을 입력합니다.

C++ 17 표준을 사용한 샘플 코드이기 때문에 일반 > C++ 언어 표준을 변경합니다

빌드 탭에서 솔루션 정리 후 빌드를 합니다

  • 프로젝트경로x64Debug 경로에 cpp_test.exe와 cpp_test.pdb가 생성됨을 확인합니다.
  • C:Program Filesvcpkginstalledx64-windowsbin 경로의 다음 dll 파일들을 모두 이 경로에 복사합니다.

명령 프롬프트 창을 실행하여, 프로젝트경로x64Debug 경로로 이동 한 다음, cpp_test.exe를 실행하여 결과를 확인합니다.

  • Linux 활용 실습

선행 패키지인 postgresql-devel을 설치

#yum install centos-release-scl-rh
#yum install llvm-toolset-7-clang
#yum install postgresql14-devel-14.2*

설치 후 선행 패키지인 g++도 설치

yum install gcc-c++

libpqxx 4.0.1 버전을 설치
libpqxx-devel 4.0.1 버전을 설치

# yum install libpqxx-4.0.1
# yum install libpqxx-devel-4.0.1

pgtest.cpp 파일을 업로드

$ su – opensql
$ mkdir ./interface/libpqxx
$ cd /opensql/interface/libpqxx

pgtest.cpp를 컴파일합니다. posgresql 바이너리의 include, lib 디렉토리 경로를 명시하고 -std=c++11 옵션을 추가하여 c++11 포맷을 인식하도록 합니다.

$ g++ pgtest.cpp -std=c++11 -I/usr/pgsql-14/include -I/usr/pgsql-14/include/internal -L/usr/pgsql-14/lib -lpqxx -lpq

수행 결과를 확인합니다

$ ./a.out
Data inserted successfully.
Reading data from the test table:
col1: value1, col2: value2, col3: value3
Data updated successfully.
Reading data from the test table:
col1: updated_value, col2: value2, col3: value3
Data deleted successfully.
Reading data from the test table:

지금까지 PostgreSQL의 Interface(C++)에 관해 알아보았습니다

PostgreSQL의 (Interface) .NET – Npgsql을 바로 이어서 확인해보세요!

광고성 정보 수신

개인정보 수집, 활용 목적 및 기간

(주)티맥스티베로의 개인정보 수집 및 이용 목적은 다음과 같습니다.
내용을 자세히 읽어보신 후 동의 여부를 결정해 주시기 바랍니다.

  • 수집 목적: 티맥스티베로 뉴스레터 발송 및 고객 관리
  • 수집 항목: 성함, 회사명, 회사 이메일, 연락처, 부서명, 직급, 산업, 담당업무, 관계사 여부, 방문 경로
  • 보유 및 이용 기간: 동의 철회 시까지

※ 위 개인정보 수집 및 이용에 대한 동의를 거부할 권리가 있습니다.
※ 필수 수집 항목에 대한 동의를 거부하는 경우 뉴스레터 구독이 제한될 수 있습니다.

개인정보의 처리 위탁 정보
  • 업체명: 스티비 주식회사
  • 위탁 업무 목적 및 범위: 광고가 포함된 뉴스레터 발송 및 수신자 관리
 

개인정보 수집 및 이용

개인정보 수집, 활용 목적 및 기간

(주)티맥스티베로의 개인정보 수집 및 이용 목적은 다음과 같습니다. 내용을 자세히 읽어보신 후 동의 여부를 결정해 주시기 바랍니다.

  • 수집 목적: 티맥스티베로 뉴스레터 발송 및 고객 관리
  • 수집 항목: 성함, 회사명, 회사 이메일, 연락처, 부서명, 직급, 산업, 담당업무, 관계사 여부, 방문 경로
  • 보유 및 이용 기간: 동의 철회 시까지

※ 위 개인정보 수집 및 이용에 대한 동의를 거부할 권리가 있습니다.
※ 필수 수집 항목에 대한 동의를 거부하는 경우 뉴스레터 구독이 제한될 수 있습니다.

개인정보의 처리 위탁 정보

  • 업체명: 스티비 주식회사
  • 위탁 업무 목적 및 범위: 광고가 포함된 뉴스레터 발송 및 수신자 관리
  •