Пример #1
0
int
collStatAllKinds( rsComm_t *rsComm, dataObjInp_t *dataObjInp,
                  rodsObjStat_t **rodsObjStatOut ) {
    int status;

    *rodsObjStatOut = NULL;
    addKeyVal( &dataObjInp->condInput, SEL_OBJ_TYPE_KW, "collection" );
    status = _rsObjStat( rsComm, dataObjInp, rodsObjStatOut );
    rmKeyVal( &dataObjInp->condInput, SEL_OBJ_TYPE_KW );
    if ( status >= 0 ) {
        if ( ( *rodsObjStatOut )->objType != COLL_OBJ_T ) {
            status = OBJ_PATH_DOES_NOT_EXIST;
        }
    }
    if ( status < 0 && *rodsObjStatOut != NULL ) {
        freeRodsObjStat( *rodsObjStatOut );
        *rodsObjStatOut = NULL;
    }
    return status;
}
Пример #2
0
int
rsObjStat (rsComm_t *rsComm, dataObjInp_t *dataObjInp,
rodsObjStat_t **rodsObjStatOut)
{
    int status;
    rodsServerHost_t *rodsServerHost = NULL;
    specCollCache_t *specCollCache = NULL;
    int linkCnt;

    linkCnt = resolveLinkedPath (rsComm, dataObjInp->objPath, &specCollCache, 
      NULL);

    *rodsObjStatOut = NULL;
    status = getAndConnRcatHost (rsComm, SLAVE_RCAT, dataObjInp->objPath,
      &rodsServerHost);
    if (status < 0) {
       return(status);
    }
    if (rodsServerHost->localFlag == LOCAL_HOST) {
#ifdef RODS_CAT
        status = _rsObjStat (rsComm, dataObjInp, rodsObjStatOut);
#else
        status = SYS_NO_RCAT_SERVER_ERR;
#endif
    } else {
	if (isLocalZone (dataObjInp->objPath)) {
	    /* Since the iCat is on a remote host, see if it is a sub path of 
             * a cached specColl locally first. If it is, it will save time 
             * resolving it */
            status = statPathInSpecColl (rsComm, dataObjInp->objPath, 1,
              rodsObjStatOut);
	    if (status >= 0) {
		/* the path is in a specColl */
		return status;
	    } else if (status != SYS_SPEC_COLL_NOT_IN_CACHE) {
		/* path is in the path of specColl cache but does not exist */
                if (linkCnt > 0 && *rodsObjStatOut != NULL) {
		    /* a soft link - returns specColl */
                    if ((*rodsObjStatOut)->specColl == NULL) {
                        replSpecColl (&specCollCache->specColl,
                          &(*rodsObjStatOut)->specColl);
                    }
                    rstrcpy ((*rodsObjStatOut)->specColl->objPath, 
		      dataObjInp->objPath, MAX_NAME_LEN);
                }
		return status;
	    }
	    /* falls through if the path is not in a cached specColl */
	}
	/* not in cache, need to do a remote call */
        status = rcObjStat (rodsServerHost->conn, dataObjInp, 
	  rodsObjStatOut);
	if (status >= 0 && (*rodsObjStatOut)->specColl != NULL) {
	    /* queue it in cache */
	    queueSpecCollCacheWithObjStat (*rodsObjStatOut);
	}
    }

    if (linkCnt > 0 && *rodsObjStatOut != NULL) {
	/* fill in (*rodsObjStatOut)->specColl if it is linked */
        if ((*rodsObjStatOut)->specColl == NULL) {
            replSpecColl (&specCollCache->specColl,
              &(*rodsObjStatOut)->specColl);
	}
	rstrcpy ((*rodsObjStatOut)->specColl->objPath, dataObjInp->objPath, 
	  MAX_NAME_LEN);
    }
    return (status);
}