/***************************************************************************
                Cache 생성 관련 Job List 관리 class
                -----------------------------------------
    begin      : 2014/07/08
    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_JOB_LIST_H__
#define __CACHE_JOB_LIST_H__

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

#include "CacheRequestData.h"
#include "CacheData.h"


// CCacheJobList class
// Hot Content cache 생성 관련하여 
// 대기 중인 content 목록과 현재 Thread 를 통해서 진행 중인 Content 목록을 관리한다.
// 본 클래스의 목적은 
// 동일 Content 에 대해 연속된 Cache 생성 요청으로 인한 중복 작업으로 인해 발생 가능한 
// 잘못된 업무 Flow 발생을 방지하기 위해 존재한다.
// 작업 등록 : CacheOrder 모듈
// 작업 수행 : CacheControl 모듈 및 각 Cache Thread
// 작업 삭제 : CacheInsert 모듈에서 RCDB 작업 완료 후 삭제 처리.
class CCacheJobList
{
	public :
		
		// 생성자.
		CCacheJobList();
		
		// 소멸자.
		~CCacheJobList();
				
		// 등록된 job 의 갯수 반환.
		unsigned int GetSize( void );

		// 해당 Content 에 대한 Job 이 존재하는지 여부 판단.
		// true  : 이미 존재
		// false : 존재 안하거나.. 인자값 오류
		bool IsExist( CCacheRequestData & data );

		// 해당 Content 에 대한 Job 등록
		// true  : 등록 성공
		// false : 등록 실패
		bool Register( CCacheData & data );

		// 해당 Content 에 대해 등록된 job 삭제
		void UnRegister( CCacheData & data );
		
		// 저장된 job 중에서 상태 정보가 CACHE_STATUS_READY 인 job 을
		// 전달된 listData 에 최대 nMaxCount 값만큼 저장하여 반환한다.
		// - 전달된 job 은 중복 추출을 방지하기 위해 상태정보를 CACHE_STATUS_START 변경처리한다.
		// @param [IN] nMaxCout 추출 가능한 최대 갯수
		// @param [OUT] 추출된 job 정보를 저장하기 위한 List
		// @return false 추출 가능한 항목이 없을 경우.
		//         true  그 외
		bool GetDataToStart( const unsigned int nMaxCount, std::list<CCacheData>& listData );


	private:
		
		// job 정보을 담당하는 map ( key-value 구조 )
		// - key = content_length:uri 형식으로 구성하여 중복 제거 처리
		std::map<std::string, CCacheData> m_mapJob;
		
		// map 객체에 대한 접근제어를 담당할 mutex lock
		pthread_mutex_t m_mutexMap;


	private:

		// 전달받은 정보를 바탕으로 map 에 사용할 Key 값을 생성한다.
		// key 값은 동일 Contnt 중복 방지를 위해
		// content_length:filename_hash(경로정보를 제외한 Only hash name) 형식으로 구성한다.
		// @param data [IN] content length 및 filename hash 정보가 저장된 CCacheRequestData 객체 참조
		// @param strKey [OUT] 생성된 key 값.
		bool GetKey( CCacheRequestData & data, std::string& strKey );
						
};

#endif // __CACHE_JOB_LIST_H__
