/****************************************************************************
                Thread class for storage used calcutator per service
                -----------------------------------------

    begin      : 2015/08/31
    copyright  : (C) 2005 Solbox Inc.
    author     : Dev Storage Team
	email      : huibong@solbox.com
	version    : 3.5

    CopyRight(C) 2005 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 __STORAGE_USED_CALC_THREAD_H__
#define __STORAGE_USED_CALC_THREAD_H__


#include <pthread.h>
#include <unistd.h>
#include <vector>

#include "RcdbInfo.h"
#include "Database.h"


// 각 서비스별 계산된 Storage 사용량 정보를 저장하기 위한 Struct....
struct storage_used_info {

	unsigned int timestamp;    // 5분 단위 timestamp 값 저장...

	int user_seq;              // 고객사 sequence 정보..
	int svc_seq;               // 서비스 sequence 정보.

	unsigned long long quota;  // 할당량 (Byte)
	unsigned long long used;   // 사용량 (Byte)

	unsigned long long check_resource_id;       // 조회 기준 resource_id 값.
	unsigned long long check_get_lastmodified;  // 조회 기준 get_lastmodifed 값.	

};



/// @brief CStorageUsedCalcThread
/// 본 클래스는 Thread 클래스로서...
/// RCDB 정보를 기준으로 서비스별 스토리지 사용량 정보를 주기적으로 계산하여... RCDB 및 Local DB 에 저장하는 역활을 수행한다.
class CStorageUsedCalcThread
{
	public:
	
		// 생성 및 소멸자.
		CStorageUsedCalcThread();
		~CStorageUsedCalcThread();

		// 업무 Flow 작업 시작
		bool Start( void );

			
	private:
		
		// Thread function....
		static void * threadFunc( void * arg );

		// 실제 작업 수행을 담당하는 함수
		void Execute( void );
				

		// Full Scan 을 담당하는 rc_du 를 실행시킨다.
		bool ExecuteFullScanProcess();

		// RCDB 에 저장된 full scan 실행 결과 정보를 조회하여 내부 객체인 m_vecStorage 에 저장 처리한다.
		bool GetFullScanResult( CRcdbInfo & rcdbInfo, unsigned int nowTimestamp );

		// RCDB t_sms_sp_svc_product 테이블로 부터 서비스 정보를 추출하여.. 멤버변수 m_vecStorage 에 저장한다.
		// return value : -1  : RCDB Query 수행 등의 오류 발생시
		//                 0  : 처리할 서비스 정보가 존재하지 않는 경우.
		//               양수 : 처리할 서비스의 갯수
		int GetServiceInfoFromRCDB( DataBase & rcdb );

		// 멤버 변수 m_vecStorage 에 저장된 서비스에 대하여....
		// Local db storage_stat 테이블에 저장된 마지막 스토리지 사용량, partial scan 관련 정보 값을 조회하여 저장 처리한다.
		// return value :  -1 : Local DB 접속 실패 등의 오류 발생시...
		//                 0  : 처리할 서비스 정보가 존재하지 않는 경우.
		//               양수 : 처리할 서비스의 갯수
		int GetLastStorageStatFromLocal();


		// 멤버 변수 m_vecStorage 에 저장된 서비스별 Storage 사용량 정보를 Local DB 에 저장 처리한다.
		bool SaveStorageStatToLocal( unsigned int nowTimestamp );

		// 멤버 변수 m_vecStorage 에 저장된 서비스별 Storage 사용량 정보를 RCDB 에 저장 처리한다.
		bool SaveStorageStatToRCDB( DataBase & rcdb, unsigned int nowTimestamp );

		// 멤버 객체 m_vecStorage 에 저장된 서비스별 스트리지 사용량을 확인하여.. 지정된 임계치가 초과할 경우. report 로그에 기록 처리한다.
		void CheckQuotaForReport( unsigned int nowTimestamp );


	private:
		
		// 쓰레드 핸들
        pthread_t m_threadHandle;

		// DB 조회 정보를 저장할 Vector 객체
		std::vector<struct storage_used_info> m_vecStorage;
		
};

#endif /* __STORAGE_USED_CALC_THREAD_H__ */

