ARSperl
view release on metacpan or search on metacpan
(void) ARError_reset();
fields = fieldcache_get_schema_fields( ctrl, schema, TRUE );
if( ! fields ){
goto get_fieldtable_end;
}
hv_iterinit( fields );
while( (hval = hv_iternextsv(fields,&hkey,&klen)) ){
if( strcmp(hkey,"0") == 0 ) continue;
h = (HV* ) SvRV(hval);
hvalName = hv_fetch( h, "name", 4, 0 );
XPUSHs( sv_2mortal(newSVsv(*hvalName)) );
XPUSHs( sv_2mortal(newSVpv(hkey,0)) );
}
get_fieldtable_end:;
if( ! fields ){
XSRETURN_UNDEF;
}
}
SV *
ars_CreateEntry(ctrl,schema,...)
ARControlStruct * ctrl
char * schema
CODE:
{
int a = 0,
i = 0,
c = (items - 2) / 2;
AREntryIdType entryId;
ARFieldValueList fieldList;
ARInternalIdList getFieldIds;
ARStatusList status;
int ret = 0, rv = 0;
unsigned int dataType = 0, j = 0;
HV *cacheFields;
RETVAL=NULL;
(void) ARError_reset();
Zero(&entryId, 1, AREntryIdType);
Zero(&fieldList, 1, ARFieldValueList);
Zero(&getFieldIds, 1, ARInternalIdList);
Zero(&status, 1, ARStatusList);
if (((items - 2) % 2) || c < 1) {
(void) ARError_add( AR_RETURN_ERROR, AP_ERR_BAD_ARGS);
} else {
cacheFields = fieldcache_get_schema_fields( ctrl, schema, FALSE );
if( ! cacheFields ){
goto create_entry_end;
}
fieldList.numItems = c;
AMALLOCNN(fieldList.fieldValueList,c,ARFieldValueStruct);
getFieldIds.numItems = 0;
getFieldIds.internalIdList = NULL;
/* try to get data type from field cache, collect fieldIds which are not cached */
for (i=0; i<c; ++i) {
ARInternalId fieldId;
a = i*2+2;
fieldId = fieldList.fieldValueList[i].fieldId = SvIV(ST(a));
dataType = fieldcache_get_data_type( cacheFields, fieldId );
if (dataType <= AR_DATA_TYPE_MAX_TYPE) {
/* printf( "%s [%d] found in cache\n", schema, fieldId ); fflush(stdout); */ /* _DEBUG_ */
if (sv_to_ARValue(ctrl, ST(a+1), dataType, &fieldList.fieldValueList[i].value) < 0) {
goto create_entry_end;
}
}else{
if( getFieldIds.numItems == 0 ){
AMALLOCNN(getFieldIds.internalIdList,c,ARInternalId);
}
/* printf( "%s [%d] collect for loading\n", schema, fieldId ); fflush(stdout); */ /* _DEBUG_ */
getFieldIds.internalIdList[getFieldIds.numItems] = fieldId;
++getFieldIds.numItems;
}
}
/* load missing fields into cache */
if( getFieldIds.numItems > 0 ){
/* printf( "--- load missing fields ---\n" ); fflush(stdout); */ /* _DEBUG_ */
/* if( fieldcache_load_schema(ctrl,schema,&getFieldIds,NULL) != AR_RETURN_OK ){ */
if( fieldcache_load_schema(ctrl,schema,&getFieldIds,NULL) > AR_RETURN_WARNING ){
goto create_entry_end;
}
}
/* now get data type from the freshly cached fields */
i = 0;
for (j=0; j<getFieldIds.numItems; ++j) {
ARInternalId fieldId = getFieldIds.internalIdList[j];
while(fieldId != fieldList.fieldValueList[i].fieldId) ++i;
a = i*2+2;
dataType = fieldcache_get_data_type( cacheFields, fieldId );
if (dataType <= AR_DATA_TYPE_MAX_TYPE) {
/* printf( "%s [%d] freshly loaded\n", schema, fieldId ); fflush(stdout); */ /* _DEBUG_ */
if (sv_to_ARValue(ctrl, ST(a+1), dataType, &fieldList.fieldValueList[i].value) < 0) {
goto create_entry_end;
}
}else{
char errTxt[256];
sprintf( errTxt, "Failed to fetch field %d from hash", fieldId );
ARError_add(AR_RETURN_ERROR, AP_ERR_FIELD_TYPE);
ARError_add(AR_RETURN_ERROR, AP_ERR_CONTINUE, errTxt );
goto create_entry_end;
}
}
/* printf( "--------------------\n" ); fflush(stdout); */ /* _DEBUG_ */
ret = ARCreateEntry(ctrl, schema, &fieldList, entryId, &status);
#ifdef PROFILE
((ars_ctrl *)ctrl)->queries++;
#endif
if (! ARError( ret, status)) rv = 1;
create_entry_end:;
if(rv == 0) {
RETVAL = newSVsv(&PL_sv_undef);
} else {
RETVAL = newSVpv( entryId, strlen(entryId) );
}
AP_FREE(fieldList.fieldValueList);
if( getFieldIds.internalIdList != NULL ) AP_FREE(getFieldIds.internalIdList);
}
}
OUTPUT:
RETVAL
int
ars_DeleteEntry(ctrl,schema,entry_id)
ARControlStruct * ctrl
char * schema
char * entry_id
CODE:
{
int ret = 0;
ARStatusList status;
#if AR_EXPORT_VERSION >= 3
AREntryIdList entryList;
RETVAL = 0; /* assume error */
(void) ARError_reset();
Zero(&status, 1, ARStatusList);
if(perl_BuildEntryList(ctrl, &entryList, entry_id) != 0)
goto delete_fail;
ret = ARDeleteEntry(ctrl, schema, &entryList, 0, &status);
if (entryList.entryIdList) AP_FREE(entryList.entryIdList);
#else /* ARS 2 */
RETVAL = 0; /* assume error */
if(!entry_id || !*entry_id) {
ARError_add( AR_RETURN_ERROR, AP_ERR_BAD_EID);
goto delete_fail;
}
ret = ARDeleteEntry(ctrl, schema, entry_id, &status);
#endif
#endif
if (! ARError( ret, status)) {
for (i=0; i<nameList.numItems; i++) {
XPUSHs(sv_2mortal(newSVpv(nameList.nameList[i], 0)));
}
FreeARNameList(&nameList,FALSE);
}
}
void
ars_GetListContainer(ctrl,changedSince=0,attributes=0,...)
ARControlStruct * ctrl
ARTimestamp changedSince
unsigned int attributes
PPCODE:
{
ARStatusList status;
int i, ret, rv = 0;
(void) ARError_reset();
Zero(&status, 1, ARStatusList);
if(items < 1 || items > 200){ /* don't overflow clist[] */
(void) ARError_add( AR_RETURN_ERROR, AP_ERR_BAD_ARGS);
}else{
ARContainerTypeList containerTypes;
int count;
int clist[256];
ARContainerOwnerObjList ownerObjList;
# if AR_EXPORT_VERSION >= 8L
ARPropList propList;
# endif
ARContainerInfoList conList;
Zero(&containerTypes, 1, ARContainerTypeList);
Zero(&ownerObjList, 1, ARContainerOwnerObjList);
# if AR_EXPORT_VERSION >= 8L
Zero(&propList, 1, ARPropList);
# endif
Zero(&conList, 1, ARContainerInfoList);
count = 0;
if( items >= 4 ){
SV* st3 = ST(3);
if( SvROK(st3) && SvTYPE(SvRV(st3)) == SVt_PVAV ){
HV *h_dummy = newHV();
SvREFCNT_inc( st3 );
hv_store( h_dummy, "_", 1, st3, 0 );
rv += rev_ARContainerOwnerObjList( ctrl, h_dummy, "_", &ownerObjList );
hv_undef( h_dummy );
}else{
clist[count++] = SvIV(st3);
}
}
for(i = 4 ; i < items ; ++i){
clist[count++] = SvIV(ST(i));
}
containerTypes.numItems = count;
containerTypes.type = clist;
if( rv == 0 ){
ret = ARGetListContainer(ctrl, changedSince,
&containerTypes,
attributes,
&ownerObjList,
# if AR_EXPORT_VERSION >= 8L
&propList,
# endif
&conList, &status);
}else{
ARError_add( AR_RETURN_ERROR, AP_ERR_PREREVFAIL);
}
if( rv == 0 && !ARError(ret, status)) {
unsigned int i;
for(i = 0 ; i < conList.numItems ; i++) {
HV *conInfo = newHV();
ARContainerOwnerObjList cOwnerObjList;
hv_store(conInfo, "containerType", strlen("containerType") ,
newSVpv(ContainerTypeMap[conList.conInfoList[i].type].name, 0), 0);
hv_store(conInfo, "containerName", strlen("containerName") ,
newSVpv(conList.conInfoList[i].name, 0), 0);
cOwnerObjList = conList.conInfoList[i].ownerList;
hv_store(conInfo, "ownerObjList", strlen("ownerObjList") ,
perl_AROwnerObjList(ctrl, &cOwnerObjList), 0);
XPUSHs(sv_2mortal(newRV_noinc((SV *)conInfo)));
}
}
/* Don't try to FreeAR this, because clist[] is a stack variable */
/* FreeARContainerTypeList(&containerTypes, FALSE); */
FreeARContainerInfoList(&conList, FALSE);
FreeARContainerOwnerObjList(&ownerObjList, FALSE);
# if AR_EXPORT_VERSION >= 8L
FreeARPropList(&propList, FALSE);
# endif
}
}
HV *
ars_GetContainer(control,name)
ARControlStruct * control
char * name
CODE:
{
ARStatusList status;
int ret;
ARReferenceTypeList refTypes;
ARPermissionList assignedGroupList;
ARPermissionList groupList;
ARInternalIdList adminGroupList;
ARContainerOwnerObjList ownerObjList;
char *label = CPNULL;
char *description = CPNULL;
unsigned int type;
ARReferenceList references;
char *helpText = CPNULL;
ARAccessNameType owner;
ARTimestamp timestamp;
ARAccessNameType lastChanged;
char *changeDiary = CPNULL;
ARPropList objPropList;
int tlist[] = {ARREF_ALL};
/* int i; */
ARDiaryList diaryList;
(void) ARError_reset();
Zero(&status, 1, ARStatusList);
Zero(&refTypes, 1, ARReferenceTypeList);
Zero(&assignedGroupList, 1, ARPermissionList);
Zero(&groupList, 1, ARPermissionList);
Zero(&adminGroupList, 1, ARInternalIdList);
Zero(&ownerObjList, 1, ARContainerOwnerObjList);
Zero(&references, 1, ARReferenceList);
Zero(owner, 1, ARAccessNameType);
Zero(×tamp, 1, ARTimestamp);
Zero(&objPropList, 1, ARPropList);
Zero(&diaryList, 1, ARDiaryList);
refTypes.numItems = 1;
refTypes.refType = tlist;
ret = ARGetContainer(control, name,
&refTypes,
#if AR_CURRENT_API_VERSION >= 17
&assignedGroupList,
#endif
&groupList, &adminGroupList,
&ownerObjList,
&label, &description,
&type, &references, &helpText,
owner, ×tamp, lastChanged, &changeDiary,
&objPropList,
&status);
#ifdef PROFILE
((ars_ctrl *)control)->queries++;
#endif
RETVAL = newHV();
sv_2mortal( (SV*) RETVAL );
if (!ARError( ret,status)) {
AV *rtypeList = newAV(), *rnameList = newAV();
hv_store(RETVAL, "objPropList", strlen("objPropList") ,
perl_ARPropList(control, &objPropList), 0);
#if AR_CURRENT_API_VERSION >= 17
hv_store(RETVAL, "assignedGroupList", strlen("assignedGroupList") ,
perl_ARPermissionList(control, &assignedGroupList, PERMTYPE_SCHEMA), 0);
#endif
hv_store(RETVAL, "groupList", strlen("groupList") ,
perl_ARPermissionList(control, &groupList, PERMTYPE_SCHEMA), 0);
hv_store(RETVAL, "adminList", strlen("adminList") ,
perl_ARList(control, (ARList *)&adminGroupList,
(ARS_fn)perl_ARInternalId,
sizeof(ARInternalId)),0);
hv_store(RETVAL, "ownerObjList", strlen("ownerObjList") ,
perl_AROwnerObjList(control, &ownerObjList), 0);
if (helpText)
hv_store(RETVAL, "helpText", strlen("helpText") , newSVpv(helpText, 0), 0);
hv_store(RETVAL, "timestamp", strlen("timestamp") , newSViv(timestamp), 0);
hv_store(RETVAL, "type", strlen("type") ,
newSVpv( ContainerTypeMap[type].name, strlen(ContainerTypeMap[type].name) ) ,
0);
hv_store(RETVAL, "name", strlen("name") , newSVpv(name, 0), 0);
hv_store(RETVAL, "owner", strlen("owner") , newSVpv(owner, 0), 0);
hv_store(RETVAL, "lastChanged", strlen("lastChanged") ,
newSVpv(lastChanged, 0), 0);
if (changeDiary) {
ret = ARDecodeDiary(control, changeDiary, &diaryList, &status);
if (!ARError(ret, status)) {
hv_store(RETVAL, "changeDiary", strlen("changeDiary") ,
perl_ARList(control, (ARList *)&diaryList,
(ARS_fn)perl_diary,
sizeof(ARDiaryStruct)), 0);
FreeARDiaryList(&diaryList, FALSE);
}
}
hv_store(RETVAL, "referenceList", strlen("referenceList") ,
perl_ARReferenceList(control, &references), 0);
if (label)
hv_store(RETVAL, "label", strlen("label") , newSVpv(label, 0), 0);
if (description)
hv_store(RETVAL, "description", strlen("description") , newSVpv(description, 0), 0);
hv_store(RETVAL, "numReferences", strlen("numReferences") , newSViv(references.numItems), 0);
FreeARPermissionList(&groupList,FALSE);
FreeARInternalIdList(&adminGroupList,FALSE);
FreeARContainerOwnerObjList(&ownerObjList,FALSE);
FreeARReferenceList(&references,FALSE);
FreeARPropList(&objPropList, FALSE);
if(helpText)
arsperl_FreeARTextString(helpText);
if(changeDiary)
arsperl_FreeARTextString(changeDiary);
if(label)
arsperl_FreeARTextString(label);
if(description)
arsperl_FreeARTextString(description);
}
}
OUTPUT:
RETVAL
void
ars_GetListServer()
PPCODE:
{
ARServerNameList serverList;
ARStatusList status;
int ret = 0;
unsigned int i = 0;
ARControlStruct ctrl;
(void) ARError_reset();
Zero(&serverList, 1, ARServerNameList);
Zero(&status, 1, ARStatusList);
Zero(&ctrl, 1, ARControlStruct);
#if AR_EXPORT_VERSION >= 4
/* this function can be called without a control struct
* (or even before a control struct is available).
* we will create a bogus control struct, initialize it
* and execute the function. this seems to work fine.
}
OUTPUT:
RETVAL
int
ars_SetEntry(ctrl,schema,entry_id,getTime,...)
ARControlStruct * ctrl
char * schema
char * entry_id
unsigned long getTime
CODE:
{
int a = 0, i = 0, c = (items - 4) / 2;
int offset = 4;
ARFieldValueList fieldList;
ARInternalIdList getFieldIds;
ARStatusList status;
int ret = 0;
unsigned int dataType = 0, j = 0;
unsigned int option = AR_JOIN_SETOPTION_NONE;
AREntryIdList entryList;
HV *cacheFields;
(void) ARError_reset();
Zero(&status, 1,ARStatusList);
Zero(&fieldList, 1, ARFieldValueList);
Zero(&getFieldIds, 1, ARInternalIdList);
Zero(&entryList, 1,AREntryIdList);
RETVAL = 0; /* assume error */
if ((items - 4) % 2) {
option = SvIV(ST(offset));
offset ++;
}
if (c < 1) {
(void) ARError_add( AR_RETURN_ERROR, AP_ERR_BAD_ARGS);
goto set_entry_exit;
}
cacheFields = fieldcache_get_schema_fields( ctrl, schema, FALSE );
if( ! cacheFields ){
goto set_entry_exit;
}
fieldList.numItems = c;
AMALLOCNN(fieldList.fieldValueList,c,ARFieldValueStruct);
getFieldIds.numItems = 0;
getFieldIds.internalIdList = NULL;
for (i=0; i<c; i++) {
ARInternalId fieldId;
a = i*2+offset;
fieldId = fieldList.fieldValueList[i].fieldId = SvIV(ST(a));
if (! SvOK(ST(a+1))) {
/* pass a NULL */
fieldList.fieldValueList[i].value.dataType = AR_DATA_TYPE_NULL;
}else{
/* determine data type and pass value */
dataType = fieldcache_get_data_type( cacheFields, fieldId );
if (dataType <= AR_DATA_TYPE_MAX_TYPE) {
if (sv_to_ARValue(ctrl, ST(a+1), dataType, &fieldList.fieldValueList[i].value) < 0) {
goto set_entry_end;
}
}else{
if( getFieldIds.numItems == 0 ){
AMALLOCNN(getFieldIds.internalIdList,c,ARInternalId);
}
/* printf( "%s [%d] collect for loading\n", schema, fieldId ); fflush(stdout); */ /* _DEBUG_ */
getFieldIds.internalIdList[getFieldIds.numItems] = fieldId;
++getFieldIds.numItems;
}
}
}
/* load missing fields into cache */
if( getFieldIds.numItems > 0 ){
/* printf( "--- load missing fields ---\n" ); fflush(stdout); */ /* _DEBUG_ */
/* if( fieldcache_load_schema(ctrl,schema,&getFieldIds,NULL) != AR_RETURN_OK ){ */
if( fieldcache_load_schema(ctrl,schema,&getFieldIds,NULL) > AR_RETURN_WARNING ){
goto set_entry_end;
}
}
/* now get data type from the freshly cached fields */
i = 0;
for (j=0; j<getFieldIds.numItems; ++j) {
ARInternalId fieldId = getFieldIds.internalIdList[j];
while(fieldId != fieldList.fieldValueList[i].fieldId) ++i;
a = i*2+offset;
dataType = fieldcache_get_data_type( cacheFields, fieldId );
if (dataType <= AR_DATA_TYPE_MAX_TYPE) {
/* printf( "%s [%d] freshly loaded\n", schema, fieldId ); fflush(stdout); */ /* _DEBUG_ */
if (sv_to_ARValue(ctrl, ST(a+1), dataType, &fieldList.fieldValueList[i].value) < 0) {
goto set_entry_end;
}
}else{
char errTxt[256];
sprintf( errTxt, "Failed to fetch field %d from hash", fieldId );
ARError_add(AR_RETURN_ERROR, AP_ERR_FIELD_TYPE);
ARError_add(AR_RETURN_ERROR, AP_ERR_CONTINUE, errTxt );
goto set_entry_end;
}
}
/* printf( "--------------------\n" ); fflush(stdout); */ /* _DEBUG_ */
/* build entryList */
if(perl_BuildEntryList(ctrl, &entryList, entry_id) != 0){
goto set_entry_end;
}
ret = ARSetEntry(ctrl, schema, &entryList, &fieldList, getTime, option, &status);
if (entryList.entryIdList) AP_FREE(entryList.entryIdList);
#ifdef PROFILE
((ars_ctrl *)ctrl)->queries++;
#endif
if (! ARError( ret, status)) {
RETVAL = 1;
}
set_entry_end:;
if (fieldList.fieldValueList) AP_FREE(fieldList.fieldValueList);
set_entry_exit:;
}
OUTPUT:
RETVAL
SV *
ars_Export(ctrl,displayTag,vuiType,...)
ARControlStruct * ctrl
char * displayTag
unsigned int vuiType
CODE:
{
int ret = 0, i = 0, a = 0, c = (items - 3) / 2, ok = 1;
ARStructItemList structItems;
char *buf = CPNULL;
ARStatusList status;
#if AR_CURRENT_API_VERSION >= 17
unsigned int exportOption = AR_EXPORT_DEFAULT; /* TODO: support this as ars_Export() argument */
#endif
#if AR_EXPORT_VERSION >= 8L
ARWorkflowLockStruct workflowLockStruct;
#endif
(void) ARError_reset();
Zero(&status, 1, ARStatusList);
Zero(&structItems, 1, ARStructItemList);
#if AR_EXPORT_VERSION >= 8L
Zero(&workflowLockStruct, 1, ARWorkflowLockStruct);
#endif
RETVAL = &PL_sv_undef;
if ( (items % 2 == 0) || (c < 1) ) {
(void) ARError_add( AR_RETURN_ERROR, AP_ERR_BAD_ARGS);
ok = 0;
} else {
structItems.numItems = c;
AMALLOCNN(structItems.structItemList, c, ARStructItemStruct);
for (i = 0 ; i < c ; i++) {
unsigned int et = 0;
a = i * 2 + 3;
et = caseLookUpTypeNumber((TypeMapStruct *)
StructItemTypeMap,
SvPV(ST(a), PL_na)
);
if(et == TYPEMAP_LAST) {
(void) ARError_add(AR_RETURN_ERROR, AP_ERR_BAD_EXP);
(void) ARError_add(AR_RETURN_ERROR, AP_ERR_CONTINUE,
SvPV(ST(a), PL_na) );
ok = 0;
} else {
structItems.structItemList[i].type = et;
/* printf( "structItems.structItemList[i].type <%d>\n", structItems.structItemList[i].type ); */ /* _DEBUG_ */
strncpy(structItems.structItemList[i].name,
SvPV(ST(a+1), PL_na),
sizeof(ARNameType) );
structItems.structItemList[i].name[sizeof(ARNameType)-1] = '\0';
/* printf( "structItems.structItemList[i].name <%s>\n", structItems.structItemList[i].name ); */ /* _DEBUG_ */
}
}
}
#if AR_EXPORT_VERSION >= 8L
workflowLockStruct.lockType = 0;
workflowLockStruct.lockKey[0] = '\0';
#endif
if(ok) {
ret = ARExport(ctrl, &structItems, displayTag,
#if AR_EXPORT_VERSION >= 6
vuiType,
#endif
#if AR_CURRENT_API_VERSION >= 17
exportOption,
#endif
#if AR_EXPORT_VERSION >= 8L
&workflowLockStruct,
#endif
&buf, &status);
#ifdef PROFILE
((ars_ctrl *)ctrl)->queries++;
#endif
if (! ARError(ret, status) ) {
RETVAL = newSVpv(buf, 0);
}
}
if(buf) arsperl_FreeARTextString(buf);
AP_FREE(structItems.structItemList);
}
OUTPUT:
RETVAL
int
ars_Import(ctrl,importOption=AR_IMPORT_OPT_CREATE,importBuf,...)
ARControlStruct * ctrl
char * importBuf
unsigned int importOption
CODE:
{
int ret = 1, i = 0, a = 0, c = (items - 2) / 2, ok = 1;
ARStructItemList *structItems = NULL;
char *objectModificationLogLabel = NULL;
ARStatusList status;
(void) ARError_reset();
Zero(&status, 1,ARStatusList);
RETVAL = 0;
if ((items-3) % 2) {
(void) ARError_add( AR_RETURN_ERROR, AP_ERR_BAD_ARGS);
ok = 0;
} else {
if (c > 0) {
AMALLOCNN(structItems, c, ARStructItemList);
structItems->numItems = c;
AMALLOCNN(structItems->structItemList, c,
ARStructItemStruct);
for (i = 0; i < c; i++) {
unsigned int et = 0;
a = i*2+3;
et = caseLookUpTypeNumber((TypeMapStruct *)
StructItemTypeMap,
SvPV(ST(a), PL_na)
);
if(et == TYPEMAP_LAST) {
(void) ARError_add(AR_RETURN_ERROR, AP_ERR_BAD_IMP);
(void) ARError_add(AR_RETURN_ERROR, AP_ERR_CONTINUE,
SvPV(ST(a), PL_na) );
ok = 0;
} else {
structItems->structItemList[i].type = et;
strncpy(structItems->structItemList[i].name,
SvPV(ST(a+1), PL_na),
sizeof(ARNameType) );
structItems->structItemList[i].name[sizeof(ARNameType)-1] = '\0';
}
}
}
}
if(ok) {
ret = ARImport(ctrl, structItems, importBuf,
#if AR_EXPORT_VERSION >= 5
importOption,
#endif
#if AR_CURRENT_API_VERSION >= 17
objectModificationLogLabel,
#endif
&status);
#ifdef PROFILE
((ars_ctrl *)ctrl)->queries++;
#endif
if (ARError(ret, status)) {
RETVAL = 0;
} else {
RETVAL = 1;
}
} else {
RETVAL = 0;
}
if (structItems != NULL)
{
AP_FREE(structItems->structItemList);
AP_FREE(structItems);
}
}
OUTPUT:
RETVAL
void
ars_GetListFilter(control,schema=NULL,changedsince=0)
ARControlStruct * control
char * schema
unsigned long changedsince
PPCODE:
{
ARNameList nameList;
ARStatusList status;
#if AR_EXPORT_VERSION >= 8L
ARPropList propList;
#endif
int ret = 0;
unsigned int i = 0;
(void) ARError_reset();
#if AR_EXPORT_VERSION >= 8L
Zero(&propList, 1, ARPropList);
#endif
Zero(&nameList, 1, ARNameList);
Zero(&status, 1,ARStatusList);
ret = ARGetListFilter(control,schema,changedsince,
hv_store(RETVAL, "StopWords", strlen("StopWords") , newRV_noinc((SV *)a), 0);
break;
case AR_FULLTEXTINFO_CASE_SENSITIVE_SRCH:
hv_store(RETVAL, "CaseSensitive", strlen("CaseSensitive") ,
perl_ARValueStruct(ctrl,
&(fullTextInfo.fullTextInfoList[i].u.value)), 0);
break;
case AR_FULLTEXTINFO_COLLECTION_DIR:
hv_store(RETVAL, "CollectionDir", strlen("CollectionDir") ,
perl_ARValueStruct(ctrl,
&(fullTextInfo.fullTextInfoList[i].u.value)), 0);
break;
case AR_FULLTEXTINFO_FTS_MATCH_OP:
hv_store(RETVAL, "MatchOp", strlen("MatchOp") ,
perl_ARValueStruct(ctrl,
&(fullTextInfo.fullTextInfoList[i].u.value)), 0);
break;
case AR_FULLTEXTINFO_STATE:
hv_store(RETVAL, "State", strlen("State") ,
perl_ARValueStruct(ctrl,
&(fullTextInfo.fullTextInfoList[i].u.value)), 0);
break;
}
}
FreeARFullTextInfoList(&fullTextInfo, FALSE);
}
}
OUTPUT:
RETVAL
#ifdef GETLISTGROUP_OLD_STYLE
HV *
ars_GetListGroup(ctrl, userName=NULL,password=NULL)
ARControlStruct * ctrl
char * userName
char * password
CODE:
{
ARStatusList status;
ARGroupInfoList groupList;
int ret = 0;
unsigned int i = 0, v = 0;
(void) ARError_reset();
Zero(&status, 1,ARStatusList);
Zero(&groupList, 1, ARGroupInfoList);
RETVAL = newHV();
sv_2mortal( (SV*) RETVAL );
ret = ARGetListGroup(ctrl, userName,
#if AR_EXPORT_VERSION >= 6
password,
#endif
&groupList, &status);
#ifdef PROFILE
((ars_ctrl *)ctrl)->queries++;
#endif
if(!ARError( ret, status)) {
AV *gidList = newAV(), *gtypeList = newAV(),
*gnameListList = newAV(), *gnameList;
for(i = 0; i < groupList.numItems; i++) {
av_push(gidList, newSViv(groupList.groupList[i].groupId));
av_push(gtypeList, newSViv(groupList.groupList[i].groupType));
gnameList = newAV();
for(v = 0; v < groupList.groupList[i].groupName.numItems ; v++) {
av_push(gnameList, newSVpv(groupList.groupList[i].groupName.nameList[v], 0));
}
av_push(gnameListList, newRV_noinc((SV *)gnameList));
}
hv_store(RETVAL, "groupId", strlen("groupId") , newRV_noinc((SV *)gidList), 0);
hv_store(RETVAL, "groupType", strlen("groupType") , newRV_noinc((SV *)gtypeList), 0);
hv_store(RETVAL, "groupName", strlen("groupName") , newRV_noinc((SV *)gnameListList), 0);
FreeARGroupInfoList(&groupList, FALSE);
}
}
OUTPUT:
RETVAL
#else
void
ars_GetListGroup(ctrl, userName=NULL,password=NULL)
ARControlStruct * ctrl
char * userName
char * password
PPCODE:
{
ARStatusList status;
ARGroupInfoList groupList;
int ret = 0;
(void) ARError_reset();
Zero(&status, 1,ARStatusList);
Zero(&groupList, 1, ARGroupInfoList);
ret = ARGetListGroup(ctrl, userName,
#if AR_EXPORT_VERSION >= 6
password,
#endif
&groupList, &status);
#ifdef PROFILE
((ars_ctrl *)ctrl)->queries++;
#endif
if(!ARError( ret, status)) {
unsigned int i;
for(i = 0; i < groupList.numItems; i++) {
unsigned int v;
HV *groupInfo = newHV();
AV *gnameList = newAV();
for(v = 0; v < groupList.groupList[i].groupName.numItems ; v++) {
av_push(gnameList, newSVpv(groupList.groupList[i].groupName.nameList[v], 0));
}
hv_store(groupInfo, "groupId", 7, newSViv(groupList.groupList[i].groupId), 0);
hv_store(groupInfo, "groupType", 9, newSViv(groupList.groupList[i].groupType), 0);
hv_store(groupInfo, "groupName", 9, newRV_noinc((SV *)gnameList), 0);
#if AR_CURRENT_API_VERSION >= 10
hv_store(groupInfo, "groupCategory", 13, newSViv(groupList.groupList[i].groupCategory), 0);
#endif
XPUSHs(sv_2mortal(newRV_noinc((SV *)groupInfo)));
}
}
FreeARGroupInfoList(&groupList, FALSE);
}
#endif
ARRoleInfoList roleList;
int ret = 0;
(void) ARError_reset();
Zero(&status, 1,ARStatusList);
Zero(&roleList, 1, ARRoleInfoList);
ret = ARGetListRole(ctrl,
applicationName,
userName,
password,
&roleList, &status);
if(!ARError( ret, status)) {
unsigned int i;
for(i = 0; i < roleList.numItems; i++) {
HV *roleInfo = newHV();
hv_store(roleInfo, "roleId", 6, newSViv(roleList.roleList[i].roleId), 0);
hv_store(roleInfo, "roleType", 8, newSViv(roleList.roleList[i].roleType), 0);
hv_store(roleInfo, "roleName", 8, newSVpv(roleList.roleList[i].roleName,0), 0);
XPUSHs(sv_2mortal(newRV_noinc((SV *)roleInfo)));
}
}
FreeARRoleInfoList(&roleList, FALSE);
#else /* < 6.0 */
XPUSHs(sv_2mortal(newSViv(0))); /* ERR */
(void) ARError_add( AR_RETURN_ERROR, AP_ERR_DEPRECATED,
"ars_GetListRole() is only available in ARS >= 6.0");
#endif
}
void
ars_GetListLicense(ctrl, licenseType=NULL)
ARControlStruct * ctrl
char * licenseType
PPCODE:
{
#if AR_EXPORT_VERSION >= 6L
ARStatusList status;
ARLicenseInfoList licList;
int ret = 0;
(void) ARError_reset();
Zero(&status, 1,ARStatusList);
Zero(&licList, 1, ARLicenseInfoList);
ret = ARGetListLicense(ctrl,
licenseType,
&licList, &status);
if(!ARError( ret, status)) {
unsigned int i;
for(i = 0; i < licList.numItems; i++) {
HV *licInfo = newHV();
hv_store(licInfo, "licKey", 6, newSVpv(licList.licenseInfoList[i].licKey,0), 0);
hv_store(licInfo, "licType", 8, newSVpv(licList.licenseInfoList[i].licType,0), 0);
hv_store(licInfo, "licSubtype", 10, newSVpv(licList.licenseInfoList[i].licSubtype,0), 0);
hv_store(licInfo, "issuedDate", 10,
perl_ARLicenseDateStruct(ctrl, &(licList.licenseInfoList[i].issuedDate)), 0);
hv_store(licInfo, "expireDate", 10,
perl_ARLicenseDateStruct(ctrl, &(licList.licenseInfoList[i].expireDate)), 0);
hv_store(licInfo, "hostId", 6, newSVpv(licList.licenseInfoList[i].hostId,0), 0);
hv_store(licInfo, "numLicenses", 11, newSViv(licList.licenseInfoList[i].numLicenses), 0);
hv_store(licInfo, "tokenList", 9, newSVpv(licList.licenseInfoList[i].tokenList,0), 0);
hv_store(licInfo, "comment", 7, newSVpv(licList.licenseInfoList[i].comment,0), 0);
XPUSHs(sv_2mortal(newRV_noinc((SV *)licInfo)));
}
}
FreeARLicenseInfoList(&licList, FALSE);
#else /* < 6.0 */
XPUSHs(sv_2mortal(newSViv(0))); /* ERR */
(void) ARError_add( AR_RETURN_ERROR, AP_ERR_DEPRECATED,
"ars_GetListLicense() is only available in ARS >= 5.0");
#endif
}
HV *
ars_GetListSQL(ctrl, sqlCommand, maxRetrieve=AR_NO_MAX_LIST_RETRIEVE)
ARControlStruct * ctrl
char * sqlCommand
unsigned int maxRetrieve
PPCODE:
{
ARStatusList status;
ARValueListList valueListList;
unsigned int numMatches = 0;
int ret = 0;
(void) ARError_reset();
RETVAL = NULL;
Zero(&status, 1, ARStatusList);
Zero(&valueListList, 1, ARValueListList);
#ifndef ARS20
ret = ARGetListSQL(ctrl, sqlCommand, maxRetrieve, &valueListList,
&numMatches, &status);
#ifdef PROFILE
((ars_ctrl *)ctrl)->queries++;
#endif
if(!ARError( ret, status)) {
unsigned int row, col;
AV *ra = newAV(), *ca;
RETVAL = newHV();
hv_store(RETVAL, "numMatches", strlen("numMatches") , newSViv(numMatches), 0);
for(row = 0; row < valueListList.numItems ; row++) {
ca = newAV();
for(col = 0; col < valueListList.valueListList[row].numItems;
col++)
{
av_push(ca, perl_ARValueStruct(ctrl,
&(valueListList.valueListList[row].valueList[col])));
}
av_push(ra, newRV_noinc((SV *)ca));
}
hv_store(RETVAL, "rows", strlen("rows") , newRV_noinc((SV *)ra), 0);
changedSince,
#if AR_CURRENT_API_VERSION >= 17
NULL, /* &objPropList (undocumented by BMC) */
#endif
&idList,
&status);
#ifdef PROFILE
((ars_ctrl *)ctrl)->queries++;
#endif
if(!ARError( ret, status)) {
for(i = 0 ; i < idList.numItems ; i++) {
XPUSHs(sv_2mortal(newSViv(idList.internalIdList[i])));
}
}
FreeARInternalIdList(&idList, FALSE);
#else /* ars 2.x */
(void) ARError_reset();
(void) ARError_add( AR_RETURN_ERROR, AP_ERR_DEPRECATED, "Not available in 2.x");
#endif
}
void
ars_SetServerInfo(ctrl, ...)
ARControlStruct * ctrl
PPCODE:
{
ARStatusList status;
ARServerInfoList serverInfo;
int ret = 0, i = 0, count = 0;
(void) ARError_reset();
Zero(&status, 1, ARStatusList);
Zero(&serverInfo, 1, ARServerInfoList);
if((items == 1) || ((items % 2) == 0)) {
(void) ARError_add(AR_RETURN_ERROR,
AP_ERR_BAD_ARGS);
} else {
unsigned int infoType, j = 0;
char buf[256];
serverInfo.numItems = (items - 1) / 2;
serverInfo.serverInfoList = MALLOCNN(serverInfo.numItems * sizeof(ARServerInfoStruct));
/* Zero(serverInfo.serverInfoList, 1, ARServerInfoStruct); # happens already in MALLOCNN */
for(j = 0 ; j < serverInfo.numItems ; ++j) {
i = 2 * j + 1;
infoType = lookUpServerInfoTypeHint(SvIV(ST(i)));
serverInfo.serverInfoList[j].operation = SvIV(ST(i));
serverInfo.serverInfoList[j].value.dataType = infoType;
switch(infoType) {
case AR_DATA_TYPE_CHAR:
serverInfo.serverInfoList[j].value.u.charVal = strdup(SvPV(ST(i+1), PL_na));
break;
case AR_DATA_TYPE_INTEGER:
serverInfo.serverInfoList[j].value.u.intVal = SvIV(ST(i+1));
break;
default:
sprintf( buf, "(%d) type = %d", serverInfo.serverInfoList[j].operation, serverInfo.serverInfoList[j].value.dataType );
(void) ARError_add(AR_RETURN_ERROR, AP_ERR_INV_ARGS,
buf);
FreeARServerInfoList(&serverInfo, FALSE);
XPUSHs(sv_2mortal(newSViv(0))); /* ERR */
goto SetServerInfo_fail;
}
}
ret = ARSetServerInfo(ctrl, &serverInfo, &status);
FreeARServerInfoList(&serverInfo, FALSE);
if(ARError(ret, status)) {
XPUSHs(sv_2mortal(newSViv(0))); /* ERR */
} else {
XPUSHs(sv_2mortal(newSViv(1))); /* OK */
}
}
SetServerInfo_fail:;
}
void
ars_GetServerInfo(ctrl, ...)
ARControlStruct * ctrl
PPCODE:
{
ARStatusList status;
ARServerInfoRequestList requestList;
ARServerInfoList serverInfo;
int ret = 0;
int i = 0;
unsigned int ui = 0, count = 0;
unsigned int rlist[AR_MAX_SERVER_INFO_USED];
(void) ARError_reset();
Zero(&status, 1,ARStatusList);
Zero(&requestList, 1, ARServerInfoRequestList);
Zero(&serverInfo, 1, ARServerInfoList);
count = 0;
if(items == 1) { /* none specified.. fetch all */
for(i = 0; i < AR_MAX_SERVER_INFO_USED ; i++) {
/* we'll exclude ones that can't be retrieved to avoid errors */
switch(i+1) {
case AR_SERVER_INFO_DB_PASSWORD:
#if AR_CURRENT_API_VERSION < 17
case 332:
case 331:
case 330:
case 329:
case 328:
case 327:
case 326:
case 325:
#endif
break;
default:
rlist[count++] = i+1;
}
}
}else if(items > AR_MAX_SERVER_INFO_USED + 1) {
ARError_add( AR_RETURN_ERROR, AP_ERR_BAD_ARGS);
}else { /* user has asked for specific ones */
for(i = 1 ; i < items ; i++) {
rlist[count++] = SvIV(ST(i));
}
}
if(count > 0) {
requestList.numItems = count;
requestList.requestList = rlist;
ret = ARGetServerInfo(ctrl, &requestList, &serverInfo, &status);
#ifdef PROFILE
((ars_ctrl *)ctrl)->queries++;
#endif
if(!ARError( ret, status)) {
for(ui = 0 ; ui < serverInfo.numItems ; ui++) {
/* provided we have a mapping for the operation code,
* push out it's translation. else push out the code itself
*/
if(serverInfo.serverInfoList[ui].operation <= AR_MAX_SERVER_INFO_USED) {
/* printf( "%d %s: data type = %d\n", serverInfo.serverInfoList[ui].operation, ServerInfoMap[serverInfo.serverInfoList[ui].operation].name, serverInfo.serverInfoList[ui].value.dataType ); */
XPUSHs(sv_2mortal(newSVpv(ServerInfoMap[serverInfo.serverInfoList[ui].operation].name, 0)));
} else {
XPUSHs(sv_2mortal(newSViv(serverInfo.serverInfoList[ui].operation)));
}
XPUSHs(sv_2mortal(perl_ARValueStruct(ctrl,
&(serverInfo.serverInfoList[ui].value))));
}
}
FreeARServerInfoList(&serverInfo, FALSE);
}
}
HV *
ars_GetVUI(ctrl, schema, vuiId)
ARControlStruct * ctrl
char * schema
ARInternalId vuiId
CODE:
{
#if AR_EXPORT_VERSION >= 3
ARStatusList status;
ARNameType vuiName;
ARPropList dPropList;
char *helpText = CPNULL;
ARTimestamp timestamp;
ARAccessNameType owner;
ARAccessNameType lastChanged;
char *changeDiary = CPNULL;
int ret = 0;
ARDiaryList diaryList;
ARPropList objPropList;
# if AR_EXPORT_VERSION >= 6
unsigned int vuiType = 0;
ARLocaleType locale;
Zero(locale, 1, ARLocaleType);
# endif
RETVAL = newHV();
sv_2mortal( (SV*) RETVAL );
(void) ARError_reset();
Zero(&status, 1,ARStatusList);
Zero(vuiName, 1, ARNameType);
Zero(&dPropList, 1, ARPropList);
Zero(&objPropList, 1, ARPropList);
Zero(×tamp, 1, ARTimestamp);
Zero(owner, 1, ARAccessNameType);
Zero(lastChanged, 1, ARAccessNameType);
ret = ARGetVUI(ctrl, schema, vuiId, vuiName,
# if AR_EXPORT_VERSION >= 6
locale, &vuiType,
# endif
&dPropList, &helpText,
×tamp, owner, lastChanged, &changeDiary,
#if AR_CURRENT_API_VERSION >= 17
&objPropList,
#endif
&status);
# ifdef PROFILE
((ars_ctrl *)ctrl)->queries++;
# endif
if(!ARError( ret, status)) {
}
FreeARPropList(&dPropList, FALSE);
FreeARPropList(&objPropList, FALSE);
if(helpText) {
AP_FREE(helpText);
}
if(changeDiary) {
AP_FREE(changeDiary);
}
#else /* ars 2.x */
(void) ARError_reset();
(void) ARError_add( AR_RETURN_ERROR, AP_ERR_DEPRECATED, "Not available in 2.x");
RETVAL = newHV();
#endif
}
OUTPUT:
RETVAL
int
ars_CreateCharMenu( ctrl, menuDefRef, removeFlag=TRUE )
ARControlStruct * ctrl
SV * menuDefRef
ARBoolean removeFlag;
CODE:
{
#if AR_EXPORT_VERSION >= 6L
ARNameType name;
int ret = 0, rv = 0;
unsigned int refreshCode;
char *refreshCodeStr = NULL;
char *menuTypeStr = NULL;
ARCharMenuStruct arMenuDef;
char *helpText = NULL;
ARAccessNameType owner;
char *changeDiary = NULL;
ARPropList objPropList;
char *objectModificationLogLabel = NULL;
ARStatusList status;
HV *menuDef = NULL;
SV **pSvTemp;
RETVAL = 0; /* assume error */
(void) ARError_reset();
Zero(&arMenuDef, 1,ARCharMenuStruct);
Zero(owner, 1,ARAccessNameType);
Zero(&objPropList, 1,ARPropList);
Zero(&status, 1,ARStatusList);
if( SvROK(menuDefRef) && SvTYPE(SvRV(menuDefRef)) == SVt_PVHV ){
menuDef = (HV*) SvRV(menuDefRef);
}else{
croak("usage: ars_CreateCharMenu(...)");
}
rv += strcpyHVal( menuDef, "name", name, AR_MAX_NAME_SIZE );
/* rv += uintcpyHVal( menuDef, "refreshCode", &type ); */
rv += strmakHVal( menuDef, "refreshCode", &refreshCodeStr );
refreshCode = revTypeName( (TypeMapStruct*)CharMenuRefreshCodeTypeMap, refreshCodeStr );
if( refreshCode == TYPEMAP_LAST ){
ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL,
"ars_CreateCharMenu: refreshCode key invalid. key follows:");
ARError_add(AR_RETURN_WARNING, AP_ERR_CONTINUE,
refreshCodeStr ? refreshCodeStr : "[key null]" );
}
if( refreshCodeStr != NULL ){ AP_FREE(refreshCodeStr); }
rv += strmakHVal( menuDef, "menuType", &menuTypeStr );
arMenuDef.menuType = revTypeName( (TypeMapStruct*)CharMenuTypeMap, menuTypeStr );
if( arMenuDef.menuType == TYPEMAP_LAST ){
ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL,
"ars_CreateCharMenu: menuType key invalid. key follows:");
ARError_add(AR_RETURN_WARNING, AP_ERR_CONTINUE,
menuTypeStr ? menuTypeStr : "[key null]" );
}
if( menuTypeStr != NULL ){ AP_FREE(menuTypeStr); }
switch( arMenuDef.menuType ){
case AR_CHAR_MENU_LIST:
pSvTemp = hv_fetch( menuDef, "menuList", strlen("menuList") , 0 );
if( pSvTemp && *pSvTemp && SvTYPE(*pSvTemp) != SVt_NULL ){
rv += rev_ARCharMenuList( ctrl, menuDef, "menuList", &(arMenuDef.u.menuList) );
}
break;
case AR_CHAR_MENU_QUERY:
pSvTemp = hv_fetch( menuDef, "menuQuery", strlen("menuQuery") , 0 );
if( pSvTemp && *pSvTemp && SvTYPE(*pSvTemp) != SVt_NULL ){
rv += rev_ARCharMenuQueryStruct( ctrl, menuDef, "menuQuery", &(arMenuDef.u.menuQuery) );
}
break;
case AR_CHAR_MENU_FILE:
pSvTemp = hv_fetch( menuDef, "menuFile", strlen("menuFile") , 0 );
if( pSvTemp && *pSvTemp && SvTYPE(*pSvTemp) != SVt_NULL ){
rv += rev_ARCharMenuFileStruct( ctrl, menuDef, "menuFile", &(arMenuDef.u.menuFile) );
}
break;
case AR_CHAR_MENU_SQL:
pSvTemp = hv_fetch( menuDef, "menuSQL", strlen("menuSQL") , 0 );
if( pSvTemp && *pSvTemp && SvTYPE(*pSvTemp) != SVt_NULL ){
rv += rev_ARCharMenuSQLStruct( ctrl, menuDef, "menuSQL", &(arMenuDef.u.menuSQL) );
}
break;
case AR_CHAR_MENU_SS:
pSvTemp = hv_fetch( menuDef, "menuSS", strlen("menuSS") , 0 );
if( pSvTemp && *pSvTemp && SvTYPE(*pSvTemp) != SVt_NULL ){
rv += rev_ARCharMenuSSStruct( ctrl, menuDef, "menuSS", &(arMenuDef.u.menuSS) );
}
break;
case AR_CHAR_MENU_DATA_DICTIONARY:
pSvTemp = hv_fetch( menuDef, "menuDD", strlen("menuDD") , 0 );
if( pSvTemp && *pSvTemp && SvTYPE(*pSvTemp) != SVt_NULL ){
rv += rev_ARCharMenuDDStruct( ctrl, menuDef, "menuDD", &(arMenuDef.u.menuDD) );
}
break;
}
objPropList.numItems = 0;
if( rv == 0 ){
ret = ARSetVUI( ctrl,
schemaName,
vuiId,
vuiNamePtr,
localePtr,
vuiTypePtr,
dPropList,
helpText,
owner,
changeDiary,
#if AR_CURRENT_API_VERSION >= 17
objPropList,
#endif
&status );
RETVAL = ARError(ret,status) ? 0 : 1;
}else{
ARError_add( AR_RETURN_ERROR, AP_ERR_PREREVFAIL);
RETVAL = 0;
}
if( helpText != NULL ){
AP_FREE( helpText );
}
if( changeDiary != NULL ){
AP_FREE( changeDiary );
}
FreeARPropList( dPropList, TRUE );
FreeARPropList( objPropList, TRUE );
#else /* < 5.0 */
XPUSHs(sv_2mortal(newSViv(0))); /* ERR */
(void) ARError_add( AR_RETURN_ERROR, AP_ERR_DEPRECATED,
"ARSperl supports SetVUI() only for ARSystem >= 5.0");
RETVAL = AR_RETURN_ERROR;
#endif
}
OUTPUT:
RETVAL
int
ars_CreateContainer( ctrl, containerDefRef, removeFlag=TRUE )
ARControlStruct * ctrl
SV * containerDefRef
ARBoolean removeFlag;
CODE:
{
#if AR_EXPORT_VERSION >= 6L
int ret = 0, rv = 0;
ARNameType name;
ARPermissionList groupList;
ARInternalIdList admingrpList;
ARContainerOwnerObjList ownerObjList;
char *label = NULL;
char *description = NULL;
char *typeStr = NULL;
unsigned int type;
ARReferenceList references;
char *helpText = NULL;
ARAccessNameType owner;
char *changeDiary = NULL;
ARPropList objPropList;
char *objectModificationLogLabel = NULL;
ARStatusList status;
HV *containerDef = NULL;
SV **pSvTemp;
RETVAL = 0; /* assume error */
(void) ARError_reset();
Zero(name, 1,ARNameType);
Zero(&groupList, 1,ARPermissionList);
Zero(&admingrpList, 1,ARInternalIdList);
Zero(&ownerObjList, 1,ARContainerOwnerObjList);
Zero(&references, 1,ARReferenceList);
Zero(owner, 1,ARAccessNameType);
Zero(&objPropList, 1,ARPropList);
Zero(&status, 1,ARStatusList);
if( SvROK(containerDefRef) && SvTYPE(SvRV(containerDefRef)) == SVt_PVHV ){
containerDef = (HV*) SvRV(containerDefRef);
}else{
croak("usage: ars_CreateContainer(...)");
}
rv += strcpyHVal( containerDef, "name", name, AR_MAX_NAME_SIZE );
/* rv += uintcpyHVal( containerDef, "type", &type ); */
rv += strmakHVal( containerDef, "type", &typeStr );
type = revTypeName( (TypeMapStruct*)ContainerTypeMap, typeStr );
if( type == TYPEMAP_LAST ){
ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL,
"ars_CreateContainer: type key invalid. key follows:");
ARError_add(AR_RETURN_WARNING, AP_ERR_CONTINUE,
typeStr ? typeStr : "[key null]" );
}
if( typeStr != NULL ){ AP_FREE(typeStr); }
groupList.numItems = 0;
groupList.permissionList = NULL;
pSvTemp = hv_fetch( containerDef, "groupList", strlen("groupList") , 0 );
if( pSvTemp && *pSvTemp && SvTYPE(*pSvTemp) != SVt_NULL ){
rv += rev_ARPermissionList( ctrl, containerDef, "groupList", &groupList );
}
admingrpList.numItems = 0;
admingrpList.internalIdList = NULL;
pSvTemp = hv_fetch( containerDef, "adminList", strlen("adminList") , 0 );
if( pSvTemp && *pSvTemp && SvTYPE(*pSvTemp) != SVt_NULL ){
rv += rev_ARInternalIdList( ctrl, containerDef, "adminList", &admingrpList );
}
ownerObjList.numItems = 0;
ownerObjList.ownerObjList = NULL;
pSvTemp = hv_fetch( containerDef, "ownerObjList", strlen("ownerObjList") , 0 );
if( pSvTemp && *pSvTemp && SvTYPE(*pSvTemp) != SVt_NULL ){
rv += rev_ARContainerOwnerObjList( ctrl, containerDef, "ownerObjList", &ownerObjList );
}
objPropList.numItems = 0;
objPropList.props = NULL;
pSvTemp = hv_fetch( containerDef, "objPropList", strlen("objPropList") , 0 );
if( pSvTemp && *pSvTemp && SvTYPE(*pSvTemp) != SVt_NULL ){
rv += rev_ARPropList( ctrl, containerDef, "objPropList", &objPropList );
}
references.numItems = 0;
references.referenceList = NULL;
pSvTemp = hv_fetch( containerDef, "referenceList", strlen("referenceList") , 0 );
if( pSvTemp && *pSvTemp && SvTYPE(*pSvTemp) != SVt_NULL ){
rv += rev_ARReferenceList( ctrl, containerDef, "referenceList", &references );
}
if( hv_exists(containerDef,"label",5) ){
rv += strmakHVal( containerDef, "label", &label );
}
if( hv_exists(containerDef,"description",11) ){
rv += strmakHVal( containerDef, "description", &description );
}
if( hv_exists(containerDef,"helpText",8) ){
rv += strmakHVal( containerDef, "helpText", &helpText );
}
if( hv_exists(containerDef,"owner",5) ){
rv += strcpyHVal( containerDef, "owner", owner, AR_MAX_ACCESS_NAME_SIZE );
}
if( hv_exists(containerDef,"changeDiary",11) ){
rv += strmakHVal( containerDef, "changeDiary", &changeDiary );
}
if( rv == 0 ){
ret = ARCreateContainer( ctrl,
name,
&groupList,
&admingrpList,
&ownerObjList,
label,
description,
type,
&references,
removeFlag,
helpText,
owner,
changeDiary,
&objPropList,
#if AR_CURRENT_API_VERSION >= 17
objectModificationLogLabel,
#endif
&status );
RETVAL = ARError(ret,status) ? 0 : 1;
}else{
ARError_add( AR_RETURN_ERROR, AP_ERR_PREREVFAIL);
RETVAL = 0;
}
if( label != NULL ){
AP_FREE( label );
}
if( description != NULL ){
AP_FREE( description );
}
if( helpText != NULL ){
AP_FREE( helpText );
}
if( changeDiary != NULL ){
AP_FREE( changeDiary );
}
FreeARPermissionList( &groupList, FALSE );
FreeARInternalIdList( &admingrpList, FALSE );
FreeARContainerOwnerObjList( &ownerObjList, FALSE );
FreeARReferenceList( &references, FALSE );
FreeARPropList( &objPropList, FALSE );
#else /* < 5.0 */
XPUSHs(sv_2mortal(newSViv(0))); /* ERR */
(void) ARError_add( AR_RETURN_ERROR, AP_ERR_DEPRECATED,
"ARSperl supports CreateContainer() only for ARSystem >= 5.0");
RETVAL = AR_RETURN_ERROR;
#endif
}
OUTPUT:
RETVAL
int
ars_SetContainer( ctrl, name, containerDefRef, removeFlag=TRUE )
ARControlStruct * ctrl
ARNameType name
SV * containerDefRef
ARBoolean removeFlag;
CODE:
{
#if AR_EXPORT_VERSION >= 6L
int ret = 0, rv = 0;
ARNameType newName;
char *newNamePtr = NULL;
ARPermissionList *groupList = NULL;
ARInternalIdList *admingrpList = NULL;
ARContainerOwnerObjList *ownerObjList = NULL;
char *label = NULL;
char *description = NULL;
char *typeStr = NULL;
unsigned int type;
unsigned int *typePtr = NULL;
ARReferenceList *references = NULL;
char *helpText = NULL;
ARAccessNameType owner;
char *changeDiary = NULL;
ARPropList *objPropList = NULL;
char *objectModificationLogLabel = NULL;
ARStatusList status;
HV *containerDef = NULL;
SV **pSvTemp;
RETVAL = 0; /* assume error */
(void) ARError_reset();
Zero(newName, 1,ARNameType);
Zero(owner, 1,ARAccessNameType);
Zero(&status, 1,ARStatusList);
if( SvROK(containerDefRef) && SvTYPE(SvRV(containerDefRef)) == SVt_PVHV ){
containerDef = (HV*) SvRV(containerDefRef);
}else{
croak("usage: ars_SetContainer(...)");
}
if( hv_exists(containerDef,"name",4) ){
rv += strcpyHVal( containerDef, "name", newName, AR_MAX_NAME_SIZE );
newNamePtr = newName;
}
if( hv_exists(containerDef,"type",4) ){
/* rv += uintcpyHVal( containerDef, "type", &type ); */
rv += strmakHVal( containerDef, "type", &typeStr );
type = revTypeName( (TypeMapStruct*)ContainerTypeMap, typeStr );
if( type == TYPEMAP_LAST ){
ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL,
"ars_CreateContainer: type key invalid. key follows:");
ARError_add(AR_RETURN_WARNING, AP_ERR_CONTINUE,
typeStr ? typeStr : "[key null]" );
}
if( typeStr != NULL ){ AP_FREE(typeStr); }
typePtr = &type;
}
pSvTemp = hv_fetch( containerDef, "groupList", strlen("groupList") , 0 );
if( pSvTemp && *pSvTemp && SvTYPE(*pSvTemp) != SVt_NULL ){
groupList = (ARPermissionList*) MALLOCNN( sizeof(ARPermissionList) );
rv += rev_ARPermissionList( ctrl, containerDef, "groupList", groupList );
}
pSvTemp = hv_fetch( containerDef, "adminList", strlen("adminList") , 0 );
if( pSvTemp && *pSvTemp && SvTYPE(*pSvTemp) != SVt_NULL ){
admingrpList = (ARInternalIdList*) MALLOCNN( sizeof(ARInternalIdList) );
rv += rev_ARInternalIdList( ctrl, containerDef, "adminList", admingrpList );
}
pSvTemp = hv_fetch( containerDef, "ownerObjList", strlen("ownerObjList") , 0 );
if( pSvTemp && *pSvTemp && SvTYPE(*pSvTemp) != SVt_NULL ){
ownerObjList = (ARContainerOwnerObjList*) MALLOCNN( sizeof(ARContainerOwnerObjList) );
rv += rev_ARContainerOwnerObjList( ctrl, containerDef, "ownerObjList", ownerObjList );
}
pSvTemp = hv_fetch( containerDef, "objPropList", strlen("objPropList") , 0 );
if( pSvTemp && *pSvTemp && SvTYPE(*pSvTemp) != SVt_NULL ){
objPropList = (ARPropList*) MALLOCNN( sizeof(ARPropList) );
rv += rev_ARPropList( ctrl, containerDef, "objPropList", objPropList );
}
pSvTemp = hv_fetch( containerDef, "referenceList", strlen("referenceList") , 0 );
if( pSvTemp && *pSvTemp && SvTYPE(*pSvTemp) != SVt_NULL ){
references = (ARReferenceList*) MALLOCNN( sizeof(ARReferenceList) );
rv += rev_ARReferenceList( ctrl, containerDef, "referenceList", references );
}
if( hv_exists(containerDef,"label",5) ){
rv += strmakHVal( containerDef, "label", &label );
}
if( hv_exists(containerDef,"description",11) ){
rv += strmakHVal( containerDef, "description", &description );
}
if( hv_exists(containerDef,"helpText",8) ){
rv += strmakHVal( containerDef, "helpText", &helpText );
}
if( hv_exists(containerDef,"owner",5) ){
rv += strcpyHVal( containerDef, "owner", owner, AR_MAX_ACCESS_NAME_SIZE );
}
if( hv_exists(containerDef,"changeDiary",11) ){
rv += strmakHVal( containerDef, "changeDiary", &changeDiary );
}
if( rv == 0 ){
ret = ARSetContainer( ctrl,
name,
newNamePtr,
groupList,
admingrpList,
ownerObjList,
label,
description,
typePtr,
references,
removeFlag,
helpText,
owner,
changeDiary,
objPropList,
#if AR_CURRENT_API_VERSION >= 17
objectModificationLogLabel,
#endif
&status );
RETVAL = ARError(ret,status) ? 0 : 1;
}else{
ARError_add( AR_RETURN_ERROR, AP_ERR_PREREVFAIL);
RETVAL = 0;
}
if( label != NULL ){
AP_FREE( label );
}
if( description != NULL ){
AP_FREE( description );
}
if( helpText != NULL ){
AP_FREE( helpText );
}
if( changeDiary != NULL ){
AP_FREE( changeDiary );
}
if( groupList != NULL ){
FreeARPermissionList( groupList, TRUE );
}
if( admingrpList != NULL ){
FreeARInternalIdList( admingrpList, TRUE );
}
if( ownerObjList != NULL ){
FreeARContainerOwnerObjList( ownerObjList, TRUE );
}
if( references != NULL ){
FreeARReferenceList( references, TRUE );
}
if( objPropList != NULL ){
FreeARPropList( objPropList, TRUE );
}
#else /* < 5.0 */
XPUSHs(sv_2mortal(newSViv(0))); /* ERR */
(void) ARError_add( AR_RETURN_ERROR, AP_ERR_DEPRECATED,
"ARSperl supports SetContainer() only for ARSystem >= 5.0");
RETVAL = AR_RETURN_ERROR;
#endif
}
OUTPUT:
RETVAL
int
ars_CreateActiveLink(ctrl, alDefRef)
ARControlStruct * ctrl
SV * alDefRef
CODE:
{
int ret = 0, rv = 0;
ARNameType schema, name;
ARInternalIdList groupList;
unsigned int executeMask, order;
#if AR_EXPORT_VERSION >= 3
ARInternalId controlField = 0;
ARInternalId focusField = 0;
#else /* 2.x */
ARInternalId field = 0;
ARDisplayList displayList;
#endif
unsigned int enable = 0;
ARQualifierStruct *query;
ARActiveLinkActionList actionList;
#if AR_EXPORT_VERSION >= 3
ARActiveLinkActionList elseList;
#endif
char *helpText = CPNULL;
ARAccessNameType owner;
char *changeDiary = CPNULL;
char *objectModificationLogLabel = NULL;
ARStatusList status;
#if AR_EXPORT_VERSION >= 5
ARNameList schemaNameList;
ARWorkflowConnectStruct schemaList;
ARPropList objPropList;
#endif
RETVAL = 0; /* assume error */
(void) ARError_reset();
Zero(&status, 1,ARStatusList);
Zero(schema, 1, ARNameType);
Zero(name, 1, ARNameType);
Zero(&groupList, 1,ARInternalIdList);
Zero(&actionList, 1,ARActiveLinkActionList);
Zero(owner, 1, ARAccessNameType);
#if AR_EXPORT_VERSION >= 3
Zero(&elseList, 1,ARActiveLinkActionList);
#else
Zero(&displayList, 1,ARDisplayList);
#endif
#if AR_EXPORT_VERSION >= 5
Zero(&objPropList, 1, ARPropList);
Zero(&schemaList, 1, ARWorkflowConnectStruct);
Zero(&schemaNameList, 1, ARNameList);
schemaList.type = AR_WORKFLOW_CONN_SCHEMA_LIST;
schemaList.u.schemaList = &schemaNameList;
#endif
if(SvTYPE((SV *)SvRV(alDefRef)) != SVt_PVHV) {
ARError_add( AR_RETURN_ERROR, AP_ERR_EXPECT_PVHV);
} else {
HV *alDef = (HV *)SvRV(alDefRef);
SV **qhv = hv_fetch(alDef, "query", strlen("query") , 0);
/* dereference the qual pointer */
if(qhv && *qhv && SvROK(*qhv)) {
query = (ARQualifierStruct *)SvIV((SV *)SvRV(*qhv));
/* query = (ARQualifierStruct*) MALLOCNN( sizeof(ARQualifierStruct) );
rv += rev_ARQualifierStruct( ctrl, alDef, "query", query ); */
} else {
query = (ARQualifierStruct *)NULL;
}
/* copy the various hash entries into the appropriate
* data structure. if any are missing, we fail.
*/
rv = 0;
rv += strcpyHVal( alDef, "name", name, AR_MAX_NAME_SIZE);
#if AR_EXPORT_VERSION >= 5
rv += rev_ARNameList( ctrl, alDef, "schemaList", schemaList.u.schemaList );
#else
rv += strcpyHVal( alDef, "schema", schema, AR_MAX_NAME_SIZE);
#endif
rv += uintcpyHVal( alDef, "order", &order);
rv += rev_ARInternalIdList(ctrl, alDef, "groupList", &groupList);
rv += uintcpyHVal( alDef, "executeMask", &executeMask);
rv += uintcpyHVal( alDef, "enable", &enable);
if(hv_exists(alDef, "owner", strlen("owner") ))
rv += strcpyHVal( alDef, "owner", owner, AR_MAX_ACCESS_NAME_SIZE);
else
strncpy(owner, ctrl->user, sizeof(ARAccessNameType));
/* these two are optional, so if the calls return warnings
* it probably indicates that the hash keys don't exist and
* we'll ignore it unless an actual failure code is returned.
*/
if(hv_exists(alDef, "changeDiary", strlen("changeDiary") ))
rv += strmakHVal( alDef, "changeDiary", &changeDiary);
if(hv_exists(alDef, "helpText", strlen("helpText") ))
rv += strmakHVal( alDef, "helpText", &helpText);
/* now handle the action & else (3.x) lists */
rv += rev_ARActiveLinkActionList(ctrl, alDef, "actionList",
&actionList);
#if AR_EXPORT_VERSION >= 3
rv += rev_ARActiveLinkActionList(ctrl, alDef, "elseList",
&elseList);
if((executeMask & AR_EXECUTE_ON_RETURN)
|| (executeMask & AR_EXECUTE_ON_MENU_CHOICE)
#if AR_EXPORT_VERSION >= 4
|| (executeMask & AR_EXECUTE_ON_GAIN_FOCUS)
|| (executeMask & AR_EXECUTE_ON_LOSE_FOCUS)
int
ars_SetActiveLink(ctrl, name, objDefRef)
ARControlStruct * ctrl
ARNameType name
SV * objDefRef
CODE:
{
#if AR_EXPORT_VERSION >= 5
int ret = 0, rv = 0;
ARNameType newName;
char *newNamePtr = NULL;
ARInternalIdList *groupList = NULL;
unsigned int *executeMask = NULL;
unsigned int *order = NULL;
ARInternalId *controlField = NULL;
ARInternalId *focusField = NULL;
unsigned int *enable = NULL;
ARQualifierStruct *query = NULL;
ARActiveLinkActionList *actionList = NULL;
ARActiveLinkActionList *elseList = NULL;
char *helpText = CPNULL;
ARAccessNameType owner;
char *ownerPtr = NULL;
char *changeDiary = CPNULL;
char *objectModificationLogLabel = NULL;
ARStatusList status;
ARWorkflowConnectStruct *schemaList = NULL;
ARPropList *objPropList = NULL;
RETVAL = 0; /* assume error */
(void) ARError_reset();
Zero(&status, 1,ARStatusList);
Zero(newName, 1, ARNameType);
Zero(owner, 1, ARAccessNameType);
if(SvTYPE((SV *)SvRV(objDefRef)) != SVt_PVHV) {
ARError_add( AR_RETURN_ERROR, AP_ERR_EXPECT_PVHV);
} else {
HV *objDef = (HV *)SvRV(objDefRef);
SV **qhv = hv_fetch(objDef, "query", strlen("query") , 0);
/* dereference the qual pointer */
if( qhv && *qhv && SvROK(*qhv) ){
query = (ARQualifierStruct *)SvIV((SV *)SvRV(*qhv));
/* query = (ARQualifierStruct*) MALLOCNN( sizeof(ARQualifierStruct) );
rv += rev_ARQualifierStruct( ctrl, objDef, "query", query ); */
}
/* copy the various hash entries into the appropriate
* data structure. if any are missing, we fail.
*/
rv = 0;
if( hv_exists(objDef,"name",4) ){
rv += strcpyHVal( objDef, "name", newName, AR_MAX_NAME_SIZE );
newNamePtr = newName;
}
if( hv_exists(objDef,"schemaList",10) ){
schemaList = (ARWorkflowConnectStruct*) MALLOCNN(sizeof(ARWorkflowConnectStruct));
schemaList->type = AR_WORKFLOW_CONN_SCHEMA_LIST;
schemaList->u.schemaList = (ARNameList*) MALLOCNN( sizeof(ARNameList) );
rv += rev_ARNameList( ctrl, objDef, "schemaList", schemaList->u.schemaList );
}
if( hv_exists(objDef,"order",5) ){
order = (unsigned int*) MALLOCNN(sizeof(unsigned int));
rv += uintcpyHVal( objDef, "order", order );
}
if( hv_exists(objDef,"groupList",9) ){
groupList = (ARInternalIdList*) MALLOCNN(sizeof(ARInternalIdList));
rv += rev_ARInternalIdList(ctrl, objDef, "groupList", groupList);
}
if( hv_exists(objDef,"executeMask",11) ){
executeMask = (unsigned int*) MALLOCNN(sizeof(unsigned int));
rv += uintcpyHVal( objDef, "executeMask", executeMask);
}
if( hv_exists(objDef,"enable",6) ){
enable = (unsigned int*) MALLOCNN(sizeof(unsigned int));
rv += uintcpyHVal( objDef, "enable", enable);
}
if(hv_exists(objDef, "owner", strlen("owner") )){
rv += strcpyHVal( objDef, "owner", owner, AR_MAX_ACCESS_NAME_SIZE);
ownerPtr = owner;
}
/* these two are optional, so if the calls return warnings
* it probably indicates that the hash keys don't exist and
* we'll ignore it unless an actual failure code is returned.
*/
if(hv_exists(objDef, "changeDiary", strlen("changeDiary") ))
rv += strmakHVal( objDef, "changeDiary", &changeDiary);
if(hv_exists(objDef, "helpText", strlen("helpText") ))
rv += strmakHVal( objDef, "helpText", &helpText);
/* now handle the action & else (3.x) lists */
if(hv_exists(objDef, "actionList", strlen("actionList") )){
actionList = (ARActiveLinkActionList*) MALLOCNN(sizeof(ARActiveLinkActionList));
rv += rev_ARActiveLinkActionList(ctrl, objDef, "actionList", actionList);
}
if(hv_exists(objDef, "elseList", strlen("elseList") )){
elseList = (ARActiveLinkActionList*) MALLOCNN(sizeof(ARActiveLinkActionList));
rv += rev_ARActiveLinkActionList(ctrl, objDef, "elseList", elseList);
}
if(hv_exists(objDef, "objPropList", strlen("objPropList") )){
objPropList = (ARPropList*) MALLOCNN(sizeof(ARPropList));
rv += rev_ARPropList(ctrl, objDef, "objPropList", objPropList);
}
if( executeMask != NULL ){
if((*executeMask & AR_EXECUTE_ON_RETURN) ||
(*executeMask & AR_EXECUTE_ON_MENU_CHOICE)) {
focusField = (ARInternalId*) MALLOCNN(sizeof(ARInternalId));
rv += ulongcpyHVal( objDef, "focusField", focusField);
}
if(*executeMask & AR_EXECUTE_ON_BUTTON) {
controlField = (ARInternalId*) MALLOCNN(sizeof(ARInternalId));
if( controlField != NULL ) { AP_FREE(controlField); }
/* if( query != NULL ) { FreeARARQualifierStruct( query, TRUE ); } */
if( schemaList != NULL ) { FreeARWorkflowConnectStruct( schemaList, TRUE ); }
if( groupList != NULL ) { FreeARInternalIdList( groupList, TRUE ); }
if( actionList != NULL ) { FreeARActiveLinkActionList( actionList, TRUE ); }
if( elseList != NULL ) { FreeARActiveLinkActionList( elseList, TRUE ); }
if( objPropList != NULL ) { FreeARPropList( objPropList, TRUE ); }
#else /* < 5.0 */
XPUSHs(sv_2mortal(newSViv(0))); /* ERR */
(void) ARError_add( AR_RETURN_ERROR, AP_ERR_DEPRECATED,
"ARSperl supports CreateContainer() only for ARSystem >= 5.0");
RETVAL = AR_RETURN_ERROR;
#endif
}
OUTPUT:
RETVAL
int
ars_CreateFilter(ctrl, objDefRef)
ARControlStruct * ctrl
SV * objDefRef
CODE:
{
#if AR_EXPORT_VERSION >= 5
int ret = 0, rv = 0;
ARNameType schema, name;
unsigned int opSet, order;
unsigned int enable = 0;
ARQualifierStruct *query;
ARFilterActionList actionList;
ARFilterActionList elseList;
char *helpText = CPNULL;
ARAccessNameType owner;
char *changeDiary = CPNULL;
char *objectModificationLogLabel = NULL;
ARStatusList status;
ARNameList schemaNameList;
ARWorkflowConnectStruct schemaList;
ARPropList objPropList;
#if AR_CURRENT_API_VERSION >= 13
unsigned int errorFilterOptions = 0;
ARNameType errorFilterName;
#endif
RETVAL = 0; /* assume error */
(void) ARError_reset();
Zero(&status, 1,ARStatusList);
Zero(schema, 1, ARNameType);
Zero(name, 1, ARNameType);
Zero(&actionList, 1,ARFilterActionList);
Zero(&elseList, 1,ARFilterActionList);
Zero(owner, 1, ARAccessNameType);
Zero(&objPropList, 1, ARPropList);
Zero(&schemaList, 1, ARWorkflowConnectStruct);
Zero(&schemaNameList, 1, ARNameList);
#if AR_CURRENT_API_VERSION >= 13
Zero(errorFilterName, 1, ARNameType);
#endif
schemaList.type = AR_WORKFLOW_CONN_SCHEMA_LIST;
schemaList.u.schemaList = &schemaNameList;
if(SvTYPE((SV *)SvRV(objDefRef)) != SVt_PVHV) {
ARError_add( AR_RETURN_ERROR, AP_ERR_EXPECT_PVHV);
} else {
HV *objDef = (HV *)SvRV(objDefRef);
SV **qhv = hv_fetch(objDef, "query", strlen("query") , 0);
/* dereference the qual pointer */
if(qhv && *qhv && SvROK(*qhv)) {
query = (ARQualifierStruct *)SvIV((SV *)SvRV(*qhv));
/* query = (ARQualifierStruct*) MALLOCNN( sizeof(ARQualifierStruct) );
rv += rev_ARQualifierStruct( ctrl, objDef, "query", query ); */
} else {
query = (ARQualifierStruct *)NULL;
}
/* copy the various hash entries into the appropriate
* data structure. if any are missing, we fail.
*/
rv = 0;
rv += strcpyHVal( objDef, "name", name, AR_MAX_NAME_SIZE);
rv += rev_ARNameList( ctrl, objDef, "schemaList", schemaList.u.schemaList );
rv += uintcpyHVal( objDef, "order", &order);
rv += uintcpyHVal( objDef, "opSet", &opSet);
rv += uintcpyHVal( objDef, "enable", &enable);
if(hv_exists(objDef, "owner", strlen("owner") ))
rv += strcpyHVal( objDef, "owner", owner, AR_MAX_ACCESS_NAME_SIZE);
else
strncpy(owner, ctrl->user, sizeof(ARAccessNameType));
/* these two are optional, so if the calls return warnings
* it probably indicates that the hash keys don't exist and
* we'll ignore it unless an actual failure code is returned.
*/
if(hv_exists(objDef, "changeDiary", strlen("changeDiary") ))
rv += strmakHVal( objDef, "changeDiary", &changeDiary);
if(hv_exists(objDef, "helpText", strlen("helpText") ))
rv += strmakHVal( objDef, "helpText", &helpText);
/* now handle the action & else (3.x) lists */
rv += rev_ARFilterActionList(ctrl, objDef, "actionList",
&actionList);
rv += rev_ARFilterActionList(ctrl, objDef, "elseList",
&elseList);
if(hv_exists(objDef, "objPropList", strlen("objPropList") ))
rv += rev_ARPropList(ctrl, objDef, "objPropList",
&objPropList);
#if AR_CURRENT_API_VERSION >= 13
if( hv_exists(objDef, "errorFilterOptions", strlen("errorFilterOptions")) )
rv += uintcpyHVal( objDef, "errorFilterOptions", &errorFilterOptions );
if( hv_exists(objDef, "errorFilterName", strlen("errorFilterName")) )
rv += strcpyHVal( objDef, "errorFilterName", errorFilterName, AR_MAX_NAME_SIZE );
CODE:
{
#if AR_EXPORT_VERSION >= 5
int ret = 0, rv = 0;
ARNameType newName;
char *newNamePtr = NULL;
unsigned int *opSet = NULL;
unsigned int *order = NULL;
unsigned int *enable = NULL;
ARQualifierStruct *query = NULL;
ARFilterActionList *actionList = NULL;
ARFilterActionList *elseList = NULL;
char *helpText = CPNULL;
ARAccessNameType owner;
char *ownerPtr = NULL;
char *changeDiary = CPNULL;
char *objectModificationLogLabel = NULL;
ARStatusList status;
ARWorkflowConnectStruct *schemaList = NULL;
ARPropList *objPropList = NULL;
#if AR_CURRENT_API_VERSION >= 13
unsigned int *errorFilterOptions = NULL;
ARNameType errorFilterName;
char *errorFilterNamePtr = NULL;
#endif
RETVAL = 0; /* assume error */
(void) ARError_reset();
Zero(&status, 1,ARStatusList);
Zero(newName, 1, ARNameType);
Zero(owner, 1, ARAccessNameType);
#if AR_CURRENT_API_VERSION >= 13
Zero(errorFilterName, 1, ARNameType);
#endif
if(SvTYPE((SV *)SvRV(objDefRef)) != SVt_PVHV) {
ARError_add( AR_RETURN_ERROR, AP_ERR_EXPECT_PVHV);
} else {
HV *objDef = (HV *)SvRV(objDefRef);
SV **qhv = hv_fetch(objDef, "query", strlen("query") , 0);
/* dereference the qual pointer */
if( qhv && *qhv && SvROK(*qhv) ){
query = (ARQualifierStruct *)SvIV((SV *)SvRV(*qhv));
/* query = (ARQualifierStruct*) MALLOCNN( sizeof(ARQualifierStruct) );
rv += rev_ARQualifierStruct( ctrl, objDef, "query", query ); */
}
/* copy the various hash entries into the appropriate
* data structure. if any are missing, we fail.
*/
rv = 0;
if( hv_exists(objDef,"name",4) ){
rv += strcpyHVal( objDef, "name", newName, AR_MAX_NAME_SIZE );
newNamePtr = newName;
}
if( hv_exists(objDef,"schemaList",10) ){
schemaList = (ARWorkflowConnectStruct*) MALLOCNN(sizeof(ARWorkflowConnectStruct));
schemaList->type = AR_WORKFLOW_CONN_SCHEMA_LIST;
schemaList->u.schemaList = (ARNameList*) MALLOCNN( sizeof(ARNameList) );
rv += rev_ARNameList( ctrl, objDef, "schemaList", schemaList->u.schemaList );
}
if( hv_exists(objDef,"order",5) ){
order = (unsigned int*) MALLOCNN(sizeof(unsigned int));
rv += uintcpyHVal( objDef, "order", order );
}
if( hv_exists(objDef,"opSet",5) ){
opSet = (unsigned int*) MALLOCNN(sizeof(unsigned int));
rv += uintcpyHVal( objDef, "opSet", opSet);
}
if( hv_exists(objDef,"enable",6) ){
enable = (unsigned int*) MALLOCNN(sizeof(unsigned int));
rv += uintcpyHVal( objDef, "enable", enable);
}
if(hv_exists(objDef, "owner", strlen("owner") )){
rv += strcpyHVal( objDef, "owner", owner, AR_MAX_ACCESS_NAME_SIZE);
ownerPtr = owner;
}
/* these two are optional, so if the calls return warnings
* it probably indicates that the hash keys don't exist and
* we'll ignore it unless an actual failure code is returned.
*/
if(hv_exists(objDef, "changeDiary", strlen("changeDiary") ))
rv += strmakHVal( objDef, "changeDiary", &changeDiary);
if(hv_exists(objDef, "helpText", strlen("helpText") ))
rv += strmakHVal( objDef, "helpText", &helpText);
/* now handle the action & else (3.x) lists */
if(hv_exists(objDef, "actionList", strlen("actionList") )){
actionList = (ARFilterActionList*) MALLOCNN(sizeof(ARFilterActionList));
rv += rev_ARFilterActionList(ctrl, objDef, "actionList", actionList);
}
if(hv_exists(objDef, "elseList", strlen("elseList") )){
elseList = (ARFilterActionList*) MALLOCNN(sizeof(ARFilterActionList));
rv += rev_ARFilterActionList(ctrl, objDef, "elseList", elseList);
}
if(hv_exists(objDef, "objPropList", strlen("objPropList") )){
objPropList = (ARPropList*) MALLOCNN(sizeof(ARPropList));
rv += rev_ARPropList(ctrl, objDef, "objPropList", objPropList);
}
#if AR_CURRENT_API_VERSION >= 13
if( hv_exists(objDef,"errorFilterOptions",18) ){
errorFilterOptions = (unsigned int*) MALLOCNN(sizeof(unsigned int));
rv += uintcpyHVal( objDef, "errorFilterOptions", errorFilterOptions);
}
if(hv_exists(objDef, "errorFilterName", strlen("errorFilterName") )){
rv += strcpyHVal( objDef, "errorFilterName", errorFilterName, AR_MAX_NAME_SIZE);
errorFilterNamePtr = errorFilterName;
}
#endif
/* at this point all datastructures (hopefully) are
if (helpText) {
AP_FREE(helpText);
}
if (changeDiary) {
AP_FREE(changeDiary);
}
if( order != NULL ) { AP_FREE(order); }
if( enable != NULL ) { AP_FREE(enable); }
/* if( query != NULL ) { FreeARARQualifierStruct( query, TRUE ); } */
if( schemaList != NULL ) { FreeARWorkflowConnectStruct( schemaList, TRUE ); }
if( actionList != NULL ) { FreeARFilterActionList( actionList, TRUE ); }
if( elseList != NULL ) { FreeARFilterActionList( elseList, TRUE ); }
if( objPropList != NULL ) { FreeARPropList( objPropList, TRUE ); }
#else /* < 5.0 */
XPUSHs(sv_2mortal(newSViv(0))); /* ERR */
(void) ARError_add( AR_RETURN_ERROR, AP_ERR_DEPRECATED,
"ARSperl supports CreateContainer() only for ARSystem >= 5.0");
RETVAL = AR_RETURN_ERROR;
#endif
}
OUTPUT:
RETVAL
int
ars_CreateEscalation(ctrl, objDefRef)
ARControlStruct * ctrl
SV * objDefRef
CODE:
{
#if AR_EXPORT_VERSION >= 5
int ret = 0, rv = 0;
ARNameType name;
unsigned int enable = 0;
AREscalationTmStruct escalationTm;
ARQualifierStruct *query;
ARFilterActionList actionList;
ARFilterActionList elseList;
char *helpText = CPNULL;
ARAccessNameType owner;
char *changeDiary = CPNULL;
char *objectModificationLogLabel = NULL;
ARStatusList status;
ARNameList schemaNameList;
ARWorkflowConnectStruct schemaList;
ARPropList objPropList;
RETVAL = 0; /* assume error */
(void) ARError_reset();
Zero(&status, 1,ARStatusList);
Zero(name, 1, ARNameType);
Zero(&actionList, 1,ARFilterActionList);
Zero(&elseList, 1,ARFilterActionList);
Zero(owner, 1, ARAccessNameType);
Zero(&objPropList, 1, ARPropList);
Zero(&schemaList, 1, ARWorkflowConnectStruct);
Zero(&schemaNameList, 1, ARNameList);
Zero(&escalationTm, 1, AREscalationTmStruct);
schemaList.type = AR_WORKFLOW_CONN_SCHEMA_LIST;
schemaList.u.schemaList = &schemaNameList;
if(SvTYPE((SV *)SvRV(objDefRef)) != SVt_PVHV) {
ARError_add( AR_RETURN_ERROR, AP_ERR_EXPECT_PVHV);
} else {
HV *objDef = (HV *)SvRV(objDefRef);
SV **qhv = hv_fetch(objDef, "query", strlen("query") , 0);
/* dereference the qual pointer */
if(qhv && *qhv && SvROK(*qhv)) {
query = (ARQualifierStruct *)SvIV((SV *)SvRV(*qhv));
/* query = (ARQualifierStruct*) MALLOCNN( sizeof(ARQualifierStruct) );
rv += rev_ARQualifierStruct( ctrl, objDef, "query", query ); */
} else {
query = (ARQualifierStruct *)NULL;
}
/* copy the various hash entries into the appropriate
* data structure. if any are missing, we fail.
*/
rv = 0;
rv += strcpyHVal( objDef, "name", name, AR_MAX_NAME_SIZE);
rv += rev_ARNameList( ctrl, objDef, "schemaList", schemaList.u.schemaList );
rv += uintcpyHVal( objDef, "enable", &enable);
/* rv += rev_AREscalationTmStruct( ctrl, objDef, "escalationTm", &escalationTm ); */
rv += uintcpyHVal( objDef, "TmType", &(escalationTm.escalationTmType) );
switch( escalationTm.escalationTmType ){
case AR_ESCALATION_TYPE_INTERVAL:
rv += longcpyHVal( objDef, "TmInterval", &(escalationTm.u.interval) );
break;
case AR_ESCALATION_TYPE_TIMEMARK:
rv += longcpyHVal( objDef, "TmMonthDayMask", &(escalationTm.u.date.monthday) );
rv += longcpyHVal( objDef, "TmWeekDayMask", &(escalationTm.u.date.weekday) );
rv += longcpyHVal( objDef, "TmHourMask", &(escalationTm.u.date.hourmask) );
rv += uintcpyHVal( objDef, "TmMinute", &(escalationTm.u.date.minute) );
break;
default:
rv += (-1);
}
if(hv_exists(objDef, "owner", strlen("owner") ))
rv += strcpyHVal( objDef, "owner", owner, AR_MAX_ACCESS_NAME_SIZE);
else
strncpy(owner, ctrl->user, sizeof(ARAccessNameType));
/* these two are optional, so if the calls return warnings
* it probably indicates that the hash keys don't exist and
* we'll ignore it unless an actual failure code is returned.
*/
if(hv_exists(objDef, "changeDiary", strlen("changeDiary") ))
rv += strmakHVal( objDef, "changeDiary", &changeDiary);
if(hv_exists(objDef, "helpText", strlen("helpText") ))
rv += strmakHVal( objDef, "helpText", &helpText);
/* now handle the action & else (3.x) lists */
OUTPUT:
RETVAL
int
ars_SetEscalation(ctrl, name, objDefRef)
ARControlStruct * ctrl
ARNameType name
SV * objDefRef
CODE:
{
#if AR_EXPORT_VERSION >= 5
int ret = 0, rv = 0;
ARNameType newName;
char *newNamePtr = NULL;
AREscalationTmStruct *escalationTm = NULL;
unsigned int *enable = NULL;
ARQualifierStruct *query = NULL;
ARFilterActionList *actionList = NULL;
ARFilterActionList *elseList = NULL;
char *helpText = CPNULL;
ARAccessNameType owner;
char *ownerPtr = NULL;
char *changeDiary = CPNULL;
char *objectModificationLogLabel = NULL;
ARStatusList status;
ARWorkflowConnectStruct *schemaList = NULL;
ARPropList *objPropList = NULL;
RETVAL = 0; /* assume error */
(void) ARError_reset();
Zero(&status, 1,ARStatusList);
Zero(newName, 1, ARNameType);
Zero(owner, 1, ARAccessNameType);
if(SvTYPE((SV *)SvRV(objDefRef)) != SVt_PVHV) {
ARError_add( AR_RETURN_ERROR, AP_ERR_EXPECT_PVHV);
} else {
HV *objDef = (HV *)SvRV(objDefRef);
SV **qhv = hv_fetch(objDef, "query", strlen("query") , 0);
/* dereference the qual pointer */
if( qhv && *qhv && SvROK(*qhv) ){
query = (ARQualifierStruct *)SvIV((SV *)SvRV(*qhv));
/* query = (ARQualifierStruct*) MALLOCNN( sizeof(ARQualifierStruct) );
rv += rev_ARQualifierStruct( ctrl, objDef, "query", query ); */
}
/* copy the various hash entries into the appropriate
* data structure. if any are missing, we fail.
*/
rv = 0;
if( hv_exists(objDef,"name",4) ){
rv += strcpyHVal( objDef, "name", newName, AR_MAX_NAME_SIZE );
newNamePtr = newName;
}
if( hv_exists(objDef,"schemaList",10) ){
schemaList = (ARWorkflowConnectStruct*) MALLOCNN(sizeof(ARWorkflowConnectStruct));
schemaList->type = AR_WORKFLOW_CONN_SCHEMA_LIST;
schemaList->u.schemaList = (ARNameList*) MALLOCNN( sizeof(ARNameList) );
rv += rev_ARNameList( ctrl, objDef, "schemaList", schemaList->u.schemaList );
}
if( hv_exists(objDef,"enable",6) ){
enable = (unsigned int*) MALLOCNN(sizeof(unsigned int));
rv += uintcpyHVal( objDef, "enable", enable);
}
if( hv_exists(objDef,"TmInterval",10) ){
escalationTm = (AREscalationTmStruct*) MALLOCNN(sizeof(AREscalationTmStruct));
escalationTm->escalationTmType = AR_ESCALATION_TYPE_INTERVAL;
rv += longcpyHVal( objDef, "TmInterval", &(escalationTm->u.interval) );
}else if( hv_exists(objDef,"TmHourMask",10) ){
escalationTm = (AREscalationTmStruct*) MALLOCNN(sizeof(AREscalationTmStruct));
escalationTm->escalationTmType = AR_ESCALATION_TYPE_TIMEMARK;
rv += longcpyHVal( objDef, "TmMonthDayMask", &(escalationTm->u.date.monthday) );
rv += longcpyHVal( objDef, "TmWeekDayMask", &(escalationTm->u.date.weekday) );
rv += longcpyHVal( objDef, "TmHourMask", &(escalationTm->u.date.hourmask) );
rv += uintcpyHVal( objDef, "TmMinute", &(escalationTm->u.date.minute) );
}
if(hv_exists(objDef, "owner", strlen("owner") )){
rv += strcpyHVal( objDef, "owner", owner, AR_MAX_ACCESS_NAME_SIZE);
ownerPtr = owner;
}
/* these two are optional, so if the calls return warnings
* it probably indicates that the hash keys don't exist and
* we'll ignore it unless an actual failure code is returned.
*/
if(hv_exists(objDef, "changeDiary", strlen("changeDiary") ))
rv += strmakHVal( objDef, "changeDiary", &changeDiary);
if(hv_exists(objDef, "helpText", strlen("helpText") ))
rv += strmakHVal( objDef, "helpText", &helpText);
/* now handle the action & else (3.x) lists */
if(hv_exists(objDef, "actionList", strlen("actionList") )){
actionList = (ARFilterActionList*) MALLOCNN(sizeof(ARFilterActionList));
rv += rev_ARFilterActionList(ctrl, objDef, "actionList", actionList);
}
if(hv_exists(objDef, "elseList", strlen("elseList") )){
elseList = (ARFilterActionList*) MALLOCNN(sizeof(ARFilterActionList));
rv += rev_ARFilterActionList(ctrl, objDef, "elseList", elseList);
}
if(hv_exists(objDef, "objPropList", strlen("objPropList") )){
objPropList = (ARPropList*) MALLOCNN(sizeof(ARPropList));
rv += rev_ARPropList(ctrl, objDef, "objPropList", objPropList);
}
/* at this point all datastructures (hopefully) are
* built. we can call the api routine to modify the workflow object
*/
if(rv == 0) {
ret = ARSetEscalation(ctrl, name, newNamePtr,
escalationTm,
schemaList,
( run in 2.390 seconds using v1.01-cache-2.11-cpan-f0ff5d10edf )