int task_execute(oph_operator_struct *handle) { if (!handle || !handle->operator_handle){ pmesg(LOG_ERROR, __FILE__, __LINE__, "Null Handle\n"); logging(LOG_ERROR, __FILE__, __LINE__, OPH_GENERIC_CONTAINER_ID, OPH_LOG_OPH_DELETECONTAINER_NULL_OPERATOR_HANDLE ); return OPH_ANALYTICS_OPERATOR_NULL_OPERATOR_HANDLE; } //Only master process has to continue if (handle->proc_rank != 0) return OPH_ANALYTICS_OPERATOR_SUCCESS; ophidiadb *oDB = &((OPH_DELETECONTAINER_operator_handle*)handle->operator_handle)->oDB; int id_container = ((OPH_DELETECONTAINER_operator_handle*)handle->operator_handle)->id_input_container; int hidden = ((OPH_DELETECONTAINER_operator_handle*)handle->operator_handle)->hidden; int delete_type = ((OPH_DELETECONTAINER_operator_handle*)handle->operator_handle)->delete_type; char *container_name = ((OPH_DELETECONTAINER_operator_handle*)handle->operator_handle)->container_input; char *cwd = ((OPH_DELETECONTAINER_operator_handle*)handle->operator_handle)->cwd; char *user = ((OPH_DELETECONTAINER_operator_handle*)handle->operator_handle)->user; if(delete_type == OPH_DELETE_LOGIC_CODE) hidden = 0; //Check if user can operate on container and if container exists int permission = 0; int folder_id = 0; int container_exists = 0; //Check if input path exists if((oph_odb_fs_path_parsing("", cwd, &folder_id, NULL, oDB))) { //Check if user can work on datacube pmesg(LOG_ERROR, __FILE__, __LINE__, "Path %s doesn't exists\n", cwd); logging(LOG_ERROR, __FILE__, __LINE__, OPH_GENERIC_CONTAINER_ID, OPH_LOG_OPH_DELETECONTAINER_CWD_ERROR, container_name, cwd ); return OPH_ANALYTICS_OPERATOR_UTILITY_ERROR; } if((oph_odb_fs_check_folder_session(folder_id, ((OPH_DELETECONTAINER_operator_handle*)handle->operator_handle)->sessionid, oDB, &permission)) || !permission){ //Check if user can work on datacube pmesg(LOG_ERROR, __FILE__, __LINE__, "User %s is not allowed to work in this folder\n", user); logging(LOG_ERROR, __FILE__, __LINE__, OPH_GENERIC_CONTAINER_ID, OPH_LOG_OPH_DELETECONTAINER_DATACUBE_PERMISSION_ERROR, container_name, user ); return OPH_ANALYTICS_OPERATOR_UTILITY_ERROR; } if(oph_odb_fs_retrieve_container_id_from_container_name(oDB, folder_id, container_name, hidden, &id_container)){ pmesg(LOG_ERROR, __FILE__, __LINE__, "Unknown input %s container\n", (hidden ? "hidden" : "visible")); logging(LOG_ERROR, __FILE__, __LINE__,id_container, OPH_LOG_OPH_DELETECONTAINER_NO_INPUT_CONTAINER, (hidden ? "hidden" : "visible"), container_name ); return OPH_ANALYTICS_OPERATOR_MYSQL_ERROR; } ((OPH_DELETECONTAINER_operator_handle*)handle->operator_handle)->id_input_container = id_container; if(delete_type == OPH_DELETE_PHYSIC_CODE){ if(oph_odb_fs_check_if_container_empty(oDB, id_container)){ pmesg(LOG_ERROR, __FILE__, __LINE__, "Input container isn't empty\n"); logging(LOG_ERROR, __FILE__, __LINE__, id_container, OPH_LOG_OPH_DELETECONTAINER_CONTAINER_NOT_EMPTY, container_name ); return OPH_ANALYTICS_OPERATOR_MYSQL_ERROR; } //Remove also grid related to container dimensions if(oph_odb_dim_delete_from_grid_table(oDB, id_container)){ pmesg(LOG_ERROR, __FILE__, __LINE__, "Error while deleting grid related to container\n"); logging(LOG_ERROR, __FILE__, __LINE__, ((OPH_DELETECONTAINER_operator_handle*)handle->operator_handle)->id_input_container, OPH_LOG_OPH_DELETECONTAINER_GRID_DELETE_ERROR ); return OPH_ANALYTICS_OPERATOR_MYSQL_ERROR; } //Delete container and related dimensions/ dimension instances if(oph_odb_fs_delete_from_container_table(oDB, id_container)){ pmesg(LOG_ERROR, __FILE__, __LINE__, "Error while deleting input container\n"); logging(LOG_ERROR, __FILE__, __LINE__, ((OPH_DELETECONTAINER_operator_handle*)handle->operator_handle)->id_input_container, OPH_LOG_OPH_DELETECONTAINER_CONTAINER_DELETE_ERROR ); return OPH_ANALYTICS_OPERATOR_MYSQL_ERROR; } oph_odb_db_instance db_; oph_odb_db_instance *db = &db_; if (oph_dim_load_dim_dbinstance(db)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Error while loading dimension db paramters\n"); logging(LOG_ERROR, __FILE__, __LINE__, ((OPH_DELETECONTAINER_operator_handle*)handle->operator_handle)->id_input_container, OPH_LOG_OPH_DELETECONTAINER_DIM_LOAD ); oph_dim_unload_dim_dbinstance(db); return OPH_ANALYTICS_OPERATOR_MYSQL_ERROR; } if (oph_dim_connect_to_dbms(db->dbms_instance, 0)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Error while connecting to dimension dbms\n"); logging(LOG_ERROR, __FILE__, __LINE__, ((OPH_DELETECONTAINER_operator_handle*)handle->operator_handle)->id_input_container, OPH_LOG_OPH_DELETECONTAINER_DIM_CONNECT ); oph_dim_disconnect_from_dbms(db->dbms_instance); oph_dim_unload_dim_dbinstance(db); return OPH_ANALYTICS_OPERATOR_MYSQL_ERROR; } if (oph_dim_use_db_of_dbms(db->dbms_instance, db)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Error while opening dimension db\n"); logging(LOG_ERROR, __FILE__, __LINE__, ((OPH_DELETECONTAINER_operator_handle*)handle->operator_handle)->id_input_container, OPH_LOG_OPH_DELETECONTAINER_DIM_USE_DB ); oph_dim_disconnect_from_dbms(db->dbms_instance); oph_dim_unload_dim_dbinstance(db); return OPH_ANALYTICS_OPERATOR_MYSQL_ERROR; } char index_dimension_table_name[OPH_COMMON_BUFFER_LEN],label_dimension_table_name[OPH_COMMON_BUFFER_LEN]; snprintf(index_dimension_table_name,OPH_COMMON_BUFFER_LEN,OPH_DIM_TABLE_NAME_MACRO,((OPH_DELETECONTAINER_operator_handle*)handle->operator_handle)->id_input_container); snprintf(label_dimension_table_name,OPH_COMMON_BUFFER_LEN,OPH_DIM_TABLE_LABEL_MACRO,((OPH_DELETECONTAINER_operator_handle*)handle->operator_handle)->id_input_container); if (oph_dim_delete_table(db, index_dimension_table_name)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Error while deleting dimension table\n"); logging(LOG_ERROR, __FILE__, __LINE__, ((OPH_DELETECONTAINER_operator_handle*)handle->operator_handle)->id_input_container, OPH_LOG_OPH_DELETECONTAINER_DIM_TABLE_DELETE_ERROR ); oph_dim_disconnect_from_dbms(db->dbms_instance); oph_dim_unload_dim_dbinstance(db); return OPH_ANALYTICS_OPERATOR_MYSQL_ERROR; } if (oph_dim_delete_table(db, label_dimension_table_name)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Error while deleting dimension table\n"); logging(LOG_ERROR, __FILE__, __LINE__, ((OPH_DELETECONTAINER_operator_handle*)handle->operator_handle)->id_input_container, OPH_LOG_OPH_DELETECONTAINER_DIM_TABLE_DELETE_ERROR ); oph_dim_disconnect_from_dbms(db->dbms_instance); oph_dim_unload_dim_dbinstance(db); return OPH_ANALYTICS_OPERATOR_MYSQL_ERROR; } oph_dim_disconnect_from_dbms(db->dbms_instance); oph_dim_unload_dim_dbinstance(db); } else{ //Check if hidden container exists in folder if(oph_odb_fs_is_hidden_container(folder_id, container_name, oDB, &container_exists)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Unable to check output container\n"); logging(LOG_ERROR, __FILE__, __LINE__, id_container, OPH_LOG_OPH_DELETECONTAINER_OUTPUT_CONTAINER_ERROR_NO_CONTAINER, container_name, container_name ); return OPH_ANALYTICS_OPERATOR_UTILITY_ERROR; } if (container_exists) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Hidden container '%s' already exists in this folder\n", container_name); logging(LOG_ERROR, __FILE__, __LINE__, id_container, OPH_LOG_OPH_DELETECONTAINER_OUTPUT_CONTAINER_EXIST_ERROR, container_name, container_name ); return OPH_ANALYTICS_OPERATOR_INVALID_PARAM; } //If container exists then DELETE if(oph_odb_fs_set_container_hidden_status(id_container, 1, oDB)){ pmesg(LOG_ERROR, __FILE__, __LINE__, "Unable to delete logically container %s\n", container_name); logging(LOG_ERROR, __FILE__, __LINE__, id_container, OPH_LOG_OPH_DELETECONTAINER_UPDATE_CONTAINER_ERROR, container_name ); return OPH_ANALYTICS_OPERATOR_UTILITY_ERROR; } } return OPH_ANALYTICS_OPERATOR_SUCCESS; }
int task_execute(oph_operator_struct * handle) { if (!handle || !handle->operator_handle) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Null Handle\n"); logging(LOG_ERROR, __FILE__, __LINE__, OPH_GENERIC_CONTAINER_ID, OPH_LOG_OPH_RESTORECONTAINER_NULL_OPERATOR_HANDLE); return OPH_ANALYTICS_OPERATOR_NULL_OPERATOR_HANDLE; } //Only master process has to continue if (handle->proc_rank != 0) return OPH_ANALYTICS_OPERATOR_SUCCESS; char *container_name = ((OPH_RESTORECONTAINER_operator_handle *) handle->operator_handle)->container_output; int id_container_out = 0, container_exists = 0; ophidiadb *oDB = &((OPH_RESTORECONTAINER_operator_handle *) handle->operator_handle)->oDB; char *cwd = ((OPH_RESTORECONTAINER_operator_handle *) handle->operator_handle)->cwd; char *user = ((OPH_RESTORECONTAINER_operator_handle *) handle->operator_handle)->user; int permission = 0; int folder_id = 0; //Check if input path exists if ((oph_odb_fs_path_parsing("", cwd, &folder_id, NULL, oDB))) { //Check if user can work on datacube pmesg(LOG_ERROR, __FILE__, __LINE__, "Path %s doesn't exists\n", cwd); logging(LOG_ERROR, __FILE__, __LINE__, OPH_GENERIC_CONTAINER_ID, OPH_LOG_OPH_RESTORECONTAINER_CWD_ERROR, container_name, cwd); return OPH_ANALYTICS_OPERATOR_UTILITY_ERROR; } if ((oph_odb_fs_check_folder_session(folder_id, ((OPH_RESTORECONTAINER_operator_handle *) handle->operator_handle)->sessionid, oDB, &permission)) || !permission) { //Check if user can work on datacube pmesg(LOG_ERROR, __FILE__, __LINE__, "User %s is not allowed to work in this folder\n", user); logging(LOG_ERROR, __FILE__, __LINE__, OPH_GENERIC_CONTAINER_ID, OPH_LOG_OPH_RESTORECONTAINER_DATACUBE_PERMISSION_ERROR, container_name, user); return OPH_ANALYTICS_OPERATOR_UTILITY_ERROR; } if ((oph_odb_fs_retrieve_container_id_from_container_name(oDB, folder_id, container_name, 1, &id_container_out))) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Output container doesn't exist or it isn't hidden\n"); logging(LOG_ERROR, __FILE__, __LINE__, OPH_GENERIC_CONTAINER_ID, OPH_LOG_OPH_RESTORECONTAINER_OUTPUT_CONTAINER_EXIST_ERROR_NO_CONTAINER, container_name, container_name); return OPH_ANALYTICS_OPERATOR_UTILITY_ERROR; } if (id_container_out) { ((OPH_RESTORECONTAINER_operator_handle *) handle->operator_handle)->id_output_container = id_container_out; //Check if non-hidden container exists in folder if ((oph_odb_fs_check_if_container_not_present(oDB, container_name, folder_id, &container_exists))) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Unable to check output container\n"); logging(LOG_ERROR, __FILE__, __LINE__, id_container_out, OPH_LOG_OPH_RESTORECONTAINER_OUTPUT_CONTAINER_ERROR_NO_CONTAINER, container_name, container_name); return OPH_ANALYTICS_OPERATOR_UTILITY_ERROR; } if (container_exists) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Visible container '%s' already exists in this folder\n", container_name); logging(LOG_ERROR, __FILE__, __LINE__, id_container_out, OPH_LOG_OPH_RESTORECONTAINER_OUTPUT_CONTAINER_EXIST_ERROR, container_name, container_name); return OPH_ANALYTICS_OPERATOR_INVALID_PARAM; } //If container exists then restore if (oph_odb_fs_set_container_hidden_status(id_container_out, 0, oDB)) { pmesg(LOG_ERROR, __FILE__, __LINE__, "Unable to update container table\n"); logging(LOG_ERROR, __FILE__, __LINE__, id_container_out, OPH_LOG_OPH_RESTORECONTAINER_UPDATE_CONTAINER_ERROR, container_name); return OPH_ANALYTICS_OPERATOR_UTILITY_ERROR; } } return OPH_ANALYTICS_OPERATOR_SUCCESS; }