/***************************************************************************
                Replication 완료된 Content 정보를 RCDB 에 저장
                -----------------------------------------
    begin      : 2010/03/12
    copyright  : (C) 2010 Solbox Inc.
    author     : storage dev team
    email      : storage.sd@solbox.com
    version    : 3.3

    CopyRight(C) 2010 Solbox Inc. All Rights reserved.
    Redistribution and use in source and binary forms, with or with out
    modification, are not permitted in outside of Solbox Inc.
***************************************************************************/

#ifndef __REPLICATE_INSERT_H__
#define __REPLICATE_INSERT_H__

#include <pthread.h>

#include "ReplicationData.h"
#include "DataQueue.hpp"
#include "RcdbInfo.h"
#include "ReportLog.h"


// CReplicateInsert
// Replication 생성이 완료된 Conetent 정보를 queue 에서 pop 하여 RCDB 에 저장 처리를 수행
// 내부적으로 Thread를 사용
class CReplicateInsert
{
    public :
        
		// 생성자
        // @param [in] pCCompleteData replication 완료 content 정보를 저장하는 queue
		CReplicateInsert( CDataQueue<CCompleteData> * pCCompleteData );
		// 소멸자
		~CReplicateInsert();
        
        // 초기화
        bool Init();

        // Thread를 생성하고, 이를 시작한다.        
        bool Start();
        

	private :
        // 스레드 함수
		static void* threadFunc( void* arg );
        
		// RCDB 상에 복제 완료된 content 정보를 insert 처리한다. ( t_dav_resource 사용 )
		bool InsertToOldDB();

		// RCDB 상에 복제 완료된 content 정보를 insert 처리한다. ( t_meta_xxx 사용 )
		bool InsertToDB();
				        
        void Execute();
		

	private:

		// 생성자를 통해 전달받은 replication 생성 완료된 content 정보를 저장하는 queue 포인터.
		CDataQueue<CCompleteData> * m_pCompleteQueue;
		        
        // 쓰레드 핸들
        pthread_t m_threadHandle;
		
		// RCDB 접속 정보를 저장할 변수.
		CRcdbInfo m_rcdbInfo;

		// New 2014-06-19 huibong
		// RCDB 형상변경에 따라 서비스별 Table 분리 여부 판단 flag
		// TODO: 향후 신규 RCDB 형상 적용 완료 후 본 항목 제거 필요.
		// - false : 기존 t_dav_resource 테이블 사용.
		// - ture  : 신규 RCDB 형상 (서비스별 meta table 분리) 사용.
		bool m_bServiceTableSeparate;

		// Thread Loop 마다 Sleep Time 정보를 저장하기 위한 변수
		unsigned int m_uSleep;

		// Report log 처리 관련 객체
		CReportLog m_reportLog;

};

#endif // __REPLICATE_INSERT_H__
