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; }
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; }
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); }
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); }
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); }