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 int
00024 rsDataObjTruncate (rsComm_t *rsComm, dataObjInp_t *dataObjTruncateInp)
00025 {
00026 int status;
00027 dataObjInfo_t *dataObjInfoHead = NULL;
00028 int remoteFlag;
00029 rodsServerHost_t *rodsServerHost;
00030
00031 remoteFlag = getAndConnRemoteZone (rsComm, dataObjTruncateInp,
00032 &rodsServerHost, REMOTE_OPEN);
00033
00034 if (remoteFlag < 0) {
00035 return (remoteFlag);
00036 } else if (remoteFlag == REMOTE_HOST) {
00037 status = rcDataObjTruncate (rodsServerHost->conn, dataObjTruncateInp);
00038 return status;
00039 }
00040
00041 dataObjTruncateInp->openFlags = O_WRONLY;
00042 status = getDataObjInfoIncSpecColl (rsComm, dataObjTruncateInp,
00043 &dataObjInfoHead);
00044
00045 if (status < 0) return (status);
00046
00047 status = _rsDataObjTruncate (rsComm, dataObjTruncateInp, dataObjInfoHead);
00048
00049 return (status);
00050
00051 }
00052
00053 int
00054 _rsDataObjTruncate (rsComm_t *rsComm, dataObjInp_t *dataObjTruncateInp,
00055 dataObjInfo_t *dataObjInfoHead)
00056 {
00057 int status;
00058 int retVal = 0;
00059 dataObjInfo_t *tmpDataObjInfo;
00060
00061 tmpDataObjInfo = dataObjInfoHead;
00062 while (tmpDataObjInfo != NULL) {
00063 status = dataObjTruncateS (rsComm, dataObjTruncateInp, tmpDataObjInfo);
00064 if (status < 0) {
00065 if (retVal == 0) {
00066 retVal = status;
00067 }
00068 }
00069 if (dataObjTruncateInp->specColl != NULL)
00070 break;
00071 tmpDataObjInfo = tmpDataObjInfo->next;
00072 }
00073
00074 freeAllDataObjInfo (dataObjInfoHead);
00075
00076 return (retVal);
00077 }
00078
00079 int
00080 dataObjTruncateS (rsComm_t *rsComm, dataObjInp_t *dataObjTruncateInp,
00081 dataObjInfo_t *dataObjInfo)
00082 {
00083 int status;
00084 keyValPair_t regParam;
00085 modDataObjMeta_t modDataObjMetaInp;
00086 char tmpStr[MAX_NAME_LEN];
00087
00088 if (dataObjInfo->dataSize == dataObjTruncateInp->dataSize) return 0;
00089
00090
00091 if (strcmp (dataObjInfo->rescInfo->rescName, BUNDLE_RESC) == 0) return 0;
00092
00093 status = l3Truncate (rsComm, dataObjTruncateInp, dataObjInfo);
00094
00095 if (status < 0) {
00096 int myError = getErrno (status);
00097 rodsLog (LOG_NOTICE,
00098 "dataObjTruncateS: l3Truncate error for %s. status = %d",
00099 dataObjTruncateInp->objPath, status);
00100
00101 if (myError != ENOENT && myError != EACCES) {
00102 return (status);
00103 }
00104 }
00105
00106 if (dataObjInfo->specColl == NULL) {
00107
00108
00109 memset (®Param, 0, sizeof (regParam));
00110 memset (&modDataObjMetaInp, 0, sizeof (modDataObjMetaInp));
00111
00112 snprintf (tmpStr, MAX_NAME_LEN, "%lld", dataObjTruncateInp->dataSize);
00113 addKeyVal (®Param, DATA_SIZE_KW, tmpStr);
00114 addKeyVal (®Param, CHKSUM_KW, "");
00115
00116 modDataObjMetaInp.dataObjInfo = dataObjInfo;
00117 modDataObjMetaInp.regParam = ®Param;
00118 status = rsModDataObjMeta (rsComm, &modDataObjMetaInp);
00119 clearKeyVal (®Param);
00120 if (status < 0) {
00121 rodsLog (LOG_NOTICE,
00122 "dataObjTruncateS: rsModDataObjMeta error for %s. status = %d",
00123 dataObjTruncateInp->objPath, status);
00124 }
00125 }
00126 return (status);
00127 }
00128
00129 int
00130 l3Truncate (rsComm_t *rsComm, dataObjInp_t *dataObjTruncateInp,
00131 dataObjInfo_t *dataObjInfo)
00132 {
00133 int rescTypeInx;
00134 fileOpenInp_t fileTruncateInp;
00135 int status;
00136
00137 if (getStructFileType (dataObjInfo->specColl) >= 0) {
00138 subFile_t subFile;
00139 memset (&subFile, 0, sizeof (subFile));
00140 rstrcpy (subFile.subFilePath, dataObjInfo->subPath,
00141 MAX_NAME_LEN);
00142 rstrcpy (subFile.addr.hostAddr, dataObjInfo->rescInfo->rescLoc,
00143 NAME_LEN);
00144 subFile.specColl = dataObjInfo->specColl;
00145 subFile.offset = dataObjTruncateInp->dataSize;
00146 status = rsSubStructFileTruncate (rsComm, &subFile);
00147 } else {
00148 rescTypeInx = dataObjInfo->rescInfo->rescTypeInx;
00149
00150 switch (RescTypeDef[rescTypeInx].rescCat) {
00151 case FILE_CAT:
00152 memset (&fileTruncateInp, 0, sizeof (fileTruncateInp));
00153 fileTruncateInp.fileType = (fileDriverType_t)RescTypeDef[rescTypeInx].driverType;
00154 rstrcpy (fileTruncateInp.fileName, dataObjInfo->filePath,
00155 MAX_NAME_LEN);
00156 rstrcpy (fileTruncateInp.addr.hostAddr,
00157 dataObjInfo->rescInfo->rescLoc, NAME_LEN);
00158 fileTruncateInp.dataSize = dataObjTruncateInp->dataSize;
00159 status = rsFileTruncate (rsComm, &fileTruncateInp);
00160 break;
00161
00162 default:
00163 rodsLog (LOG_NOTICE,
00164 "l3Truncate: rescCat type %d is not recognized",
00165 RescTypeDef[rescTypeInx].rescCat);
00166 status = SYS_INVALID_RESC_TYPE;
00167 break;
00168 }
00169 }
00170 return (status);
00171 }
00172