ARSperl
view release on metacpan or search on metacpan
supportrev.c view on Meta::CPAN
ARError_add(AR_RETURN_WARNING, AP_ERR_CONTINUE,
c);
}
}
svp = hv_fetch(hr, "multiMatchOption", strlen("multiMatchOption") , 0);
if (svp && *svp) {
char *c = SvPV(*svp, PL_na);
if (rev_ARAssignFieldStructStr2MMO(ctrl, c, &(s->multiMatchOption)) != 0) {
s->multiMatchOption = AR_MULTI_MATCH_ERROR;
ARError_add(AR_RETURN_WARNING, AP_ERR_GENERAL,
"rev_ARAssignSQLStruct: unknown multiMatchOption string:");
ARError_add(AR_RETURN_WARNING, AP_ERR_CONTINUE,
c);
}
}
return rv;
}
#endif /* ARS 3.x */
/* ROUTINE
* rev_ARValueStruct(hash, value-key, type-key, valueStruct)
*
* DESCRIPTION
* given a hash that contains a key that points to a list of values
* and a key that contains a value and another key that describes
* the (ars) datatype of that value, populate the given valueStruct.
*
* RETURNS
* 0 on success
* -1 on failure
* -2 on warning
*/
int
rev_ARValueStruct(ARControlStruct * ctrl, HV * h, char *k, char *t, ARValueStruct * m)
{
SV **val, **type;
if (!m || !h || !k || !t) {
ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL,
"rev_ARValueStruct: invalid (NULL) parameter");
return -1;
}
/*
* extract the value of the key, determine what datatype it is and
* fill in the value struct.
*/
val = hv_fetch(h, k, strlen(k) , 0);
type = hv_fetch(h, t, strlen(t) , 0);
if (val && *val && type && *type && SvPOK(*type)) {
char *tp, *vp;
STRLEN len;
char *str;
if( SvOK(*val) ){
str = SvPV( *val, len );
if( len > 0 && str[0] == '\0' ){
m->dataType = AR_DATA_TYPE_KEYWORD;
if (rev_ARValueStructKW2KN(ctrl, str, &(m->u.keyNum)) == -1) return -1;
return 0;
}
}
tp = SvPV(*type, PL_na);
(void) rev_ARValueStructStr2Type(ctrl, tp, &(m->dataType));
switch (m->dataType) {
case AR_DATA_TYPE_NULL:
m->u.intVal = 0;
break;
case AR_DATA_TYPE_KEYWORD:
vp = SvPV(*val, PL_na);
if (rev_ARValueStructKW2KN(ctrl, vp, &(m->u.keyNum)) == -1)
return -1;
break;
case AR_DATA_TYPE_INTEGER:
m->u.intVal = SvIV(*val);
break;
case AR_DATA_TYPE_REAL:
m->u.realVal = SvNV(*val);
break;
case AR_DATA_TYPE_CHAR:
if (strmakHVal(h, k, &(m->u.charVal)) == -1)
return -1;
break;
case AR_DATA_TYPE_DIARY:
if (rev_ARValueStructDiary(ctrl, h, k, &(m->u.diaryVal)) == -1)
return -1;
break;
case AR_DATA_TYPE_ENUM:
m->u.enumVal = (unsigned long) SvIV(*val);
break;
case AR_DATA_TYPE_TIME:
m->u.timeVal = (ARTimestamp) SvIV(*val);
break;
case AR_DATA_TYPE_BITMASK:
m->u.maskVal = (unsigned long) SvIV(*val);
break;
#if AR_EXPORT_VERSION >= 3
case AR_DATA_TYPE_BYTES:
m->u.byteListVal = (ARByteList *) MALLOCNN(sizeof(ARByteList));
if (rev_ARByteList(ctrl, h, k, m->u.byteListVal) == -1)
return -1;
break;
case AR_DATA_TYPE_JOIN:
return -1; /* FIX: implement */
break;
case AR_DATA_TYPE_TRIM:
return -1; /* FIX: implement */
break;
case AR_DATA_TYPE_CONTROL:
return -1; /* FIX: implement */
break;
case AR_DATA_TYPE_COORDS:
m->u.coordListVal = (ARCoordList *) MALLOCNN(sizeof(ARCoordList));
if (rev_ARCoordList(ctrl, h, k, m->u.coordListVal) == -1)
return -1;
break;
case AR_DATA_TYPE_ULONG:
m->u.ulongVal = (unsigned long) SvIV(*val);
break;
#endif
#if AR_EXPORT_VERSION >= 4
case AR_DATA_TYPE_DECIMAL:
if (strmakHVal(h, k, &(m->u.decimalVal)) == -1)
return -1;
break;
#endif
#if AR_EXPORT_VERSION >= 7
case AR_DATA_TYPE_DATE:
m->u.dateVal = SvIV(*val);
break;
case AR_DATA_TYPE_TIME_OF_DAY:
m->u.timeOfDayVal = (ARTime) SvIV(*val);
break;
case AR_DATA_TYPE_CURRENCY:
m->u.currencyVal = (ARCurrencyStruct*) MALLOCNN(sizeof(ARCurrencyStruct));
if( sv_to_ARCurrencyStruct(ctrl,*val,m->u.currencyVal) == -1 )
return -1;
break;
case AR_DATA_TYPE_VIEW:
case AR_DATA_TYPE_DISPLAY:
if (strmakHVal(h, k, &(m->u.charVal)) == -1)
return -1;
break;
#endif
default:
ARError_add(AR_RETURN_WARNING, AP_ERR_GENERAL,
"rev_ARValueStruct: unknown data type:");
ARError_add(AR_RETURN_WARNING, AP_ERR_CONTINUE,
tp);
return -2;
}
return 0;
}
ARError_add(AR_RETURN_WARNING, AP_ERR_GENERAL,
"rev_ARValueStruct: hash value(s) were invalid for keys:");
ARError_add(AR_RETURN_WARNING, AP_ERR_CONTINUE, k);
ARError_add(AR_RETURN_WARNING, AP_ERR_CONTINUE, t);
return -2;
}
static int
rev_ARValueStructStr2Type(ARControlStruct * ctrl, char *type, unsigned int *n)
{
int i = 0;
if (type && *type) {
for (i = 0; DataTypeMap[i].number != TYPEMAP_LAST; i++)
if (strcasecmp(type, DataTypeMap[i].name) == 0)
break;
if (DataTypeMap[i].number != TYPEMAP_LAST) {
*n = DataTypeMap[i].number;
return 0;
}
ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL,
"rev_ARValueStructStr2Type: type given is unknown:");
ARError_add(AR_RETURN_ERROR, AP_ERR_CONTINUE,
type);
} else
ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL,
"rev_ARValueStructStr2Type: type param is NULL");
return -1;
}
static int
rev_ARValueStructKW2KN(ARControlStruct * ctrl, char *keyword, unsigned int *n)
{
int i;
if (keyword && (*keyword == '\0')) {
for (i = 0; KeyWordMap[i].number != TYPEMAP_LAST; i++) {
if (compmem(keyword, KeyWordMap[i].name, KeyWordMap[i].len) == 0)
break;
}
if (KeyWordMap[i].number != TYPEMAP_LAST) {
*n = KeyWordMap[i].number;
return 0;
}
ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL,
"rev_ARValueStructKW2KN: keyword given is unknown:");
ARError_add(AR_RETURN_ERROR, AP_ERR_CONTINUE,
supportrev.c view on Meta::CPAN
"rev_ARPermissionList: no permission type value");
return -2;
}
++i;
}
return 0;
} else
ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL,
"rev_ARPermissionList: hash value is not a hash reference");
} else {
ARError_add(AR_RETURN_WARNING, AP_ERR_GENERAL,
"rev_ARPermissionList: hv_fetch returned null");
return -2;
}
} else {
ARError_add(AR_RETURN_WARNING, AP_ERR_GENERAL,
"rev_ARPermissionList: key doesn't exist");
return -2;
}
} else
ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL,
"rev_ARPermissionList: first argument is not a hash");
return -1;
}
int
rev_ARReferenceStruct( ARControlStruct *ctrl, HV *h, char *k, ARReferenceStruct *p ){
SV **val;
int i = 0;
if( !p ){
ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL, "rev_ARReferenceStruct: AR Object param is NULL" );
return -1;
}
if( SvTYPE((SV*) h) == SVt_PVHV ){
// printf( "ARReferenceStruct: k = <%s>\n", k );
if( hv_exists(h,k,strlen(k)) ){
val = hv_fetch( h, k, strlen(k), 0 );
if( val && *val ){
{
{
char *pcase = NULL;
char errText[512];
SV **valDataType;
// pcase = SvPV_nolen(*val);
// p->reference.dataType = caseLookUpTypeNumber( (TypeMapStruct*) dataType, pcase );
HV *h2 = (HV* ) SvRV((SV*) *val);
valDataType = hv_fetch( h2, "dataType", 8, 0 );
p->reference.dataType = SvIV(*valDataType);
switch( p->reference.dataType ){
case ARREF_DATA_ARSREF:
{
if( SvTYPE(SvRV(*val)) == SVt_PVHV ){
int i = 0, num = 0;
HV *h = (HV* ) SvRV((SV*) *val);
char k[256];
k[255] = '\0';
{
SV **val;
strncpy( k, "name", 255 );
val = hv_fetch( h, "name", 4, 0 );
if( val && *val ){
{
strncpy( p->reference.u.name, SvPV_nolen(*val), sizeof(p->reference.u.name) );
}
}else{
ARError_add( AR_RETURN_ERROR, AP_ERR_GENERAL, "hv_fetch error: key \"name\"" );
return -1;
}
}
}else{
ARError_add( AR_RETURN_ERROR, AP_ERR_GENERAL, "rev_ARReferenceStruct: hash value is not a hash reference" );
return -1;
}
}
break;
case ARREF_DATA_EXTREF:
{
if( SvTYPE(SvRV(*val)) == SVt_PVHV ){
int i = 0, num = 0;
HV *h = (HV* ) SvRV((SV*) *val);
char k[256];
k[255] = '\0';
{
SV **val;
strncpy( k, "permittedGroups", 255 );
val = hv_fetch( h, "permittedGroups", 15, 0 );
if( val && *val ){
rev_ARInternalIdList( ctrl, h, k, &(p->reference.u.extRef.permittedGroups) );
}else{
ARError_add( AR_RETURN_ERROR, AP_ERR_GENERAL, "hv_fetch error: key \"permittedGroups\"" );
return -1;
}
}
{
SV **val;
strncpy( k, "value", 255 );
val = hv_fetch( h, "value", 5, 0 );
if( val && *val ){
rev_ARValueStruct( ctrl, h, k, "value_dataType", &(p->reference.u.extRef.value) );
}else{
ARError_add( AR_RETURN_ERROR, AP_ERR_GENERAL, "hv_fetch error: key \"value\"" );
return -1;
}
}
}else{
ARError_add( AR_RETURN_ERROR, AP_ERR_GENERAL, "rev_ARReferenceStruct: hash value is not a hash reference" );
return -1;
}
}
break;
default:
sprintf( errText, "rev_ARReferenceStruct: invalid switch value %d", p->reference.dataType );
ARError_add( AR_RETURN_ERROR, AP_ERR_GENERAL, errText );
}
}
if( SvTYPE(SvRV(*val)) == SVt_PVHV ){
int i = 0, num = 0;
HV *h = (HV* ) SvRV((SV*) *val);
char k[256];
k[255] = '\0';
( run in 0.505 second using v1.01-cache-2.11-cpan-140bd7fdf52 )