コード例 #1
0
ファイル: collection.cpp プロジェクト: bpow/irods
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;
}
コード例 #2
0
ファイル: rsDataObjUnlink.c プロジェクト: UPPMAX/irods
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);
}
コード例 #3
0
ファイル: rsRmColl.cpp プロジェクト: bpow/irods
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;
}
コード例 #4
0
ファイル: rsDataObjUnlink.cpp プロジェクト: srfraser/irods
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;
}