Ejemplo n.º 1
0
int
_l3DataPutSingleBuf( rsComm_t *rsComm, int l1descInx, dataObjInp_t *dataObjInp,
                     bytesBuf_t *dataObjInpBBuf ) {
    int status = 0;
    int bytesWritten;
    dataObjInfo_t *myDataObjInfo;

    myDataObjInfo = L1desc[l1descInx].dataObjInfo;

    bytesWritten = l3FilePutSingleBuf( rsComm, l1descInx, dataObjInpBBuf );
    if ( bytesWritten >= 0 ) {
        if ( L1desc[l1descInx].replStatus == NEWLY_CREATED_COPY &&
                myDataObjInfo->specColl == NULL &&
                L1desc[l1descInx].remoteZoneHost == NULL ) {
            /* the check for remoteZoneHost host is not needed because
             * the put would have done in the remote zone. But it make
             * the code easier to read (similar ro copy).
             */
            status = svrRegDataObj( rsComm, myDataObjInfo );
            if ( status < 0 ) {
                rodsLog( LOG_NOTICE,
                         "l3DataPutSingleBuf: rsRegDataObj for %s failed, status = %d",
                         myDataObjInfo->objPath, status );
                if ( status != CATALOG_ALREADY_HAS_ITEM_BY_THAT_NAME ) {
                    l3Unlink( rsComm, myDataObjInfo );
                }
                return ( status );
            }
            else {
                myDataObjInfo->replNum = status;
            }
        }
        /* myDataObjInfo->dataSize = bytesWritten; update size problem */
        if ( bytesWritten == 0 && myDataObjInfo->dataSize > 0 ) {
            /* overwrite with 0 len file */
            L1desc[l1descInx].bytesWritten = 1;
        }
        else {
            L1desc[l1descInx].bytesWritten = bytesWritten;
        }
    }
    L1desc[l1descInx].dataSize = dataObjInp->dataSize;

    return ( bytesWritten );
}
Ejemplo n.º 2
0
int
_l3DataPutSingleBuf( rsComm_t *rsComm, int l1descInx, dataObjInp_t *dataObjInp,
                     bytesBuf_t *dataObjInpBBuf ) {
    int status = 0;
    dataObjInfo_t *myDataObjInfo = L1desc[l1descInx].dataObjInfo;

    int bytesWritten = l3FilePutSingleBuf( rsComm, l1descInx, dataObjInpBBuf );
    if ( bytesWritten >= 0 ) {
        if ( L1desc[l1descInx].replStatus == NEWLY_CREATED_COPY &&
                myDataObjInfo->specColl == NULL &&
                L1desc[l1descInx].remoteZoneHost == NULL ) {

            /* the check for remoteZoneHost host is not needed because
             * the put would have done in the remote zone. But it make
             * the code easier to read (similar ro copy).
             */
            status = svrRegDataObj( rsComm, myDataObjInfo );
            if ( status < 0 ) {
                rodsLog( LOG_NOTICE,
                         "l3DataPutSingleBuf: rsRegDataObj for %s failed, status = %d",
                         myDataObjInfo->objPath, status );
                if ( status != CATALOG_ALREADY_HAS_ITEM_BY_THAT_NAME ) {
                    l3Unlink( rsComm, myDataObjInfo );
                }
                return status;
            }
            else {
                myDataObjInfo->replNum = status;
            }

        }
        /* myDataObjInfo->dataSize = bytesWritten; update size problem */
        if ( bytesWritten == 0 && myDataObjInfo->dataSize > 0 ) {
            /* overwrite with 0 len file */
            L1desc[l1descInx].bytesWritten = 1;
        }
        else {
            L1desc[l1descInx].bytesWritten = bytesWritten;
        }

        // special case of zero length files, trigger the fileModified
        // operation for execution of coordinating resource logic
        if ( 0 == dataObjInp->dataSize ) {
            irods::file_object_ptr file_obj(
                new irods::file_object(
                    rsComm,
                    myDataObjInfo ) );

            char* pdmo_kw = getValByKey( &myDataObjInfo->condInput, IN_PDMO_KW );
            if ( pdmo_kw != NULL ) {
                file_obj->in_pdmo( pdmo_kw );
            }
            irods::error ret = fileModified( rsComm, file_obj );
            if ( !ret.ok() ) {
                std::stringstream msg;
                msg << "fileModified failed for [";
                msg << myDataObjInfo->objPath;
                msg << "]";
                ret = PASSMSG( msg.str(), ret );
                irods::log( ret );
                status = ret.code();
            }
        }
    }

    L1desc[l1descInx].dataSize = dataObjInp->dataSize;

    return bytesWritten;
}