int get_jobid(char *json_string, char **jid) 
{
	if (!json_string || !jid ) 
  {
    logging(LOG_ERROR, __FILE__, __LINE__, "Missing function input\n" );
		return AGENT_ERROR_QUIT;
	}

	/* Conversion from JSON string to OPH_JSON structure */
	char *tmp_json_string = strdup(json_string);
	if (!tmp_json_string){
  	logging(LOG_ERROR, __FILE__, __LINE__, "Error while duplicating json string\n" );
		return AGENT_ERROR_QUIT;
	}

	oph_json *json = NULL;
	if (oph_json_from_json_string(&json,&tmp_json_string))
  {
		if (json) oph_json_free(json);
  	logging(LOG_ERROR, __FILE__, __LINE__, "Unable to convert string to Json\n" );
		return AGENT_ERROR_JSON;
	}

	/* Check for Json status. In case of ERROR exit */
	size_t n,valid=0;
	for (n = 0; n < json->responseKeyset_num; n++) 
  {
		if (!strcmp(json->responseKeyset[n],"status")) 
    {
			valid = 1;
			break;
		}
	}
	if (!valid) 
  {
		if (json) oph_json_free(json);
  	logging(LOG_ERROR, __FILE__, __LINE__, "Json string not valid!\n" );
		return AGENT_ERROR_JSON;
	}
	valid=0;
	for (n = 0; n < json->response_num; n++) 
  {
		if (!strcmp(json->response[n].objkey,"status")) 
    {
			if (!strcmp(((oph_json_obj_text *)(json->response[n].objcontent))[0].title, "SUCCESS")) 
      {
				valid = 1;
				break;
			} 
      else 
      {
        /* If an error occured return status error */
      	logging(LOG_ERROR, __FILE__, __LINE__, "Job id retrieve execution failed!\n" );
        if (json) oph_json_free(json);
				return AGENT_SUCCESS;
			}
		}
	}
	if (!valid) {
		if (json) oph_json_free(json);
  	logging(LOG_ERROR, __FILE__, __LINE__, "Json string not valid!\n" );
		return AGENT_ERROR_JSON;
	}


	/* Get last job id. In case of ERROR exit */
  valid=0;
	for (n = 0; n < json->responseKeyset_num; n++) 
  {
		if (!strcmp(json->responseKeyset[n],"workflow_list")) 
    {
			valid = 1;
			break;
		}
	}
	if (!valid) 
  {
		if (json) oph_json_free(json);
  	logging(LOG_ERROR, __FILE__, __LINE__, "Json string not valid!\n" );
		return AGENT_ERROR_JSON;
	}

  char *wid = NULL;
  char *mid = NULL;

  valid = 0;
	for (n = 0; n < json->response_num; n++) 
  {
		if (!strcmp(json->response[n].objkey,"workflow_list")) 
    {
      /* Check if rows and columns are correct*/
      if((((oph_json_obj_grid *) json->response[n].objcontent)[0]).values_num1 < 1)
      {
      	logging(LOG_ERROR, __FILE__, __LINE__, "Json string not valid\n" );
    		if (json) oph_json_free(json);
		    return AGENT_ERROR_JSON;
	    }
      if((((oph_json_obj_grid *) json->response[n].objcontent)[0]).values_num2 < 5)
      {
      	logging(LOG_ERROR, __FILE__, __LINE__, "Json string not valid\n" );
    		if (json) oph_json_free(json);
		    return AGENT_ERROR_JSON;
	    }

      wid = (char *) strdup((((oph_json_obj_grid *) json->response[n].objcontent)[0]).values[(((oph_json_obj_grid *) json->response[n].objcontent)[0]).values_num1 - 1][2]);
	    if (!wid)
      {
      	logging(LOG_ERROR, __FILE__, __LINE__, "Error while duplicating json string\n" );
        if (json) oph_json_free(json);
		    return AGENT_ERROR_QUIT;
	    }

      mid = (char *) strdup((((oph_json_obj_grid *) json->response[n].objcontent)[0]).values[(((oph_json_obj_grid *) json->response[n].objcontent)[0]).values_num1 - 1][3]);
	    if (!mid)
      {
      	logging(LOG_ERROR, __FILE__, __LINE__, "Error while duplicating json string\n" );
    		if (wid) free(wid);
    		if (json) oph_json_free(json);
		    return AGENT_ERROR_QUIT;
	    }

      valid = 1;
      break;    
		}
	}

  if(!valid)
  {
	  if (json) oph_json_free(json);
    if (mid) free(mid);
    if (wid) free(wid);
	  logging(LOG_ERROR, __FILE__, __LINE__, "Json string not valid!\n" ); 
	  return AGENT_ERROR_JSON;
  }

  size_t length = snprintf(NULL, 0, JSON_JOBID_FORMAT, wid, mid);
  *jid = (char *)malloc(sizeof(char) * (length +1));
  if(!*jid)
  {
	  if (json) oph_json_free(json);
    free(mid);
    free(wid);
	  logging(LOG_ERROR, __FILE__, __LINE__, "Memory alloc error\n" ); 
	  return AGENT_ERROR_QUIT;
  }
    
	if (json) oph_json_free(json);
  snprintf(*jid, length + 1, JSON_JOBID_FORMAT, wid, mid);
  free(mid);
  free(wid);

  return AGENT_SUCCESS;
}
int oph_finalize_known_operator(int idjob, oph_json * oper_json, const char *operator_name, char *error_message, int success, char **response, ophidiadb * oDB, enum oph__oph_odb_job_status *exit_code)
{
	pmesg_safe(&global_flag, LOG_DEBUG, __FILE__, __LINE__, "Finalize known operator: %s (%s)\n", success ? "success" : "failure", error_message ? error_message : "-");

	char *jstring = NULL;
	if (oper_json) {
		int return_code = 0;

		if (!success) {
			if (!strlen(error_message)) {
				snprintf(error_message, OPH_MAX_STRING_SIZE, "Operator '%s' failed!", operator_name);
				if (exit_code)
					*exit_code = OPH_ODB_STATUS_ERROR;
			}
			if (oph_json_add_text(oper_json, OPH_JSON_OBJKEY_STATUS, "ERROR", error_message)) {
				pmesg_safe(&global_flag, LOG_WARNING, __FILE__, __LINE__, "ADD TEXT error\n");
				return_code = -1;
			} else if (oph_write_and_get_json(oper_json, &jstring)) {
				pmesg_safe(&global_flag, LOG_WARNING, __FILE__, __LINE__, "JSON file creation error\n");
				return_code = -1;
			}
		} else {
			if (oph_json_add_text(oper_json, OPH_JSON_OBJKEY_STATUS, "SUCCESS", strlen(error_message) ? error_message : NULL)) {
				pmesg_safe(&global_flag, LOG_WARNING, __FILE__, __LINE__, "ADD TEXT error\n");
				return_code = -1;
			} else if (oph_write_and_get_json(oper_json, &jstring)) {
				pmesg_safe(&global_flag, LOG_WARNING, __FILE__, __LINE__, "JSON file creation error\n");
				return_code = -1;
			} else if (exit_code && (*exit_code != OPH_ODB_STATUS_WAIT))
				*exit_code = OPH_ODB_STATUS_COMPLETED;
		}
		oph_json_free(oper_json);

		if (return_code && exit_code)
			*exit_code = OPH_ODB_STATUS_ERROR;

	} else if (exit_code)
		*exit_code = OPH_ODB_STATUS_ERROR;

	if (!jstring) {
		pmesg_safe(&global_flag, LOG_WARNING, __FILE__, __LINE__, "Unable to convert JSON Response into a string\n");
		if (exit_code)
			*exit_code = OPH_ODB_STATUS_ERROR;
		oph_odb_disconnect_from_ophidiadb(oDB);
		return OPH_SERVER_SYSTEM_ERROR;
	}
	if (response)
		*response = jstring;
	else
		free(jstring);

	// Set ODB_STATUS to COMPLETED
	pmesg_safe(&global_flag, LOG_DEBUG, __FILE__, __LINE__, "Finalize OphDB status\n");
	if (exit_code && (*exit_code == OPH_ODB_STATUS_WAIT))
		oph_odb_set_job_status(idjob, OPH_ODB_STATUS_WAIT, oDB);
	else
		oph_odb_stop_job_fast(idjob, oDB);
	oph_odb_disconnect_from_ophidiadb(oDB);

	return OPH_SERVER_OK;
}
int get_job_status(char *json_string, short int *job_status) {
	if (!json_string || !job_status ) 
  {
    logging(LOG_ERROR, __FILE__, __LINE__, "Missing function input\n" );
		return AGENT_ERROR_QUIT;
	}

	/* Conversion from JSON string to OPH_JSON structure */
	char *tmp_json_string = strdup(json_string);
	if (!tmp_json_string){
  	logging(LOG_ERROR, __FILE__, __LINE__, "Error while duplicating json string\n" );
		return AGENT_ERROR_QUIT;
	}

	oph_json *json = NULL;
	if (oph_json_from_json_string(&json,&tmp_json_string))
  {
		if (json) oph_json_free(json);
  	logging(LOG_ERROR, __FILE__, __LINE__, "Unable to convert string to Json\n" );
		return AGENT_ERROR_JSON;
	}

	/* Check for Json status. In case of ERROR exit */
	size_t n,valid=0;
	for (n = 0; n < json->responseKeyset_num; n++) 
  {
		if (!strcmp(json->responseKeyset[n],"status")) 
    {
			valid = 1;
			break;
		}
	}
	if (!valid) 
  {
		if (json) oph_json_free(json);
  	logging(LOG_ERROR, __FILE__, __LINE__, "Json string not valid!\n" );
		return AGENT_ERROR_JSON;
	}
	valid=0;
	for (n = 0; n < json->response_num; n++) 
  {
		if (!strcmp(json->response[n].objkey,"status")) 
    {
			if (!strcmp(((oph_json_obj_text *)(json->response[n].objcontent))[0].title, "SUCCESS")) 
      {
				valid = 1;
				break;
			} 
      else 
      {
        /* If an error occured return status error */
      	logging(LOG_WARNING, __FILE__, __LINE__, "Workflow execution failed!\n" );
        *job_status = COMMAND_STATUS_CODE_ERROR;				
        if (json) oph_json_free(json);
				return AGENT_SUCCESS;
			}
		}
	}
	if (!valid) {
		if (json) oph_json_free(json);
  	logging(LOG_ERROR, __FILE__, __LINE__, "Json string not valid!\n" );
		return AGENT_ERROR_JSON;
	}


	/* Check for status. In case of ERROR exit */
  valid=0;
	for (n = 0; n < json->responseKeyset_num; n++) 
  {
		if (!strcmp(json->responseKeyset[n],"workflow_status")) 
    {
			valid = 1;
			break;
		}
	}
	if (!valid) 
  {
		if (json) oph_json_free(json);
  	logging(LOG_ERROR, __FILE__, __LINE__, "Json string not valid!\n" );
		return AGENT_ERROR_JSON;
	}

	for (n = 0; n < json->response_num; n++) 
  {
		if (!strcmp(json->response[n].objkey,"workflow_status")) 
    {
			if (!strncmp(((oph_json_obj_text *)(json->response[n].objcontent))[0].message, COMMAND_STATUS_COMPLETED, MAX_LENGTH(((oph_json_obj_text *)(json->response[n].objcontent))[0].message, COMMAND_STATUS_COMPLETED))) 
      {
        /* If workflow is completed correctly */
        *job_status = COMMAND_STATUS_CODE_COMPLETED;				
        if (json) oph_json_free(json);
				return AGENT_SUCCESS;
			} 
			else if (!strncmp(((oph_json_obj_text *)(json->response[n].objcontent))[0].message, COMMAND_STATUS_PENDING, MAX_LENGTH(((oph_json_obj_text *)(json->response[n].objcontent))[0].message, COMMAND_STATUS_PENDING)) || !strncmp(((oph_json_obj_text *)(json->response[n].objcontent))[0].message, COMMAND_STATUS_UNKNOWN, MAX_LENGTH(((oph_json_obj_text *)(json->response[n].objcontent))[0].message, COMMAND_STATUS_UNKNOWN))) 
      {
        /* If workflow is waiting */
        *job_status = COMMAND_STATUS_CODE_PENDING;				
        if (json) oph_json_free(json);
				return AGENT_SUCCESS;
			}
      else if (!strncmp(((oph_json_obj_text *)(json->response[n].objcontent))[0].message, COMMAND_STATUS_RUNNING, MAX_LENGTH(((oph_json_obj_text *)(json->response[n].objcontent))[0].message, COMMAND_STATUS_RUNNING))) 
      {
        /* If workflow is running */
        *job_status = COMMAND_STATUS_CODE_RUNNING;				
        if (json) oph_json_free(json);
				return AGENT_SUCCESS;
			}
      else if (!strncmp(((oph_json_obj_text *)(json->response[n].objcontent))[0].message, COMMAND_STATUS_ERROR, MAX_LENGTH(((oph_json_obj_text *)(json->response[n].objcontent))[0].message, COMMAND_STATUS_ERROR))) 
      {
        /* If workflow stopped due to an error */
      	logging(LOG_WARNING, __FILE__, __LINE__, "Workflow execution failed!\n" );
        *job_status = COMMAND_STATUS_CODE_ERROR;				
        if (json) oph_json_free(json);
				return AGENT_SUCCESS;
			}
      else 
      {
        /* If return status is unknown */
      	logging(LOG_ERROR, __FILE__, __LINE__, "Unknown status!\n" );
        *job_status = COMMAND_STATUS_CODE_ERROR;				
        if (json) oph_json_free(json);
				return AGENT_ERROR_JSON;
			}
		}
	}

	if (json) oph_json_free(json);
	logging(LOG_ERROR, __FILE__, __LINE__, "Json string not valid!\n" );
	return AGENT_ERROR_JSON;
}