Ejemplo n.º 1
0
int _oph_odb_update_session_table(ophidiadb * oDB, char *sessionid, int id_user, int *id_session, pthread_mutex_t * flag)
{
	if (!oDB || !sessionid || !id_session) {
		pmesg_safe(flag, LOG_ERROR, __FILE__, __LINE__, "Null input parameter\n");
		return OPH_ODB_NULL_PARAM;
	}

	if (oph_odb_check_connection_to_ophidiadb(oDB)) {
		pmesg_safe(flag, LOG_ERROR, __FILE__, __LINE__, "Unable to reconnect to OphidiaDB.\n");
		return OPH_ODB_MYSQL_ERROR;
	}

	char session_code[OPH_MAX_STRING_SIZE];
	if (oph_get_session_code(sessionid, session_code)) {
		pmesg_safe(flag, LOG_ERROR, __FILE__, __LINE__, "Unable to extract session code.\n");
		return OPH_ODB_MYSQL_ERROR;
	}
	int id_folder;
	if (_oph_odb_update_folder_table(oDB, session_code, &id_folder, flag)) {
		pmesg_safe(flag, LOG_ERROR, __FILE__, __LINE__, "Unable to create folder.\n");
		return OPH_ODB_MYSQL_ERROR;
	}

	char insertQuery[MYSQL_BUFLEN];
	int n = snprintf(insertQuery, MYSQL_BUFLEN, MYSQL_QUERY_UPDATE_OPHIDIADB_SESSION, id_user, sessionid, id_folder);

	if (n >= MYSQL_BUFLEN) {
		pmesg_safe(flag, LOG_ERROR, __FILE__, __LINE__, "Size of query exceed query limit.\n");
		return OPH_ODB_STR_BUFF_OVERFLOW;
	}

	if (mysql_set_server_option(oDB->conn, MYSQL_OPTION_MULTI_STATEMENTS_ON)) {
		pmesg(LOG_ERROR, __FILE__, __LINE__, "MySQL query error: %s\n", mysql_error(oDB->conn));
		return OPH_ODB_MYSQL_ERROR;
	}

	if (mysql_query(oDB->conn, insertQuery)) {
		pmesg_safe(flag, LOG_ERROR, __FILE__, __LINE__, "MySQL query error: %s\n", mysql_error(oDB->conn));
		return OPH_ODB_MYSQL_ERROR;
	}

	if (!(*id_session = mysql_insert_id(oDB->conn))) {
		pmesg_safe(flag, LOG_ERROR, __FILE__, __LINE__, "Unable to find last inserted session id\n");
		return OPH_ODB_TOO_MANY_ROWS;
	}

	return OPH_ODB_SUCCESS;
}
int oph_workflow_set_basic_var(oph_workflow * wf)
{
	if (!wf) {
		pmesg(LOG_ERROR, __FILE__, __LINE__, "Null param\n");
		return OPH_WORKFLOW_EXIT_BAD_PARAM_ERROR;
	}

	oph_workflow_var var;
	var.caller = -1;	// Don't care

	int i;
	char *key[OPH_WORKFLOW_MIN_STRING] = OPH_WORKFLOW_BVAR_KEYS;
	for (i = 0; i < OPH_WORKFLOW_BVAR_KEYS_SIZE; ++i) {
		*var.svalue = 0;
		switch (i) {
			case 0:
				if (wf->sessionid)
					strcpy(var.svalue, wf->sessionid);
				break;
			case 1:
				if (wf->sessionid) {
					char session_code[OPH_WORKFLOW_MAX_STRING];
					if (oph_get_session_code(wf->sessionid, session_code))
						pmesg(LOG_ERROR, __FILE__, __LINE__, "Unable to get session code\n");
					else
						strcpy(var.svalue, session_code);
				}
				break;
			case 2:
				if (wf->sessionid)
					snprintf(var.svalue, OPH_WORKFLOW_MIN_STRING, "%d", wf->workflowid);
				break;
			default:
				pmesg(LOG_WARNING, __FILE__, __LINE__, "No basic key available at index %d for workflow '%s'.\n", i, wf->name);
		}
		if (hashtbl_insert_with_size(wf->vars, key[i], (void *) &var, sizeof(oph_workflow_var)))
			pmesg(LOG_DEBUG, __FILE__, __LINE__, "Unable to store variable '%s' in environment of workflow '%s'. Maybe it already exists.\n", key[i], wf->name);
		else
			pmesg(LOG_DEBUG, __FILE__, __LINE__, "Added variable '%s=%s' in environment of workflow '%s'.\n", key[i], var.svalue, wf->name);
	}

	return OPH_WORKFLOW_EXIT_SUCCESS;
}
int oph_workflow_get_submission_string(oph_workflow * workflow, int task_index, int light_task_index, char **long_submission_string, char **short_submission_string, char **error)
{
	if (error)
		*error = NULL;
	if (!workflow || !long_submission_string) {
		pmesg(LOG_ERROR, __FILE__, __LINE__, "Null parameter\n");
		if (error)
			*error = strdup("Null parameter");
		return OPH_WORKFLOW_EXIT_BAD_PARAM_ERROR;
	}
	if ((task_index < 0) || (task_index > workflow->tasks_num) || ((task_index == workflow->tasks_num) && strcmp(workflow->tasks[task_index].name, OPH_WORKFLOW_FINAL_TASK))) {
		pmesg(LOG_ERROR, __FILE__, __LINE__, "Index out of boundaries\n");
		if (error)
			*error = strdup("Index out of boundaries");
		return OPH_WORKFLOW_EXIT_BAD_PARAM_ERROR;
	}
	int subtask = light_task_index >= 0;
	if (subtask) {
		if (light_task_index >= workflow->tasks[task_index].light_tasks_num) {
			pmesg(LOG_ERROR, __FILE__, __LINE__, "Index out of boundaries\n");
			if (error)
				*error = strdup("Index out of boundaries");
			return OPH_WORKFLOW_EXIT_BAD_PARAM_ERROR;
		}
	}

	int i, j;
	unsigned int length;
	char long_submit_string[OPH_WORKFLOW_MAX_STRING], short_submit_string[OPH_WORKFLOW_MAX_STRING];
	char key_value[OPH_WORKFLOW_MAX_STRING];
	char *key, *value, *value2;
	char *path_key[OPH_WORKFLOW_PATH_SET_SIZE] = OPH_WORKFLOW_PATH_SET;
	char path_value[OPH_WORKFLOW_MAX_STRING];
	char session_code[OPH_WORKFLOW_MAX_STRING];
	if (oph_get_session_code(workflow->sessionid, session_code)) {
		pmesg(LOG_ERROR, __FILE__, __LINE__, "Unable to get session code\n");
		if (error)
			*error = strdup("Unable to get session code");
		return OPH_WORKFLOW_EXIT_BAD_PARAM_ERROR;
	}

	snprintf(long_submit_string, OPH_WORKFLOW_MAX_STRING, OPH_WORKFLOW_EXT_SUB_STRING, workflow->tasks[task_index].operator, workflow->sessionid, workflow->workflowid,
		 subtask ? workflow->tasks[task_index].light_tasks[light_task_index].markerid : workflow->tasks[task_index].markerid, workflow->username, workflow->userrole, workflow->idjob,
		 task_index, light_task_index);

	if (workflow->host_partition) {
		snprintf(key_value, OPH_WORKFLOW_MAX_STRING, OPH_WORKFLOW_KEY_VALUE_STRING, OPH_WORKFLOW_KEY_HOST_PARTITION, workflow->host_partition);
		if ((length = OPH_WORKFLOW_MAX_STRING - strlen(long_submit_string)) <= strlen(key_value)) {
			pmesg(LOG_ERROR, __FILE__, __LINE__, "Space for submission string is not enough\n");
			if (error)
				*error = strdup("Space for submission string is not enough");
			return OPH_WORKFLOW_EXIT_MEMORY_ERROR;
		}
		strncat(long_submit_string, key_value, length);
	}

	if (short_submission_string)
		snprintf(short_submit_string, OPH_WORKFLOW_MAX_STRING, "%s ", workflow->tasks[task_index].operator);

	for (j = 0; j < (subtask ? workflow->tasks[task_index].light_tasks[light_task_index].arguments_num : workflow->tasks[task_index].arguments_num); ++j) {
		key = subtask ? workflow->tasks[task_index].light_tasks[light_task_index].arguments_keys[j] : workflow->tasks[task_index].arguments_keys[j];
		value = value2 = subtask ? workflow->tasks[task_index].light_tasks[light_task_index].arguments_values[j] : workflow->tasks[task_index].arguments_values[j];
		if (key && value && strlen(key) && strlen(value)) {
			// Path correction
			if (value[0] == OPH_WORKFLOW_ROOT_FOLDER[0]) {
				for (i = 0; i < OPH_WORKFLOW_PATH_SET_SIZE; ++i)
					if (!strcmp(key, path_key[i])) {
						snprintf(path_value, OPH_WORKFLOW_MAX_STRING, "%s%s%s", OPH_WORKFLOW_ROOT_FOLDER, session_code, strlen(value) > 1 ? value : "");
						value = path_value;
						break;
					}
			}
			snprintf(key_value, OPH_WORKFLOW_MAX_STRING, strchr(value, OPH_WORKFLOW_VALUE_SEPARATOR) ? OPH_WORKFLOW_KEY_VALUE_STRING2 : OPH_WORKFLOW_KEY_VALUE_STRING, key, value);
			if ((length = OPH_WORKFLOW_MAX_STRING - strlen(long_submit_string)) <= strlen(key_value)) {
				pmesg(LOG_ERROR, __FILE__, __LINE__, "Space for submission string is not enough\n");
				if (error)
					*error = strdup("Space for submission string is not enough");
				return OPH_WORKFLOW_EXIT_MEMORY_ERROR;
			}
			strncat(long_submit_string, key_value, length);
			if (short_submission_string) {
				if (value != value2)
					snprintf(key_value, OPH_WORKFLOW_MAX_STRING, strchr(value2, OPH_WORKFLOW_VALUE_SEPARATOR) ? OPH_WORKFLOW_KEY_VALUE_STRING2 : OPH_WORKFLOW_KEY_VALUE_STRING, key,
						 value2);
				strncat(short_submit_string, key_value, length);
			}
		} else
			pmesg(LOG_WARNING, __FILE__, __LINE__, "Argument skipped\n");
	}

	// Variable substitution
	if (oph_workflow_var_substitute(workflow, task_index, light_task_index, long_submit_string, error))
		return OPH_WORKFLOW_EXIT_BAD_PARAM_ERROR;
	pmesg(LOG_DEBUG, __FILE__, __LINE__, "Submission string of '%s' is '%s'\n", workflow->tasks[task_index].name, long_submit_string);

	*long_submission_string = strdup(long_submit_string);
	if (!(*long_submission_string)) {
		pmesg(LOG_ERROR, __FILE__, __LINE__, "Unable to allocate submission string\n");
		if (error)
			*error = strdup("Unable to allocate submission string");
		return OPH_WORKFLOW_EXIT_MEMORY_ERROR;
	}

	if (short_submission_string) {
		// Variable substitution
		if (oph_workflow_var_substitute(workflow, task_index, light_task_index, short_submit_string, error))
			return OPH_WORKFLOW_EXIT_BAD_PARAM_ERROR;
		*short_submission_string = strdup(short_submit_string);
		if (!(*short_submission_string)) {
			pmesg(LOG_ERROR, __FILE__, __LINE__, "Unable to allocate submission string\n");
			if (error)
				*error = strdup("Unable to allocate submission string");
			return OPH_WORKFLOW_EXIT_MEMORY_ERROR;
		}
	}

	return OPH_WORKFLOW_EXIT_SUCCESS;
}