int rsMkCollR( rsComm_t *rsComm, const char *startColl, const char *destColl ) { int status; int startLen; int pathLen, tmpLen; char tmpPath[MAX_NAME_LEN]; startLen = strlen( startColl ); pathLen = strlen( destColl ); rstrcpy( tmpPath, destColl, MAX_NAME_LEN ); tmpLen = pathLen; while ( tmpLen > startLen ) { if ( isCollAllKinds( rsComm, tmpPath, NULL ) >= 0 ) { break; } /* Go backward */ while ( tmpLen && tmpPath[tmpLen] != '/' ) { tmpLen --; } tmpPath[tmpLen] = '\0'; } /* Now we go forward and make the required coll */ while ( tmpLen < pathLen ) { collInp_t collCreateInp; /* Put back the '/' */ tmpPath[tmpLen] = '/'; memset( &collCreateInp, 0, sizeof( collCreateInp ) ); rstrcpy( collCreateInp.collName, tmpPath, MAX_NAME_LEN ); status = rsCollCreate( rsComm, &collCreateInp ); if ( status == CAT_NAME_EXISTS_AS_DATAOBJ && isTrashPath( tmpPath ) ) { /* name conflict with a data object in the trash collection */ dataObjCopyInp_t dataObjRenameInp; memset( &dataObjRenameInp, 0, sizeof( dataObjRenameInp ) ); dataObjRenameInp.srcDataObjInp.oprType = dataObjRenameInp.destDataObjInp.oprType = RENAME_DATA_OBJ; rstrcpy( dataObjRenameInp.srcDataObjInp.objPath, tmpPath, MAX_NAME_LEN ); rstrcpy( dataObjRenameInp.destDataObjInp.objPath, tmpPath, MAX_NAME_LEN ); appendRandomToPath( dataObjRenameInp.destDataObjInp.objPath ); status = rsDataObjRename( rsComm, &dataObjRenameInp ); if ( status >= 0 ) { status = rsCollCreate( rsComm, &collCreateInp ); } } /* something may be added by rsCollCreate */ clearKeyVal( &collCreateInp.condInput ); if ( status < 0 ) { // =-=-=-=-=-=-=- // JMC - backport 4819 if ( status == CATALOG_ALREADY_HAS_ITEM_BY_THAT_NAME ) { rodsLog( LOG_DEBUG, "rsMkCollR: rsCollCreate - coll %s already exist.stat = %d", tmpPath, status ); status = 0; } else { rodsLog( LOG_ERROR, "rsMkCollR: rsCollCreate failed for %s, status =%d", tmpPath, status ); } // =-=-=-=-=-=-=- return status; } while ( tmpLen && tmpPath[tmpLen] != '\0' ) { tmpLen ++; } } return 0; }
int rsMvDataObjToTrash (rsComm_t *rsComm, dataObjInp_t *dataObjInp, dataObjInfo_t **dataObjInfoHead) { int status; char trashPath[MAX_NAME_LEN]; dataObjCopyInp_t dataObjRenameInp; if (strstr ((*dataObjInfoHead)->dataType, BUNDLE_STR) != NULL) { return SYS_CANT_MV_BUNDLE_DATA_TO_TRASH; } if (getValByKey (&dataObjInp->condInput, DATA_ACCESS_KW) == NULL) { addKeyVal (&dataObjInp->condInput, DATA_ACCESS_KW, ACCESS_DELETE_OBJECT); } status = getDataObjInfo (rsComm, dataObjInp, dataObjInfoHead, ACCESS_DELETE_OBJECT, 0); if (status < 0) { rodsLog (LOG_NOTICE, "rsMvDataObjToTrash: getDataObjInfo error for %s. status = %d", dataObjInp->objPath, status); return (status); } status = chkPreProcDeleteRule (rsComm, dataObjInp, *dataObjInfoHead); if (status < 0) return status; #if 0 /* done in chkPreProcDeleteRule */ initReiWithDataObjInp (&rei, rsComm, dataObjInp); rei.doi = *dataObjInfoHead; status = applyRule ("acDataDeletePolicy", NULL, &rei, NO_SAVE_REI); if (status < 0 && status != NO_MORE_RULES_ERR && status != SYS_DELETE_DISALLOWED) { rodsLog (LOG_NOTICE, "rsMvDataObjToTrash: acDataDeletePolicy error for %s. status = %d", dataObjInp->objPath, status); return (status); } if (rei.status == SYS_DELETE_DISALLOWED) { rodsLog (LOG_NOTICE, "rsMvDataObjToTrash:disallowed for %s via DataDeletePolicy,status=%d", dataObjInp->objPath, rei.status); return (rei.status); } #endif status = rsMkTrashPath (rsComm, dataObjInp->objPath, trashPath); if (status < 0) { return (status); } memset (&dataObjRenameInp, 0, sizeof (dataObjRenameInp)); dataObjRenameInp.srcDataObjInp.oprType = dataObjRenameInp.destDataObjInp.oprType = RENAME_DATA_OBJ; rstrcpy (dataObjRenameInp.destDataObjInp.objPath, trashPath, MAX_NAME_LEN); rstrcpy (dataObjRenameInp.srcDataObjInp.objPath, dataObjInp->objPath, MAX_NAME_LEN); status = rsDataObjRename (rsComm, &dataObjRenameInp); while (status == CAT_NAME_EXISTS_AS_DATAOBJ || status == CAT_NAME_EXISTS_AS_COLLECTION || status == SYS_PHY_PATH_INUSE || getErrno (status) == EISDIR) { appendRandomToPath (dataObjRenameInp.destDataObjInp.objPath); status = rsDataObjRename (rsComm, &dataObjRenameInp); #if 0 if (status1 < 0) { rodsLog (LOG_ERROR, "rsMvDataObjToTrash: rsDataObjRename error for %s", dataObjRenameInp.destDataObjInp.objPath); } else { status = 0; } #endif } if (status < 0) { rodsLog (LOG_ERROR, "rsMvDataObjToTrash: rcDataObjRename error for %s, status = %d", dataObjRenameInp.destDataObjInp.objPath, status); return (status); } return (status); }
int rsMvCollToTrash( rsComm_t *rsComm, collInp_t *rmCollInp ) { int status; char trashPath[MAX_NAME_LEN]; dataObjCopyInp_t dataObjRenameInp; genQueryInp_t genQueryInp; genQueryOut_t *genQueryOut = NULL; int continueInx; dataObjInfo_t dataObjInfo; /* check permission of files */ memset( &genQueryInp, 0, sizeof( genQueryInp ) ); status = rsQueryDataObjInCollReCur( rsComm, rmCollInp->collName, &genQueryInp, &genQueryOut, ACCESS_DELETE_OBJECT, 0 ); memset( &dataObjInfo, 0, sizeof( dataObjInfo ) ); while ( status >= 0 ) { sqlResult_t *subColl, *dataObj, *rescName; ruleExecInfo_t rei; /* check if allow to delete */ if ( ( subColl = getSqlResultByInx( genQueryOut, COL_COLL_NAME ) ) == NULL ) { rodsLog( LOG_ERROR, "rsMvCollToTrash: getSqlResultByInx for COL_COLL_NAME failed" ); return UNMATCHED_KEY_OR_INDEX; } if ( ( dataObj = getSqlResultByInx( genQueryOut, COL_DATA_NAME ) ) == NULL ) { rodsLog( LOG_ERROR, "rsMvCollToTrash: getSqlResultByInx for COL_DATA_NAME failed" ); return UNMATCHED_KEY_OR_INDEX; } if ( ( rescName = getSqlResultByInx( genQueryOut, COL_D_RESC_NAME ) ) == NULL ) { rodsLog( LOG_ERROR, "rsMvCollToTrash: getSqlResultByInx for COL_D_RESC_NAME failed" ); return UNMATCHED_KEY_OR_INDEX; } snprintf( dataObjInfo.objPath, MAX_NAME_LEN, "%s/%s", subColl->value, dataObj->value ); rstrcpy( dataObjInfo.rescName, rescName->value, NAME_LEN ); initReiWithDataObjInp( &rei, rsComm, NULL ); rei.doi = &dataObjInfo; status = applyRule( "acDataDeletePolicy", NULL, &rei, NO_SAVE_REI ); if ( status < 0 && status != NO_MORE_RULES_ERR && status != SYS_DELETE_DISALLOWED ) { rodsLog( LOG_NOTICE, "rsMvCollToTrash: acDataDeletePolicy error for %s. status = %d", dataObjInfo.objPath, status ); return status; } if ( rei.status == SYS_DELETE_DISALLOWED ) { rodsLog( LOG_NOTICE, "rsMvCollToTrash:disallowed for %s via DataDeletePolicy,status=%d", dataObjInfo.objPath, rei.status ); return rei.status; } continueInx = genQueryOut->continueInx; freeGenQueryOut( &genQueryOut ); if ( continueInx > 0 ) { /* More to come */ genQueryInp.continueInx = continueInx; status = rsGenQuery( rsComm, &genQueryInp, &genQueryOut ); } else { break; } } if ( status < 0 && status != CAT_NO_ROWS_FOUND ) { rodsLog( LOG_ERROR, "rsMvCollToTrash: rsQueryDataObjInCollReCur error for %s, stat=%d", rmCollInp->collName, status ); return status; } status = rsMkTrashPath( rsComm, rmCollInp->collName, trashPath ); if ( status < 0 ) { appendRandomToPath( trashPath ); status = rsMkTrashPath( rsComm, rmCollInp->collName, trashPath ); if ( status < 0 ) { return status; } } memset( &dataObjRenameInp, 0, sizeof( dataObjRenameInp ) ); dataObjRenameInp.srcDataObjInp.oprType = dataObjRenameInp.destDataObjInp.oprType = RENAME_COLL; rstrcpy( dataObjRenameInp.destDataObjInp.objPath, trashPath, MAX_NAME_LEN ); rstrcpy( dataObjRenameInp.srcDataObjInp.objPath, rmCollInp->collName, MAX_NAME_LEN ); status = rsDataObjRename( rsComm, &dataObjRenameInp ); while ( status == CAT_NAME_EXISTS_AS_COLLECTION ) { appendRandomToPath( dataObjRenameInp.destDataObjInp.objPath ); status = rsDataObjRename( rsComm, &dataObjRenameInp ); } if ( status < 0 ) { rodsLog( LOG_ERROR, "mvCollToTrash: rcDataObjRename error for %s, status = %d", dataObjRenameInp.destDataObjInp.objPath, status ); return status; } return status; }
int rsMvDataObjToTrash( rsComm_t *rsComm, dataObjInp_t *dataObjInp, dataObjInfo_t **dataObjInfoHead ) { int status; char trashPath[MAX_NAME_LEN]; dataObjCopyInp_t dataObjRenameInp; if ( strstr( ( *dataObjInfoHead )->dataType, BUNDLE_STR ) != NULL ) { // JMC - backport 4658 return SYS_CANT_MV_BUNDLE_DATA_TO_TRASH; } if ( getValByKey( &dataObjInp->condInput, DATA_ACCESS_KW ) == NULL ) { addKeyVal( &dataObjInp->condInput, DATA_ACCESS_KW, ACCESS_DELETE_OBJECT ); } status = getDataObjInfo( rsComm, dataObjInp, dataObjInfoHead, ACCESS_DELETE_OBJECT, 0 ); if ( status < 0 ) { rodsLog( LOG_NOTICE, "rsMvDataObjToTrash: getDataObjInfo error for %s. status = %d", dataObjInp->objPath, status ); return status; } status = chkPreProcDeleteRule( rsComm, dataObjInp, *dataObjInfoHead ); if ( status < 0 ) { return status; } status = rsMkTrashPath( rsComm, dataObjInp->objPath, trashPath ); if ( status < 0 ) { return status; } memset( &dataObjRenameInp, 0, sizeof( dataObjRenameInp ) ); dataObjRenameInp.srcDataObjInp.oprType = dataObjRenameInp.destDataObjInp.oprType = RENAME_DATA_OBJ; rstrcpy( dataObjRenameInp.destDataObjInp.objPath, trashPath, MAX_NAME_LEN ); rstrcpy( dataObjRenameInp.srcDataObjInp.objPath, dataObjInp->objPath, MAX_NAME_LEN ); status = rsDataObjRename( rsComm, &dataObjRenameInp ); while ( status == CAT_NAME_EXISTS_AS_DATAOBJ || status == CAT_NAME_EXISTS_AS_COLLECTION || status == SYS_PHY_PATH_INUSE || getErrno( status ) == EISDIR ) { appendRandomToPath( dataObjRenameInp.destDataObjInp.objPath ); status = rsDataObjRename( rsComm, &dataObjRenameInp ); } if ( status < 0 ) { rodsLog( LOG_ERROR, "rsMvDataObjToTrash: rcDataObjRename error for %s, status = %d", dataObjRenameInp.destDataObjInp.objPath, status ); return status; } return status; }