Skip to content

Server Data Storing

ka-yeon edited this page Jul 6, 2021 · 7 revisions

Data Storing

사용한 DB 시스템과 라이브러리

🖥데이터베이스 시스템 : PostgreSQL
📄라이브러리 : libpqxx(c++과 PostgreSQL을 연결시켜주는 라이브러리)


경로 수정

💾데이터 저장

DBStoring/~StoringThread.cpp

connection C("dbname = 데이터베이스명 user = 데이터베이스 사용자명 password =  비밀번호 \
hostaddr = host 주소 port = 포트번호");

데이터베이스명, 데이터베이스 사용자명, 비밀번호, host 주소, 포트번호를 수정해준다.


string path = "json 파일이 저장되어있는 위치"

json parsing 하기 위해, json 파일들이 저장되어 있는 위치를 수정해준다.


동작 방식

💾데이터 저장

DBStoring/main.cpp

main문에서 각각의 thread가 돌면서 json에 저장되어 있던 데이터들이 PostgreSQL DB에 저장된다.

int main(int argc, char *argv[]){

    // LOG
    LogStoringThread mLogStoringThread;
    thread logThread(&LogStoringThread::run, &mLogStoringThread);
    logThread.join();

    // FRAME
    FrameStoringThread mFrameRawStoringThread;
    thread frameThread(&FrameStoringThread::run, &mFrameRawStoringThread);
    frameThread.join();

    // SCENE
    SceneStoringThread mSceneStoringThread;
    thread SceneThread(&SceneStoringThread::run, &mSceneStoringThread);
    SceneThread.join();

    // Lidar
    LidarStoringThread mLidarStoringThread;
    thread lidarThread(&LidarStoringThread::run, &mLidarStoringThread);
    lidarThread.join();

    // CAM
    CamStoringThread mCamStoringThread;
    thread camThread(&CamStoringThread::run, &mCamStoringThread);
    camThread.join();

    // GPS
    GpsStoringThread mGpsStoringThread;
    thread gpsThread(&GpsStoringThread::run, &mGpsStoringThread);
    gpsThread.join();

    // IMU
    ImuStoringThread mImuStoringThread;
    thread imuThread(&ImuStoringThread::run, &mImuStoringThread);
    imuThread.join();

    // CAN
    CanStoringThread mCanStoringThread;
    thread canThread(&CanStoringThread::run, &mCanStoringThread);
    canThread.join();
        
}

Thread 코드 구성

예시 : CamStoringThread.cpp

나머지 Thread들도 같은 방식으로 코드가 구성되어 있다.


1. DB connect & create table

connection C("dbname = 데이터베이스명 user = 데이터베이스 사용자명 password =  비밀번호 \
hostaddr = host 주소 port = 포트번호");

저장하고 싶은 Database에 연결한다.


//Create SQL statement
sql = "create table CAM_DATA(token text primary key references frame (frame_token), fileformat text, filename text);";
      
//Create a transactional object
work W(C);

//Execute SQL query
W.exec( sql );
W.commit();

json 파일 이름에 해당하는 테이블을 생성한다.


2. json file parsing

Server/DIVA2_DATA/YYYYMDD_0/JSON 폴더 안에 있는 json 파일들을 parsing한다.


3. insert data in table

parsing한 데이터들을 테이블에 삽입한다.

//JSON parsing & DB Storing
for(int i=0; i<Cam_datas.size(); i++){
   temp1=std::string((Cam_datas[i]["token"].asString()).c_str());
   temp2=std::string((Cam_datas[i]["fileformat"].asString()).c_str());
   temp3=std::string((Cam_datas[i]["filename"].asString()).c_str());

   //Create a transactional object
   work W(C);
	std::string query_string;
   query_string.append("insert into CAM_DATA values('"); 
            
   //Set table
   query_string.append(temp1);
   query_string.append("','");
   query_string.append(temp2);
   query_string.append("','");
   query_string.append(temp3);
   query_string.append("');");
         
   //Execute SQL query
   W.exec(query_string);
   W.commit();

2, 3 과정이 함께 구성되어 있다.


4. Database 연결 해제

//Disconnect Database
C.disconnect ();

database의 연결을 해제시켜준다.


코드 실행 후 생성되는 table 목록

데이터베이스에 8개의 table이 새로 생성되고, table 안에 데이터들이 저장된다.

log, frame, scene, gps_data, imu_data, cam_data, lidar_data, can_data


데이터 저장 확인

PostgreSQL에 접속하여 간단한 명령어와 쿼리문으로 데이터가 저장된 것을 확인할 수 있다.

\dt

테이블 목록 확인 명령어

select * from 테이블명;

특정 테이블의 모든 데이터를 조회하는 쿼리문