/***************************************************************************
                Replicate 대상 content 정보 조회 class
                -----------------------------------------
    begin      : 2010/03/11
    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_SELECT_H__ 
#define __REPLICATE_SELECT_H__

#include <pthread.h>
#include <map>

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

// CReplicateSelect
// 복제 대상 content 를 RCDB 로 부터 조회하여... Queue 에 저장 처리를 수행.
// 내부적으로 Thread 를 사용하여 주기적으로 RCDB 를 연결 후 조회 처리.
class CReplicateSelect
{

	public:
		// 생성자
		// @param [in] pCSsourceData 조회된 Content 정보를 저장할 Queue 객체 포인트
		CReplicateSelect( CDataQueue<CSourceData> * pQueue );

		// 소멸자
		~CReplicateSelect();

		// 초기화 작업 및 DB 접속 정보를 이용하여 RCDB Test 접속을 수행함.
		bool Init();
		
		// Thread를 생성하고, 이를 시작한다.
		bool Start();

		// 2010년 12월 6일 장희준 추가
		// Thread를 생성하고, 이를 시작한다.
		// 인자로 Replication 대상 선택을 위한 초단위의 시간 설정값을 받는다.
		bool Start( unsigned int interval, unsigned int intervalOnStarting );

			
	private:
		
		// Replication 대상 File 정보를 저장하기 위한 Queue 객체에 대한 Pointer, Not NULL
		CDataQueue<CSourceData> * m_pSourceQueue;
	
		// 내부 Thread 에 대한 ID
		pthread_t m_threadHandle;

		// RCDB 접속 정보를 저장할 변수.
		CRcdbInfo m_rcdbInfo;

		// 마지막 DB 조회 시간을 저장하기 위한 변수 ( micro-second 단위 )
		long long m_timeLastCheck;

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

		// 각 고객사별 Replicatin Count 정보를 저장하기 위한 변수
		// t_sms_sp_svc_product 테이블에 저장된 고객 tran_id 별 Repliation count 정보를 저장한다.
		std::map< std::string, int > m_listCustomer;

		// Replication 대상 선택 주기. 단위 :  microsec
		long long m_nTargetSelectInterval;

		// 프로세스 구동시의 replication 대상 선택 주기. 단위 : microsec 
		long long m_nTargetSelectIntervalOnStarting;

		// New 2014-06-13 huibong
		// uri skip 처리 관련 설정 정보 저장을 위한 vector 객체 생성.
		// 모든 content 마다 검사하는 정보이므로 처리 속도 향상을 위해 멤버변수화 처리함.
		std::vector<std::string> m_vecSipkWord;

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

		

	private:

		// 스레드 함수
		static void* threadFunc( void* arg );

		// loop 단위의 replication 대상 조회 작업 수행
		void Execute();

		// RCDB 로 부터 Replication 대상 content 조회		
		bool SelectFromDB();
	
		// replication 대상 선택시 시간 term 설정
		void SetTargetSelectInterval( unsigned int sec );
				
		// 프로세스 구동시의 replication 대상 선택 시간 term 설정		
		void SetTargetSelectIntervalOnStarting( unsigned int hour );
		
		// micro second 단위로 설정된 replication 대상 선택 시간 term 을 반환
		long long GetTargetSelectInterval();
				
		// micro second 단위로 설정된 프로세스 구동시의 replication 대상 선택 시간 term 을 반환
		long long GetTargetSelectIntervalOnStarting();

		// 전달받은 data 를 멤버변수인 m_pSourceQueue 에 push 처리한다.
		void PushDataToSourceQueue( CSourceData& data );

		/// 2012.09.24 : dadamin
		/// @brief 해당 uri에 skip keyword가 포함되어있는지 체크함
		/// @param [in] uri : 복제 대상 URI(복제 대상 full 파일명)
		/// @return ture 시 해당 uri에 skip keyword를 포함
		bool HasSkipKeyWord( const std::string & uri );
		void StringSplit( std::string str, std::string delim, std::vector<std::string> &results, bool bUseEmpty );
		

		// loop 간 sleep time 을 MAX 값으로 설정.
		void SetSleepTimeMax();

		// loop 간 sleep time 을 default 값으로 설정.
		void SetSleepTimeDefault();

		
};

#endif // __REPLICATE_SELECT_H__
