int oph_odb_create_hp(ophidiadb * oDB, const char *name, const char *parent) { if (!oDB || !name || !parent) return OPH_ODB_NULL_PARAM; if (oph_odb_check_connection_to_ophidiadb(oDB)) return OPH_ODB_MYSQL_ERROR; char insertQuery[MYSQL_BUFLEN]; int n = snprintf(insertQuery, MYSQL_BUFLEN, OPHIDIADB_CREATE_PARTITION, name); if (n >= MYSQL_BUFLEN) return OPH_ODB_STR_BUFF_OVERFLOW; if (mysql_query(oDB->conn, insertQuery)) return OPH_ODB_MYSQL_ERROR; if (oph_odb_check_connection_to_ophidiadb(oDB)) return OPH_ODB_MYSQL_ERROR; n = snprintf(insertQuery, MYSQL_BUFLEN, OPHIDIADB_FILL_PARTITION, parent); if (n >= MYSQL_BUFLEN) return OPH_ODB_STR_BUFF_OVERFLOW; if (mysql_query(oDB->conn, insertQuery)) return OPH_ODB_MYSQL_ERROR; return OPH_ODB_SUCCESS; }
int _oph_odb_update_folder_table(ophidiadb * oDB, char *folder_name, int *id_folder, pthread_mutex_t * flag) { if (!oDB || !folder_name || !id_folder) { 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 insertQuery[MYSQL_BUFLEN]; int n = snprintf(insertQuery, MYSQL_BUFLEN, MYSQL_QUERY_UPDATE_OPHIDIADB_SESSION_FOLDER, folder_name); 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_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_folder = mysql_insert_id(oDB->conn))) { pmesg_safe(flag, LOG_ERROR, __FILE__, __LINE__, "Unable to find last inserted folder id\n"); return OPH_ODB_TOO_MANY_ROWS; } return OPH_ODB_SUCCESS; }
int _oph_odb_retrieve_job_id(ophidiadb * oDB, char *sessionid, char *markerid, int *id_job, pthread_mutex_t * flag) { if (!oDB || !sessionid || !markerid || !id_job) { pmesg_safe(flag, LOG_ERROR, __FILE__, __LINE__, "Null input parameter\n"); return OPH_ODB_NULL_PARAM; } *id_job = 0; 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 query[MYSQL_BUFLEN]; int n = snprintf(query, MYSQL_BUFLEN, MYSQL_RETRIEVE_JOB_ID, sessionid, markerid); if (n >= MYSQL_BUFLEN) { pmesg_safe(flag, LOG_ERROR, __FILE__, __LINE__, "Size of query exceed query limit.\n"); return OPH_ODB_STR_BUFF_OVERFLOW; } pmesg_safe(flag, LOG_DEBUG, __FILE__, __LINE__, "Find job with markerid '%s'\n", markerid); if (mysql_query(oDB->conn, query)) { pmesg_safe(flag, LOG_ERROR, __FILE__, __LINE__, "MySQL query error: %s\n", mysql_error(oDB->conn)); return OPH_ODB_MYSQL_ERROR; } MYSQL_RES *res; MYSQL_ROW row; res = mysql_store_result(oDB->conn); if (mysql_num_rows(res) < 1) { pmesg_safe(flag, LOG_DEBUG, __FILE__, __LINE__, "No row found by query\n"); mysql_free_result(res); return OPH_ODB_NO_ROW_FOUND; } if (mysql_num_rows(res) > 1) { pmesg_safe(flag, LOG_ERROR, __FILE__, __LINE__, "More than one row found by query\n"); mysql_free_result(res); return OPH_ODB_TOO_MANY_ROWS; } if (mysql_field_count(oDB->conn) != 1) { pmesg_safe(flag, LOG_ERROR, __FILE__, __LINE__, "Not enough fields found by query\n"); mysql_free_result(res); return OPH_ODB_TOO_MANY_ROWS; } if ((row = mysql_fetch_row(res)) != NULL) *id_job = (int) strtol(row[0], NULL, 10); mysql_free_result(res); return OPH_ODB_SUCCESS; }
int oph_odb_user_retrieve_user_id(ophidiadb *oDB, char* username, int *id_user) { if(!oDB || !username || !id_user){ pmesg(LOG_ERROR, __FILE__, __LINE__, "Null input parameter\n"); return OPH_ODB_NULL_PARAM; } if( oph_odb_check_connection_to_ophidiadb(oDB)){ pmesg(LOG_ERROR, __FILE__, __LINE__, "Unable to reconnect to OphidiaDB.\n"); return OPH_ODB_MYSQL_ERROR; } char query[MYSQL_BUFLEN]; int n = snprintf(query, MYSQL_BUFLEN, MYSQL_QUERY_USER_RETRIEVE_USER_ID, username); if(n >= MYSQL_BUFLEN){ pmesg(LOG_ERROR, __FILE__, __LINE__, "Size of query exceed query limit.\n"); return OPH_ODB_STR_BUFF_OVERFLOW; } if (mysql_query(oDB->conn, query)){ pmesg(LOG_ERROR, __FILE__, __LINE__, "MySQL query error: %s\n", mysql_error(oDB->conn)); return OPH_ODB_MYSQL_ERROR; } MYSQL_RES *res; MYSQL_ROW row; res = mysql_store_result(oDB->conn); if (mysql_num_rows(res) < 1) { pmesg(LOG_DEBUG, __FILE__, __LINE__, "No row found by query\n"); mysql_free_result(res); return OPH_ODB_NO_ROW_FOUND; } if (mysql_num_rows(res) > 1) { pmesg(LOG_ERROR, __FILE__, __LINE__, "More than one row found by query\n"); mysql_free_result(res); return OPH_ODB_TOO_MANY_ROWS; } if (mysql_field_count(oDB->conn) != 1){ pmesg(LOG_ERROR, __FILE__, __LINE__, "Not enough fields found by query\n"); mysql_free_result(res); return OPH_ODB_TOO_MANY_ROWS; } if ((row = mysql_fetch_row(res)) != NULL) *id_user=(int)strtol(row[0], NULL, 10); mysql_free_result(res); return OPH_ODB_SUCCESS; }
int _oph_odb_update_job_table(ophidiadb * oDB, char *markerid, char *task_string, char *status, int id_user, int id_session, int nchildren, int *id_job, char *parentid, char *workflowid, pthread_mutex_t * flag) { if (!oDB || !markerid || !task_string || !status || !id_job) { 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 insertQuery[MYSQL_BUFLEN]; int n, i, j; char new_query[OPERATION_QUERY_SIZE]; j = 0; for (i = 0; i < OPERATION_QUERY_SIZE; i++) { if (!task_string[i]) break; if (task_string[i] == '\'') new_query[j++] = '\\'; new_query[j] = task_string[i]; j++; if (j >= OPERATION_QUERY_SIZE - 1) break; } new_query[j] = 0; if (parentid) n = snprintf(insertQuery, MYSQL_BUFLEN, MYSQL_QUERY_UPDATE_OPHIDIADB_JOB_CHILD, id_user, id_session, markerid, status, new_query, parentid, workflowid); else if (nchildren >= 0) n = snprintf(insertQuery, MYSQL_BUFLEN, MYSQL_QUERY_UPDATE_OPHIDIADB_JOB_PARENT, id_user, id_session, markerid, status, new_query, nchildren, workflowid); else n = snprintf(insertQuery, MYSQL_BUFLEN, MYSQL_QUERY_UPDATE_OPHIDIADB_JOB, id_user, id_session, markerid, status, new_query); pmesg_safe(flag, LOG_DEBUG, __FILE__, __LINE__, "Execute query: %s\n", insertQuery); 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_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_job = mysql_insert_id(oDB->conn))) { pmesg_safe(flag, LOG_ERROR, __FILE__, __LINE__, "Unable to find last inserted job id\n"); return OPH_ODB_TOO_MANY_ROWS; } return OPH_ODB_SUCCESS; }
int oph_odb_retrieve_ids(ophidiadb * oDB, const char *command, int **id, char ***ctime, int *nn) { if (!oDB || !command || !id || !nn) { return OPH_ODB_NULL_PARAM; } *nn = 0; *id = NULL; if (oph_odb_check_connection_to_ophidiadb(oDB)) return OPH_ODB_MYSQL_ERROR; char query[MYSQL_BUFLEN]; int n = snprintf(query, MYSQL_BUFLEN, "%s", command); if (n >= MYSQL_BUFLEN) return OPH_ODB_STR_BUFF_OVERFLOW; if (mysql_select_db(oDB->conn, oDB->name)) return OPH_ODB_MYSQL_ERROR; if (mysql_query(oDB->conn, query)) return OPH_ODB_MYSQL_ERROR; MYSQL_RES *res; MYSQL_ROW row; res = mysql_store_result(oDB->conn); if (mysql_field_count(oDB->conn) != 2) { mysql_free_result(res); return OPH_ODB_TOO_MANY_ROWS; } *nn = mysql_num_rows(res); if (!(*nn)) { mysql_free_result(res); return OPH_ODB_NO_ROW_FOUND; } *id = (int *) malloc((*nn) * sizeof(int)); if (ctime) *ctime = (char **) malloc((*nn) * sizeof(char *)); int j = 0; while ((row = mysql_fetch_row(res)) != NULL) { (*id)[j] = (int) strtol(row[0], NULL, 10); if (ctime) (*ctime)[j] = row[1] ? strdup(row[1]) : NULL; j++; } mysql_free_result(res); return OPH_ODB_SUCCESS; }
int oph_odb_fs_is_unique_hidden(int folder_id, char *name, ophidiadb * oDB, int *answer) { if (!name || !folder_id || !answer) { return OPH_ODB_NULL_PARAM; } if (oph_odb_check_connection_to_ophidiadb(oDB)) { return OPH_ODB_MYSQL_ERROR; } *answer = 0; return OPH_ODB_SUCCESS; }
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_odb_insert_user2(ophidiadb * oDB, const char *username, const char *password, const char *name, const char *surname, const char *email, const char *country) { if (!oDB || !username) return OPH_ODB_NULL_PARAM; if (oph_odb_check_connection_to_ophidiadb(oDB)) return OPH_ODB_MYSQL_ERROR; char insertQuery[MYSQL_BUFLEN], tmp[MYSQL_BUFLEN]; int n; if (country) { int idcountry = 0; n = snprintf(insertQuery, MYSQL_BUFLEN, MYSQL_QUERY_SELECT_COUNTRY, country); if (n >= MYSQL_BUFLEN) return OPH_ODB_STR_BUFF_OVERFLOW; if (mysql_query(oDB->conn, insertQuery)) return OPH_ODB_MYSQL_ERROR; MYSQL_RES *res; MYSQL_ROW row; res = mysql_store_result(oDB->conn); if ((mysql_field_count(oDB->conn) != 1) || (mysql_num_rows(res) != 1)) { mysql_free_result(res); return OPH_ODB_TOO_MANY_ROWS; } while ((row = mysql_fetch_row(res)) != NULL) idcountry = (row[0] ? (int) strtol(row[0], NULL, 10) : 0); mysql_free_result(res); snprintf(tmp, MYSQL_BUFLEN, "%d", idcountry); } else snprintf(tmp, MYSQL_BUFLEN, "NULL"); n = snprintf(insertQuery, MYSQL_BUFLEN, MYSQL_QUERY_INSERT_USER2, username, password, name ? "'" : "", name ? name : "NULL", name ? "'" : "", surname ? "'" : "", surname ? surname : "NULL", surname ? "'" : "", email ? "'" : "", email ? email : "NULL", email ? "'" : "", tmp); if (n >= MYSQL_BUFLEN) return OPH_ODB_STR_BUFF_OVERFLOW; if (mysql_query(oDB->conn, insertQuery)) return OPH_ODB_MYSQL_ERROR; return OPH_ODB_SUCCESS; }
int oph_odb_delete_user(ophidiadb * oDB, const char *username) { if (!oDB || !username) return OPH_ODB_NULL_PARAM; if (oph_odb_check_connection_to_ophidiadb(oDB)) return OPH_ODB_MYSQL_ERROR; char insertQuery[MYSQL_BUFLEN]; int n = snprintf(insertQuery, MYSQL_BUFLEN, MYSQL_QUERY_DELETE_USER, username); if (n >= MYSQL_BUFLEN) return OPH_ODB_STR_BUFF_OVERFLOW; if (mysql_query(oDB->conn, insertQuery)) return OPH_ODB_MYSQL_ERROR; return OPH_ODB_SUCCESS; }
int oph_odb_destroy_hp(ophidiadb * oDB, const char *name) { if (!oDB || !name) return OPH_ODB_NULL_PARAM; if (oph_odb_check_connection_to_ophidiadb(oDB)) return OPH_ODB_MYSQL_ERROR; char updateQuery[MYSQL_BUFLEN]; int n = snprintf(updateQuery, MYSQL_BUFLEN, OPHIDIADB_DESTROY_PARTITION, name); if (n >= MYSQL_BUFLEN) return OPH_ODB_STR_BUFF_OVERFLOW; if (mysql_query(oDB->conn, updateQuery)) return OPH_ODB_MYSQL_ERROR; return OPH_ODB_SUCCESS; }
int oph_odb_extract_datacube_ids(ophidiadb * oDB, char *query, cube ** datacube, int *counter) { if (!oDB || !query || !datacube || !counter) return OPH_ODB_NULL_PARAM; if (oph_odb_check_connection_to_ophidiadb(oDB)) return OPH_ODB_MYSQL_ERROR; if (mysql_query(oDB->conn, query)) return OPH_ODB_MYSQL_ERROR; MYSQL_RES *res; MYSQL_ROW row; res = mysql_store_result(oDB->conn); if (mysql_field_count(oDB->conn) != 2) { mysql_free_result(res); return OPH_ODB_TOO_MANY_ROWS; } *counter = mysql_num_rows(res); if (!(*counter)) { mysql_free_result(res); return OPH_ODB_SUCCESS; } if (!(*datacube = (cube *) malloc(*counter * sizeof(cube)))) { mysql_free_result(res); return OPH_ODB_MEMORY_ERROR; } int i = 0; while ((row = mysql_fetch_row(res)) != NULL) { (*datacube)[i].id_datacube = (row[0] ? (int) strtol(row[0], NULL, 10) : 0); (*datacube)[i].id_container = (row[1] ? (int) strtol(row[1], NULL, 10) : 0); i++; } mysql_free_result(res); return OPH_ODB_SUCCESS; }
int _oph_odb_update_session_label(ophidiadb * oDB, const char *sessionid, char *label, pthread_mutex_t * flag) { if (!oDB || !sessionid) { 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; } int id_session; if (_oph_odb_retrieve_session_id(oDB, sessionid, &id_session, flag)) { pmesg_safe(flag, LOG_ERROR, __FILE__, __LINE__, "Unable to retrieve session id\n"); return OPH_ODB_MYSQL_ERROR; } char insertQuery[MYSQL_BUFLEN]; int n = snprintf(insertQuery, MYSQL_BUFLEN, MYSQL_QUERY_UPDATE_OPHIDIADB_SESSION_LABEL, label ? label : "", id_session); 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; } return OPH_ODB_SUCCESS; }
int recursive_search(const char *folder_abs_path, int folderid, const char *filters, ophidiadb * oDB, int *max_lengths, int max_lengths_size, char *query, char *path, int is_start, oph_json * oper_json, int is_objkey_printable) { if (!oDB) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Null input parameter\n"); return OPH_ODB_NULL_PARAM; } if (oph_odb_check_connection_to_ophidiadb(oDB)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Unable to reconnect to OphidiaDB.\n"); return OPH_ODB_MYSQL_ERROR; } MYSQL_RES *res; MYSQL_FIELD *fields; MYSQL_ROW row; int i, j, num_fields; char *buffer; char *buffer2; if (is_start) { buffer = malloc(MYSQL_BUFLEN); if (!buffer) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Error allocating memory for query\n"); return OPH_ANALYTICS_OPERATOR_MEMORY_ERR; } buffer2 = malloc(MYSQL_BUFLEN); if (!buffer2) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Error allocating memory for path\n"); free(buffer); return OPH_ANALYTICS_OPERATOR_MEMORY_ERR; } } else { buffer = query; buffer2 = path; } snprintf(buffer, MYSQL_BUFLEN, MYSQL_QUERY_OPH_SEARCH_READ_INSTANCES, folderid, filters); if (mysql_query(oDB->conn, buffer)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "MySQL query error: %s\n", mysql_error(oDB->conn)); free(buffer); free(buffer2); return OPH_ANALYTICS_OPERATOR_MYSQL_ERROR; } res = mysql_store_result(oDB->conn); fields = mysql_fetch_fields(res); num_fields = mysql_num_fields(res) - 1; if (is_start) { //print header printf("+"); for (i = 0; i < max_lengths_size; i++) { printf("-"); for (j = 0; j < max_lengths[i]; j++) { printf("-"); } printf("-+"); } printf("\n"); printf("|"); for (i = 0; i < max_lengths_size; i++) { printf(" "); printf("%-*s", max_lengths[i], fields[i].name); printf(" |"); } printf("\n"); printf("+"); for (i = 0; i < max_lengths_size; i++) { printf("-"); for (j = 0; j < max_lengths[i]; j++) { printf("-"); } printf("-+"); } printf("\n"); if (is_objkey_printable) { char **jsonkeys = NULL; char **fieldtypes = NULL; int iii, jjj; jsonkeys = (char **) malloc(sizeof(char *) * num_fields); if (!jsonkeys) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Error allocating memory\n"); logging(LOG_ERROR, __FILE__, __LINE__, OPH_GENERIC_CONTAINER_ID, OPH_LOG_OPH_SEARCH_MEMORY_ERROR_INPUT, "keys"); mysql_free_result(res); return OPH_ANALYTICS_OPERATOR_MEMORY_ERR; } for (jjj = 0; jjj < num_fields; ++jjj) { jsonkeys[jjj] = strdup(fields[jjj + 1].name ? fields[jjj + 1].name : ""); if (!jsonkeys[jjj]) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Error allocating memory\n"); logging(LOG_ERROR, __FILE__, __LINE__, OPH_GENERIC_CONTAINER_ID, OPH_LOG_OPH_SEARCH_MEMORY_ERROR_INPUT, "key"); for (iii = 0; iii < jjj; iii++) if (jsonkeys[iii]) free(jsonkeys[iii]); if (jsonkeys) free(jsonkeys); mysql_free_result(res); return OPH_ANALYTICS_OPERATOR_MEMORY_ERR; } } fieldtypes = (char **) malloc(sizeof(char *) * num_fields); if (!fieldtypes) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Error allocating memory\n"); logging(LOG_ERROR, __FILE__, __LINE__, OPH_GENERIC_CONTAINER_ID, OPH_LOG_OPH_SEARCH_MEMORY_ERROR_INPUT, "fieldtypes"); for (iii = 0; iii < num_fields; iii++) if (jsonkeys[iii]) free(jsonkeys[iii]); if (jsonkeys) free(jsonkeys); mysql_free_result(res); return OPH_ANALYTICS_OPERATOR_MEMORY_ERR; } for (jjj = 0; jjj < num_fields; ++jjj) { fieldtypes[jjj] = strdup(OPH_JSON_STRING); if (!fieldtypes[jjj]) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Error allocating memory\n"); logging(LOG_ERROR, __FILE__, __LINE__, OPH_GENERIC_CONTAINER_ID, OPH_LOG_OPH_SEARCH_MEMORY_ERROR_INPUT, "fieldtype"); for (iii = 0; iii < num_fields; iii++) if (jsonkeys[iii]) free(jsonkeys[iii]); if (jsonkeys) free(jsonkeys); for (iii = 0; iii < jjj; iii++) if (fieldtypes[iii]) free(fieldtypes[iii]); if (fieldtypes) free(fieldtypes); mysql_free_result(res); return OPH_ANALYTICS_OPERATOR_MEMORY_ERR; } } if (oph_json_add_grid(oper_json, OPH_JSON_OBJKEY_SEARCH, "Searching results", NULL, jsonkeys, num_fields, fieldtypes, num_fields)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "ADD GRID error\n"); logging(LOG_WARNING, __FILE__, __LINE__, OPH_GENERIC_CONTAINER_ID, "ADD GRID error\n"); for (iii = 0; iii < num_fields; iii++) if (jsonkeys[iii]) free(jsonkeys[iii]); if (jsonkeys) free(jsonkeys); for (iii = 0; iii < num_fields; iii++) if (fieldtypes[iii]) free(fieldtypes[iii]); if (fieldtypes) free(fieldtypes); mysql_free_result(res); return OPH_ANALYTICS_OPERATOR_UTILITY_ERROR; } for (iii = 0; iii < num_fields; iii++) if (jsonkeys[iii]) free(jsonkeys[iii]); if (jsonkeys) free(jsonkeys); for (iii = 0; iii < num_fields; iii++) if (fieldtypes[iii]) free(fieldtypes[iii]); if (fieldtypes) free(fieldtypes); } } //print each ROW while ((row = mysql_fetch_row(res))) { printf("|"); for (i = 0; i < max_lengths_size; i++) { printf(" "); if (!strcasecmp(fields[i].name, "Container")) { if (folder_abs_path[strlen(folder_abs_path) - 1] == '/') { snprintf(buffer2, MYSQL_BUFLEN, "%s%s", folder_abs_path, row[i]); } else { snprintf(buffer2, MYSQL_BUFLEN, "%s/%s", folder_abs_path, row[i]); } printf("%-*s", max_lengths[i], buffer2); } else { printf("%-*s", max_lengths[i], row[i]); } printf(" |"); } printf("\n"); if (is_objkey_printable) { char **jsonvalues = NULL; int iii, jjj; jsonvalues = (char **) calloc(num_fields, sizeof(char *)); if (!jsonvalues) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Error allocating memory\n"); logging(LOG_ERROR, __FILE__, __LINE__, OPH_GENERIC_CONTAINER_ID, OPH_LOG_OPH_SEARCH_MEMORY_ERROR_INPUT, "values"); mysql_free_result(res); return OPH_ANALYTICS_OPERATOR_MEMORY_ERR; } for (jjj = 0; jjj < num_fields; ++jjj) { if (jjj) jsonvalues[jjj] = strdup(row[1 + jjj] ? row[1 + jjj] : ""); else { char *tmp_uri = NULL, *pid = NULL; if (oph_pid_get_uri(&tmp_uri)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Error allocating memory\n"); logging(LOG_ERROR, __FILE__, __LINE__, OPH_GENERIC_CONTAINER_ID, OPH_LOG_OPH_SEARCH_MEMORY_ERROR_INPUT, "PID"); mysql_free_result(res); return OPH_ANALYTICS_OPERATOR_MEMORY_ERR; } if (oph_pid_create_pid(tmp_uri, (int) strtol(row[0], NULL, 10), (int) strtol(row[1], NULL, 10), &pid)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Unable to create PID string\n"); logging(LOG_ERROR, __FILE__, __LINE__, OPH_GENERIC_CONTAINER_ID, OPH_LOG_OPH_SEARCH_MEMORY_ERROR_INPUT, "PID"); mysql_free_result(res); return OPH_ANALYTICS_OPERATOR_MEMORY_ERR; } if (tmp_uri) free(tmp_uri); jsonvalues[jjj] = strdup(pid ? pid : ""); } if (!jsonvalues[jjj]) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Error allocating memory\n"); logging(LOG_ERROR, __FILE__, __LINE__, OPH_GENERIC_CONTAINER_ID, OPH_LOG_OPH_SEARCH_MEMORY_ERROR_INPUT, "value"); for (iii = 0; iii < jjj; iii++) if (jsonvalues[iii]) free(jsonvalues[iii]); if (jsonvalues) free(jsonvalues); mysql_free_result(res); return OPH_ANALYTICS_OPERATOR_MEMORY_ERR; } } if (oph_json_add_grid_row(oper_json, OPH_JSON_OBJKEY_SEARCH, jsonvalues)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "ADD GRID ROW error\n"); logging(LOG_WARNING, __FILE__, __LINE__, OPH_GENERIC_CONTAINER_ID, "ADD GRID ROW error\n"); for (iii = 0; iii < num_fields; iii++) if (jsonvalues[iii]) free(jsonvalues[iii]); if (jsonvalues) free(jsonvalues); mysql_free_result(res); return OPH_ANALYTICS_OPERATOR_UTILITY_ERROR; } for (iii = 0; iii < num_fields; iii++) if (jsonvalues[iii]) free(jsonvalues[iii]); if (jsonvalues) free(jsonvalues); } } mysql_free_result(res); //recursive step snprintf(buffer, MYSQL_BUFLEN, MYSQL_QUERY_OPH_SEARCH_READ_SUBFOLDERS, folderid); if (mysql_query(oDB->conn, buffer)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "MySQL query error: %s\n", mysql_error(oDB->conn)); free(buffer); free(buffer2); return OPH_ANALYTICS_OPERATOR_MYSQL_ERROR; } res = mysql_store_result(oDB->conn); while ((row = mysql_fetch_row(res))) { if (folder_abs_path[strlen(folder_abs_path) - 1] == '/') { snprintf(buffer2, MYSQL_BUFLEN, "%s%s/", folder_abs_path, row[1]); } else { snprintf(buffer2, MYSQL_BUFLEN, "%s/%s/", folder_abs_path, row[1]); } char *subfolder_path = strdup(buffer2); if (!subfolder_path) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Error allocating memory for subfolder path\n"); free(buffer); free(buffer2); mysql_free_result(res); return OPH_ANALYTICS_OPERATOR_MEMORY_ERR; } if (recursive_search(subfolder_path, (int) strtol(row[0], NULL, 10), filters, oDB, max_lengths, max_lengths_size, buffer, buffer2, 0, oper_json, is_objkey_printable)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Recursive step error\n"); free(buffer); free(buffer2); free(subfolder_path); mysql_free_result(res); return OPH_ANALYTICS_OPERATOR_UTILITY_ERROR; } free(subfolder_path); } mysql_free_result(res); if (is_start) { //print footer printf("+"); for (i = 0; i < max_lengths_size; i++) { printf("-"); for (j = 0; j < max_lengths[i]; j++) { printf("-"); } printf("-+"); } printf("\n"); if (buffer) { free(buffer); buffer = NULL; } if (buffer2) { free(buffer2); buffer2 = NULL; } } return OPH_ANALYTICS_OPERATOR_SUCCESS; }
int oph_odb_set_job_status_and_nchildrencompleted(int id_job, enum oph__oph_odb_job_status status, int nchildren, int force_nchildren_saving, ophidiadb * oDB) { if (!oDB) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Null input parameter\n"); return OPH_ODB_NULL_PARAM; } if (oph_odb_check_connection_to_ophidiadb(oDB)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Unable to reconnect to OphidiaDB.\n"); return OPH_ODB_MYSQL_ERROR; } char insertQuery[MYSQL_BUFLEN]; int n; switch (status) { case OPH_ODB_STATUS_UNKNOWN: if (nchildren >= 0) { pmesg(LOG_DEBUG, __FILE__, __LINE__, "Status is not changed\n"); return OPH_ODB_SUCCESS; } n = snprintf(insertQuery, MYSQL_BUFLEN, MYSQL_QUERY_DELETE_OPHIDIADB_JOB, id_job); break; case OPH_ODB_STATUS_CLOSED: pmesg(LOG_ERROR, __FILE__, __LINE__, "Status %s is not allowed\n", OPH_ODB_STATUS_UNKNOWN_STR); return OPH_ODB_MYSQL_ERROR; case OPH_ODB_STATUS_PENDING: case OPH_ODB_STATUS_WAIT: case OPH_ODB_STATUS_START: case OPH_ODB_STATUS_SET_ENV: case OPH_ODB_STATUS_INIT: case OPH_ODB_STATUS_DISTRIBUTE: case OPH_ODB_STATUS_EXECUTE: case OPH_ODB_STATUS_REDUCE: case OPH_ODB_STATUS_DESTROY: case OPH_ODB_STATUS_UNSET_ENV: if (nchildren < 0) n = snprintf(insertQuery, MYSQL_BUFLEN, MYSQL_QUERY_UPDATE_OPHIDIADB_JOB_STATUS_1, oph_odb_convert_status_to_str(status), id_job); else n = snprintf(insertQuery, MYSQL_BUFLEN, MYSQL_QUERY_UPDATE_OPHIDIADB_JOB_STATUS_PARENT_1, oph_odb_convert_status_to_str(status), nchildren, id_job); break; case OPH_ODB_STATUS_RUNNING: if (nchildren < 0) n = snprintf(insertQuery, MYSQL_BUFLEN, MYSQL_QUERY_UPDATE_OPHIDIADB_JOB_STATUS_2, oph_odb_convert_status_to_str(status), id_job); else if (force_nchildren_saving) n = snprintf(insertQuery, MYSQL_BUFLEN, MYSQL_QUERY_UPDATE_OPHIDIADB_JOB_STATUS_PARENT_1, oph_odb_convert_status_to_str(status), nchildren, id_job); else n = snprintf(insertQuery, MYSQL_BUFLEN, MYSQL_QUERY_UPDATE_OPHIDIADB_JOB_STATUS_PARENT_2, oph_odb_convert_status_to_str(status), nchildren, id_job); break; case OPH_ODB_STATUS_COMPLETED: case OPH_ODB_STATUS_ERROR: case OPH_ODB_STATUS_START_ERROR: // Exception due to errors in operator arguments case OPH_ODB_STATUS_ABORTED: case OPH_ODB_STATUS_EXPIRED: if (nchildren < 0) n = snprintf(insertQuery, MYSQL_BUFLEN, MYSQL_QUERY_UPDATE_OPHIDIADB_JOB_STATUS_3, oph_odb_convert_status_to_str(status), id_job); else n = snprintf(insertQuery, MYSQL_BUFLEN, MYSQL_QUERY_UPDATE_OPHIDIADB_JOB_STATUS_PARENT_3, oph_odb_convert_status_to_str(status), nchildren, id_job); break; default: if (nchildren < 0) n = snprintf(insertQuery, MYSQL_BUFLEN, MYSQL_QUERY_UPDATE_OPHIDIADB_JOB_STATUS_4, id_job); else n = snprintf(insertQuery, MYSQL_BUFLEN, MYSQL_QUERY_UPDATE_OPHIDIADB_JOB_STATUS_PARENT_4, nchildren, id_job); } if (n >= MYSQL_BUFLEN) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Size of query exceed query limit.\n"); return OPH_ODB_STR_BUFF_OVERFLOW; } if ((nchildren >= 0) && 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(LOG_ERROR, __FILE__, __LINE__, "MySQL query error: %s\n", mysql_error(oDB->conn)); return OPH_ODB_MYSQL_ERROR; } pmesg(LOG_DEBUG, __FILE__, __LINE__, "Job status changed into '%s' using: %s\n", oph_odb_convert_status_to_str(status), insertQuery); return OPH_ODB_SUCCESS; }
int oph_odb_update_user(ophidiadb * oDB, const char *username, const char *password, const char *name, const char *surname, const char *email, const char *country) { if (!oDB || !username) return OPH_ODB_NULL_PARAM; if (oph_odb_check_connection_to_ophidiadb(oDB)) return OPH_ODB_MYSQL_ERROR; char updateQuery[MYSQL_BUFLEN]; int n; if (password) { n = snprintf(updateQuery, MYSQL_BUFLEN, MYSQL_QUERY_UPDATE_USER2, "password", password, username); if (n >= MYSQL_BUFLEN) return OPH_ODB_STR_BUFF_OVERFLOW; if (mysql_query(oDB->conn, updateQuery)) return OPH_ODB_MYSQL_ERROR; } if (name) { n = snprintf(updateQuery, MYSQL_BUFLEN, MYSQL_QUERY_UPDATE_USER, "name", name, username); if (n >= MYSQL_BUFLEN) return OPH_ODB_STR_BUFF_OVERFLOW; if (mysql_query(oDB->conn, updateQuery)) return OPH_ODB_MYSQL_ERROR; } if (surname) { n = snprintf(updateQuery, MYSQL_BUFLEN, MYSQL_QUERY_UPDATE_USER, "surname", surname, username); if (n >= MYSQL_BUFLEN) return OPH_ODB_STR_BUFF_OVERFLOW; if (mysql_query(oDB->conn, updateQuery)) return OPH_ODB_MYSQL_ERROR; } if (email) { n = snprintf(updateQuery, MYSQL_BUFLEN, MYSQL_QUERY_UPDATE_USER, "mail", email, username); if (n >= MYSQL_BUFLEN) return OPH_ODB_STR_BUFF_OVERFLOW; if (mysql_query(oDB->conn, updateQuery)) return OPH_ODB_MYSQL_ERROR; } if (country) { int idcountry = 0; n = snprintf(updateQuery, MYSQL_BUFLEN, MYSQL_QUERY_SELECT_COUNTRY, country); if (n >= MYSQL_BUFLEN) return OPH_ODB_STR_BUFF_OVERFLOW; if (mysql_query(oDB->conn, updateQuery)) return OPH_ODB_MYSQL_ERROR; MYSQL_RES *res; MYSQL_ROW row; res = mysql_store_result(oDB->conn); if ((mysql_field_count(oDB->conn) != 1) || (mysql_num_rows(res) != 1)) { mysql_free_result(res); return OPH_ODB_TOO_MANY_ROWS; } while ((row = mysql_fetch_row(res)) != NULL) idcountry = (row[0] ? (int) strtol(row[0], NULL, 10) : 0); mysql_free_result(res); char tmp[MYSQL_BUFLEN]; snprintf(tmp, MYSQL_BUFLEN, "%d", idcountry); n = snprintf(updateQuery, MYSQL_BUFLEN, MYSQL_QUERY_UPDATE_USER, "idcountry", tmp, username); if (n >= MYSQL_BUFLEN) return OPH_ODB_STR_BUFF_OVERFLOW; if (mysql_query(oDB->conn, updateQuery)) return OPH_ODB_MYSQL_ERROR; } return OPH_ODB_SUCCESS; }
int oph_odb_get_uncompleted_job_number(int parent_idjob, int *number, ophidiadb * oDB) { if (!oDB || !number) { pmesg_safe(&global_flag, LOG_ERROR, __FILE__, __LINE__, "Null input parameter\n"); return OPH_ODB_NULL_PARAM; } *number = 0; if (oph_odb_check_connection_to_ophidiadb(oDB)) { pmesg_safe(&global_flag, LOG_ERROR, __FILE__, __LINE__, "Unable to reconnect to OphidiaDB.\n"); return OPH_ODB_MYSQL_ERROR; } char query[MYSQL_BUFLEN]; int n = snprintf(query, MYSQL_BUFLEN, MYSQL_RETRIEVE_UNCOMPLETED_JOB_NUMBER, parent_idjob); if (n >= MYSQL_BUFLEN) { pmesg_safe(&global_flag, LOG_ERROR, __FILE__, __LINE__, "Size of query exceed query limit.\n"); return OPH_ODB_STR_BUFF_OVERFLOW; } pmesg_safe(&global_flag, LOG_DEBUG, __FILE__, __LINE__, "Extract number of pending children using: %s.\n", query); if (mysql_query(oDB->conn, query)) { pmesg_safe(&global_flag, LOG_ERROR, __FILE__, __LINE__, "MySQL query error: %s\n", mysql_error(oDB->conn)); return OPH_ODB_MYSQL_ERROR; } MYSQL_RES *res; MYSQL_ROW row; res = mysql_store_result(oDB->conn); if (mysql_num_rows(res) < 1) { pmesg_safe(&global_flag, LOG_DEBUG, __FILE__, __LINE__, "No row found by query\n"); mysql_free_result(res); return OPH_ODB_NO_ROW_FOUND; } if (mysql_num_rows(res) > 1) { pmesg_safe(&global_flag, LOG_ERROR, __FILE__, __LINE__, "More than one row found by query\n"); mysql_free_result(res); return OPH_ODB_TOO_MANY_ROWS; } if (mysql_field_count(oDB->conn) != 1) { pmesg_safe(&global_flag, LOG_ERROR, __FILE__, __LINE__, "Not enough fields found by query\n"); mysql_free_result(res); return OPH_ODB_TOO_MANY_ROWS; } if ((row = mysql_fetch_row(res)) != NULL) { if (!row[0]) { pmesg_safe(&global_flag, LOG_ERROR, __FILE__, __LINE__, "No parent job found\n"); mysql_free_result(res); return OPH_ODB_ERROR; } *number = (int) strtol(row[0], NULL, 10); } mysql_free_result(res); return OPH_ODB_SUCCESS; }
int oph_odb_retrieve_list(ophidiadb * oDB, const char *command, ophidiadb_list * list) { if (!oDB || !command || !list) return OPH_ODB_NULL_PARAM; if (oph_odb_check_connection_to_ophidiadb(oDB)) return OPH_ODB_MYSQL_ERROR; char query[MYSQL_BUFLEN]; int n = snprintf(query, MYSQL_BUFLEN, "%s", command); if (n >= MYSQL_BUFLEN) return OPH_ODB_STR_BUFF_OVERFLOW; if (mysql_select_db(oDB->conn, oDB->name)) return OPH_ODB_MYSQL_ERROR; if (mysql_query(oDB->conn, query)) return OPH_ODB_MYSQL_ERROR; MYSQL_RES *res; MYSQL_ROW row; res = mysql_store_result(oDB->conn); if ((mysql_field_count(oDB->conn) < 4) || (mysql_field_count(oDB->conn) > 6)) { mysql_free_result(res); return OPH_ODB_TOO_MANY_ROWS; } list->size = mysql_num_rows(res); list->name = (char **) malloc(list->size * sizeof(char *)); list->id = (int *) malloc(list->size * sizeof(int)); list->pid = (int *) malloc(list->size * sizeof(int)); list->wid = (int *) malloc(list->size * sizeof(int)); list->ctime = (char **) malloc(list->size * sizeof(char *)); list->max_status = (char **) malloc(list->size * sizeof(char *)); if (!list->name || !list->id || !list->wid || !list->pid || !list->ctime || !list->max_status) { mysql_free_result(res); return OPH_ODB_MEMORY_ERROR; } int j = 0; while ((row = mysql_fetch_row(res)) != NULL) { list->id[j] = row[0] ? (int) strtol(row[0], NULL, 10) : 0; list->ctime[j] = row[1] ? strndup(row[1], OPH_MAX_STRING_SIZE) : NULL; list->name[j] = row[2] ? strndup(row[2], OPH_MAX_STRING_SIZE) : NULL; list->wid[j] = row[3] ? (int) strtol(row[3], NULL, 10) : 0; if ((mysql_field_count(oDB->conn) > 4) && row[4]) list->pid[j] = (int) strtol(row[4], NULL, 10); else list->pid[j] = 0; if ((mysql_field_count(oDB->conn) > 5) && row[5]) list->max_status[j] = strndup(row[5], OPH_MAX_STRING_SIZE); else list->max_status[j] = NULL; j++; } mysql_free_result(res); return OPH_ODB_SUCCESS; }
int recursive_get_max_lengths(int folder_abs_path_len, int folderid, const char *filters, ophidiadb * oDB, int **max_lengths, int *max_lengths_size, char *query, int is_start) { if (!oDB) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Null input parameter\n"); return OPH_ODB_NULL_PARAM; } if (oph_odb_check_connection_to_ophidiadb(oDB)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Unable to reconnect to OphidiaDB.\n"); return OPH_ODB_MYSQL_ERROR; } MYSQL_RES *res; MYSQL_FIELD *fields; MYSQL_ROW row; int i, tmp; char *buffer; if (is_start) { buffer = malloc(MYSQL_BUFLEN); if (!buffer) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Error allocating memory for query\n"); return OPH_ANALYTICS_OPERATOR_MEMORY_ERR; } } else { buffer = query; } snprintf(buffer, MYSQL_BUFLEN, MYSQL_QUERY_OPH_SEARCH_READ_INSTANCES, folderid, filters); if (mysql_query(oDB->conn, buffer)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "MySQL query error: %s\n", mysql_error(oDB->conn)); free(buffer); return OPH_ANALYTICS_OPERATOR_MYSQL_ERROR; } res = mysql_store_result(oDB->conn); fields = mysql_fetch_fields(res); if (is_start) { *max_lengths_size = mysql_num_fields(res); *max_lengths = (int *) malloc((*max_lengths_size) * sizeof(int)); if (!(*max_lengths)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Error allocating memory\n"); free(buffer); mysql_free_result(res); return OPH_ANALYTICS_OPERATOR_MEMORY_ERR; } for (i = 0; i < *max_lengths_size; i++) { (*max_lengths)[i] = 0; } } for (i = 0; i < *max_lengths_size; i++) { if (!strcasecmp(fields[i].name, "Container")) { tmp = ((*max_lengths)[i] > (int) (fields[i].max_length + folder_abs_path_len)) ? (*max_lengths)[i] : (int) (fields[i].max_length + folder_abs_path_len); } else { tmp = ((*max_lengths)[i] > (int) fields[i].max_length) ? (*max_lengths)[i] : (int) fields[i].max_length; } (*max_lengths)[i] = (tmp > (int) fields[i].name_length) ? tmp : (int) fields[i].name_length; } mysql_free_result(res); snprintf(buffer, MYSQL_BUFLEN, MYSQL_QUERY_OPH_SEARCH_READ_SUBFOLDERS, folderid); if (mysql_query(oDB->conn, buffer)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "MySQL query error: %s\n", mysql_error(oDB->conn)); free(buffer); return OPH_ANALYTICS_OPERATOR_MYSQL_ERROR; } res = mysql_store_result(oDB->conn); while ((row = mysql_fetch_row(res))) { if (recursive_get_max_lengths(folder_abs_path_len + strlen(row[1]) + 1, (int) strtol(row[0], NULL, 10), filters, oDB, max_lengths, max_lengths_size, buffer, 0)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Recursive step error\n"); free(buffer); mysql_free_result(res); return OPH_ANALYTICS_OPERATOR_UTILITY_ERROR; } } mysql_free_result(res); if (is_start) { if (buffer) { free(buffer); buffer = NULL; } } return OPH_ANALYTICS_OPERATOR_SUCCESS; }