Ejemplo n.º 1
0
int irods_reli_rename   ( const char *host, const char *path, const char *newpath )
{
	dataObjCopyInp_t request;
	int result;

	/* rcDataObjRename does not have the Unix semantics of atomically
	   destroying the target file.  So, we must do it ourselves.
	*/

	irods_reli_unlink(host,newpath);

	struct irods_server *server = connect_to_host(host);
	if(!server) return -1;

	memset(&request,0,sizeof(request));
	strcpy(request.srcDataObjInp.objPath,path);
	strcpy(request.destDataObjInp.objPath,newpath);
	request.srcDataObjInp.oprType  = RENAME_DATA_OBJ;
	request.destDataObjInp.oprType = RENAME_DATA_OBJ;

	debug(D_IRODS,"rcDataObjRename %s %s %s",host,path,newpath);
	result = rcDataObjRename(server->conn,&request);
	debug(D_IRODS,"= %d",result);	

	if(result<0) {
		errno = irods_reli_errno(result);
		return -1;
	}

	return result;
}
Ejemplo n.º 2
0
int
mvObjUtil( rcComm_t *conn, char *srcPath, char *targPath, objType_t objType,
           rodsArguments_t *rodsArgs, dataObjCopyInp_t *dataObjRenameInp ) {
    int status;
    struct timeval startTime, endTime;

    if ( srcPath == NULL || targPath == NULL ) {
        rodsLog( LOG_ERROR,
                 "mvFileUtil: NULL srcPath or targPath incp" );
        return USER__NULL_INPUT_ERR;
    }

    if ( objType == DATA_OBJ_T ) {
        dataObjRenameInp->srcDataObjInp.oprType =
            dataObjRenameInp->destDataObjInp.oprType = RENAME_DATA_OBJ;
    }
    else if ( objType == COLL_OBJ_T ) {
        dataObjRenameInp->srcDataObjInp.oprType =
            dataObjRenameInp->destDataObjInp.oprType = RENAME_COLL;
    }
    else {
        /* should not be here */
        rodsLog( LOG_ERROR,
                 "mvObjUtil: invalid cp dest objType %d for %s",
                 objType, targPath );
        return USER_INPUT_PATH_ERR;
    }


    if ( rodsArgs->verbose == True ) {
        ( void ) gettimeofday( &startTime, ( struct timezone * )0 );
    }

    rstrcpy( dataObjRenameInp->destDataObjInp.objPath, targPath, MAX_NAME_LEN );
    rstrcpy( dataObjRenameInp->srcDataObjInp.objPath, srcPath, MAX_NAME_LEN );

    status = rcDataObjRename( conn, dataObjRenameInp );

    if ( status >= 0 && rodsArgs->verbose == True ) {
        ( void ) gettimeofday( &endTime, ( struct timezone * )0 );
        printTiming( conn, dataObjRenameInp->destDataObjInp.objPath,
                     0, NULL, &startTime, &endTime );
    }

    return status;
}
Ejemplo n.º 3
0
int RodsConnection::renameObj(RodsObjEntryPtr objEntry, const std::string &newName)
{
    int status = 0;
    dataObjCopyInp_t objRenameInp;
    std::string newObjPath;

    // sanity check, if name doesn't change nothing to do
    if (!objEntry->getObjectName().compare(newName))
        return (status);

    // construct new dest object path
    newObjPath = objEntry->getObjectBasePath() + "/" + newName;

    // zero rods api param struct
    memset(&objRenameInp, 0, sizeof (dataObjCopyInp_t));

    // set operation type
    if (objEntry->objType == DATA_OBJ_T)
        objRenameInp.srcDataObjInp.oprType = objRenameInp.destDataObjInp.oprType = RENAME_DATA_OBJ;

    else if (objEntry->objType == COLL_OBJ_T)
        objRenameInp.srcDataObjInp.oprType = objRenameInp.destDataObjInp.oprType = RENAME_COLL;

    // set source and target object paths
    rstrcpy(objRenameInp.srcDataObjInp.objPath, objEntry->getObjectFullPath().c_str(), MAX_NAME_LEN);
    rstrcpy(objRenameInp.destDataObjInp.objPath, newObjPath.c_str(), MAX_NAME_LEN);

    // try to execute rods api call
    if ((status = rcDataObjRename(this->rodsCommPtr, &objRenameInp)) >= 0)
    {
        // on success we update object name
        if (objEntry->objType == DATA_OBJ_T)
            objEntry->objName = newName;

        // for collection objects update botn coll path and object name attribute
        else if (objEntry->objType == COLL_OBJ_T)
        {
            objEntry->collPath = objEntry->objName = newObjPath;
        }
    }

    return (status);
}
Ejemplo n.º 4
0
int RodsConnection::moveObjToColl(RodsObjEntryPtr objEntry, const std::string &collPath)
{
    int status = 0;
    dataObjCopyInp_t objMoveInp;
    std::string newObjPath;

    // construct dest object path starting from new coll path
    newObjPath = collPath;

    // check for trailing slash
    if (collPath.find_last_of('/') != collPath.length())
        newObjPath += "/";

    newObjPath += objEntry->getObjectName();

    // zero rods api param struct
    memset(&objMoveInp, 0, sizeof (dataObjCopyInp_t));

    // set operation type
    if (objEntry->objType == DATA_OBJ_T)
        objMoveInp.srcDataObjInp.oprType = objMoveInp.destDataObjInp.oprType = RENAME_DATA_OBJ;

    else if (objEntry->objType == COLL_OBJ_T)
        objMoveInp.srcDataObjInp.oprType = objMoveInp.destDataObjInp.oprType = RENAME_COLL;

    // set source and target object paths
    rstrcpy(objMoveInp.srcDataObjInp.objPath, objEntry->getObjectFullPath().c_str(), MAX_NAME_LEN);
    rstrcpy(objMoveInp.destDataObjInp.objPath, newObjPath.c_str(), MAX_NAME_LEN);

    // try to execute rods api call (which is named somewhat incorrectly...)
    if ((status = rcDataObjRename(this->rodsCommPtr, &objMoveInp)) >= 0)
    {
        // on success we update th object entry
        objEntry->collPath = collPath;

        if (objEntry->objType == COLL_OBJ_T)
            objEntry->objName = collPath;
    }

    // return rods api status to caller
    return (status);
}
Ejemplo n.º 5
0
int
irodsRename (const char *from, const char *to)
{
    dataObjCopyInp_t dataObjRenameInp;
    int status;
    iFuseConn_t *iFuseConn = NULL;

    rodsLog (LOG_DEBUG, "irodsRename: %s to %s", from, to);

    /* test rcDataObjRename */

    memset (&dataObjRenameInp, 0, sizeof (dataObjRenameInp));

    status = parseRodsPathStr ((char *) (from + 1) , &MyRodsEnv,
                               dataObjRenameInp.srcDataObjInp.objPath);
    if (status < 0) {
        rodsLogError (LOG_ERROR, status,
                      "irodsRename: parseRodsPathStr of %s error", from);
        /* use ENOTDIR for this type of error */
        return -ENOTDIR;
    }

    status = parseRodsPathStr ((char *) (to + 1) , &MyRodsEnv,
                               dataObjRenameInp.destDataObjInp.objPath);
    if (status < 0) {
        rodsLogError (LOG_ERROR, status,
                      "irodsRename: parseRodsPathStr of %s error", to);
        /* use ENOTDIR for this type of error */
        return -ENOTDIR;
    }

    char *toIrodsPath = strdup(dataObjRenameInp.destDataObjInp.objPath);

    addKeyVal (&dataObjRenameInp.destDataObjInp.condInput, FORCE_FLAG_KW, "");

    dataObjRenameInp.srcDataObjInp.oprType =
        dataObjRenameInp.destDataObjInp.oprType = RENAME_UNKNOWN_TYPE;

    getAndUseIFuseConn (&iFuseConn, &MyRodsEnv);
    /*    rodsLog (LOG_ERROR, "irodsRenme: %s -> %s conn: %p", from, to, iFuseConn);*/

    status = rcDataObjRename (iFuseConn->conn, &dataObjRenameInp);

    if (status == CAT_NAME_EXISTS_AS_DATAOBJ ||
            status == SYS_DEST_SPEC_COLL_SUB_EXIST) {
        rcDataObjUnlink (iFuseConn->conn, &dataObjRenameInp.destDataObjInp);
        status = rcDataObjRename (iFuseConn->conn, &dataObjRenameInp);
    }

    if (status >= 0) {
#ifdef CACHE_FUSE_PATH
        status = renmeLocalPath ((char *) from, (char *) to, (char *) toIrodsPath);
#endif
    } else {
        if (isReadMsgError (status)) {
            ifuseReconnect (iFuseConn);
            status = rcDataObjRename (iFuseConn->conn, &dataObjRenameInp);
        }
        if (status < 0) {
            rodsLogError (LOG_ERROR, status,
                          "irodsRename: rcDataObjRename of %s to %s error", from, to);
            status = -ENOENT;
        }
    }
    unuseIFuseConn (iFuseConn);
    free(toIrodsPath);

    return (status);
}