| Return Type | Function name | Arguments |
|---|---|---|
| hzEcode | hdsApp::PcEntConv | (hzAtom&,const hzString&,hzHttpEvent*,) |
Declared in file: hzDissemino.h
Defined in file : hdsSystem.cpp
Function Logic:
Function body:
hzEcode hdsApp::PcEntConv (hzAtom& atom, const hzString& v, hzHttpEvent* pE)
{
_hzfunc("hdsApp::PcEntConv") ;
const hdbMember* pMbr ;
hzChain W ;
hdsInfo* pInfo ;
hdsFormref* pFormref ;
hdsFormdef* pFormdef ;
hdsField* pFld ;
const hdbEnum* pSlct ;
hdbObjRepos* pRepos = 0;
const char* i ;
hzString w_val ;
hzString extn ;
hzString val ;
uint32_t nTest ;
char buf[12];
hzEcode rc = E_OK ;
if (!pE)
hzexit(E_ARGUMENT, "%s: No HTTP event supplied for input=%s", *m_Appname, *v) ;
atom.Clear() ;
if (!v)
return E_OK ;
m_pLog->Log("PcEntConv processing %s\n", *v) ;
if (v[0]!= CHAR_PERCENT)
{
atom = v ;
return E_OK ;
}
if (v[2]!= CHAR_COLON)
return E_SYNTAX ;
i = *v ;
for (i += 3; *i && *i != CHAR_SCOLON && IsAlpha(*i) ; i++)
W.AddByte(*i) ;
w_val = W ;
W.Clear() ;
if (*i == CHAR_PERIOD)
{
for (i++ ; *i && *i != CHAR_SCOLON && IsAlpha(*i) ; i++)
W.AddByte(*i) ;
extn = W ;
W.Clear() ;
}
if (*i == CHAR_SCOLON)
i++ ;
pInfo = (hdsInfo*) pE->Session() ;
switch (v[1])
{
case ''x'':
if (w_val == "count")
{
pRepos = m_ADP.GetObjRepos(extn) ;
if (!pRepos)
{ rc = E_NOTFOUND ; m_pLog->Log("Cannot Xlate. Repository not found: %s\n", *extn) ; }
else
atom = pRepos->Count() ;
}
else if (w_val == "objid")
{
pRepos = m_ADP.GetObjRepos(extn) ;
if (!pRepos)
{ rc = E_NOTFOUND ; m_pLog->Log("Cannot Xlate. Repository not found: %s\n", *extn) ; }
else
{
if (pE->m_ObjIds.Exists(extn))
atom = pE->m_ObjIds[extn] ;
else
{ rc = E_NOTFOUND ; m_pLog->Log("Cannot Xlate. Event entry not found: %s\n", *extn) ; }
}
}
else if (w_val == "date") atom = pE->m_Occur.Date() ;
else if (w_val == "time") atom = pE->m_Occur.Time() ;
else if (w_val == "datetime") atom = pE->m_Occur ;
else if (w_val == "referer") atom.SetValue(BASETYPE_STRING, pE->Referer()) ;
else if (w_val == "usecs") atom = pE->m_Occur.uSec() ;
else if (w_val == "uid") atom = (uint32_t) (pInfo ? pInfo->m_UserId : 0);
else if (w_val == "random") { sprintf(buf, "%06d", pE->m_Occur.uSec()) ; atom.SetValue(BASETYPE_STRING, buf) ; }
else
{ rc = E_NOTFOUND ; m_pLog->Log("Cannot Xlate. Unknown parameter: %s\n", *w_val) ; }
break ;
case ''e'':
pSlct = m_ADP.GetDataEnum(w_val) ;
if (pSlct)
{
val = pE->m_mapStrings[w_val] ;
if (IsPosint(nTest, *val))
{
val = pSlct->GetStr(nTest) ;
rc = atom.SetValue(BASETYPE_STRING, val) ;
break ;
}
}
if (pE->m_Uploads.Exists(w_val))
{
hzHttpFile& hf = pE->m_Uploads[w_val] ;
if (extn == "name")
rc = atom.SetValue(BASETYPE_STRING, hf.m_filename) ;
else if (extn == "data")
{
if (hf.m_file.Size())
{ rc = E_OK ; atom = hf.m_file ; }
else
rc = E_NODATA ;
m_pLog->Log("Have file %s of %d bytes\n", *hf.m_filename, hf.m_file.Size()) ;
}
else
rc = E_BADVALUE ;
break ;
}
if (w_val == g_Errmsg)
{
if (pE->m_appError)
atom = pE->m_appError ;
break ;
}
if (w_val == "resarg")
{
atom.SetValue(BASETYPE_STRING, pE->m_Resarg) ;
break ;
}
if (pE->m_mapStrings.Exists(w_val))
{
val = pE->m_mapStrings[w_val] ;
if (pE->m_pContextForm)
{
pFormref = (hdsFormref*) pE->m_pContextForm ;
pFormdef = m_FormDefs[pFormref->m_Formname] ;
if (!pFormdef->m_mapFlds.Exists(w_val))
{
m_pLog->Log("Case 1: Using string context value %s = %s\n", *w_val, *val) ;
rc = atom.SetValue(BASETYPE_STRING, val) ;
}
else
{
pFld = pFormdef->m_mapFlds[w_val] ;
if (pFld)
{
m_pLog->Log("Case 2: Using string context value %s = %s %s\n", *w_val, Basetype2Txt(pFld->m_Fldspec.m_pType->Basetype()), *val) ;
rc = atom.SetValue(pFld->m_Fldspec.m_pType->Basetype(), val) ;
}
else
{
m_pLog->Log("Case 3: Using string context value %s = %s\n", *w_val, *val) ;
rc = atom.SetValue(BASETYPE_STRING, val) ;
}
}
}
else
{
m_pLog->Log("Using context-less value %s\n", *val) ;
rc = atom.SetValue(BASETYPE_STRING, val) ;
}
break ;
}
if (pE->m_mapChains.Exists(w_val))
{
val = pE->m_mapChains[w_val] ;
if (pE->m_pContextForm)
{
pFormref = (hdsFormref*) pE->m_pContextForm ;
pFormdef = m_FormDefs[pFormref->m_Formname] ;
if (!pFormdef->m_mapFlds.Exists(w_val))
{
m_pLog->Log("Case 1: Using chain context value %s = %s\n", *w_val, *val) ;
rc = atom.SetValue(BASETYPE_STRING, val) ;
}
else
{
m_pLog->Log("Case 2: Using chain context value %s = %s\n", *w_val, *val) ;
pFld = pFormdef->m_mapFlds[w_val] ;
rc = atom.SetValue(pFld->m_Fldspec.m_pType->Basetype(), val) ;
}
}
else
{
m_pLog->Log("Using context-less value %s\n", *val) ;
rc = atom.SetValue(BASETYPE_STRING, val) ;
}
break ;
}
rc = E_NOTFOUND ;
break ;
case ''s'':
rc = E_NOTFOUND ;
if (pInfo && pInfo->m_Sessvals.Count())
{
if (pInfo->m_Sessvals.Exists(w_val))
{
atom = pInfo->m_Sessvals[w_val] ;
rc = E_OK ;
}
break ;
}
m_pLog->Log("Warning: No such session value [%s]\n", *w_val) ;
break ;
case ''i'':
rc = E_NOTFOUND ;
if (!pInfo)
break ;
if (!pInfo->m_CurrRepos)
break ;
if (!pInfo->m_CurrObj)
break ;
pRepos = m_ADP.GetObjRepos(pInfo->m_CurrRepos) ;
if (pRepos)
pMbr = pRepos->GetMember(w_val) ;
if (pMbr)
{
hdbObject obj ;
hzChain Z ;
rc = pRepos->Fetch(obj, pInfo->m_CurrObj) ;
if (rc != E_OK)
break ;
if (pMbr->Basetype() == BASETYPE_BINARY || pMbr->Basetype() == BASETYPE_TXTDOC)
{
if (extn == "addr")
{
m_pLog->Log("Fetching address %s\n", *w_val) ;
obj.GetValue(atom, pMbr) ;
}
if (extn == "data")
{
m_pLog->Log("Fetching binary body %s\n", *w_val) ;
rc = obj.GetBinary(Z, pMbr) ;
atom = Z ;
}
}
else
{
m_pLog->Log("Fetching ord %s\n", *w_val) ;
rc = obj.GetValue(atom, pMbr) ;
}
}
break ;
case ''v'':
break ;
case ''u'':
rc = E_NOTFOUND ;
if (!pInfo)
break ;
m_pLog->Log("Fetching item %s for subscriber id %d\n", *w_val, pInfo->m_SubId) ;
if (w_val == "username")
{
atom = pInfo->m_Username ;
break ;
}
if (pInfo->m_CurrRepos && pInfo->m_UserId > 0)
{
pRepos = m_ADP.GetObjRepos(pInfo->m_CurrRepos) ;
if (pRepos)
pMbr = pRepos->GetMember(w_val) ;
if (!pMbr)
break ;
hdbObject obj ;
hzChain Z ;
rc = pRepos->Fetch(obj, pInfo->m_CurrObj) ;
if (rc != E_OK)
break ;
if (pMbr->Basetype() == BASETYPE_BINARY || pMbr->Basetype() == BASETYPE_TXTDOC)
{
if (extn == "addr")
{
m_pLog->Out("Fetching address %s\n", *w_val) ;
rc = obj.GetValue(atom, pMbr) ;
}
if (extn == "data")
{
m_pLog->Out("Fetching binary body %s\n", *w_val) ;
rc = obj.GetBinary(Z, pMbr) ;
atom = Z ;
}
}
else
{
m_pLog->Out("Fetching ord %s\n", *w_val) ;
rc = obj.GetValue(atom, pMbr) ;
}
}
break ;
default:
hzerr(E_SYNTAX, "Invalid Percent Entity Category (%c)", v[1]);
rc = E_SYNTAX ;
}
return rc ;
}