/***************************************************************************
				Service Info Updater
                -----------------------------------------

	begin      : 2013/09/16
	copyright  : (C) 2005 Solbox Inc.
	author     : Development 1 Team
					- 2013/09/16
	email      : dev1@solbox.com
	version    : 3.2.0

	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 __CSERVICE_INFO_UPDATER__
#define __CSERVICE_INFO_UPDATER__

#include <pthread.h>
#include "Logger.h"
#include "Database.h"
#include "Data.h"
#include "DataQueue.h"


/// @brief CServiceInfoUpdater
/// 서비스 리스트를 요청 할 때 Login Info를 생성해서 Queue에 담아두게 되는데..
/// 그 Queue의 정보를 가지고 cs_service.cs_login_log table에 Instert 하는 역할을 한다.
/// 주기는 5분에 한번씩 Insert처리 할 것이 있는지 확인후 있다면 Instert 한다.
/// 
/// 내부적으로 Thread를 사용하고있다. 
class CServiceInfoUpdater
{
// Attributes
private:
	// 로깅 파일
	DataBase* m_pPgSQL;
	CQueue<CLoginInfo> *m_pLoginInfo;
   
	// 쓰레드 핸들
	//pthread_t m_threadHandle;
	pthread_t* m_pThreadHandle;
	/// @brief DB connection information
	std::string m_szHost;
	int m_nPort;
	std::string m_szDBName;
	std::string m_szAcct;
	std::string m_szPasswd;

	std::string m_szBaseDomain;

protected:

public:


// Operations
private:
	// 쓰레드 시작 루틴이다.
	static void* EntryPoint(void* arg);
	
	// DB에서 데이터를 가져올때 임시로 저장해두는 역할을 한다.
	CCustomerInfoMap *m_mapCustomerInfoTemp;

	// Worker에서 정보 조회를 할 수 있도록 Data를 저장해두는 역할을 한다.
	CCustomerInfoMap *m_mapCustomerInfo;
	
	// DB에서 주기적으로 전체 유저들의 정보들을 가져온다.
	bool Execute();
	
	// 내부기능 함수들
	bool DbConnect();
	void DbClose();
	
	/// @brief Data에 대한 뮤텍스 변수
	pthread_mutex_t m_mxData;


protected:

public:
	/// @brief 생성자
	/// @param [in] pLogger 로깅을 위한 클래스.
	CServiceInfoUpdater();
	~CServiceInfoUpdater();
	
	/// @brief 생성자
	/// @param [in]  db info
	/// @return 성공하면 return true 실패하면 return false
	bool Init(const std::string &szHost, const int nPort, const std::string &szDBName, const std::string &szAcct, const std::string &szPasswd);
	
	
	/// @brief Thread를 생성하고, 이를 시작한다.
	/// @param none
	/// @return 성공은 return true 실패는 return false
	bool Start();
	// DB에서 유저별 서비스 정보를 얻어 온다.
	bool GetServiceInfo(string szUserSeq, CServiceInfoMap *pmapServiceInfo);

	// Interface 함수 들이다.
	// 유저에 대한 Map Data를 얻는다.
	bool GetUserServiceData(string szUserID, CCustomerInfo &objCustomerInfo);
};
#endif //__CSERVICE_INFO_UPDATER__
