/***************************************************************************
                   Anonymous Directory Class ( AnonymousDir.cpp )
                -----------------------------------------

	begin      : 2013/03/18
	copyright  : (C) 2013 Solbox Inc.
	author     : Development 1 Team
					- 2013/03/18 - 1st dadamin
	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.
***************************************************************************/
#include "rc_mngd.h"
#include "Job.h"
#include "AnonymousDir.h"
#include "JobData.h"
#include "Protocol.h"
#include "Configs.h"
#include "UtilFn.h"
#include "Logger.h"
#include "ReportLog.h"

CAnonymousDir::CAnonymousDir()
{

}

CAnonymousDir::~CAnonymousDir()
{

}

int CAnonymousDir::run( CJobDataMap &jobData )
{
	 int r = JOB_SUCCESS;
	_LOG( LDBG, "Anonymous Directory running...");

	CMyConfig* pConf = CMyConfig::GetInstance();

	if(!pConf)
	{
		LOG( LERR, "Config is NULL.");
		return JOB_ERR_CREATION_FAIL;
	}

	CRCDBControl rcdb;

	if( rcdb.Init() != 0 )
	{
		LOG( LERR, "RCDB Initialization failed.");
		return JOB_ERR_CREATION_FAIL;
	}	

	bool setAnony = false;

	while(1)
	{
		// check info
		int t = 0;
		t = ExistInfo(rcdb, jobData);
		if(t != 1 )
		{
			r = t;
			LOG( LERR, "Base information check error.");
			break;
		}
		
		if( !CheckIdentify(jobData) )
		{
			r = JOB_ERR_MISS_PASSWROD;
			break;
		}

		int num = atoi(jobData[KEY_REQ_DATA_NUM].c_str());

		vector<string> bodys;
		StringSplitEx(jobData[KEY_REQ_URI],SDK_DELIMITER,bodys);

		// 2013-03-19 : dadamin
		// 2개 이상 요청 일 경우 실패로 처리한다.
		// 해당 기능 수행 중 모호한 상태가 빠질 수 있으므로 에러 리턴함
		// 2개 중 1개만 성공하고 1개만 실패 했을 때 요청한 client로 응답 보낼 때 부분 에러로 
		// 리턴되어야 하지만, 현재(SDK 관련 로직) 관련 프로토콜상 실패/성공만 체크 하기 때문에 
		// 이런 경우 시스템적으로 불완전한 상태가 될 수 있음

		if(bodys.size() > 1 || num > 1)
		{
			r = JOB_ERR_REQ_EXCEED;
			LOG( LERR,  "The number of requests that could not be handled.[REQ CNT:%d].", num);
			break;
		}
		
		string targeturi;
		if(!bodys.empty())
		{
			targeturi = bodys[0];
		}		

		vector<string> anonydirs;
		if( !rcdb.GetAnonyDir(jobData, targeturi, anonydirs) )
		{
			r = JOB_ERR_GET_ANONY_DIR;
			break;
		}
		
		bool sendfhs = false;
		bool del = false;
		
		if(IsSubKey(jobData, JOB_ANONY_DIR_SET))
		{
			del = false; sendfhs = true;
			setAnony = anonydirs.size() ? false : true;
			
		}
		else if(IsSubKey(jobData, JOB_ANONY_DIR_UNSET))
		{
			del = true; sendfhs = true;
			setAnony = anonydirs.size() ? true : false;
		}
		else 
		{
			// JOB_ANONY_DIR_GET
			sendfhs = false; setAnony = false; del = false;			
			break;
		}		
		
		if(setAnony && !rcdb.BeginTrans())
		{
			r = JOB_ERR_RCDB_BEGIN_TRANS;
			break;
		}

		// rcdb
		if( setAnony && !rcdb.SetAnonyDir(jobData, targeturi, del) )
		{
			r = JOB_ERR_SET_ANONY_DIR;
			break;
		}

		// 2015.09.10
		// version 3.5 부터 FHS에서 해당 정보를 주기적으로 갱신 처리함

		rcdb.SetSuccess(true);
		
		break;
	}

	if(setAnony)
	{
		if( !rcdb.EndTrans() )
			r = JOB_ERR_RCDB_END_TRANS;
	}

	if(r != 0)
	{
		if(!IsSubKey(jobData, JOB_ANONY_DIR_GET))
		{
			// pgpool 3.0.9 이전 버전 경우 정적 쿼리 수행 후 동일 세션을 사용 시
			// pgpool 비정상 종료 현상이 발생하기 때문에 사용한 Pool을 강제 종료 시킴
			rcdb.ForceClose();
		}
		LOG( LERR, "Anonymous Directory(%s) error.[%s@%s:%s]", 
					jobData[KEY_JOBSUB_TYPE].c_str(),
					jobData[KEY_SP_SVC_ID].c_str(),	jobData[KEY_SP_USER_ID].c_str(),
					jobData[KEY_REQ_URI].c_str());
	}
	else 
	{
		_LOG( LINF, "Anonymous Directory(%s) success.[%s@%s:%s]",
			jobData[KEY_JOBSUB_TYPE].c_str(),
			jobData[KEY_SP_SVC_ID].c_str(),	jobData[KEY_SP_USER_ID].c_str(),
			jobData[KEY_REQ_URI].c_str());

		CReportLog rlog;

		if (rlog.Init(pConf->GetAppLogRoot()))
		{
			rlog.Write("INF", "[%s] [Anonymous Directory(%s).[%s@%s => %s]]"
				, PROG_NAME
				, jobData[KEY_JOBSUB_TYPE].c_str()
				, jobData[KEY_SP_SVC_ID].c_str(), jobData[KEY_SP_USER_ID].c_str()
				, jobData[KEY_REQ_URI].c_str());
		}
	}
	
	rcdb.Final();

	_LOG( LDBG, "Anonymous Directory End.");
	 return r;
}
