/***************************************************************************
                Replicate Work Class
                -----------------------------------------
    begin      : 2012/10/14
    copyright  : (C) 2010 SolutionBox Inc.
    author     : Service 1 Team
    email      : svc1@solbox.com
    version    : 1.0

    CopyRight(C) 2010 SolutionBox Inc. All Rights reserved.
    Redistribution and use in source and binary forms, with or with out
    modification, are not permitted in outside of SolutionBox Inc.
***************************************************************************/

#ifndef __ACCOUNT_UPDATE_THREAD__
#define __ACCOUNT_UPDATE_THREAD__

#include </usr/include/sys/signal.h>
#include <csignal>
#include <pthread.h>
#include <string>
#include <map>
#include "Logger.h"
#include "Database.h"
#include "FimngdData.h"
#include "SharedMemAPR.h"

// 시스템에서 추출된 Mount 정보를 저장하기 위한 struct...
struct systme_mount_info {

	std::string mount_name;                  // Mount Name..

	unsigned long long available_byte;       // available byte
};

/// @brief
class CAccountUpdateThread
{
public:
	/// @brief 생성자
	/// @param [in] pLogger 로깅을 위한 클래스.
	CAccountUpdateThread();
	~CAccountUpdateThread();

	void printac(struct account *pAc);
	void printShredMemory();
	/// @brief Thread를 생성하고, 이를 시작한다.
	/// @param none
	/// @return 성공은 return true 실패는 return false
	bool Start();
	
	bool DbConnect();
	void DbClose();
	bool GetData();

	void MakeServiceFolder();
	void UpdateSharedMemory();
	/// @brief ProcessStatus 내의 RCDB 관련 설정값을 이용해 DB Connection을 한다.
	/// @param sighandle 쓰레드에서 signal에 따라 정상 종료하도록 signal handle을 전달한다.
	/// @param pShmemAccount 공유메모리 포인터
	/// @return 성공하면 return true 실패하면 return false
	bool ThreadInit(const sig_atomic_t *sighandle, CSharedMem* pShmemAccount);

// 서비스 폴더 생성을 위한 함수와 변수들
private:
	bool GetSystmeMountInfo();
	void GetUpperPath( const std::string & strSourcePath, std::string & strUpperPath );
	std::vector<std::string> GetMountNodeInfo();

	// systme 에서 추출된 mount 상태 정보를 저장하기 위한 vector 변수
	std::vector<std::string> m_vecMount;
	std::vector<std::string> m_vecMountNodeInfo;
	std::string m_szStorageRoot;
// Attributes
private:
	DataBase* m_pPgSQL;
	
	std::string m_szHost;
	int m_nPort;
	std::string m_szDBName;
	std::string m_szAcct;
	std::string m_szPasswd;

	// 쓰레드 핸들
	pthread_t m_threadHandle;
	
	const sig_atomic_t *m_sighandle;

	CSharedMem* m_pShmemAccount;

	std::map<std::string, struct account> m_mapAccount;

	// 쓰레드 시작 루틴이다.
	static void* EntryPoint(void* arg);
	
	// 해당 함수의 내용은 수정하지 말것.
	void Execute();
};
#endif //__ACCOUNT_UPDATE_THREAD__
