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
00086 dataObjTruncateS (rsComm_t *rsComm, dataObjInp_t *dataObjTruncateInp,
00087 dataObjInfo_t *dataObjInfo)
00088 {
00089 int status;
00090 keyValPair_t regParam;
00091 modDataObjMeta_t modDataObjMetaInp;
00092 char tmpStr[MAX_NAME_LEN];
00093
00094 if (dataObjInfo->dataSize == dataObjTruncateInp->dataSize) return 0;
00095
00096
00097 if (strcmp (dataObjInfo->rescInfo->rescName, BUNDLE_RESC) == 0) return 0;
00098
00099 status = l3Truncate (rsComm, dataObjTruncateInp, dataObjInfo);
00100
00101 if (status < 0) {
00102 int myError = getErrno (status);
00103 rodsLog (LOG_NOTICE,
00104 "dataObjTruncateS: l3Truncate error for %s. status = %d",
00105 dataObjTruncateInp->objPath, status);
00106
00107 if (myError != ENOENT && myError != EACCES) {
00108 return (status);
00109 }
00110 }
00111
00112 if (dataObjInfo->specColl == NULL) {
00113
00114
00115 memset (®Param, 0, sizeof (regParam));
00116 memset (&modDataObjMetaInp, 0, sizeof (modDataObjMetaInp));
00117
00118 snprintf (tmpStr, MAX_NAME_LEN, "%lld", dataObjTruncateInp->dataSize);
00119 addKeyVal (®Param, DATA_SIZE_KW, tmpStr);
00120 addKeyVal (®Param, CHKSUM_KW, "");
00121
00122 modDataObjMetaInp.dataObjInfo = dataObjInfo;
00123 modDataObjMetaInp.regParam = ®Param;
00124 status = rsModDataObjMeta (rsComm, &modDataObjMetaInp);
00125 clearKeyVal (®Param);
00126 if (status < 0) {
00127 rodsLog (LOG_NOTICE,
00128 "dataObjTruncateS: rsModDataObjMeta error for %s. status = %d",
00129 dataObjTruncateInp->objPath, status);
00130 }
00131 }
00132 return (status);
00133 }
00134
00135 int
00136 l3Truncate (rsComm_t *rsComm, dataObjInp_t *dataObjTruncateInp,
00137 dataObjInfo_t *dataObjInfo)
00138 {
00139 int rescTypeInx;
00140 fileOpenInp_t fileTruncateInp;
00141 int status;
00142
00143
00144
00145 std::string location;
00146 eirods::error ret = eirods::get_loc_for_hier_string( dataObjInfo->rescHier, location );
00147 if( !ret.ok() ) {
00148 eirods::log( PASSMSG( "l3Truncate - failed in get_loc_for_hier_String", ret ) );
00149 return -1;
00150 }
00151
00152
00153 if (getStructFileType (dataObjInfo->specColl) >= 0) {
00154 subFile_t subFile;
00155 memset (&subFile, 0, sizeof (subFile));
00156 rstrcpy (subFile.subFilePath, dataObjInfo->subPath,MAX_NAME_LEN);
00157 rstrcpy (subFile.addr.hostAddr, location.c_str(), NAME_LEN);
00158 subFile.specColl = dataObjInfo->specColl;
00159 subFile.offset = dataObjTruncateInp->dataSize;
00160 status = rsSubStructFileTruncate (rsComm, &subFile);
00161 } else {
00162 #if 0 // JMC legacy resource
00163 rescTypeInx = dataObjInfo->rescInfo->rescTypeInx;
00164
00165 switch (RescTypeDef[rescTypeInx].rescCat) {
00166 case FILE_CAT:
00167 #endif // JMC legacy resource
00168 memset (&fileTruncateInp, 0, sizeof (fileTruncateInp));
00169 fileTruncateInp.fileType = static_cast<fileDriverType_t>(-1);
00170 rstrcpy (fileTruncateInp.fileName, dataObjInfo->filePath, MAX_NAME_LEN);
00171 rstrcpy (fileTruncateInp.resc_hier_, dataObjInfo->rescHier, MAX_NAME_LEN);
00172 rstrcpy (fileTruncateInp.addr.hostAddr, location.c_str(), NAME_LEN);
00173 fileTruncateInp.dataSize = dataObjTruncateInp->dataSize;
00174 status = rsFileTruncate (rsComm, &fileTruncateInp);
00175 #if 0 // JMC legacy resource
00176 break;
00177
00178 default:
00179 rodsLog (LOG_NOTICE,
00180 "l3Truncate: rescCat type %d is not recognized",
00181 RescTypeDef[rescTypeInx].rescCat);
00182 status = SYS_INVALID_RESC_TYPE;
00183 break;
00184 }
00185 #endif // JMC legacy resource
00186 }
00187 return (status);
00188 }
00189