Files
interactive/rcts/rc_mngd/src/RCDBControl.cpp
T
2026-08-07 17:38:18 +09:00

3595 lines
86 KiB
C++

/***************************************************************************
RCDB Control Class (RCDBControl.cpp)
-----------------------------------------
begin : 2013/02/26
copyright : (C) 2013 Solbox Inc.
author : Development 1 Team
- 2013/02/26 - 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 "RCDBControl.h"
#include "Configs.h"
#include "DbConnPool.h"
#include "Database.h"
#include "Logger.h"
#include "UtilFn.h"
#include "Protocol.h"
#include <algorithm>
#define USER_INFO_INSERT_COLUMN \
"sp_user_seq,"\
"sp_user_id,"\
"sp_user_password"\
#define USER_INFO_UPDATE_COLUMN \
"sp_user_password"\
#define PRODUCT_INSERT_COLUMN \
"sp_user_seq,"\
"sp_svc_tran_id,"\
"sp_svc_id,"\
"sp_svc_begin_date,"\
"sp_svc_end_date,"\
"max_bandwidth,"\
"max_str_size,"\
"initial_vector,"\
"private_key,"\
"validate_sp_session_id_yn,"\
"bandwidth_ctrl_yn,"\
"referer_chk_yn,"\
"replication_count,"\
"cal_used_depth,"\
"uri_ignore_case,"\
"del_file_keep_time"
#define PRODUCT_UPDATE_COLUMN \
"sp_svc_begin_date,"\
"sp_svc_end_date,"\
"max_bandwidth,"\
"max_str_size,"\
"initial_vector,"\
"private_key,"\
"validate_sp_session_id_yn,"\
"bandwidth_ctrl_yn,"\
"referer_chk_yn,"\
"replication_count,"\
"cal_used_depth,"\
"uri_ignore_case,"\
"del_file_keep_time"
#define PRODUCT_EXT_AUTH_MODE_STR KEY_REQ_AUTH_MODE
#define PRODUCT_EXT_AUTH_INSERT_COLUMN \
"sp_svc_tran_id,"\
"sp_user_seq,"\
PRODUCT_EXT_AUTH_MODE_STR","\
"auth_server,"\
"auth_path,"\
"auth_port,"\
"auth_timeout,"\
"bill_server,"\
"bill_path,"\
"bill_port,"\
"bill_timeout,"\
"referer_chk_url,"\
"referer_chk_filetype"
#define PRODUCT_EXT_AUTH_UPDATE_COLUMN \
PRODUCT_EXT_AUTH_MODE_STR","\
"auth_server,"\
"auth_path,"\
"auth_port,"\
"auth_timeout,"\
"bill_server,"\
"bill_path,"\
"bill_port,"\
"bill_timeout,"\
"referer_chk_url,"\
"referer_chk_filetype"
#define PRODUCT_BAND_MODE_STR KEY_REQ_BAND_MODE
#define PRODUCT_BAND_INSERT_COLUMN \
"sp_svc_tran_id,"\
"sp_user_seq,"\
PRODUCT_BAND_MODE_STR","\
"volume_bandwidth_limit,"\
"volume_bandwidth_current,"\
"volume_bandwidth_before,"\
"volume_bandwidth_control_current,"\
"volume_bandwidth_control_before,"\
"volume_bandwidth_update_datetime,"\
"session_bandwidth_limit"
#define PRODUCT_BAND_UPDATE_COLUMN \
PRODUCT_BAND_MODE_STR","\
"volume_bandwidth_limit,"\
"session_bandwidth_limit"
#define PRODUCT_SYNC_INSERT_COLUMN \
"sp_svc_tran_id,"\
"master_yn,"\
"linked_sp_svc_tran_id,"\
"linked_rcts"
#define SERVICE_VOLUME_INSERT_COLUMN \
"sp_user_seq,"\
"sp_svc_tran_id,"\
"depth,"\
"path_name"
//2014.07.23 신균 형상(9.3)경우 대소문자 관련 기능 구현시 사용되는 값(display_name)이므로 개통 시 해당 값을 insert 해야됨
#define SERVICE_ROOT_INSERT_COLUMN \
"sp_user_seq,"\
"sp_svc_tran_id,"\
"host_name,"\
KEY_URI","\
"display_name"
#define SERVICE_ROOT_UPDATE_COLUMN \
"host_name,"\
"get_etag,"\
"deleted_yn,"\
"file_lastmodified"
#define ANONYMOUS_INSERT_COLUMN \
"sp_user_seq,"\
"sp_svc_tran_id,"\
KEY_URI
static string timeToString(time_t stamp)
{
struct tm *_tm;
char buf[30] = { 0 };
_tm = localtime(&stamp);
sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d", (1900 + _tm->tm_year),
(_tm->tm_mon + 1), _tm->tm_mday, _tm->tm_hour,
_tm->tm_min, _tm->tm_sec);
return string(buf);
}
static string timeSQL(int t)
{
string r;
string strNow = timeToString(time(NULL));
switch (t)
{
case 1:
// NOW(),NOW()
r = "'" + strNow + "','" + strNow + "'";
break;
case 2:
// update_datetime = NOW()
r = "update_datetime = '" + strNow + "'";
break;
default:
break;
}
return r;
}
CRCDBControl::CRCDBControl()
: m_pDB(NULL), m_used(CConnDBpool::POOL_ERR)
, m_success(false), m_tabletype(-1), m_usedisplay(false)
{
}
CRCDBControl::~CRCDBControl()
{
}
void CRCDBControl::ForceClose()
{
m_used = CConnDBpool::POOL_CLOSE;
}
int CRCDBControl::Init()
{
int r = 0;
if (CMasterDBpool::getInstance() == NULL)
return -1;
// database
m_pDB = CMasterDBpool::getInstance()->GetConnFromPool();
// 2014.06.07 dadamin
// DB 형상 설정
m_tabletype = CMasterDBpool::getInstance()->GetTargetTableType();
m_usedisplay = (m_tabletype == 1);
if(m_pDB == NULL)
{
// failure to acquire Database
m_used = CConnDBpool::POOL_ERR;
r = -1;
}
else
{
r = 0;
m_used = CConnDBpool::POOL_USE;
}
return r;
}
int CRCDBControl::Final()
{
int r = 0;
if(m_pDB)
{
CMasterDBpool::getInstance()->ReleaseConnToPool(m_pDB, m_used);
m_pDB = NULL;
}
return r;
}
bool CRCDBControl::BeginTrans()
{
if(m_pDB)
{
if( m_pDB->PgDoExec("BEGIN WORK", DataBase::CLEAR) < 0)
{
// error
m_used = CConnDBpool::POOL_ERR;
LOG(LERR, "BeginTrans fail.[%s]", m_pDB->GetErrorMessage().c_str());
}
else
{
m_used = CConnDBpool::POOL_USE;
LOG(LDBG, "BeginTrans Success.[BEGIN WORK]");
}
}
return (m_used == CConnDBpool::POOL_USE ? true : false);
}
bool CRCDBControl::EndTrans()
{
if(m_pDB)
{
string sql;
if(m_success)
sql = "COMMIT WORK";
else
sql = "ROLLBACK WORK";
if( m_pDB->PgDoExec(const_cast<char*>(sql.c_str()), DataBase::CLEAR) < 0)
{
// error
m_used = CConnDBpool::POOL_ERR;
LOG(LERR, "EndTrans fail.[%s]", m_pDB->GetErrorMessage().c_str());
}
else
{
m_used = CConnDBpool::POOL_USE;
LOG(LDBG, "EndTrans Success.[%s]", sql.c_str());
}
}
return (m_used == CConnDBpool::POOL_USE ? true : false);
}
bool CRCDBControl::DoSQL(string sql, int nParamCnt, const char * const *paramValues)
{
_LOG(LDBG, "RCDB SQL:%s", sql.c_str());
if(nParamCnt == 0)
m_pDB->PgDoExec(sql);
else
m_pDB->PgDoExecParams(const_cast<char*>(sql.c_str()), nParamCnt, paramValues);
// Query 결과를 가져온다.
int nResult = m_pDB->PgResult(DataBase::NOT_CLEAR);
if(nResult < 0)
{
m_used = CConnDBpool::POOL_ERR;
LOG(LERR, "Database Error.[%s|%s]", sql.c_str(), m_pDB->GetErrorMessage().c_str());
return false;
}
return true;
}
bool CRCDBControl::DoSetSQL(string sql, int nParamCnt, const char * const *paramValues)
{
_LOG(LDBG, "RCDB SQL2:%s", sql.c_str());
if(nParamCnt == 0)
m_pDB->PgDoExec(sql);
else
m_pDB->PgDoExecParams(const_cast<char*>(sql.c_str()), nParamCnt, paramValues);
// Query 결과를 가져온다.
int nResult = m_pDB->PgResult(DataBase::CLEAR);
if(nResult < 0)
{
m_used = CConnDBpool::POOL_ERR;
LOG(LERR, "Database Error.[%s|%s]", sql.c_str(), m_pDB->GetErrorMessage().c_str());
return false;
}
return true;
}
bool CRCDBControl::CheckJobDataUserInfo(CJobDataMap & jobData, bool & hasuserseq, bool & hasuserid)
{
if( jobData[KEY_SP_USER_SEQ].empty() )
{
hasuserseq = false;
LOG(LDEV2, "User Information Jobdata empty.(%s)", KEY_SP_USER_SEQ);
}
if( jobData[KEY_SP_USER_ID].empty() )
{
hasuserid = false;
LOG(LDEV2, "User Information Jobdata empty.(%s)", KEY_SP_USER_ID);
}
if( hasuserseq == false && hasuserid == false )
{
return false;
}
return true;
}
bool CRCDBControl::CheckJobDataSvcProduct(CJobDataMap & jobData, bool & hastranid, bool & hassvcid)
{
if( jobData[KEY_SP_SVC_TRAN_ID].empty() )
{
hastranid = false;
LOG(LDEV2, "Service Product Jobdata empty.(%s)", KEY_SP_SVC_TRAN_ID);
}
if( jobData[KEY_SP_SVC_ID].empty() )
{
hassvcid = false;
LOG(LDEV2, "Service Product Jobdata empty.(%s)", KEY_SP_SVC_ID);
}
if( hastranid == false && hassvcid == false )
{
return false;
}
return true;
}
bool CRCDBControl::SetDB2JobData(bool & has, CJobDataMap & jobData, string valkey, const char * val)
{
if(has)
{
if( jobData[valkey].compare(val) != 0 )
{
LOG(LWAR, "SetDB2JobData failed.[key:%s, J:%s, S:%s]"
, valkey.c_str(), jobData[valkey].c_str(), val);
return false;
}
}
else
{
jobData[valkey] = val;
}
LOG(LDBG, "SetDB2JobData :has =%d, key = %s, val = %s", has, valkey.c_str(), val);
return true;
}
bool CRCDBControl::SetDB2JobData(CJobDataMap & jobData, string valkey, const char * val, bool force /* = false*/)
{
bool r = true;
bool exist = !(jobData[valkey].empty());
if(force)
{
if(exist)
{
if( jobData[valkey].compare(val) != 0)
{
LOG(LWAR, "SetDB2JobData : Force mode, key = %s, val = %s=>%s",
valkey.c_str(), jobData[valkey].c_str(), val);
}
}
exist = false;
}
r = SetDB2JobData(exist, jobData, valkey, val);
return r;
}
bool CRCDBControl::CheckUserInfo(CJobDataMap & jobData, bool & exist)
{
// check t_sms_sp_user
bool hasuserseq = true, hasuserid = true;
if( CheckJobDataUserInfo(jobData, hasuserseq, hasuserid) == false )
{
LOG(LERR, "User Information Jobdata empty.(ALL)");
return false;
}
int i = 0;
const char *paramValues[2];
ostringstream sql;
sql << "SELECT sp_user_seq, sp_user_id, sp_user_password FROM t_sms_sp_user ";
if (hasuserid && hasuserseq)
{
i = 2;
sql << "WHERE " << "sp_user_id = $1 OR sp_user_seq = $2";
paramValues[0] = jobData[KEY_SP_USER_ID].c_str();
paramValues[1] = jobData[KEY_SP_USER_SEQ].c_str();
}
else if (hasuserid)
{
i = 1;
sql << "WHERE " << "sp_user_id = $1";
paramValues[0] = jobData[KEY_SP_USER_ID].c_str();
}
else
{
i = 1;
sql << "WHERE " << "sp_user_seq = $1";
paramValues[0] = jobData[KEY_SP_USER_SEQ].c_str();
}
if (DoSQL(sql.str(), i, paramValues))
{
bool r = true;
if( m_pDB->GetNoTuples() == 1)
{
r = SetDB2JobData(hasuserid, jobData, KEY_SP_USER_ID, m_pDB->GetValue(0, 1));
if( r == false )
{
LOG(LNOT, "User Information difference(%s).[J:%s,D:%s]"
, KEY_SP_USER_ID, jobData[KEY_SP_USER_ID].c_str()
, m_pDB->GetValue(0, 1));
}
else
{
r = SetDB2JobData(hasuserseq, jobData, KEY_SP_USER_SEQ, m_pDB->GetValue(0, 0));
if (r == false)
{
LOG(LNOT, "User Information difference(%s).[J:%s,D:%s]"
, KEY_SP_USER_SEQ, jobData[KEY_SP_USER_SEQ].c_str()
, m_pDB->GetValue(0, 0));
}
}
if (r) exist = true;
}
else if ( m_pDB->GetNoTuples() > 1)
{
r = false;
LOG(LNOT, "User Information duplicate.[J:%s,J:%s]",
jobData[KEY_SP_USER_SEQ].c_str(), jobData[KEY_SP_USER_ID].c_str());
}
else
{
exist = false;
LOG(LDBG, "User Information empty.[J:%s,J:%s]",
jobData[KEY_SP_USER_SEQ].c_str(), jobData[KEY_SP_USER_ID].c_str());
}
if( r && exist )
{
if(jobData[KEY_SP_USER_PASSWORD].empty())
{
bool b = false;
SetDB2JobData(b, jobData, KEY_SP_USER_PASSWORD, m_pDB->GetValue(0, 2));
}
LOG(LDBG, "User Information exist.[%s,%s]",
jobData[KEY_SP_USER_SEQ].c_str(), jobData[KEY_SP_USER_ID].c_str());
}
m_pDB->PgClear();
return r;
}
return false;
}
bool CRCDBControl::CheckAnotherProduct(CJobDataMap & jobData, bool & exist)
{
// check t_sms_sp_svc_product
bool hastranid = true, hassvcid = true;
if (CheckJobDataSvcProduct(jobData, hastranid, hassvcid) == false)
{
LOG(LERR, "Service Procuct Jobdata empty.(ALL)");
return false;
}
const char *paramValues[2];
ostringstream sql;
sql << "SELECT sp_user_seq FROM t_sms_sp_svc_product WHERE sp_user_seq = ";
if (!hassvcid)
{
sql << "(SELECT sp_user_seq FROM t_sms_sp_svc_product WHERE sp_svc_tran_id = $1)";
sql << "AND sp_svc_tran_id != $2";
paramValues[0] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
paramValues[1] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
}
else
{
sql << "(SELECT sp_user_seq FROM t_sms_sp_svc_product WHERE sp_svc_id = $1)";
sql << "AND sp_svc_id != $2";
paramValues[0] = jobData[KEY_SP_SVC_ID].c_str();
paramValues[1] = jobData[KEY_SP_SVC_ID].c_str();
}
if (DoSQL(sql.str(), 2, paramValues))
{
if (m_pDB->GetNoTuples() > 0)
{
exist = true;
LOG(LINF, "Another Product exist.[user:%s]", paramValues[0]);
}
else
{
exist = false;
LOG(LINF, "Another Product empty.[user:%s]", paramValues[0]);
}
m_pDB->PgClear();
return true;
}
return false;
}
bool CRCDBControl::CheckProductInfo(CJobDataMap & jobData, bool & exist)
{
// check t_sms_sp_svc_product
bool hasuserseq = true, hasuserid = true;
bool hastranid = true, hassvcid = true;
CheckJobDataUserInfo(jobData, hasuserseq, hasuserid);
if ( CheckJobDataSvcProduct(jobData, hastranid, hassvcid) == false )
{
LOG(LERR, "Service Procuct Jobdata empty.(ALL)");
return false;
}
int i = 0;
const char *paramValues[2];
ostringstream sql;
sql << "SELECT U.sp_user_seq, U.sp_user_id, P.sp_svc_tran_id, P.sp_svc_id "
<< "FROM t_sms_sp_svc_product AS P "
<< "LEFT OUTER JOIN t_sms_sp_user AS U ON P.sp_user_seq = U.sp_user_seq";
if (hastranid && hassvcid)
{
i = 2;
sql << " WHERE P.sp_svc_tran_id = $1 OR P.sp_svc_id = $2";
paramValues[0] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
paramValues[1] = jobData[KEY_SP_SVC_ID].c_str();
}
else if(hastranid)
{
i = 1;
sql << " WHERE P.sp_svc_tran_id = $1";
paramValues[0] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
}
else
{
i = 1;
sql << " WHERE P.sp_svc_id = $1";
paramValues[0] = jobData[KEY_SP_SVC_ID].c_str();
}
if( DoSQL(sql.str(), i, paramValues) )
{
bool r = true;
if( m_pDB->GetNoTuples() == 1)
{
if(strlen(m_pDB->GetValue(0, 0)) == 0)
{
r = false;
LOG(LNOT, "Service Product exist. But User Information empty.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else
{
r = SetDB2JobData(hassvcid, jobData, KEY_SP_SVC_ID, m_pDB->GetValue(0, 3));
if(r == false)
{
LOG(LNOT, "Service Product difference(%s).[J:%s,D:%s]", KEY_SP_SVC_ID
, jobData[KEY_SP_SVC_ID].c_str(), m_pDB->GetValue(0, 3));
}
else
{
r = SetDB2JobData(hastranid, jobData, KEY_SP_SVC_TRAN_ID, m_pDB->GetValue(0, 2));
if (r == false)
{
LOG(LNOT, "Service Product difference(%s).[J:%s,D:%s]", KEY_SP_SVC_TRAN_ID
, jobData[KEY_SP_SVC_TRAN_ID].c_str(), m_pDB->GetValue(0, 2));
}
}
if (r) exist = true;
}
if( r && exist )
{
r = SetDB2JobData(hasuserseq, jobData, KEY_SP_USER_SEQ, m_pDB->GetValue(0, 0));
if(r == false)
{
LOG(LNOT, "Service Product exist. But User Information difference(%s)[J:%s].[J:%s,J:%s]"
, KEY_SP_USER_SEQ,jobData[KEY_SP_USER_SEQ].c_str(),
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
r = SetDB2JobData(hasuserid, jobData, KEY_SP_USER_ID, m_pDB->GetValue(0, 1));
if(r == false)
{
LOG(LNOT, "Service Product exist. But User Information difference(%s)[J:%s].[J:%s,J:%s]"
, KEY_SP_USER_ID, jobData[KEY_SP_USER_ID].c_str(),
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
}
}
else if ( m_pDB->GetNoTuples() > 1)
{
r = false;
LOG(LNOT, "Service Product duplicate.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else
{
exist = false;
LOG(LDBG, "Service Product empty.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(),jobData[KEY_SP_SVC_ID].c_str());
}
if( r && exist )
{
LOG(LDBG, "Service Product exist.[%s,%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
m_pDB->PgClear();
return r;
}
return false;
}
bool CRCDBControl::CheckProductExtAuth(CJobDataMap & jobData, bool & exist)
{
// check t_sms_sp_svc_product_val
bool hasuserseq = true, hasuserid = true;
bool hastranid = true, hassvcid = true;
CheckJobDataUserInfo(jobData, hasuserseq, hasuserid);
if ( CheckJobDataSvcProduct(jobData, hastranid, hassvcid) == false )
{
LOG(LERR, "Service Procuct(Auth) Jobdata empty.(ALL)");
return false;
}
const char *paramValues[1];
ostringstream sql;
sql << "SELECT U.sp_user_seq, U.sp_user_id, P.sp_user_seq, P.sp_svc_tran_id, P.sp_svc_id, PV.sp_user_seq, PV.sp_svc_tran_id "
//<< "FROM t_sms_sp_svc_product_val AS PV LEFT OUTER JOIN t_sms_sp_svc_product AS P USING (sp_svc_tran_id,sp_user_seq)"
<< "FROM t_sms_sp_svc_product_val AS PV "
<< " LEFT OUTER JOIN t_sms_sp_svc_product AS P ON PV.sp_svc_tran_id = P.sp_svc_tran_id"
<< ",t_sms_sp_svc_product_val AS PV2 "
<< " LEFT OUTER JOIN t_sms_sp_user AS U ON PV2.sp_user_seq = U.sp_user_seq "
<< "WHERE PV2.sp_svc_tran_id = PV.sp_svc_tran_id";
if(hastranid)
{
sql << " AND PV.sp_svc_tran_id = $1";
paramValues[0] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
}
else
{
sql << " AND PV.sp_svc_tran_id ="
<< "(SELECT sp_svc_tran_id FROM t_sms_sp_svc_product WHERE sp_svc_id = $1)";
paramValues[0] = jobData[KEY_SP_SVC_ID].c_str();
}
if( DoSQL(sql.str(), 1, paramValues) )
{
bool r = true;
if( m_pDB->GetNoTuples() == 1)
{
if(strlen(m_pDB->GetValue(0, 0)) == 0)
{
r = false;
LOG(LNOT, "Service Product Extensions(auth) exist. But User Information empty.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else if (strlen(m_pDB->GetValue(0, 2)) == 0)
{
r = false;
LOG(LNOT, "Service Product Extensions(auth) exist. But Service Product empty.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else if (strcmp(m_pDB->GetValue(0, 0),m_pDB->GetValue(0, 2)) != 0 )
{
r = false;
LOG(LNOT, "User & Product difference(sp_user_seq).[U:%s,P:%s][J:%s,J:%s]"
,m_pDB->GetValue(0, 0),m_pDB->GetValue(0, 2)
,jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else if(hastranid)
{
r = SetDB2JobData(hassvcid, jobData, KEY_SP_SVC_ID, m_pDB->GetValue(0, 4));
if(r == false)
{
LOG(LNOT, "Service Product difference(sp_svc_id).[J:%s,J:%s]"
,jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else
{
exist = true;
}
}
else
{
exist = true;
SetDB2JobData(hastranid, jobData, KEY_SP_SVC_TRAN_ID, m_pDB->GetValue(0, 3));
}
if( r && exist )
{
r = SetDB2JobData(hasuserseq, jobData, KEY_SP_USER_SEQ, m_pDB->GetValue(0, 0));
if(r == false)
{
LOG(LNOT, "Service Product Extensions(auth) exist. But User Information difference(sp_user_seq)[J:%s].[J:%s,J:%s]",
jobData[KEY_SP_USER_SEQ].c_str(), jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
r = SetDB2JobData(hasuserid, jobData, KEY_SP_USER_ID, m_pDB->GetValue(0, 1));
if(r == false)
{
LOG(LNOT, "Service Product Extensions(auth) exist. But User Information difference(sp_user_id)[J:%s].[J:%s,J:%s]",
jobData[KEY_SP_USER_ID].c_str(), jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
}
}
else if ( m_pDB->GetNoTuples() > 1)
{
r = false;
LOG(LNOT, "Service Product Extensions(auth) duplicate.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else
{
exist = false;
LOG(LDBG, "Service Product Extensions(auth) empty.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(),jobData[KEY_SP_SVC_ID].c_str());
}
if( r && exist )
{
LOG(LDBG, "Service Product Extensions(auth) exist.[%s,%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
m_pDB->PgClear();
return r;
}
return false;
}
bool CRCDBControl::CheckProductExtBand(CJobDataMap & jobData, bool & exist)
{
// check t_sms_sp_svc_product_band
bool hasuserseq = true, hasuserid = true;
bool hastranid = true, hassvcid = true;
CheckJobDataUserInfo(jobData, hasuserseq, hasuserid);
if ( CheckJobDataSvcProduct(jobData, hastranid, hassvcid) == false )
{
LOG(LERR, "Service Procuct(bandwidth) Jobdata empty.(ALL)");
return false;
}
const char *paramValues[1];
ostringstream sql;
sql << "SELECT U.sp_user_seq, U.sp_user_id, P.sp_user_seq, P.sp_svc_tran_id, P.sp_svc_id, PB.sp_user_seq, PB.sp_svc_tran_id "
<< "FROM t_sms_sp_svc_product_band AS PB "
<< " LEFT OUTER JOIN t_sms_sp_svc_product AS P ON PB.sp_svc_tran_id = P.sp_svc_tran_id"
<< ",t_sms_sp_svc_product_band AS PB2 "
<< " LEFT OUTER JOIN t_sms_sp_user AS U ON PB2.sp_user_seq = U.sp_user_seq "
<< "WHERE PB2.sp_svc_tran_id = PB.sp_svc_tran_id";
if(hastranid)
{
sql << " AND PB.sp_svc_tran_id = $1";
paramValues[0] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
}
else
{
sql << " AND PB.sp_svc_tran_id ="
<< "(SELECT sp_svc_tran_id FROM t_sms_sp_svc_product WHERE sp_svc_id = $1)";
paramValues[0] = jobData[KEY_SP_SVC_ID].c_str();
}
if( DoSQL(sql.str(), 1, paramValues) )
{
bool r = true;
if( m_pDB->GetNoTuples() == 1)
{
if(strlen(m_pDB->GetValue(0, 0)) == 0)
{
r = false;
LOG(LNOT, "Service Product Extensions(bandwidth) exist. But User Information empty.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else if (strlen(m_pDB->GetValue(0, 2)) == 0)
{
r = false;
LOG(LNOT, "Service Product Extensions(bandwidth) exist. But Service Product empty.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else if (strcmp(m_pDB->GetValue(0, 0),m_pDB->GetValue(0, 2)) != 0 )
{
r = false;
LOG(LNOT, "User & Product difference(sp_user_seq).[U:%s,P:%s][J:%s,J:%s]"
,m_pDB->GetValue(0, 0),m_pDB->GetValue(0, 2)
,jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else if(hastranid)
{
r = SetDB2JobData(hassvcid, jobData, KEY_SP_SVC_ID, m_pDB->GetValue(0, 4));
if(r == false)
{
LOG(LNOT, "Service Product difference(bandwidth).[J:%s,J:%s]"
,jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else
{
exist = true;
}
}
else
{
exist = true;
SetDB2JobData(hastranid, jobData, KEY_SP_SVC_TRAN_ID, m_pDB->GetValue(0, 3));
}
if( r && exist )
{
r = SetDB2JobData(hasuserseq, jobData, KEY_SP_USER_SEQ, m_pDB->GetValue(0, 0));
if(r == false)
{
LOG(LNOT, "Service Product Extensions(bandwidth) exist. But User Information difference(sp_user_seq)[J:%s].[J:%s,J:%s]",
jobData[KEY_SP_USER_SEQ].c_str(), jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
r = SetDB2JobData(hasuserid, jobData, KEY_SP_USER_ID, m_pDB->GetValue(0, 1));
if(r == false)
{
LOG(LNOT, "Service Product Extensions(bandwidth) exist. But User Information difference(sp_user_id)[J:%s].[J:%s,J:%s]",
jobData[KEY_SP_USER_ID].c_str(), jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
}
}
else if ( m_pDB->GetNoTuples() > 1)
{
r = false;
LOG(LNOT, "Service Product Extensions(bandwidth) duplicate.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else
{
exist = false;
LOG(LDBG, "Service Product Extensions(bandwidth) empty.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(),jobData[KEY_SP_SVC_ID].c_str());
}
if( r && exist )
{
LOG(LDBG, "Service Product Extensions(bandwidth) exist.[%s,%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
m_pDB->PgClear();
return r;
}
return false;
}
bool CRCDBControl::CheckProductSync(CJobDataMap & jobData, bool & exist)
{
// check t_sms_sp_svc_product_band
bool hasuserseq = true, hasuserid = true;
bool hastranid = true, hassvcid = true;
CheckJobDataUserInfo(jobData, hasuserseq, hasuserid);
if (CheckJobDataSvcProduct(jobData, hastranid, hassvcid) == false)
{
LOG(LERR, "Service Procuct(sync) Jobdata empty.(ALL)");
return false;
}
if (jobData[KEY_LINK_SP_SVC_TRAN_ID].empty() && jobData[KEY_LINK_RCTS].empty())
{
exist = false;
LOG(LWAR, "Service Procuct(sync) Jobdata link empty.");
return true;
}
ostringstream sql;
sql << "SELECT P.sp_user_seq, P.sp_svc_tran_id, P.sp_svc_id, PS.master_yn, PS.linked_sp_svc_tran_id, PS.linked_rcts "
<< "FROM t_sms_sp_svc_product_sync AS PS "
<< " LEFT OUTER JOIN t_sms_sp_svc_product AS P ON PS.sp_svc_tran_id = P.sp_svc_tran_id ";
const char *paramValues[4];
int index = 3;
sql << "WHERE ";
if (hastranid)
{
sql << "PS.sp_svc_tran_id = $1 ";
paramValues[0] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
}
else
{
sql << "PS.sp_svc_tran_id = "
<< "(SELECT sp_svc_tran_id FROM t_sms_sp_svc_product WHERE sp_svc_id = $1) ";
paramValues[0] = jobData[KEY_SP_SVC_ID].c_str();
}
sql << "AND PS.linked_sp_svc_tran_id = $2 ";
paramValues[1] = jobData[KEY_LINK_SP_SVC_TRAN_ID].c_str();
sql << "AND PS.linked_rcts = $3 ";
paramValues[2] = jobData[KEY_LINK_RCTS].c_str();
if (jobData[KEY_LINK_MASTER_YN].size())
{
index = 4;
sql << "AND PS.master_yn = $4 ";
paramValues[3] = jobData[KEY_LINK_MASTER_YN].c_str();
}
if (DoSQL(sql.str(), index, paramValues))
{
bool r = true;
if (m_pDB->GetNoTuples() == 1)
{
if (strlen(m_pDB->GetValue(0, 0)) == 0)
{
r = false;
LOG(LNOT, "Service Product sync exist. But Service Product empty.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else
{
r = SetDB2JobData(hasuserseq, jobData, KEY_SP_USER_SEQ, m_pDB->GetValue(0, 0));
if (r == false)
{
LOG(LNOT, "Service Product sync exist. But User Information difference(sp_user_seq)[J:%s].[J:%s,J:%s]",
jobData[KEY_SP_USER_SEQ].c_str(), jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else
{
SetDB2JobData(hastranid, jobData, KEY_SP_SVC_TRAN_ID, m_pDB->GetValue(0, 1));
SetDB2JobData(hassvcid, jobData, KEY_SP_SVC_ID, m_pDB->GetValue(0, 2));
if (jobData[KEY_LINK_MASTER_YN].compare(m_pDB->GetValue(0, 3)) != 0)
{
LOG(LNOT, "Service Product sync exist. But Information difference(master_yn)[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
r = false;
}
else
exist = true;
}
}
}
else if (m_pDB->GetNoTuples() > 1)
{
r = false;
LOG(LNOT, "Service Product sync duplicate.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else
{
exist = false;
LOG(LDBG, "Service Product sync empty.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
m_pDB->PgClear();
return r;
}
return false;
}
bool CRCDBControl::CheckVolumeInfo(CJobDataMap & jobData, bool & exist)
{
// check t_dav_use_dir
bool hasuserseq = true, hasuserid = true;
bool hastranid = true, hassvcid = true;
CheckJobDataUserInfo(jobData, hasuserseq, hasuserid);
if (CheckJobDataSvcProduct(jobData, hastranid, hassvcid) == false)
{
LOG(LERR, "Service Procuct Jobdata empty.(ALL)");
return false;
}
const char *paramValues[1];
ostringstream sql;
sql << "SELECT U.sp_user_seq, U.sp_user_id, P.sp_user_seq, P.sp_svc_tran_id, P.sp_svc_id, DU.sp_user_seq, DU.sp_svc_tran_id "
//<< "FROM t_sms_sp_svc_product_val AS PV LEFT OUTER JOIN t_sms_sp_svc_product AS P USING (sp_svc_tran_id,sp_user_seq)"
<< "FROM t_dav_use_dir AS DU "
<< " LEFT OUTER JOIN t_sms_sp_svc_product AS P ON DU.sp_svc_tran_id = P.sp_svc_tran_id"
<< ",t_dav_use_dir AS DU2 "
<< " LEFT OUTER JOIN t_sms_sp_user AS U ON DU2.sp_user_seq = U.sp_user_seq "
<< "WHERE DU2.sp_svc_tran_id = DU.sp_svc_tran_id";
sql << " AND DU2.depth = DU.depth AND DU.depth = 0";
if (hastranid)
{
sql << " AND DU.sp_svc_tran_id = $1";
paramValues[0] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
}
else
{
sql << " AND DU.sp_svc_tran_id ="
<< "(SELECT sp_svc_tran_id FROM t_sms_sp_svc_product WHERE sp_svc_id = $1)";
paramValues[0] = jobData[KEY_SP_SVC_ID].c_str();
}
if (DoSQL(sql.str(), 1, paramValues))
{
bool r = true;
if (m_pDB->GetNoTuples() == 1)
{
if (strlen(m_pDB->GetValue(0, 0)) == 0)
{
r = false;
LOG(LNOT, "Service Product Extensions(volume) exist. But User Information empty.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else if (strlen(m_pDB->GetValue(0, 2)) == 0)
{
r = false;
LOG(LNOT, "Service Product Extensions(volume) exist. But Service Product empty.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else if (strcmp(m_pDB->GetValue(0, 0), m_pDB->GetValue(0, 2)) != 0)
{
r = false;
LOG(LNOT, "User & Product difference(sp_user_seq).[U:%s,P:%s][J:%s,J:%s]"
, m_pDB->GetValue(0, 0), m_pDB->GetValue(0, 2)
, jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else if (hastranid)
{
r = SetDB2JobData(hassvcid, jobData, KEY_SP_SVC_ID, m_pDB->GetValue(0, 4));
if (r == false)
{
LOG(LNOT, "Service Product difference(volume).[J:%s,J:%s]"
, jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else
{
exist = true;
}
}
else
{
exist = true;
SetDB2JobData(hastranid, jobData, KEY_SP_SVC_TRAN_ID, m_pDB->GetValue(0, 3));
}
if (r && exist)
{
r = SetDB2JobData(hasuserseq, jobData, KEY_SP_USER_SEQ, m_pDB->GetValue(0, 0));
if (r == false)
{
LOG(LNOT, "Service Product Extensions(volume) exist. But User Information difference(sp_user_seq)[J:%s].[J:%s,J:%s]",
jobData[KEY_SP_USER_SEQ].c_str(), jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
r = SetDB2JobData(hasuserid, jobData, KEY_SP_USER_ID, m_pDB->GetValue(0, 1));
if (r == false)
{
LOG(LNOT, "Service Product Extensions(volume) exist. But User Information difference(sp_user_id)[J:%s].[J:%s,J:%s]",
jobData[KEY_SP_USER_ID].c_str(), jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
}
}
else if (m_pDB->GetNoTuples() > 1)
{
r = false;
LOG(LNOT, "Service Product Extensions(volume) duplicate.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else
{
exist = false;
LOG(LDBG, "Service Product Extensions(volume) empty.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
if (r && exist)
{
LOG(LDBG, "Service Product Extensions(volume) exist.[%s,%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
m_pDB->PgClear();
return r;
}
return false;
}
bool CRCDBControl::CheckRootInfo(CJobDataMap & jobData, bool & exist)
{
// check meta table
bool hasuserseq = true, hasuserid = true;
bool hastranid = true, hassvcid = true;
CheckJobDataUserInfo(jobData, hasuserseq, hasuserid);
if ( CheckJobDataSvcProduct(jobData, hastranid, hassvcid) == false )
{
LOG(LERR, "Service Procuct(Root Info) Jobdata empty.(ALL)");
return false;
}
// 2014.06.07 dadamin
// 형상(9.3) 변경으로 테이블명 변경
string tblname;
if (jobData[KEY_SP_SVC_TRAN_ID].size() <= 0)
{
LOG(LERR, "There is no information about the service requested(Root Info - tran_id).");
return false;
}
tblname = GetMataTableName(jobData[KEY_SP_SVC_TRAN_ID].c_str());
const char *paramValues[1];
ostringstream sql;
sql << "SELECT U.sp_user_seq, U.sp_user_id, P.sp_user_seq, P.sp_svc_tran_id, P.sp_svc_id, R.sp_user_seq, R.sp_svc_tran_id "
<< "FROM " << tblname << " AS R "
<< " LEFT OUTER JOIN t_sms_sp_svc_product AS P ON R.sp_svc_tran_id = P.sp_svc_tran_id"
<< ", " << tblname << " AS R2 "
<< " LEFT OUTER JOIN t_sms_sp_user AS U ON R2.sp_user_seq = U.sp_user_seq "
<< "WHERE R2.sp_svc_tran_id = R.sp_svc_tran_id AND R2.depth = R.depth "
<< "AND R2.deleted_yn = R.deleted_yn AND R2.is_cache = R.is_cache AND R2.resource_type = R.resource_type "
<< "AND R.depth = 0 AND R.deleted_yn = 'N' AND R.is_cache = 'N' AND R2.resource_type = 1";
if(hastranid)
{
sql << " AND R.sp_svc_tran_id = $1";
paramValues[0] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
}
else
{
sql << " AND R.sp_svc_tran_id ="
<< "(SELECT sp_svc_tran_id FROM t_sms_sp_svc_product WHERE sp_svc_id = $1)";
paramValues[0] = jobData[KEY_SP_SVC_ID].c_str();
}
if( DoSQL(sql.str(), 1, paramValues) )
{
bool r = true;
if( m_pDB->GetNoTuples() == 1)
{
if(strlen(m_pDB->GetValue(0, 0)) == 0)
{
r = false;
LOG(LNOT, "Service Product Root exist. But User Information empty.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else if (strlen(m_pDB->GetValue(0, 2)) == 0)
{
r = false;
LOG(LNOT, "Service Product Root exist. But Service Product empty.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else if (strcmp(m_pDB->GetValue(0, 0),m_pDB->GetValue(0, 2)) != 0 )
{
r = false;
LOG(LNOT, "User & Product difference(sp_user_seq).[U:%s,P:%s][J:%s,J:%s]"
,m_pDB->GetValue(0, 0),m_pDB->GetValue(0, 2)
,jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else if(hastranid)
{
r = SetDB2JobData(hassvcid, jobData, KEY_SP_SVC_ID, m_pDB->GetValue(0, 4));
if(r == false)
{
LOG(LNOT, "Service Product difference(Root).[J:%s,J:%s]"
,jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else
{
exist = true;
}
}
else
{
exist = true;
SetDB2JobData(hastranid, jobData, KEY_SP_SVC_TRAN_ID, m_pDB->GetValue(0, 3));
}
if( r && exist )
{
r = SetDB2JobData(hasuserseq, jobData, KEY_SP_USER_SEQ, m_pDB->GetValue(0, 0));
if(r == false)
{
LOG(LNOT, "Service Product Root exist. But User Information difference(sp_user_seq)[J:%s].[J:%s,J:%s]",
jobData[KEY_SP_USER_SEQ].c_str(), jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
r = SetDB2JobData(hasuserid, jobData, KEY_SP_USER_ID, m_pDB->GetValue(0, 1));
if(r == false)
{
LOG(LNOT, "Service Product Root exist. But User Information difference(sp_user_id)[J:%s].[J:%s,J:%s]",
jobData[KEY_SP_USER_ID].c_str(), jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
}
}
else if ( m_pDB->GetNoTuples() > 1)
{
r = false;
LOG(LNOT, "Service Product Root duplicate.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else
{
exist = false;
LOG(LDBG, "Service Root empty.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(),jobData[KEY_SP_SVC_ID].c_str());
}
if( r && exist )
{
LOG(LDBG, "Service Product Root exist.[%s,%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
m_pDB->PgClear();
return r;
}
return false;
}
bool CRCDBControl::CheckParentDir(CJobDataMap & jobData, bool & IgnoreCase)
{
CJobDataMap parent;
parent[KEY_SP_USER_SEQ] = jobData[KEY_SP_USER_SEQ];
parent[KEY_SP_SVC_TRAN_ID] = jobData[KEY_SP_SVC_TRAN_ID];
parent[KEY_REQ_URI] = p_name(jobData[KEY_REQ_URI]);
// root
if (parent[KEY_REQ_URI].empty()) {
jobData[KEY_URI_PARENT].append("/");
jobData[KEY_URI_PARENT].append(jobData[KEY_SP_SVC_TRAN_ID]);
return true;
}
if (!GetFileInfo(parent, IgnoreCase)) {
LOG(LERR, "Check the parent path failure.[%s,%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_REQ_URI].c_str());
return false;
}
if (parent[KEY_HOST_NAME].size())
jobData[KEY_URI_PARENT] = parent[KEY_URI];
return true;
}
string CRCDBControl::InsertStr(CJobDataMap & jobData, const char* key, int index, const char **paramValues)
{
ostringstream sql;
string key2 = key;
if(key2.compare(PRODUCT_EXT_AUTH_MODE_STR) == 0)
key2 = "mode";
else if (key2.compare(PRODUCT_BAND_MODE_STR) == 0)
key2 = "mode";
else if (key2.compare("display_name") == 0)
{
// 2014.07.23 신규 형상(9.3) 경우 대소문자 구분 기능을 display_name 사용하므로
// 관련 값을 uri 와 동일 하게 셋팅한다.
if (!jobData[KEY_URI].empty())
{
paramValues[index] = jobData[KEY_URI].c_str();
sql << key2;
}
}
else
key2 = key;
if(!jobData[key].empty())
{
paramValues[index] = jobData[key].c_str();
sql << key2;
}
_LOG(LDBG, "InsertStr :%d,%s,%s", index, key, sql.str().c_str());
return sql.str();
}
string CRCDBControl::UpdateStr(CJobDataMap & jobData, const char* key, int index, const char **paramValues)
{
ostringstream sql;
string key2 = key;
if(key2.compare(PRODUCT_EXT_AUTH_MODE_STR) == 0)
key2 = "mode";
else if (key2.compare(PRODUCT_BAND_MODE_STR) == 0)
key2 = "mode";
else
key2 = key;
if(!jobData[key].empty())
{
paramValues[index] = jobData[key].c_str();
sql << key2 << " = $" << (index+1);
}
_LOG(LDBG, "UpdateStr :%d,%s,%s", index, key, sql.str().c_str());
return sql.str();
}
string CRCDBControl::UpdateStr(CJobDataMap & jobData, const char* key)
{
ostringstream sql;
string key2 = key;
if(key2.compare(PRODUCT_EXT_AUTH_MODE_STR) == 0)
key2 = "mode";
else if (key2.compare(PRODUCT_BAND_MODE_STR) == 0)
key2 = "mode";
else
key2 = key;
if(!jobData[key].empty())
{
sql << key2 << " = '" << jobData[key] << "'";
}
_LOG(LDBG, "UpdateStr :%s,%s", key, sql.str().c_str());
return sql.str();
}
bool CRCDBControl::InsertUerInfo(CJobDataMap & jobData)
{
// insert t_sms_sp_user
int index = 0;
const char *paramValues[3];
ostringstream sql;
sql << "INSERT INTO t_sms_sp_user ";
sql << "(";
sql << "reg_datetime,update_datetime";
vector<string> cols;
StringSplit(USER_INFO_INSERT_COLUMN, ",", cols);
for (vector<string>::iterator it = cols.begin() ; it != cols.end(); ++it)
{
string s = InsertStr(jobData, (*it).c_str(), index, paramValues);
if(!s.empty())
{
sql << "," << s;
++index;
}
}
sql << ")";
sql << " VALUES ";
sql << "(";
// 2014-04-23 : dadamin
// pgpool 경우 now 사용할 경우 세션이 비정상 종료 발생함
// 2014 - 04 - 23 19:01 : 12 ERROR : pid 13391 : Child process 12705 was terminated by segmentation fault
// 2014 - 04 - 23 19 : 09 : 43 LOG : pid 14018 : An adress "0x137a2c50" does not exist in memory pool.
// sql << "NOW(),NOW()"; //reg_datetime,update_datetime
sql << timeSQL(1);
for(int i = 0; i < index; ++i)
{
sql << ",$"<<(i+1);
}
sql << ")";
if( DoSetSQL(sql.str(), index , paramValues) )
{
return true;
}
else
{
LOG(LERR, "Failed user information insert.[J:%s,J:%s]",
jobData[KEY_SP_USER_SEQ].c_str(), jobData[KEY_SP_USER_ID].c_str());
return false;
}
return true;
}
bool CRCDBControl::UpdateUserInfo(CJobDataMap & jobData)
{
// update t_sms_sp_user
int index = 0;
const char *paramValues[19];
ostringstream sql;
sql << "UPDATE t_sms_sp_user SET ";
// 2014-04-23 : dadamin
// pgpool 경우 now 사용할 경우 세션이 비정상 종료 발생함
// 2014 - 04 - 23 19:01 : 12 ERROR : pid 13391 : Child process 12705 was terminated by segmentation fault
// 2014 - 04 - 23 19 : 09 : 43 LOG : pid 14018 : An adress "0x137a2c50" does not exist in memory pool.
//sql << "update_datetime = NOW()";
sql << timeSQL(2);
// SET
vector<string> cols;
StringSplit(USER_INFO_UPDATE_COLUMN, ",", cols);
for (vector<string>::iterator it = cols.begin() ; it != cols.end(); ++it)
{
string s = UpdateStr(jobData, (*it).c_str(), index, paramValues);
if(!s.empty())
{
sql << "," << s;
++index;
}
}
// WHERE
if(!jobData[KEY_SP_USER_ID].empty())
{
paramValues [index++] = jobData[KEY_SP_USER_ID].c_str();
sql << " WHERE sp_user_id = $" << index;
}
else
{
paramValues [index++] = jobData[KEY_SP_USER_SEQ].c_str();
sql << " WHERE sp_user_seq = $" << index;
}
if( DoSetSQL(sql.str(), index , paramValues) )
{
return true;
}
else
{
LOG(LERR, "Failed user information update.[J:%s,J:%s]",
jobData[KEY_SP_USER_SEQ].c_str(), jobData[KEY_SP_USER_ID].c_str());
return false;
}
return true;
}
bool CRCDBControl::DeleteUserInfo(CJobDataMap & jobData)
{
// delete t_sms_sp_user
int index = 0;
const char *paramValues[19];
ostringstream sql;
sql << "DELETE FROM t_sms_sp_user ";
// WHERE
if (!jobData[KEY_SP_USER_ID].empty())
{
paramValues[index++] = jobData[KEY_SP_USER_ID].c_str();
sql << " WHERE sp_user_id = $" << index;
}
else
{
paramValues[index++] = jobData[KEY_SP_USER_SEQ].c_str();
sql << " WHERE sp_user_seq = $" << index;
}
if (DoSetSQL(sql.str(), index, paramValues))
{
return true;
}
else
{
LOG(LERR, "Failed user information delete.[J:%s,J:%s]",
jobData[KEY_SP_USER_SEQ].c_str(), jobData[KEY_SP_USER_ID].c_str());
return false;
}
return true;
}
bool CRCDBControl::SetUserInfo(CJobDataMap & jobData, bool & exist)
{
// set t_sms_sp_user
bool r = true;
if (exist)
{
if (jobData[KEY_DEL_USER_INFO].compare("Y") == 0)
r = DeleteUserInfo(jobData);
else
r = UpdateUserInfo(jobData);
}
else
r = InsertUerInfo(jobData);
return r;
}
bool CRCDBControl::InsertProductInfo(CJobDataMap & jobData)
{
// insert t_sms_sp_svc_product
int index = 0;
const char *paramValues[19];
ostringstream sql;
sql << "INSERT INTO t_sms_sp_svc_product ";
sql << "(";
sql << "reg_datetime,update_datetime";
vector<string> cols;
StringSplit(PRODUCT_INSERT_COLUMN, ",", cols);
for (vector<string>::iterator it = cols.begin() ; it != cols.end(); ++it)
{
string s = InsertStr(jobData, (*it).c_str(), index, paramValues);
if(!s.empty())
{
sql << "," << s;
++index;
}
}
sql << ")";
sql << " VALUES ";
sql << "(";
// 2014-04-23 : dadamin
// pgpool 경우 now 사용할 경우 세션이 비정상 종료 발생함
// 2014 - 04 - 23 19:01 : 12 ERROR : pid 13391 : Child process 12705 was terminated by segmentation fault
// 2014 - 04 - 23 19 : 09 : 43 LOG : pid 14018 : An adress "0x137a2c50" does not exist in memory pool.
// sql << "NOW(),NOW()"; //reg_datetime,update_datetime
sql << timeSQL(1);
for(int i = 0; i < index; ++i)
{
sql << ",$"<<(i+1);
}
sql << ")";
if( DoSetSQL(sql.str(), index , paramValues) )
{
return true;
}
else
{
LOG(LERR, "Failed service product insert.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
return false;
}
return true;
}
bool CRCDBControl::UpdateProductInfo(CJobDataMap & jobData)
{
// update t_sms_sp_svc_product
int index = 0;
const char *paramValues[19];
ostringstream sql;
sql << "UPDATE t_sms_sp_svc_product SET ";
// 2014-04-23 : dadamin
// pgpool 경우 now 사용할 경우 세션이 비정상 종료 발생함
// 2014 - 04 - 23 19:01 : 12 ERROR : pid 13391 : Child process 12705 was terminated by segmentation fault
// 2014 - 04 - 23 19 : 09 : 43 LOG : pid 14018 : An adress "0x137a2c50" does not exist in memory pool.
//sql << "update_datetime = NOW()";
sql << timeSQL(2);
// SET
vector<string> cols;
StringSplit(PRODUCT_UPDATE_COLUMN, ",", cols);
for (vector<string>::iterator it = cols.begin() ; it != cols.end(); ++it)
{
string s;
s = UpdateStr(jobData, (*it).c_str(), index, paramValues);
if(!s.empty())
{
sql << "," << s;
++index;
}
}
// WHERE
if(!jobData[KEY_SP_SVC_TRAN_ID].empty())
{
paramValues [index++] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
sql << " WHERE sp_svc_tran_id = $" << index;
}
else
{
paramValues [index++] = jobData[KEY_SP_SVC_ID].c_str();
sql << " WHERE sp_svc_id = $" << index;
}
if( DoSetSQL(sql.str(), index , paramValues) )
{
return true;
}
else
{
LOG(LERR, "Failed service product update.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
return false;
}
return true;
}
bool CRCDBControl::DeleteProductInfo(CJobDataMap & jobData)
{
// delete t_sms_sp_svc_product
int index = 0;
const char *paramValues[19];
ostringstream sql;
sql << "DELETE FROM t_sms_sp_svc_product ";
// WHERE
if (!jobData[KEY_SP_SVC_TRAN_ID].empty())
{
paramValues[index++] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
sql << " WHERE sp_svc_tran_id = $" << index;
}
else
{
paramValues[index++] = jobData[KEY_SP_SVC_ID].c_str();
sql << " WHERE sp_svc_id = $" << index;
}
if (DoSetSQL(sql.str(), index, paramValues))
{
return true;
}
else
{
LOG(LERR, "Failed service product delete.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
return false;
}
return true;
}
bool CRCDBControl::SetProductInfo(CJobDataMap & jobData, bool & exist)
{
// set t_sms_sp_svc_product
bool r = true;
if (exist)
{
if (jobData[KEY_DEL_PRODUCT].compare("Y") == 0)
r = DeleteProductInfo(jobData);
else
r = UpdateProductInfo(jobData);
}
else
r = InsertProductInfo(jobData);
return r;
}
bool CRCDBControl::InsertProductExtAuth(CJobDataMap & jobData)
{
// insert t_sms_sp_svc_product_val
int index = 0;
const char *paramValues[19];
ostringstream sql;
sql << "INSERT INTO t_sms_sp_svc_product_val ";
sql << "(";
sql << "reg_datetime,update_datetime";
vector<string> cols;
StringSplit(PRODUCT_EXT_AUTH_INSERT_COLUMN, ",", cols);
for (vector<string>::iterator it = cols.begin() ; it != cols.end(); ++it)
{
string s = InsertStr(jobData, (*it).c_str(), index, paramValues);
if(!s.empty())
{
sql << "," << s;
++index;
}
}
_LOG(LDBG, "InsertProductExtAuth : insert itme cnt=%d", index);
if ( index < 3 )
{
LOG(LWAR, "There is no data to be inserted");
return true;
}
sql << ")";
sql << " VALUES ";
sql << "(";
// 2014-04-23 : dadamin
// pgpool 경우 now 사용할 경우 세션이 비정상 종료 발생함
// 2014 - 04 - 23 19:01 : 12 ERROR : pid 13391 : Child process 12705 was terminated by segmentation fault
// 2014 - 04 - 23 19 : 09 : 43 LOG : pid 14018 : An adress "0x137a2c50" does not exist in memory pool.
// sql << "NOW(),NOW()"; //reg_datetime,update_datetime
sql << timeSQL(1);
for(int i = 0; i < index; ++i)
{
sql << ",$"<<(i+1);
}
sql << ")";
if( DoSetSQL(sql.str(), index , paramValues) )
{
return true;
}
else
{
LOG(LERR, "Failed service product extensible authentication insert.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
return false;
}
return true;
}
bool CRCDBControl::UpdateProductExtAuth(CJobDataMap & jobData)
{
// update t_sms_sp_svc_product_val
int index = 0;
const char *paramValues[19];
ostringstream sql;
sql << "UPDATE t_sms_sp_svc_product_val SET ";
// 2014-04-23 : dadamin
// pgpool 경우 now 사용할 경우 세션이 비정상 종료 발생함
// 2014 - 04 - 23 19:01 : 12 ERROR : pid 13391 : Child process 12705 was terminated by segmentation fault
// 2014 - 04 - 23 19 : 09 : 43 LOG : pid 14018 : An adress "0x137a2c50" does not exist in memory pool.
//sql << "update_datetime = NOW()";
sql << timeSQL(2);
// SET
vector<string> cols;
StringSplit(PRODUCT_EXT_AUTH_UPDATE_COLUMN, ",", cols);
for (vector<string>::iterator it = cols.begin() ; it != cols.end(); ++it)
{
string s = UpdateStr(jobData, (*it).c_str(), index, paramValues);
if(!s.empty())
{
sql << "," << s;
++index;
}
}
// WHERE
if(!jobData[KEY_SP_SVC_TRAN_ID].empty())
{
paramValues [index++] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
sql << " WHERE sp_svc_tran_id = $" << index;
}
else
{
paramValues [index++] = jobData[KEY_SP_SVC_ID].c_str();
sql << " WHERE sp_svc_id = (SELECT sp_svc_tran_id FROM t_sms_sp_svc_product WHERE sp_svc_id =$"
<< index << ")";
}
if( DoSetSQL(sql.str(), index , paramValues) )
{
return true;
}
else
{
LOG(LERR, "Failed service product extensible authentication update.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
return false;
}
return true;
}
bool CRCDBControl::DeleteProductExtAuth(CJobDataMap & jobData)
{
// update t_sms_sp_svc_product_val
int index = 0;
const char *paramValues[3];
ostringstream sql;
sql << "DELETE FROM t_sms_sp_svc_product_val";
// WHERE
if(!jobData[KEY_SP_SVC_TRAN_ID].empty())
{
paramValues [index++] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
sql << " WHERE sp_svc_tran_id = $" << index;
}
else
{
paramValues [index++] = jobData[KEY_SP_SVC_ID].c_str();
sql << " WHERE sp_svc_id = (SELECT sp_svc_tran_id FROM t_sms_sp_svc_product WHERE sp_svc_id = $"
<< index << ")";
}
if( DoSetSQL(sql.str(), index , paramValues) )
{
return true;
}
else
{
LOG(LERR, "Failed service product extensible authentication deleted.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
return false;
}
return true;
}
bool CRCDBControl::SetProductExtAuth(CJobDataMap & jobData, bool & exist)
{
// set t_sms_sp_svc_product_val
bool r = true;
if(exist)
{
if(jobData[KEY_VALIDATE_SP_SESSION_ID_YN].compare("N") == 0)
r = DeleteProductExtAuth(jobData);
else
r = UpdateProductExtAuth(jobData);
}
else
{
if(jobData[KEY_VALIDATE_SP_SESSION_ID_YN].compare("Y") == 0)
r = InsertProductExtAuth(jobData);
}
return r;
}
bool CRCDBControl::InsertProductBand(CJobDataMap & jobData)
{
// insert t_sms_sp_svc_product_band
int index = 0;
const char *paramValues[19];
ostringstream sql;
sql << "INSERT INTO t_sms_sp_svc_product_band ";
sql << "(";
sql << "reg_datetime,update_datetime";
vector<string> cols;
StringSplit(PRODUCT_BAND_INSERT_COLUMN, ",", cols);
for (vector<string>::iterator it = cols.begin() ; it != cols.end(); ++it)
{
string s = InsertStr(jobData, (*it).c_str(), index, paramValues);
if(!s.empty())
{
sql << "," << s;
++index;
}
}
_LOG(LDBG, "InsertProductBand : insert itme cnt=%d", index);
if ( index < 3 )
{
LOG(LWAR, "There is no data to be inserted");
return true;
}
sql << ")";
sql << " VALUES ";
sql << "(";
// 2014-04-23 : dadamin
// pgpool 경우 now 사용할 경우 세션이 비정상 종료 발생함
// 2014 - 04 - 23 19:01 : 12 ERROR : pid 13391 : Child process 12705 was terminated by segmentation fault
// 2014 - 04 - 23 19 : 09 : 43 LOG : pid 14018 : An adress "0x137a2c50" does not exist in memory pool.
// sql << "NOW(),NOW()"; //reg_datetime,update_datetime
sql << timeSQL(1);
for(int i = 0; i < index; ++i)
{
sql << ",$"<<(i+1);
}
sql << ")";
if( DoSetSQL(sql.str(), index , paramValues) )
{
return true;
}
else
{
LOG(LERR, "Failed service product bandwidth insert.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
return false;
}
return true;
}
bool CRCDBControl::UpdateProductBand(CJobDataMap & jobData)
{
// update t_sms_sp_svc_product_band
int index = 0;
const char *paramValues[19];
ostringstream sql;
sql << "UPDATE t_sms_sp_svc_product_band SET ";
// 2014-04-23 : dadamin
// pgpool 경우 now 사용할 경우 세션이 비정상 종료 발생함
// 2014 - 04 - 23 19:01 : 12 ERROR : pid 13391 : Child process 12705 was terminated by segmentation fault
// 2014 - 04 - 23 19 : 09 : 43 LOG : pid 14018 : An adress "0x137a2c50" does not exist in memory pool.
//sql << "update_datetime = NOW()";
sql << timeSQL(2);
// SET
vector<string> cols;
StringSplit(PRODUCT_BAND_UPDATE_COLUMN, ",", cols);
for (vector<string>::iterator it = cols.begin() ; it != cols.end(); ++it)
{
string s = UpdateStr(jobData, (*it).c_str(), index, paramValues);
if(!s.empty())
{
sql << "," << s;
++index;
}
}
// WHERE
if(!jobData[KEY_SP_SVC_TRAN_ID].empty())
{
paramValues [index++] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
sql << " WHERE sp_svc_tran_id = $" << index;
}
else
{
paramValues [index++] = jobData[KEY_SP_SVC_ID].c_str();
sql << " WHERE sp_svc_id = (SELECT sp_svc_tran_id FROM t_sms_sp_svc_product WHERE sp_svc_id =$"
<< index << ")";
}
if( DoSetSQL(sql.str(), index , paramValues) )
{
return true;
}
else
{
LOG(LERR, "Failed service product bandwidth update.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
return false;
}
return true;
}
bool CRCDBControl::DeleteProductBand(CJobDataMap & jobData)
{
// update t_sms_sp_svc_product_band
int index = 0;
const char *paramValues[3];
ostringstream sql;
sql << "DELETE FROM t_sms_sp_svc_product_band";
// WHERE
if(!jobData[KEY_SP_SVC_TRAN_ID].empty())
{
paramValues [index++] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
sql << " WHERE sp_svc_tran_id = $" << index;
}
else
{
paramValues [index++] = jobData[KEY_SP_SVC_ID].c_str();
sql << " WHERE sp_svc_id = (SELECT sp_svc_tran_id FROM t_sms_sp_svc_product WHERE sp_svc_id =$"
<< index << ")";
}
if( DoSetSQL(sql.str(), index , paramValues) )
{
return true;
}
else
{
LOG(LERR, "Failed service product bandwidth deleted.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
return false;
}
return true;
}
bool CRCDBControl::SetProductBand(CJobDataMap & jobData, bool & exist)
{
// set t_sms_sp_svc_product_band
bool r = true;
if(exist)
{
if( jobData[KEY_BANDWIDTH_CTRL_YN].compare("N") == 0 )
r = DeleteProductBand(jobData);
else
r = UpdateProductBand(jobData);
}
else
{
if( jobData[KEY_BANDWIDTH_CTRL_YN].compare("Y") == 0 )
r = InsertProductBand(jobData);
}
return r;
}
bool CRCDBControl::GetSyncLink(CJobDataMap & jobData)
{
ostringstream sql;
const char *paramValues[4];
int index = 0;
sql << "SELECT sp_svc_tran_id, master_yn, linked_sp_svc_tran_id, linked_rcts ";
sql << "FROM t_sms_sp_svc_product_sync ";
sql << "WHERE ";
paramValues[index++] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
sql << "sp_svc_tran_id = $" << index << " ";
if (jobData[KEY_LINK_MASTER_YN].size())
{
paramValues[index++] = jobData[KEY_LINK_MASTER_YN].c_str();
sql << "AND master_yn = $" << index << " ";
}
if (jobData[KEY_LINK_SP_SVC_TRAN_ID].size())
{
paramValues[index++] = jobData[KEY_LINK_SP_SVC_TRAN_ID].c_str();
sql << "AND linked_sp_svc_tran_id = $" << index << " ";
}
if (jobData[KEY_LINK_RCTS].size())
{
paramValues[index++] = jobData[KEY_LINK_RCTS].c_str();
sql << "AND linked_rcts = $" << index << " ";
}
if (DoSQL(sql.str(), index, paramValues))
{
ostringstream d;
for (int c = 0; c < m_pDB->GetNoTuples(); ++c)
{
if (c > 0) d << ",";
d << m_pDB->GetValue(c, 0) << "|" << m_pDB->GetValue(c, 1) << "|";
d << m_pDB->GetValue(c, 2) << "|" << m_pDB->GetValue(c, 3);
}
m_pDB->PgClear();
jobData[KEY_SYNC_LIST] = d.str();
return true;
}
return false;
}
bool CRCDBControl::InsertProductSync(CJobDataMap & jobData)
{
// insert t_sms_sp_svc_product_sync
int index = 0;
const char *paramValues[19];
if (jobData[KEY_LINK_SP_SVC_TRAN_ID].empty()
|| jobData[KEY_LINK_RCTS].empty()
|| jobData[KEY_LINK_MASTER_YN].empty())
{
LOG(LWAR, "Sync Link Infomation empyt [J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
return true;
}
ostringstream sql;
sql << "INSERT INTO t_sms_sp_svc_product_sync ";
sql << "(";
vector<string> cols;
StringSplit(PRODUCT_SYNC_INSERT_COLUMN, ",", cols);
for (vector<string>::iterator it = cols.begin(); it != cols.end(); ++it)
{
string s = InsertStr(jobData, (*it).c_str(), index, paramValues);
if (index > 0)
{
sql << ",";
}
if (!s.empty())
{
sql << s;
++index;
}
}
sql << ")";
sql << " VALUES ";
sql << "(";
for (int i = 0; i < index; ++i)
{
if (i > 0)
{
sql << ",";
}
sql << "$" << (i + 1);
}
sql << ")";
if (DoSetSQL(sql.str(), index, paramValues))
{
return true;
}
else
{
LOG(LERR, "Failed service product sync insert.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
return false;
}
return true;
}
bool CRCDBControl::DeleteProductSync(CJobDataMap & jobData)
{
// delete t_sms_sp_svc_product_sync
int index = 0;
const char *paramValues[19];
/*
if (jobData[KEY_LINK_SP_SVC_TRAN_ID].empty() || jobData[KEY_LINK_RCTS].empty())
{
LOG( LERR, "This item is not enough to delete the t_sms_sp_svc_product_sync Table.[J:%s, J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
return false;
}
*/
ostringstream sql;
sql << "DELETE FROM t_sms_sp_svc_product_sync ";
// WHERE
if (!jobData[KEY_SP_SVC_TRAN_ID].empty())
{
paramValues[index++] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
sql << "WHERE sp_svc_tran_id = $" << index << " ";
}
else
{
paramValues[index++] = jobData[KEY_SP_SVC_ID].c_str();
sql << "WHERE sp_svc_id = (SELECT sp_svc_tran_id FROM t_sms_sp_svc_product WHERE sp_svc_id = $"
<< index << ") ";
}
if (!jobData[KEY_LINK_MASTER_YN].empty())
{
paramValues[index++] = jobData[KEY_LINK_MASTER_YN].c_str();
sql << "AND master_yn = $" << index << " ";
}
if (!jobData[KEY_LINK_SP_SVC_TRAN_ID].empty())
{
paramValues[index++] = jobData[KEY_LINK_SP_SVC_TRAN_ID].c_str();
sql << "AND linked_sp_svc_tran_id = $" << index << " ";
}
if (!jobData[KEY_LINK_RCTS].empty())
{
paramValues[index++] = jobData[KEY_LINK_RCTS].c_str();
sql << "AND linked_rcts = $" << index << " ";
}
if (DoSetSQL(sql.str(), index, paramValues))
{
return true;
}
else
{
LOG(LERR, "Failed service product sync deleted.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
return false;
}
return true;
}
bool CRCDBControl::SetProductSync(CJobDataMap & jobData, bool & exist)
{
// set t_sms_sp_svc_product_sync
bool r = true;
if (exist)
{
if (jobData[KEY_REQ_LINK_CODE] == SYNC_LINK_CODE_UNLINK)
r = DeleteProductSync(jobData);
}
else
{
if ( jobData[KEY_JOB_TYPE] == JOB_SERVICE_OPEN
|| jobData[KEY_REQ_LINK_CODE] == SYNC_LINK_CODE_LINK)
r = InsertProductSync(jobData);
}
return r;
}
bool CRCDBControl::InsertUseDir(CJobDataMap & jobData)
{
// insert t_dav_use_dir
int index = 0;
const char *paramValues[19];
ostringstream sql;
jobData["depth"] = "0";
ostringstream uri;
uri << "/" << jobData[KEY_SP_SVC_TRAN_ID];
jobData["path_name"] = uri.str();
sql << "INSERT INTO t_dav_use_dir ";
sql << "(";
vector<string> cols;
StringSplit(SERVICE_VOLUME_INSERT_COLUMN, ",", cols);
for (vector<string>::iterator it = cols.begin(); it != cols.end(); ++it)
{
if (index > 0)
sql << ",";
string s = InsertStr(jobData, (*it).c_str(), index, paramValues);
if (!s.empty())
{
sql << s;
++index;
}
}
_LOG(LDBG, "InsertUseDir : insert itme cnt=%d", index);
sql << ")";
sql << " VALUES ";
sql << "(";
for (int i = 0; i < index; ++i)
{
if (i > 0)
sql << ",";
sql << "$" << (i + 1);
}
sql << ")";
if (DoSetSQL(sql.str(), index, paramValues))
{
return true;
}
else
{
LOG(LERR, "Failed service volume info insert.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
return false;
}
return true;
}
bool CRCDBControl::DeleteUseDir(CJobDataMap & jobData)
{
// delete t_dav_use_dir
int index = 0;
const char *paramValues[3];
ostringstream sql;
sql << "DELETE FROM t_dav_use_dir";
// WHERE
if (!jobData[KEY_SP_SVC_TRAN_ID].empty())
{
paramValues[index++] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
sql << " WHERE sp_svc_tran_id = $" << index;
}
else
{
paramValues[index++] = jobData[KEY_SP_SVC_ID].c_str();
sql << " WHERE sp_svc_tran_id = (SELECT sp_svc_tran_id FROM t_sms_sp_svc_product WHERE sp_svc_id =$"
<< index << ")";
}
if (DoSetSQL(sql.str(), index, paramValues))
{
return true;
}
else
{
LOG(LERR, "Failed service volume info deleted.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
return false;
}
return true;
}
bool CRCDBControl::SetVolumeInfo(CJobDataMap & jobData, bool & exist)
{
// set t_dav_use_dir
bool r = true;
if (!exist)
r = InsertUseDir(jobData);
else
{
if (jobData[KEY_DEL_DIR_USED].compare("Y") == 0)
r = DeleteUseDir(jobData);
}
return r;
}
bool CRCDBControl::InsertRootInfo(CJobDataMap & jobData)
{
// insert meta
int index = 0;
const char *paramValues[19];
// 2014.06.07 dadamin
// 형상(9.3) 변경으로 테이블명 변경
string tblname;
if (jobData[KEY_SP_SVC_TRAN_ID].size() <= 0)
{
LOG(LERR, "There is no information about the service requested(insert root - tran_id).");
return false;
}
tblname = GetMataTableName(jobData[KEY_SP_SVC_TRAN_ID].c_str());
ostringstream sql;
uint64_t nowtime = GetTimeStamp();
sql << "INSERT INTO " << tblname;
sql << "(";
sql << "creation_date,get_lastmodified,file_lastmodified";
sql << ",filename_org,filename_hash,resource_type,depth";
// 2014.07.14 사용되지 않는 컬럼 정리(get_content_language,get_etag,supported_lock,lock_discovery)
sql << ",get_content_length,get_content_type";
sql << ",source";
vector<string> cols;
StringSplit(SERVICE_ROOT_INSERT_COLUMN, ",", cols);
for (vector<string>::iterator it = cols.begin() ; it != cols.end(); ++it)
{
string s = InsertStr(jobData, (*it).c_str(), index, paramValues);
if(!s.empty())
{
sql << "," << s;
++index;
}
}
// 2014.07.14 사용되지 않는 컬럼 정리(get_content_language,get_etag,supported_lock,lock_discovery)
sql << ")";
sql << " VALUES ";
sql << "(";
sql << nowtime << "," << nowtime << "," << nowtime;
sql << ",'','',1,0";
sql << ",0,'httpd/unix-directory'";
sql << ",0";
for(int i = 0; i < index; ++i)
{
sql << ",$"<<(i+1);
}
sql << ")";
if( DoSetSQL(sql.str(), index , paramValues) )
{
return true;
}
else
{
LOG(LERR, "Failed service root insert.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
return false;
}
return true;
}
bool CRCDBControl::UpdateRootInfo(CJobDataMap & jobData)
{
// update meta
int index = 0;
const char *paramValues[19];
// 2014.06.07 dadamin
// 형상(9.3) 변경으로 테이블명 변경
string tblname;
if (jobData[KEY_SP_SVC_TRAN_ID].size() <= 0)
{
LOG(LERR, "There is no information about the service requested(update root - tran_id).");
return false;
}
tblname = GetMataTableName(jobData[KEY_SP_SVC_TRAN_ID].c_str());
ostringstream sql;
uint64_t nowtime = GetTimeStamp();
sql << "UPDATE " << tblname << " SET "
<< "get_lastmodified = " << nowtime;
// SET
vector<string> cols;
StringSplit(SERVICE_ROOT_UPDATE_COLUMN, ",", cols);
for (vector<string>::iterator it = cols.begin() ; it != cols.end(); ++it)
{
string s = UpdateStr(jobData, (*it).c_str(), index, paramValues);
if(!s.empty())
{
sql << "," << s;
++index;
}
}
// WHERE
if(!jobData[KEY_SP_SVC_TRAN_ID].empty())
{
paramValues [index++] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
sql << " WHERE sp_svc_tran_id = $" << index;
}
else
{
paramValues [index++] = jobData[KEY_URI].c_str();
sql << " WHERE uri = $" << index;
}
sql << " AND depth = 0 AND deleted_yn = 'N'";
if( DoSetSQL(sql.str(), index , paramValues) )
{
return true;
}
else
{
LOG(LERR, "Failed service root update.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
return false;
}
return true;
}
bool CRCDBControl::DeleteRootInfo(CJobDataMap & jobData)
{
// delete meta
int index = 0;
const char *paramValues[19];
// 2014.06.07 dadamin
// 형상(9.3) 변경으로 테이블명 변경
string tblname;
if (jobData[KEY_SP_SVC_TRAN_ID].size() <= 0)
{
LOG(LERR, "There is no information about the service requested(delete root - tran_id).");
return false;
}
tblname = GetMataTableName(jobData[KEY_SP_SVC_TRAN_ID].c_str());
ostringstream sql;
uint64_t nowtime = GetTimeStamp();
sql << "DELETE FROM " << tblname;
// WHERE
if(!jobData[KEY_SP_SVC_TRAN_ID].empty())
{
paramValues [index++] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
sql << " WHERE sp_svc_tran_id = $" << index;
}
else
{
paramValues [index++] = jobData[KEY_URI].c_str();
sql << " WHERE uri = $" << index;
}
sql << " AND depth = 0 AND deleted_yn = 'N'";
if( DoSetSQL(sql.str(), index , paramValues) )
{
return true;
}
else
{
LOG(LERR, "Failed service root delete.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
return false;
}
return true;
}
bool CRCDBControl::SetRootInfo(CJobDataMap & jobData, bool & exist)
{
// set meta - root
bool r = true;
if(exist)
{
if (jobData[KEY_DEL_ROOT].compare("Y") == 0)
{
r = DeleteRootInfo(jobData);
// 2014-06-24 dadamin
// 신규 형상(9.3) 경우 서비스별 메타 테이블 생성이므로 root 정보 삭제 성공 시
// 해당 테이블 삭제한다.
if (r)
r = DropMetaTable(jobData);
}
else
r = UpdateRootInfo(jobData);
}
else
{
if (jobData["host_name"].empty())
{
if (!jobData[KEY_SP_SVC_ID].empty())
{
ostringstream domain;
domain << jobData[KEY_SP_SVC_ID] << "." <<
CMyConfig::GetInstance()->GetRCDomain();
jobData["host_name"] = domain.str();
}
}
if (jobData[KEY_URI].empty())
{
if (!jobData[KEY_SP_SVC_TRAN_ID].empty())
{
ostringstream uri;
uri << "/" << jobData[KEY_SP_SVC_TRAN_ID];
jobData[KEY_URI] = uri.str();
}
}
r = InsertRootInfo(jobData);
}
return r;
}
bool CRCDBControl::GetVolumeInformation(CJobDataMap & jobData)
{
bool r = true;
// check ignore case
bool ignorecase = false;
if (CheckUriIgnoreCase(jobData, ignorecase) == false)
{
return false;
}
const char *paramValues[3];
ostringstream sql;
sql << "SELECT d.sp_user_seq, d.sp_svc_tran_id, d.path_name, P.max_str_size, SUM(d.dir_used) "
<< "FROM t_dav_use_dir AS d "
<< " RIGHT OUTER JOIN t_sms_sp_svc_product AS P ON d.sp_svc_tran_id = P.sp_svc_tran_id";
sql << " WHERE P.sp_svc_tran_id = $1";
paramValues[0] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
if(jobData[KEY_REQ_URI].empty())
{
ostringstream uri;
uri << "/" << jobData[KEY_SP_SVC_TRAN_ID];
jobData[KEY_REQ_URI] = uri.str();
if (ignorecase)
{
if (m_usedisplay)
sql << " AND (d.path_name = lower($2) OR d.path_name ISNULL)";
else
sql << " AND (lower(d.path_name) = lower($2) OR d.path_name ISNULL)";
}
else
sql << " AND (d.path_name = $2 OR d.path_name ISNULL)";
}
else
{
if (ignorecase)
{
if (m_usedisplay)
sql << " AND d.path_name = lower($2)";
else
sql << " AND lower(d.path_name) = lower($2)";
}
else
sql << " AND d.path_name = $2";
}
sql << " GROUP BY d.sp_user_seq, d.sp_svc_tran_id, d.path_name, P.max_str_size ";
paramValues[1] = jobData[KEY_REQ_URI].c_str();
LOG(LDBG, "GetVolumeInformation %s,%s", paramValues[0], paramValues[1]);
if( DoSQL(sql.str(), 2, paramValues) )
{
r = true;
if( m_pDB->GetNoTuples() == 1 )
{
jobData[KEY_MAX_STR_SIZE] = m_pDB->GetValue(0, 3);
jobData[KEY_DIR_USED] = m_pDB->GetValue(0, 4);
}
else if ( m_pDB->GetNoTuples() > 1 )
{
LOG(LNOT, "Volume Information duplicate.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_REQ_URI].c_str());
jobData[KEY_MAX_STR_SIZE] = m_pDB->GetValue(0, 3);
jobData[KEY_DIR_USED] = m_pDB->GetValue(0, 4);
}
else
{
LOG(LNOT, "Volume Information empty.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_REQ_URI].c_str());
jobData[KEY_MAX_STR_SIZE] = "0";
jobData[KEY_DIR_USED] = "0" ;
}
m_pDB->PgClear();
}
else
{
r = false;
}
if(r)
{
LOG(LDBG, "GetVolumeInformation : %s,%s|%s,%s",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_REQ_URI].c_str(),
jobData[KEY_MAX_STR_SIZE].c_str(), jobData[KEY_DIR_USED].c_str());
}
return r;
}
bool CRCDBControl::GetAnonyDir(CJobDataMap & jobData, string targeturi, vector<string> & rdata)
{
bool r = true;
int ncnt = 0;
const char *paramValues[3];
ostringstream sql;
sql << "SELECT sp_user_seq, sp_svc_tran_id, uri FROM t_dav_anonymous";
sql << " WHERE sp_user_seq = $1 AND sp_svc_tran_id = $2 ";
paramValues[ncnt++] = jobData[KEY_SP_USER_SEQ].c_str();
paramValues[ncnt++] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
if( !targeturi.empty() )
{
sql << " AND uri = $3";
paramValues[ncnt++] = targeturi.c_str();
}
if( DoSQL(sql.str(), ncnt, paramValues) )
{
r = true;
// 결과 Row 수 확인
int nNum = m_pDB->GetNoTuples();
ostringstream response;
char d = SDK_DELIMITER;
for(int i = 0; i < nNum; ++i)
{
rdata.push_back(m_pDB->GetValue(i, 2));
if(i > 0)
response << d;
response << m_pDB->GetValue(i, 2);
}
jobData[KEY_RES_URI] = response.str();
m_pDB->PgClear();
}
else
r = false;
return r;
}
bool CRCDBControl::InsertAnonymous(CJobDataMap & jobData, string &targeturi)
{
if(targeturi.empty())
{
LOG(LERR, "Target uri is empty.[%s]", targeturi.c_str());
return false;
}
jobData[KEY_URI] = targeturi;
int index = 0;
const char *paramValues[5];
ostringstream sql;
sql << "INSERT INTO t_dav_anonymous ";
sql << "(";
sql << "reg_datetime,update_datetime";
vector<string> cols;
StringSplit(ANONYMOUS_INSERT_COLUMN, ",", cols);
for (vector<string>::iterator it = cols.begin() ; it != cols.end(); ++it)
{
string s = InsertStr(jobData, (*it).c_str(), index, paramValues);
if(!s.empty())
{
sql << "," << s;
++index;
}
}
sql << ")";
sql << " VALUES ";
sql << "(";
// 2014-04-23 : dadamin
// pgpool 경우 now 사용할 경우 세션이 비정상 종료 발생함
// 2014 - 04 - 23 19:01 : 12 ERROR : pid 13391 : Child process 12705 was terminated by segmentation fault
// 2014 - 04 - 23 19 : 09 : 43 LOG : pid 14018 : An adress "0x137a2c50" does not exist in memory pool.
// sql << "NOW(),NOW(),'N'"; //reg_datetime,update_datetime
sql << timeSQL(1);
sql << "";
for(int i = 0; i < index; ++i)
{
sql << ",$"<<(i+1);
}
sql << ")";
if( DoSetSQL(sql.str(), index , paramValues) )
{
return true;
}
else
{
LOG(LERR, "Failed Anonymous insert.[J:%s,J:%s]",
jobData[KEY_SP_USER_SEQ].c_str(), jobData[KEY_SP_USER_ID].c_str());
return false;
}
return true;
}
bool CRCDBControl::DeleteAnonymous(CJobDataMap & jobData, string &targeturi)
{
int index = 0;
const char *paramValues[3];
ostringstream sql;
sql << "DELETE FROM t_dav_anonymous WHERE ";
// WHERE
paramValues [index++] = jobData[KEY_SP_USER_SEQ].c_str();
sql << KEY_SP_USER_SEQ << " = $" << index;
paramValues [index++] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
sql << " AND " << KEY_SP_SVC_TRAN_ID << " = $" << index;
if(!targeturi.empty())
{
paramValues [index++] = targeturi.c_str();
sql << " AND " << KEY_URI << " = $" << index;
}
if( DoSetSQL(sql.str(), index , paramValues) )
{
return true;
}
else
{
LOG(LERR, "Failed Anonymous delete.[J:%s,J:%s - %s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str(),
targeturi.c_str());
return false;
}
return true;
}
bool CRCDBControl::SetAnonyDir(CJobDataMap & jobData, string targeturi, bool isdel /* = false */)
{
bool r = true;
if(isdel)
r = DeleteAnonymous(jobData, targeturi);
else
r = InsertAnonymous(jobData, targeturi);
return r;
}
#define SQLAND_STRING(index, sql) if( index > 0 ) sql << " AND ";
string CRCDBControl::WhereStr(CJobDataMap & jobData, const char* key, int &index, const char **paramValues, bool IgnoreCase)
{
ostringstream r;
if(!jobData[key].empty())
{
SQLAND_STRING(index, r);
if ( IgnoreCase )
r << key << " = lower($" << (index + 1) << ")";
else
r << key << " = $" << (index + 1) ;
paramValues[index++] = jobData[key].c_str();
}
_LOG(LDBG, "WhereStr :%d,%s,%s,%s", index, key,
r.str().c_str(), jobData[key].c_str());
return r.str();
}
bool CRCDBControl::GetFileInfo(CJobDataMap & jobData, bool IgnoreCase /*= false*/)
{
bool r = true;
if( jobData[KEY_REQ_URI].empty() )
{
LOG(LERR, "Request URI is empty.");
return false;
}
// 2014.06.09 dadamin
// 형상(9.3) 변경으로 테이블명 변경
string tblname;
if (jobData[KEY_SP_SVC_TRAN_ID].size() <= 0)
{
LOG(LERR, "There is no information about the service requested(GetFileInfo - tran_id).");
return false;
}
tblname = GetMataTableName(jobData[KEY_SP_SVC_TRAN_ID].c_str());
string::size_type pos = jobData[KEY_REQ_URI].find_last_of("/");
string::size_type len = jobData[KEY_REQ_URI].size();
string ruri = jobData[KEY_REQ_URI];
if (pos == 0 && len == 1)
{
// root
ruri.clear();
}
else if ((pos + 1) == len)
{
// tail remove
ruri = ruri.substr(0, pos);
}
else
{
// nothing
}
ostringstream uri;
uri << "/" << jobData[KEY_SP_SVC_TRAN_ID] << ruri;
jobData[KEY_URI] = uri.str();
int index = 0;
const char *paramValues[5];
ostringstream sql;
sql << "SELECT " ;
sql << " sp_user_seq, sp_svc_tran_id, host_name, resource_type, uri";
sql << ", filename_hash, depth, get_content_length, deleted_yn, is_cache";
sql << ", file_lastmodified";
sql << " FROM " << tblname;
sql << " WHERE ";
sql << WhereStr(jobData, KEY_SP_USER_SEQ, index, paramValues);
sql << WhereStr(jobData, KEY_SP_SVC_TRAN_ID, index, paramValues);
sql << WhereStr(jobData, KEY_URI, index, paramValues, IgnoreCase);
SQLAND_STRING(index, sql);
sql << " deleted_yn = 'N' AND is_cache = 'N'";
if( DoSQL(sql.str(), index, paramValues) )
{
if( m_pDB->GetNoTuples() == 1 )
{
if(!jobData[KEY_GET_CONTENT_LENGTH].empty() &&
jobData[KEY_GET_CONTENT_LENGTH].compare(m_pDB->GetValue(0, 7)) != 0)
{
r = false;
LOG(LERR, "Differs from the requested file size and the size of the files in the meta.[J:%s]",
jobData[KEY_REQ_URI].c_str());
}
else
{
jobData[KEY_HOST_NAME] = m_pDB->GetValue(0, 2);
jobData[KEY_RESOURCE_TYPE] = m_pDB->GetValue(0, 3);
jobData[KEY_FILENAME_HASH] = m_pDB->GetValue(0, 5);
jobData[KEY_GET_CONTENT_LENGTH] = m_pDB->GetValue(0, 7);
}
}
else if ( m_pDB->GetNoTuples() > 1 )
{
r = false;
LOG(LERR, "File Information duplicate.[J:%s]", jobData[KEY_REQ_URI].c_str());
}
else
{
r = true;
_LOG(LNOT, "File Information empty.[J:%s]", jobData[KEY_REQ_URI].c_str());
}
m_pDB->PgClear();
}
else
r = false;
return r;
}
bool CRCDBControl::HasFile(CJobDataMap & jobData, bool & exist)
{
bool r = true;
// 2014.06.09 dadamin
// 형상(9.3) 변경으로 테이블명 변경
string tblname;
if (jobData[KEY_SP_SVC_TRAN_ID].size() <= 0)
{
LOG(LERR, "There is no information about the service requested(HasFile - tran_id).");
return false;
}
tblname = GetMataTableName(jobData[KEY_SP_SVC_TRAN_ID].c_str());
ostringstream uri;
uri << "/" << jobData[KEY_SP_SVC_TRAN_ID] << "/";
jobData[KEY_URI] = uri.str();
const char *paramValues[1];
ostringstream sql;
sql << "SELECT uri FROM " << tblname <<" WHERE uri LIKE $1 || '%' LIMIT 1";
paramValues[0] = jobData[KEY_URI].c_str();
if (DoSQL(sql.str(), 1, paramValues))
{
r = true;
if (m_pDB->GetNoTuples() > 0)
{
exist = true;
LOG(LINF, "File Information exist.[uri:%s]", paramValues[0]);
}
else
{
exist = false;
LOG(LINF, "File Information empty.[uri:%s]", paramValues[0]);
}
m_pDB->PgClear();
}
else
r = false;
return r;
}
// 2014.06.07 dadamin
// 메타 테이블명 반환
string CRCDBControl::GetMataTableName(const char* tranid)
{
string r;
switch (m_tabletype)
{
case 1:
r = "t_meta_";
r += tranid;
break;
case 0:
default:
r = "t_dav_resource";
break;
}
LOG(LDBG, "Working Table Name %s", r.c_str());
return r;
}
bool CRCDBControl::CheckUriIgnoreCase(CJobDataMap & jobData, bool & IgnoreCase)
{
bool hasuserseq = true, hasuserid = true;
bool hastranid = true, hassvcid = true;
CheckJobDataUserInfo(jobData, hasuserseq, hasuserid);
if (CheckJobDataSvcProduct(jobData, hastranid, hassvcid) == false)
{
LOG(LERR, "Service Procuct(uir ignore case) Jobdata empty.(ALL)");
return false;
}
int i = 0;
const char *paramValues[2];
ostringstream sql;
sql << "SELECT U.sp_user_seq, U.sp_user_id, P.sp_svc_tran_id, P.sp_svc_id "
<< ", P.uri_ignore_case "
<< "FROM t_sms_sp_svc_product AS P "
<< "LEFT OUTER JOIN t_sms_sp_user AS U ON P.sp_user_seq = U.sp_user_seq";
if (hastranid && hassvcid)
{
i = 2;
sql << " WHERE P.sp_svc_tran_id = $1 OR P.sp_svc_id = $2";
paramValues[0] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
paramValues[1] = jobData[KEY_SP_SVC_ID].c_str();
}
else if (hastranid)
{
i = 1;
sql << " WHERE P.sp_svc_tran_id = $1";
paramValues[0] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
}
else
{
i = 1;
sql << " WHERE P.sp_svc_id = $1";
paramValues[0] = jobData[KEY_SP_SVC_ID].c_str();
}
if (DoSQL(sql.str(), i, paramValues))
{
bool r = true, exist = false;
if (m_pDB->GetNoTuples() == 1)
{
if (strlen(m_pDB->GetValue(0, 0)) == 0)
{
r = false;
LOG(LNOT, "Service Product exist. But User Information empty.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else
{
r = SetDB2JobData(hassvcid, jobData, KEY_SP_SVC_ID, m_pDB->GetValue(0, 3));
if (r == false)
{
LOG(LNOT, "Service Product difference(%s).[J:%s,D:%s]", KEY_SP_SVC_ID
, jobData[KEY_SP_SVC_ID].c_str(), m_pDB->GetValue(0, 3));
}
else
{
r = SetDB2JobData(hastranid, jobData, KEY_SP_SVC_TRAN_ID, m_pDB->GetValue(0, 2));
if (r == false)
{
LOG(LNOT, "Service Product difference(%s).[J:%s,D:%s]", KEY_SP_SVC_TRAN_ID
, jobData[KEY_SP_SVC_TRAN_ID].c_str(), m_pDB->GetValue(0, 2));
}
}
if (r) exist = true;
}
if (r && exist)
{
r = SetDB2JobData(hasuserseq, jobData, KEY_SP_USER_SEQ, m_pDB->GetValue(0, 0));
if (r == false)
{
LOG(LNOT, "Service Product exist. But User Information difference(%s)[J:%s].[J:%s,J:%s]"
, KEY_SP_USER_SEQ, jobData[KEY_SP_USER_SEQ].c_str(),
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
r = SetDB2JobData(hasuserid, jobData, KEY_SP_USER_ID, m_pDB->GetValue(0, 1));
if (r == false)
{
LOG(LNOT, "Service Product exist. But User Information difference(%s)[J:%s].[J:%s,J:%s]"
, KEY_SP_USER_ID, jobData[KEY_SP_USER_ID].c_str(),
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
string v = m_pDB->GetValue(0, 4);
IgnoreCase = (v.compare("Y") == 0);
}
}
else if (m_pDB->GetNoTuples() > 1)
{
r = false;
LOG(LNOT, "Service Product duplicate.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
else
{
exist = false;
LOG(LDBG, "Service Product empty.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
}
if (r && exist)
{
LOG(LDBG, "Service Product exist.[%s,%s, %d]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str()
, IgnoreCase);
}
m_pDB->PgClear();
return r;
}
return true;
}
static uint64_t convert(string s)
{
if (s.size() == 0)
return 0;
uint64_t v = 0;
size_t i = 0;
char sign = (s[0] == '-' || s[0] == '+') ? (++i, s[0]) : '+';
for (; i < s.size(); ++i)
{
if (s[i] < '0' || s[i] > '9')
return 0;
v = v * 10 + s[i] - '0';
}
return sign == '-' ? -v : v;
}
bool CRCDBControl::GetTotalCntFiles(CJobDataMap & jobData, uint64_t & total, uint64_t limit /*= 0*/)
{
bool r = true;
string tblname;
if (jobData[KEY_SP_SVC_TRAN_ID].size() <= 0)
{
LOG(LERR, "There is no information about the service requested(GetTotalCntFiles - tran_id).");
return false;
}
tblname = GetMataTableName(jobData[KEY_SP_SVC_TRAN_ID].c_str());
ostringstream uri;
uri << "/" << jobData[KEY_SP_SVC_TRAN_ID] << "/";
jobData[KEY_URI] = uri.str();
const char *paramValues[1];
ostringstream sql;
sql << "SELECT count(uri) FROM ( ";
sql << "SELECT uri FROM " << tblname << " WHERE uri LIKE $1 || '%' ";
sql << "AND deleted_yn = 'N' ";
if (limit > 0)
sql << "LIMIT " << limit;
sql << " ) t";
paramValues[0] = jobData[KEY_URI].c_str();
if (DoSQL(sql.str(), 1, paramValues))
{
r = true;
if (m_pDB->GetNoTuples() > 0)
{
total = convert(m_pDB->GetValue(0, 0));
LOG(LINF, "File total rows (%s : %ju(%ju)).", paramValues[0], total, limit);
}
else
{
total = 0;
LOG(LINF, "File total rows(%s : 0).", paramValues[0]);
}
m_pDB->PgClear();
}
else
r = false;
return r;
}
bool CRCDBControl::GetServiceInfoAll(CJobDataMap & jobData)
{
bool r = true;
if (jobData[KEY_SP_USER_SEQ].empty())
{
LOG(LERR, "User Information empty.(Get Service Info all)");
return false;
}
if (jobData[KEY_SP_SVC_TRAN_ID].size() <= 0)
{
LOG(LERR, "There is no information about the service requested(Get Service Info all - tran_id).");
return false;
}
string tblname = GetMataTableName(jobData[KEY_SP_SVC_TRAN_ID].c_str());
ostringstream sql;
sql << "SELECT ";
sql << "u.sp_user_id,u.sp_user_seq, u.sp_user_password,";
sql << "s.sp_svc_id, s.sp_svc_tran_id,s.max_str_size,s.sp_svc_begin_date,s.sp_svc_end_date,";
sql << "s.initial_vector,s.private_key,";
sql << "s.replication_count,s.uri_ignore_case,s.cal_used_depth,s.del_file_keep_time,";
sql << "s.validate_sp_session_id_yn,";
sql << "v.mode,";
sql << "v.auth_server,v.auth_path,v.auth_port,v.auth_timeout,";
sql << "v.bill_server,v.bill_path,v.bill_port,v.bill_timeout,";
sql << "s.bandwidth_ctrl_yn,";
sql << "b.volume_bandwidth_limit,";
sql << "r.host_name ";
sql << "FROM t_sms_sp_svc_product s ";
sql << "LEFT JOIN t_sms_sp_user u ON u.sp_user_seq = s.sp_user_seq ";
sql << "LEFT JOIN t_sms_sp_svc_product_val v ON v.sp_svc_tran_id = s.sp_svc_tran_id ";
sql << "LEFT JOIN t_sms_sp_svc_product_band b ON b.sp_svc_tran_id = s.sp_svc_tran_id ";
sql << "LEFT JOIN " << tblname << " r ON r.sp_svc_tran_id = s.sp_svc_tran_id ";
sql << "WHERE ";
sql << "r.depth = 0 ";
sql << "AND s.sp_user_seq = $1 AND s.sp_svc_tran_id = $2";
const char *paramValues[2];
paramValues[0] = jobData[KEY_SP_USER_SEQ].c_str();
paramValues[1] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
if (DoSQL(sql.str(), 2, paramValues))
{
r = true;
if (m_pDB->GetNoTuples() == 1)
{
const char *_f[] =
{
// sql << "u.sp_user_id,u.sp_user_seq, u.sp_user_password,";
KEY_SP_USER_ID, KEY_SP_USER_SEQ, KEY_SP_USER_PASSWORD,
// sql << "s.sp_svc_id, s.sp_svc_tran_id,s.max_str_size,s.sp_svc_begin_date,s.sp_svc_end_date,";
KEY_SP_SVC_ID, KEY_SP_SVC_TRAN_ID,
KEY_MAX_STR_SIZE, KEY_SP_SVC_BEGIN_DATE, KEY_SP_SVC_END_DATE,
// sql << "s.initial_vector,s.private_key,";
KEY_INITIAL_VECTOR, KEY_PRIVATE_KEY,
// sql << "s.replication_count,s.uri_ignore_case,s.cal_used_depth,s.del_file_keep_time,";
KEY_REPLICATION_COUNT, KEY_URI_IGNORE_CASE, KEY_CAL_USED_DEPTH, KEY_DEL_FILE_KEEP_TIME,
// sql << "s.validate_sp_session_id_yn,";
KEY_VALIDATE_SP_SESSION_ID_YN,
// sql << "v.mode,";
KEY_REQ_AUTH_MODE,
// sql << "v.auth_server,v.auth_path,v.auth_port,v.auth_timeout,";
KEY_AUTH_SERVER, KEY_AUTH_PATH, KEY_AUTH_PORT, KEY_AUTH_TIMEOUT,
// sql << "v.bill_server,v.bill_path,v.bill_port,v.bill_timeout,";
KEY_BILL_SERVER, KEY_BILL_PATH, KEY_BILL_PORT, KEY_BILL_TIMEOUT,
// sql << "s.bandwidth_ctrl_yn,";
KEY_BANDWIDTH_CTRL_YN,
// sql << "b.volume_bandwidth_limit,";
KEY_VOLUME_BANDWIDTH_LIMIT,
// sql << "r.host_name ";
KEY_HOST_NAME,
0
};
for (unsigned int i = 0; _f[i] != NULL ; ++i)
{
LOG(LDEV2, "##### [%s] => %s", _f[i], m_pDB->GetValue(0, i));
jobData[_f[i]] = m_pDB->GetValue(0, i);
}
}
else if (m_pDB->GetNoTuples() == 0)
{
LOG(LNOT, "Service information empty.[%s@%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(),
jobData[KEY_SP_USER_SEQ].c_str());
}
else
{
LOG(LNOT, "Service information duplication occurred.[%s@%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(),
jobData[KEY_SP_USER_SEQ].c_str());
}
}
else
r = false;
m_pDB->PgClear();
return r;
}
bool CRCDBControl::SetMetaIgnoreCase(CJobDataMap & jobData, bool IgnoreCase)
{
bool r = true;
// 기존 형상(8.4) 경우 대소문자 관련 기능은 인덱스로 지원하고 있으므로
// 메타 테이블 변경 필요 업으므로 무조건 성공을 리턴함
if (m_usedisplay == false)
{
LOG(LNOT, "uri ignorecase Supports INDEX.[%s]", jobData[KEY_SP_SVC_TRAN_ID].c_str());
return true;
}
string tblname;
if (jobData[KEY_SP_SVC_TRAN_ID].size() <= 0)
{
LOG(LERR, "There is no information about the service requested(Set Meta IgnoreCase - tran_id).");
return false;
}
tblname = GetMataTableName(jobData[KEY_SP_SVC_TRAN_ID].c_str());
ostringstream sql;
uint64_t nowtime = GetTimeStamp();
sql << "UPDATE " << tblname << " SET "
<< "get_lastmodified = " << nowtime;
if (IgnoreCase)
sql << ", uri = lower(display_name) ";
else
sql << ", uri = display_name ";
if (DoSetSQL(sql.str()))
{
return true;
}
else
{
LOG(LERR, "Failed service meta ignore case update.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
return false;
}
return r;
}
bool CRCDBControl::GetTargetFHS(string & targethost)
{
ostringstream sql;
sql << "SELECT fhs_hostname FROM t_fhs_top_status ";
sql << "WHERE lastupdate >= (NOW() - interval'01 minute') ";
if (DoSQL(sql.str()))
{
vector<string> vechosts;
for (int i = 0; i < m_pDB->GetNoTuples(); i++)
{
vechosts.push_back(m_pDB->GetValue(i, 0));
}
targethost = vechosts[rand() % vechosts.size()];
m_pDB->PgClear();
return true;
}
return false;
}
bool CRCDBControl::MakeDir(CJobDataMap & jobData, string & spath, bool & IgnoreCase)
{
if (jobData[KEY_HOST_NAME].empty())
GetTargetFHS(jobData[KEY_HOST_NAME]);
if (jobData[KEY_HOST_NAME].empty())
{
LOG(LERR, "Target Host Empty.[uri:%s]", spath.c_str());
return false;
}
int depth = count(spath.begin(), spath.end(), '/') - 1;
_LOG(LDBG, "Make Dir Target Host : %s - %d", jobData[KEY_HOST_NAME].c_str(), depth);
string tblname = GetMataTableName(jobData[KEY_SP_SVC_TRAN_ID].c_str());
uint64_t nowtime = GetTimeStamp();
ostringstream sql;
sql << "INSERT INTO " << tblname;
sql << "(";
sql << "creation_date,get_lastmodified,file_lastmodified";
sql << ",filename_org,filename_hash,resource_type";
sql << ",get_content_length,get_content_type";
sql << ",source";
sql << ",sp_user_seq,sp_svc_tran_id";
sql << ",host_name";
sql << ",depth";
sql << ",uri,display_name";
sql << ")";
sql << " VALUES ";
sql << "(";
sql << nowtime << "," << nowtime << "," << nowtime;
sql << ",'','',1";
sql << ",0,'httpd/unix-directory'";
sql << ",0";
sql << ",$1,$2";
sql << ",$3";
sql << ",$4";
if (IgnoreCase)
sql << ",lower($5),$6";
else
sql << ",$5,$6";
sql << ")";
ostringstream tmp;
tmp << depth;
string sdepth = tmp.str(); tmp.str("");
const char *paramValues[6];
paramValues[0] = jobData[KEY_SP_USER_SEQ].c_str();
paramValues[1] = jobData[KEY_SP_SVC_TRAN_ID].c_str();
paramValues[2] = jobData[KEY_HOST_NAME].c_str();
paramValues[3] = sdepth.c_str();
paramValues[4] = spath.c_str();
paramValues[5] = spath.c_str();
if (DoSetSQL(sql.str(), 6, paramValues))
{
return true;
}
else
{
LOG(LERR, "Failed to create directory.[J:%s]",spath.c_str());
return false;
}
return false;
}
// 메타 테이블 삭제
bool CRCDBControl::DropMetaTable(CJobDataMap & jobData)
{
// 이전 형상(8.3 + PGPOOL) 인 경우 단일 메타 테이블이므로 삭제 할 필요 없음
if (m_tabletype == 0)
{
LOG(LNOT, "Does not delete the meta table.Because it has only one meta table.[%s]"
, jobData[KEY_SP_SVC_TRAN_ID].c_str());
return true;
}
string tblname;
if (jobData[KEY_SP_SVC_TRAN_ID].size() <= 0)
{
LOG(LERR, "There is no information about the service requested(DROP table - tran_id).");
return false;
}
tblname = GetMataTableName(jobData[KEY_SP_SVC_TRAN_ID].c_str());
ostringstream sql;
sql << "DROP TABLE " << tblname;
if (DoSetSQL(sql.str()))
{
return true;
}
else
{
LOG(LERR, "Failed DROP TABLE meta.[J:%s,J:%s]",
jobData[KEY_SP_SVC_TRAN_ID].c_str(), jobData[KEY_SP_SVC_ID].c_str());
return false;
}
return true;
}