/*
 * trigger.c - convert data between trigger related messages and perl HVs
 */

#include <EXTERN.h>
#include <perl.h>
#include <XSUB.h>
#include "ppport.h"

#include <slurm/slurm.h>
#include "slurm-perl.h"

/*
 * convert trigger_info_t to perl HV
 */
int
trigger_info_to_hv(trigger_info_t *trigger_info, HV *hv)
{
	STORE_FIELD(hv, trigger_info, trig_id, uint32_t);
	STORE_FIELD(hv, trigger_info, res_type, uint16_t);
	if (trigger_info->res_id)
		STORE_FIELD(hv, trigger_info, res_id, charp);
	STORE_FIELD(hv, trigger_info, trig_type, uint32_t);
	STORE_FIELD(hv, trigger_info, offset, uint16_t);
	STORE_FIELD(hv, trigger_info, user_id, uint32_t);
	if(trigger_info->program)
		STORE_FIELD(hv, trigger_info, program, charp);
	return 0;
}

/*
 * convert perl HV to trigger_info_t
 */
int
hv_to_trigger_info(HV *hv, trigger_info_t *trigger_info)
{
	memset(trigger_info, 0, sizeof(trigger_info_t));

	FETCH_FIELD(hv, trigger_info, trig_id, uint32_t, FALSE);
	FETCH_FIELD(hv, trigger_info, res_type, uint8_t, FALSE);
	FETCH_FIELD(hv, trigger_info, res_id, charp, FALSE);
	FETCH_FIELD(hv, trigger_info, trig_type, uint32_t, FALSE);
	FETCH_FIELD(hv, trigger_info, offset, uint16_t, FALSE);
	FETCH_FIELD(hv, trigger_info, user_id, uint32_t, FALSE);
	FETCH_FIELD(hv, trigger_info, program, charp, FALSE);
	return 0;
}

/*
 * convert trigger_info_msg_t to perl HV
 */
int
trigger_info_msg_to_hv(trigger_info_msg_t *trigger_info_msg, HV *hv)
{
	int i;
	HV *hv_info;
	AV *av;

	/* record_count implied in node_array */
	av = newAV();
	for (i = 0; i < trigger_info_msg->record_count; i ++) {
		hv_info =newHV();
		if (trigger_info_to_hv(trigger_info_msg->trigger_array + i, hv_info) < 0) {
			SvREFCNT_dec((SV*)hv_info);
			SvREFCNT_dec((SV*)av);
			return -1;
		}
		av_store(av, i, newRV_noinc((SV*)hv_info));
	}
	hv_store_sv(hv, "trigger_array", newRV_noinc((SV*)av));
	return 0;
}
