00001
00002
00003
00004
00005
00006 #include "dataObjTruncate.h"
00007 #include "rodsLog.h"
00008 #include "icatDefines.h"
00009 #include "fileTruncate.h"
00010 #include "unregDataObj.h"
00011 #include "objMetaOpr.h"
00012 #include "dataObjOpr.h"
00013 #include "rsGlobalExtern.h"
00014 #include "rcGlobalExtern.h"
00015 #include "reGlobalsExtern.h"
00016 #include "reDefines.h"
00017 #include "rmColl.h"
00018 #include "modDataObjMeta.h"
00019 #include "subStructFileTruncate.h"
00020 #include "getRemoteZoneResc.h"
00021 #include "phyBundleColl.h"
00022
00023
00024
00025 #include "eirods_resource_backport.h"
00026
00027
00028
00029 int
00030 rsDataObjTruncate (rsComm_t *rsComm, dataObjInp_t *dataObjTruncateInp)
00031 {
00032 int status;
00033 dataObjInfo_t *dataObjInfoHead = NULL;
00034 int remoteFlag;
00035 rodsServerHost_t *rodsServerHost;
00036
00037 remoteFlag = getAndConnRemoteZone (rsComm, dataObjTruncateInp,
00038 &rodsServerHost, REMOTE_OPEN);
00039
00040 if (remoteFlag < 0) {
00041 return (remoteFlag);
00042 } else if (remoteFlag == REMOTE_HOST) {
00043 status = rcDataObjTruncate (rodsServerHost->conn, dataObjTruncateInp);
00044 return status;
00045 }
00046
00047 dataObjTruncateInp->openFlags = O_WRONLY;
00048 status = getDataObjInfoIncSpecColl (rsComm, dataObjTruncateInp,
00049 &dataObjInfoHead);
00050
00051 if (status < 0) return (status);
00052
00053 status = _rsDataObjTruncate (rsComm, dataObjTruncateInp, dataObjInfoHead);
00054
00055 return (status);
00056
00057 }
00058
00059 int
00060 _rsDataObjTruncate (rsComm_t *rsComm, dataObjInp_t *dataObjTruncateInp,
00061 dataObjInfo_t *dataObjInfoHead)
00062 {
00063 int status;
00064 int retVal = 0;
00065 dataObjInfo_t *tmpDataObjInfo;
00066
00067 tmpDataObjInfo = dataObjInfoHead;
00068 while (tmpDataObjInfo != NULL) {
00069 status = dataObjTruncateS (rsComm, dataObjTruncateInp, tmpDataObjInfo);
00070 if (status < 0) {
00071 if (retVal == 0) {
00072 retVal = status;
00073 }
00074 }
00075 if (dataObjTruncateInp->specColl != NULL)
00076 break;
00077 tmpDataObjInfo = tmpDataObjInfo->next;
00078 }
00079
00080 freeAllDataObjInfo (dataObjInfoHead);
00081
00082 return (retVal);
00083 }
00084
00085 int dataObjTruncateS (rsComm_t *rsComm, dataObjInp_t *dataObjTruncateInp,
00086 dataObjInfo_t *dataObjInfo)
00087 {
00088 int status;
00089 keyValPair_t regParam;
00090 modDataObjMeta_t modDataObjMetaInp;
00091 char tmpStr[MAX_NAME_LEN];
00092
00093 if (dataObjInfo->dataSize == dataObjTruncateInp->dataSize) return 0;
00094
00095
00096 if (strcmp (dataObjInfo->rescInfo->rescName, BUNDLE_RESC) == 0) return 0;
00097
00098 status = l3Truncate (rsComm, dataObjTruncateInp, dataObjInfo);
00099
00100 if (status < 0) {
00101 int myError = getErrno (status);
00102 rodsLog (LOG_NOTICE,
00103 "dataObjTruncateS: l3Truncate error for %s. status = %d",
00104 dataObjTruncateInp->objPath, status);
00105
00106 if (myError != ENOENT && myError != EACCES) {
00107 return (status);
00108 }
00109 }
00110
00111 if (dataObjInfo->specColl == NULL) {
00112
00113
00114 memset (®Param, 0, sizeof (regParam));
00115 memset (&modDataObjMetaInp, 0, sizeof (modDataObjMetaInp));
00116
00117 snprintf (tmpStr, MAX_NAME_LEN, "%lld", dataObjTruncateInp->dataSize);
00118 addKeyVal (®Param, DATA_SIZE_KW, tmpStr);
00119 addKeyVal (®Param, CHKSUM_KW, "");
00120
00121 modDataObjMetaInp.dataObjInfo = dataObjInfo;
00122 modDataObjMetaInp.regParam = ®Param;
00123 status = rsModDataObjMeta (rsComm, &modDataObjMetaInp);
00124 clearKeyVal (®Param);
00125 if (status < 0) {
00126 rodsLog (LOG_NOTICE,
00127 "dataObjTruncateS: rsModDataObjMeta error for %s. status = %d",
00128 dataObjTruncateInp->objPath, status);
00129 }
00130 }
00131 return (status);
00132 }
00133
00134 int
00135 l3Truncate (rsComm_t *rsComm, dataObjInp_t *dataObjTruncateInp,
00136 dataObjInfo_t *dataObjInfo)
00137 {
00138 fileOpenInp_t fileTruncateInp;
00139 int status;
00140
00141
00142
00143 std::string location;
00144 eirods::error ret = eirods::get_loc_for_hier_string( dataObjInfo->rescHier, location );
00145 if( !ret.ok() ) {
00146 eirods::log( PASSMSG( "l3Truncate - failed in get_loc_for_hier_String", ret ) );
00147 return -1;
00148 }
00149
00150
00151 if (getStructFileType (dataObjInfo->specColl) >= 0) {
00152 subFile_t subFile;
00153 memset (&subFile, 0, sizeof (subFile));
00154 rstrcpy (subFile.subFilePath, dataObjInfo->subPath,MAX_NAME_LEN);
00155 rstrcpy (subFile.addr.hostAddr, location.c_str(), NAME_LEN);
00156 subFile.specColl = dataObjInfo->specColl;
00157 subFile.offset = dataObjTruncateInp->dataSize;
00158 status = rsSubStructFileTruncate (rsComm, &subFile);
00159 } else {
00160 memset (&fileTruncateInp, 0, sizeof (fileTruncateInp));
00161 fileTruncateInp.fileType = static_cast<fileDriverType_t>(-1);
00162 rstrcpy (fileTruncateInp.fileName, dataObjInfo->filePath, MAX_NAME_LEN);
00163 rstrcpy (fileTruncateInp.resc_hier_, dataObjInfo->rescHier, MAX_NAME_LEN);
00164 rstrcpy (fileTruncateInp.addr.hostAddr, location.c_str(), NAME_LEN);
00165 fileTruncateInp.dataSize = dataObjTruncateInp->dataSize;
00166 status = rsFileTruncate (rsComm, &fileTruncateInp);
00167 }
00168 return (status);
00169 }
00170