/***************************************************************************
                Cache 요청을 확인하여 Job 에 등록 처리를 수행
                -----------------------------------------
    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 __CACHE_ORDER_H__
#define __CACHE_ORDER_H__

#include <pthread.h>

#include "DataQueue.hpp"
#include "CacheRequestData.h"
#include "CacheJobList.h"
#include "ProperFhs.h"
#include "RcdbInfo.h"


// CCacheOrder
// FHS로부터 수신되어 Queue 에 저장된 Hot Content Cache 요청에 대해
// 중복 요청 여부 확인 및 RCDB 에서 해당 Content 를 저장한 FHS 를 확인한 후
// 실제 Cache 생성 작업이 진행되도록 Job List 에 저장하는 역활을 수행.
// 내부적으로 Thread를 사용
class CCacheOrder
{
	public:
		
		// 생성자
		// param [IN] pQueueCacheRequest Cache 요청 정보 저장 Queue 에 대한 포인터
		// param [IN] pCacheJob Cache 관련 Job List 객체에 대한 포인터
		// param [IN] pProperFhs Proper FHS 정보를 저장하는 객체에 대한 포인터
		CCacheOrder( CDataQueue<CCacheRequestData>* pQueueCacheRequest, CCacheJobList* pCacheJob, CProperFhs * pProperFhs );
		
		// 소멸자
		~CCacheOrder();

		// 객체 초기화 수행
		bool Init();

		// thread를 생성하여 업무 flow 를 시작.
		bool Start();
				
	
	private:

		// Cache 요청 정보 저장 Queue 에 대한 포인터
		// - 생성자를 통해 전달받음
		CDataQueue<CCacheRequestData>* m_pQueueCacheRequest;

		// Cache 관련 Job List 객체에 대한 포인터
		// - 생성자를 통해 전달받음
		CCacheJobList* m_pCacheJob;

		// Proper FHS 정보를 저장하는 객체에 대한 포인터
		// - 생성자를 통해 전달받음
		CProperFhs* m_pProperFhs;
	

		// 내부 Thread 에 대한 ID
		pthread_t m_threadHandle;

		// RCDB 접속 정보를 저장할 변수.
		CRcdbInfo m_rcdbInfo;
		
		// New 2014-07-07 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;
		
	private:

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

		// 스레드 내에서 각 loop 단위 처리 호출 함수.
		void Execute();
		
		// Cache Requet Queue 에 저장된 요청을 검사하여....
		// cache 생성 Job 에 추가하는 기능을 수행.		
		bool PushRequestToJob();

};
#endif // __CACHE_ORDER_H__ 
