[Arsperl-devel] ARSperl ARS.xs, 1.124, 1.125 Makefile.PL, 1.83, 1.84 StructDef.pl, 1.7, 1.8 rev_AR_
Brought to you by:
jeffmurphy
Update of /cvsroot/arsperl/ARSperl In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv23244 Modified Files: ARS.xs Makefile.PL StructDef.pl rev_AR_template.pl supportrev.c supportrev.h supportrev_generated.c supportrev_generated.h Log Message: ars_GetListEntryWithMultiSchemaFields completed Index: rev_AR_template.pl =================================================================== RCS file: /cvsroot/arsperl/ARSperl/rev_AR_template.pl,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** rev_AR_template.pl 15 May 2008 18:30:02 -0000 1.5 --- rev_AR_template.pl 2 Apr 2009 18:57:03 -0000 1.6 *************** *** 351,355 **** strncpy( k, "<@ $key2 @>", 255 ); val = hv_fetch( h, "<@ $key2 @>", <@ length($key2) @>, 0 ); ! if( val && *val ){ @> perlToStruct( $obj->{$key}, $class, "$LINE_INDENT\t\t\t" ); }else{ --- 351,355 ---- strncpy( k, "<@ $key2 @>", 255 ); val = hv_fetch( h, "<@ $key2 @>", <@ length($key2) @>, 0 ); ! if( val && *val && SvOK(*val) ){ @> perlToStruct( $obj->{$key}, $class, "$LINE_INDENT\t\t\t" ); }else{ Index: ARS.xs =================================================================== RCS file: /cvsroot/arsperl/ARSperl/ARS.xs,v retrieving revision 1.124 retrieving revision 1.125 diff -C2 -d -r1.124 -r1.125 *** ARS.xs 1 Apr 2009 15:04:50 -0000 1.124 --- ARS.xs 2 Apr 2009 18:57:02 -0000 1.125 *************** *** 7054,7058 **** void ! ars_GetListEntryWithMultiSchemaFields(ctrl,schema,qualifier,maxRetrieve=0,firstRetrieve=0,...) ARControlStruct * ctrl SV * schema --- 7054,7058 ---- void ! ars_GetListEntryWithMultiSchemaFields(ctrl,schema,qualifier=NULL,maxRetrieve=0,firstRetrieve=0,fields=NULL,...) ARControlStruct * ctrl SV * schema *************** *** 7060,7153 **** unsigned int firstRetrieve unsigned int maxRetrieve PPCODE: { ! ARStatusList status; #if AR_CURRENT_API_VERSION >= 14 ! unsigned int c = (items - 5) / 2, i; ! int field_off = 5; ! ARMultiSchemaQueryFromList queryFromList; ! ARMultiSchemaQualifierStruct qualifierStruct; ! ARMultiSchemaFieldIdList getListFields; ! ARMultiSchemaSortList sortList; ! ARMultiSchemaFieldValueListList entryFieldValueList; ! int ret = 0, rv = 0; ! AV *getListFields_array; ! HV *hDummy; ! printf( "\n\n!!!! ars_GetListEntryWithMultiSchemaFields(): experimental implementation, not really working yet !!!!\n\n" ); ! (void) ARError_reset(); ! Zero(&queryFromList, 1, ARMultiSchemaQueryFromList); ! Zero(&qualifierStruct, 1, ARMultiSchemaQualifierStruct); ! Zero(&getListFields, 1, ARMultiSchemaFieldIdList); ! Zero(&sortList, 1, ARMultiSchemaSortList); ! Zero(&entryFieldValueList, 1, ARMultiSchemaFieldValueListList); ! Zero(&status, 1, ARStatusList); ! hDummy = newHV(); ! hv_store( hDummy, "queryFromList", 13, newSVsv(schema), 0 ); ! hv_store( hDummy, "qualifierStruct", 15, newSVsv(qualifier), 0 ); ! rv += rev_ARMultiSchemaQueryFromList( ctrl, hDummy, "queryFromList", &queryFromList ); ! rv += rev_ARMultiSchemaQualifierStruct( ctrl, hDummy, "qualifierStruct", &qualifierStruct ); ! hv_undef( hDummy ); ! /* sortList.sortList = NULL; ! getListFields.fieldsList = NULL; ! entryFieldValueList.entryList = NULL; */ ! #ifdef XXX_DUMMY_FIELDLIST ! if( (items - 5) % 2 ){ ! /* odd number of arguments, so argument after maxRetrieve is ! optional getListFields (an array of hash refs) */ ! if ( SvROK(ST(field_off)) && ! (getListFields_array = (AV *)SvRV(ST(field_off))) && ! (SvTYPE(getListFields_array) == SVt_PVAV) ) { ! getList = &getListFields; ! getListFields.numItems = av_len(getListFields_array) + 1; ! DBG( ("getListFields.numItems=%d\n", getListFields.numItems) ); ! /* Newz(777,getListFields.fieldsList, getListFields.numItems,AREntryListFieldStruct); */ ! getListFields.fieldsList = MALLOCNN( sizeof(AREntryListFieldStruct) * getListFields.numItems ); ! /* set query field list */ ! for( i = 0; i<getListFields.numItems; i++ ){ ! SV **array_entry; ! /* get fieldID from array */ ! if( ! (array_entry = av_fetch(getListFields_array, i, 0)) ){ ! (void) ARError_add( AR_RETURN_ERROR, AP_ERR_BAD_LFLDS); ! goto getlistentry_end; ! } ! getListFields.fieldsList[i].fieldId = SvIV(*array_entry); ! getListFields.fieldsList[i].columnWidth = 1; ! strncpy(getListFields.fieldsList[i].separator, " ", 2 ); ! DBG( ("i=%d, fieldId=%d, columnWidth=%d, separator=\"%s\"\n", i, ! getListFields.fieldsList[i].fieldId, ! getListFields.fieldsList[i].columnWidth, ! getListFields.fieldsList[i].separator) ); ! } ! }else{ ! (void) ARError_add( AR_RETURN_ERROR, AP_ERR_LFLDS_TYPE); ! goto getlistentry_end; ! } ! /* increase the offset of the first sortList field by one */ ! field_off ++; ! } ! #endif ! #ifdef XXX_DUMMY_SORTLIST ! /* build sortList */ ! sortList.numItems = c; ! /* Newz(777,sortList.sortList, c, ARSortStruct); */ ! sortList.sortList = MALLOCNN( sizeof(ARSortStruct) * c ); ! for (i=0; i<c; i++) { ! sortList.sortList[i].fieldId = SvIV(ST(i*2+field_off)); ! sortList.sortList[i].sortOrder = SvIV(ST(i*2+field_off+1)); ! } ! #endif ! if( rv != 0 ){ ARError_add( AR_RETURN_ERROR, AP_ERR_PREREVFAIL ); ! goto getlistentry_multischema_end; ! } ! ret = ARGetListEntryWithMultiSchemaFields( ctrl, &queryFromList, &getListFields, --- 7060,7139 ---- unsigned int firstRetrieve unsigned int maxRetrieve + SV * fields PPCODE: { ! ARStatusList status; #if AR_CURRENT_API_VERSION >= 14 ! ARMultiSchemaQueryFromList queryFromList; ! ARMultiSchemaQualifierStruct qualifierStruct; ! ARMultiSchemaFieldIdList getListFields; ! ARMultiSchemaSortList sortList; ! ARMultiSchemaFieldValueListList entryFieldValueList; ! unsigned int i; ! int i2, field_off = 6; ! int ret = 0, rv = 0; ! HV *hDummy; ! /* printf( "\n\n!!!! ars_GetListEntryWithMultiSchemaFields(): experimental implementation, not really working yet !!!!\n\n" ); */ ! (void) ARError_reset(); ! Zero( &queryFromList, 1, ARMultiSchemaQueryFromList ); ! Zero( &qualifierStruct, 1, ARMultiSchemaQualifierStruct ); ! Zero( &getListFields, 1, ARMultiSchemaFieldIdList ); ! Zero( &sortList, 1, ARMultiSchemaSortList ); ! Zero( &entryFieldValueList, 1, ARMultiSchemaFieldValueListList ); ! Zero( &status, 1, ARStatusList ); ! hDummy = newHV(); ! if( !( SvROK(schema) && SvTYPE(SvRV(schema)) == SVt_PVAV ) ){ ! (void) ARError_add( AR_RETURN_ERROR, AP_ERR_GENERAL, "QueryFromList must be an ARRAY reference" ); ! goto getlistentry_multischema_end; ! } ! hv_store( hDummy, "queryFromList", 13, newSVsv(schema), 0 ); ! rv += rev_ARMultiSchemaQueryFromList( ctrl, hDummy, "queryFromList", &queryFromList ); + if( qualifier && SvOK(qualifier) ){ + if( !( SvROK(qualifier) && SvTYPE(SvRV(qualifier)) == SVt_PVHV ) ){ + (void) ARError_add( AR_RETURN_ERROR, AP_ERR_GENERAL, "Qualifier must be a HASH reference" ); + goto getlistentry_multischema_end; + } + hv_store( hDummy, "qualifierStruct", 15, newSVsv(qualifier), 0 ); + rv += rev_ARMultiSchemaQualifierStruct( ctrl, hDummy, "qualifierStruct", &qualifierStruct ); + } ! if( fields && SvOK(fields) ){ ! if( !( SvROK(fields) && SvTYPE(SvRV(fields)) == SVt_PVAV ) ){ ! (void) ARError_add( AR_RETURN_ERROR, AP_ERR_GENERAL, "GetListFields must be an ARRAY reference" ); ! goto getlistentry_multischema_end; ! } ! hv_store( hDummy, "getListFields", 13, newSVsv(fields), 0 ); ! rv += rev_ARMultiSchemaFieldIdList( ctrl, hDummy, "getListFields", &getListFields ); ! } ! if( items > field_off ){ ! int arg, c = (items - field_off) / 2; ! if( (items - field_off) % 2 ){ ! (void) ARError_add( AR_RETURN_ERROR, AP_ERR_GENERAL, "Odd number of SortList arguments" ); ! goto getlistentry_multischema_end; ! } ! ! sortList.numItems = c; ! sortList.listPtr = MALLOCNN( sizeof(ARMultiSchemaSortStruct) * c ); ! for( i2 = 0; i2 < c; ++i2 ){ ! arg = field_off + i2 * 2; ! hv_store( hDummy, "_", 1, newSVsv(ST(arg)), 0 ); ! rv += rev_ARMultiSchemaFieldIdStruct( ctrl, hDummy, "_", &(sortList.listPtr[i2].fieldId) ); ! sortList.listPtr[i2].sortOrder = SvUV(ST(arg+1)); ! } ! } ! ! ! if( rv != 0 ){ ARError_add( AR_RETURN_ERROR, AP_ERR_PREREVFAIL ); ! goto getlistentry_multischema_end; ! } ! ret = ARGetListEntryWithMultiSchemaFields( ctrl, &queryFromList, &getListFields, *************** *** 7156,7193 **** firstRetrieve, maxRetrieve, ! FALSE, &entryFieldValueList, NULL, &status ); #ifdef PROFILE ! ((ars_ctrl *)ctrl)->queries++; #endif ! if( ARError( ret, status) ){ ! goto getlistentry_multischema_end; ! } ! for( i = 0; i < entryFieldValueList.numItems; ++i ){ ! HV * fieldValue_hash = newHV(); ! unsigned int field; ! char keyStr[AR_MAX_NAME_SIZE + 12 + 1]; ! for( field = 0; field < entryFieldValueList.listPtr[i].numItems; ++field ){ ! ARMultiSchemaFieldValueStruct *valPtr = &(entryFieldValueList.listPtr[i].listPtr[field]); ! sprintf( keyStr, "%s|%ld", valPtr->fieldId.queryFromAlias, valPtr->fieldId.fieldId ); ! hv_store( fieldValue_hash, ! keyStr, strlen(keyStr), ! perl_ARValueStruct( ctrl, &(valPtr->value) ), ! 0 ); ! } ! XPUSHs( sv_2mortal( newRV_noinc((SV *)fieldValue_hash) ) ); ! } ! getlistentry_multischema_end: ! FreeARMultiSchemaFieldIdList( &getListFields, FALSE ); ! FreeARMultiSchemaSortList( &sortList, FALSE ); ! FreeARMultiSchemaFieldValueListList( &entryFieldValueList, FALSE ); #else /* prior to ARS 7.5 */ ! (void) ARError_reset(); ! Zero(&status, 1, ARStatusList); ! (void) ARError_add( AR_RETURN_ERROR, AP_ERR_DEPRECATED, ! "ars_GetListEntryWithMultiSchemaFields() is only available in ARS >= 7.5"); #endif } --- 7142,7181 ---- firstRetrieve, maxRetrieve, ! FALSE, &entryFieldValueList, NULL, &status ); #ifdef PROFILE ! ((ars_ctrl *)ctrl)->queries++; #endif ! if( ARError( ret, status) ){ ! goto getlistentry_multischema_end; ! } ! ! for( i = 0; i < entryFieldValueList.numItems; ++i ){ ! HV * fieldValue_hash = newHV(); ! unsigned int field; ! char keyStr[AR_MAX_NAME_SIZE + 1 + 12 + 1]; ! for( field = 0; field < entryFieldValueList.listPtr[i].numItems; ++field ){ ! ARMultiSchemaFieldValueStruct *valPtr = &(entryFieldValueList.listPtr[i].listPtr[field]); ! sprintf( keyStr, "%s.%ld", valPtr->fieldId.queryFromAlias, valPtr->fieldId.fieldId ); ! hv_store( fieldValue_hash, ! keyStr, strlen(keyStr), ! perl_ARValueStruct(ctrl, &(valPtr->value)), ! 0 ); ! } ! XPUSHs( sv_2mortal( newRV_noinc((SV *)fieldValue_hash) ) ); ! } ! getlistentry_multischema_end: ! hv_undef( hDummy ); ! FreeARMultiSchemaFieldIdList( &getListFields, FALSE ); ! FreeARMultiSchemaSortList( &sortList, FALSE ); ! FreeARMultiSchemaFieldValueListList( &entryFieldValueList, FALSE ); #else /* prior to ARS 7.5 */ ! (void) ARError_reset(); ! Zero(&status, 1, ARStatusList); ! (void) ARError_add( AR_RETURN_ERROR, AP_ERR_DEPRECATED, ! "ars_GetListEntryWithMultiSchemaFields() is only available in ARS >= 7.5"); #endif } Index: Makefile.PL =================================================================== RCS file: /cvsroot/arsperl/ARSperl/Makefile.PL,v retrieving revision 1.83 retrieving revision 1.84 diff -C2 -d -r1.83 -r1.84 *** Makefile.PL 1 Apr 2009 15:04:50 -0000 1.83 --- Makefile.PL 2 Apr 2009 18:57:03 -0000 1.84 *************** *** 56,60 **** # 4.52) # ! $ARSVERSION = 7.1; # STEP 3 -> Choose whether or not to enable encryption --- 56,60 ---- # 4.52) # ! $ARSVERSION = 7.5; # STEP 3 -> Choose whether or not to enable encryption Index: StructDef.pl =================================================================== RCS file: /cvsroot/arsperl/ARSperl/StructDef.pl,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** StructDef.pl 1 Apr 2009 15:04:50 -0000 1.7 --- StructDef.pl 2 Apr 2009 18:57:03 -0000 1.8 *************** *** 1895,1900 **** }, joinQual => { ! _type => 'ARMultiSchemaQualifierStruct*', ! _data => 'p->joinQual', }, _switch => 'p->type', --- 1895,1901 ---- }, joinQual => { ! _type => 'ARMultiSchemaQualifierStruct*', ! _data => 'p->joinQual', ! _default => 'NULL', }, _switch => 'p->type', *************** *** 2094,2097 **** --- 2095,2113 ---- }, + #ARMultiSchemaArithOpStruct => { + # _min_version => '7.5.0', + # operation => { + # _type => 'unsigned int', + # _data => 'p->operation', + # }, + # operandLeft => { + # _type => 'ARMultiSchemaFieldValueOrArithStruct', + # _data => 'p->operandLeft', + # }, + # operandRight => { + # _type => 'ARMultiSchemaFieldValueOrArithStruct', + # _data => 'p->operandRight', + # }, + #}, ARMultiSchemaCurrencyPartStruct => { _min_version => '7.5.0', *************** *** 2109,2138 **** }, }, - ARMultiSchemaFieldIdStruct => { - _min_version => '7.5.0', - queryFromAlias => { - _type => 'ARNameType', - _data => 'p->queryFromAlias', - }, - fieldId => { - _type => 'ARInternalId', - _data => 'p->fieldId', - }, - }, - ARMultiSchemaArithOpStruct => { - _min_version => '7.5.0', - operation => { - _type => 'unsigned int', - _data => 'p->operation', - }, - operandLeft => { - _type => 'ARMultiSchemaFieldValueOrArithStruct', - _data => 'p->operandLeft', - }, - operandRight => { - _type => 'ARMultiSchemaFieldValueOrArithStruct', - _data => 'p->operandRight', - }, - }, ARMultiSchemaValueSetQueryStruct => { _min_version => '7.5.0', --- 2125,2128 ---- *************** *** 2172,2175 **** --- 2162,2194 ---- }, + ARMultiSchemaSortList => { + _num => 'p->numItems', + _list => 'p->listPtr', + _type => 'ARMultiSchemaSortStruct', + }, + ARMultiSchemaSortStruct => { + fieldId => { + _type => 'ARMultiSchemaFieldIdStruct', + _data => 'p->fieldId', + }, + sortOrder => { + _type => 'unsigned int', + _data => 'p->sortOrder', + }, + }, + + + #ARMultiSchemaFieldIdStruct => { + # _min_version => '7.5.0', + # queryFromAlias => { + # _type => 'ARNameType', + # _data => 'p->queryFromAlias', + # }, + # fieldId => { + # _type => 'ARInternalId', + # _data => 'p->fieldId', + # }, + #}, + Index: supportrev_generated.c =================================================================== RCS file: /cvsroot/arsperl/ARSperl/supportrev_generated.c,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** supportrev_generated.c 1 Apr 2009 15:04:50 -0000 1.8 --- supportrev_generated.c 2 Apr 2009 18:57:04 -0000 1.9 *************** *** 49,53 **** strncpy( k, "sampleSchema", 255 ); val = hv_fetch( h, "sampleSchema", 12, 0 ); ! if( val && *val ){ { strncpy( p->sampleSchema, SvPV_nolen(*val), sizeof(p->sampleSchema) ); --- 49,53 ---- strncpy( k, "sampleSchema", 255 ); val = hv_fetch( h, "sampleSchema", 12, 0 ); ! if( val && *val && SvOK(*val) ){ { [...4421 lines suppressed...] rev_ARStatusList( ctrl, h, k, &(p->status) ); --- 13561,13565 ---- strncpy( k, "status", 255 ); val = hv_fetch( h, "status", 6, 0 ); ! if( val && *val && SvOK(*val) ){ { rev_ARStatusList( ctrl, h, k, &(p->status) ); *************** *** 13600,13604 **** strncpy( k, "outputDoc", 255 ); val = hv_fetch( h, "outputDoc", 9, 0 ); ! if( val && *val ){ { p->outputDoc = strdup( SvPV_nolen(*val) ); --- 13576,13580 ---- strncpy( k, "outputDoc", 255 ); val = hv_fetch( h, "outputDoc", 9, 0 ); ! if( val && *val && SvOK(*val) ){ { p->outputDoc = strdup( SvPV_nolen(*val) ); Index: supportrev.h =================================================================== RCS file: /cvsroot/arsperl/ARSperl/supportrev.h,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** supportrev.h 31 Mar 2009 17:41:18 -0000 1.18 --- supportrev.h 2 Apr 2009 18:57:04 -0000 1.19 *************** *** 140,145 **** #endif ! EXTERN int ! rev_ARArithOpStruct( ARControlStruct *ctrl, HV *h, char *k, ARArithOpStruct *p ); #endif /* __supportrev_h_ */ --- 140,151 ---- #endif ! EXTERN int rev_ARArithOpStruct( ARControlStruct *ctrl, HV *h, char *k, ARArithOpStruct *p ); ! ! ! #if AR_CURRENT_API_VERSION >= 14 ! EXTERN int rev_ARMultiSchemaFieldIdStruct( ARControlStruct *ctrl, HV *h, char *k, ARMultiSchemaFieldIdStruct *p ); ! EXTERN int rev_ARMultiSchemaArithOpStruct( ARControlStruct *ctrl, HV *h, char *k, ARMultiSchemaArithOpStruct *p ); ! #endif ! #endif /* __supportrev_h_ */ Index: supportrev_generated.h =================================================================== RCS file: /cvsroot/arsperl/ARSperl/supportrev_generated.h,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** supportrev_generated.h 1 Apr 2009 15:04:50 -0000 1.7 --- supportrev_generated.h 2 Apr 2009 18:57:04 -0000 1.8 *************** *** 246,252 **** #if AR_CURRENT_API_VERSION >= 14 - EXTERN int rev_ARMultiSchemaArithOpStruct( ARControlStruct *ctrl, HV *h, char *k, ARMultiSchemaArithOpStruct *p ); - #endif - #if AR_CURRENT_API_VERSION >= 14 EXTERN int rev_ARMultiSchemaCurrencyPartStruct( ARControlStruct *ctrl, HV *h, char *k, ARMultiSchemaCurrencyPartStruct *p ); #endif --- 246,249 ---- *************** *** 255,261 **** #endif #if AR_CURRENT_API_VERSION >= 14 - EXTERN int rev_ARMultiSchemaFieldIdStruct( ARControlStruct *ctrl, HV *h, char *k, ARMultiSchemaFieldIdStruct *p ); - #endif - #if AR_CURRENT_API_VERSION >= 14 EXTERN int rev_ARMultiSchemaFieldValueOrArithStruct( ARControlStruct *ctrl, HV *h, char *k, ARMultiSchemaFieldValueOrArithStruct *p ); #endif --- 252,255 ---- *************** *** 278,281 **** --- 272,281 ---- EXTERN int rev_ARMultiSchemaRelOpStruct( ARControlStruct *ctrl, HV *h, char *k, ARMultiSchemaRelOpStruct *p ); #endif + + EXTERN int rev_ARMultiSchemaSortList( ARControlStruct *ctrl, HV *h, char *k, ARMultiSchemaSortList *p ); + + + EXTERN int rev_ARMultiSchemaSortStruct( ARControlStruct *ctrl, HV *h, char *k, ARMultiSchemaSortStruct *p ); + #if AR_CURRENT_API_VERSION >= 14 EXTERN int rev_ARMultiSchemaStatHistoryValue( ARControlStruct *ctrl, HV *h, char *k, ARMultiSchemaStatHistoryValue *p ); Index: supportrev.c =================================================================== RCS file: /cvsroot/arsperl/ARSperl/supportrev.c,v retrieving revision 1.33 retrieving revision 1.34 diff -C2 -d -r1.33 -r1.34 *** supportrev.c 31 Mar 2009 17:41:18 -0000 1.33 --- supportrev.c 2 Apr 2009 18:57:03 -0000 1.34 *************** *** 3661,3662 **** --- 3661,3863 ---- + #if AR_CURRENT_API_VERSION >= 14 + int + rev_ARMultiSchemaFieldIdStruct( ARControlStruct *ctrl, HV *h, char *k, ARMultiSchemaFieldIdStruct *p ){ + SV **val; + int i = 0; + + if( !p ){ + ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL, "rev_ARMultiSchemaFieldIdStruct: AR Object param is NULL" ); + return -1; + } + + if( SvTYPE((SV*) h) == SVt_PVHV ){ + + // printf( "ARMultiSchemaFieldIdStruct: k = <%s>\n", k ); + if( hv_exists(h,k,strlen(k)) ){ + val = hv_fetch( h, k, strlen(k), 0 ); + if( val && *val ){ + if( SvPOK(*val) ){ + STRLEN len; + int i, pos = 0; + char *str = SvPV( *val, len ); + + for( i = len-1; i >= 0; --i ){ + if( str[i] == '.' ){ + pos = i; + break; + } + } + + if( pos == 0 || pos == len-1 ){ + ARError_add(AR_RETURN_WARNING, AP_ERR_GENERAL, "rev_ARMultiSchemaFieldIdStruct: no fieldId separator found"); + return -2; + } + if( pos > AR_MAX_NAME_SIZE ){ + ARError_add(AR_RETURN_WARNING, AP_ERR_GENERAL, "rev_ARMultiSchemaFieldIdStruct: query alias too long"); + return -2; + } + + strncpy( p->queryFromAlias, str, pos ); + p->queryFromAlias[pos] = '\0'; + p->fieldId = atoi( &(str[pos+1]) ); + + }else{ + ARError_add(AR_RETURN_WARNING, AP_ERR_GENERAL, "rev_ARMultiSchemaFieldIdStruct: not a char value"); + return -2; + } + }else{ + ARError_add(AR_RETURN_WARNING, AP_ERR_GENERAL, "rev_ARMultiSchemaFieldIdStruct: hv_fetch returned null"); + return -2; + } + }else{ + ARError_add(AR_RETURN_WARNING, AP_ERR_GENERAL, "rev_ARMultiSchemaFieldIdStruct: key doesn't exist"); + ARError_add(AR_RETURN_WARNING, AP_ERR_GENERAL, k ); + return -2; + } + }else{ + ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL, "rev_ARMultiSchemaFieldIdStruct: first argument is not a hash"); + return -1; + } + + return 0; + } + #endif + + + + #if AR_CURRENT_API_VERSION >= 14 + int + rev_ARMultiSchemaArithOpStruct( ARControlStruct *ctrl, HV *h, char *k, ARMultiSchemaArithOpStruct *p ){ + SV **val; + int i = 0; + + if( !p ){ + ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL, "rev_ARMultiSchemaArithOpStruct: AR Object param is NULL" ); + return -1; + } + + if( SvTYPE((SV*) h) == SVt_PVHV ){ + + // printf( "ARMultiSchemaArithOpStruct: k = <%s>\n", k ); + if( hv_exists(h,k,strlen(k)) ){ + val = hv_fetch( h, k, strlen(k), 0 ); + if( val && *val ){ + { + + + 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, "oper", 255 ); + val = hv_fetch( h, "oper", 4, 0 ); + if( val && *val ){ + { + int flag = 0; + if( !strcmp(SvPV_nolen(*val),"/") ){ + p->operation = AR_ARITH_OP_DIVIDE; + flag = 1; + } + if( !strcmp(SvPV_nolen(*val),"%") ){ + p->operation = AR_ARITH_OP_MODULO; + flag = 1; + } + if( !strcmp(SvPV_nolen(*val),"+") ){ + p->operation = AR_ARITH_OP_ADD; + flag = 1; + } + /* + if( !strcmp(SvPV_nolen(*val),"-") ){ + p->operation = AR_ARITH_OP_NEGATE; + flag = 1; + } + */ + if( !strcmp(SvPV_nolen(*val),"*") ){ + p->operation = AR_ARITH_OP_MULTIPLY; + flag = 1; + } + if( !strcmp(SvPV_nolen(*val),"-") ){ + p->operation = AR_ARITH_OP_SUBTRACT; + flag = 1; + } + if( flag == 0 ){ + ARError_add( AR_RETURN_ERROR, AP_ERR_GENERAL, "rev_ARMultiSchemaArithOpStruct: invalid key value" ); + ARError_add( AR_RETURN_ERROR, AP_ERR_CONTINUE, SvPV_nolen(*val) ); + } + } + }else{ + ARError_add( AR_RETURN_ERROR, AP_ERR_GENERAL, "hv_fetch error: key \"oper\"" ); + return -1; + } + } + + + { + SV **val; + strncpy( k, "left", 255 ); + val = hv_fetch( h, "left", 4, 0 ); + if( val && *val ){ + { + rev_ARMultiSchemaFieldValueOrArithStruct( ctrl, h, k, &(p->operandLeft) ); + } + }else{ + if( p->operation == AR_ARITH_OP_SUBTRACT ){ + p->operation = AR_ARITH_OP_NEGATE; + }else{ + ARError_add( AR_RETURN_ERROR, AP_ERR_GENERAL, "hv_fetch error: key \"left\"" ); + return -1; + } + } + } + + + { + SV **val; + strncpy( k, "right", 255 ); + val = hv_fetch( h, "right", 5, 0 ); + if( val && *val ){ + { + rev_ARMultiSchemaFieldValueOrArithStruct( ctrl, h, k, &(p->operandRight) ); + } + }else{ + ARError_add( AR_RETURN_ERROR, AP_ERR_GENERAL, "hv_fetch error: key \"right\"" ); + return -1; + } + } + + + + + }else{ + ARError_add( AR_RETURN_ERROR, AP_ERR_GENERAL, "rev_ARMultiSchemaArithOpStruct: hash value is not a hash reference" ); + return -1; + } + + + } + }else{ + ARError_add(AR_RETURN_WARNING, AP_ERR_GENERAL, "rev_ARMultiSchemaArithOpStruct: hv_fetch returned null"); + return -2; + } + }else{ + ARError_add(AR_RETURN_WARNING, AP_ERR_GENERAL, "rev_ARMultiSchemaArithOpStruct: key doesn't exist"); + ARError_add(AR_RETURN_WARNING, AP_ERR_GENERAL, k ); + return -2; + } + }else{ + ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL, "rev_ARMultiSchemaArithOpStruct: first argument is not a hash"); + return -1; + } + + return 0; + } + #endif + + + |