00001
00002
00003
00004
00005
00006
00007 #include "dataObjTrim.h"
00008 #include "dataObjUnlink.h"
00009 #include "dataObjOpr.h"
00010 #include "rodsLog.h"
00011 #include "objMetaOpr.h"
00012 #include "specColl.h"
00013 #include "reGlobalsExtern.h"
00014 #include "reDefines.h"
00015 #include "reSysDataObjOpr.h"
00016 #include "getRemoteZoneResc.h"
00017
00018
00019
00020 #include "eirods_resource_redirect.h"
00021 #include "eirods_hierarchy_parser.h"
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 int
00033 rsDataObjTrim (rsComm_t *rsComm, dataObjInp_t *dataObjInp)
00034 {
00035 int status;
00036 dataObjInfo_t *dataObjInfoHead = NULL;
00037 dataObjInfo_t *tmpDataObjInfo;
00038 char *accessPerm;
00039 int retVal = 0;
00040 int remoteFlag;
00041 rodsServerHost_t *rodsServerHost;
00042 specCollCache_t *specCollCache = NULL;
00043 int myTime = 0;
00044 char *tmpStr;
00045 int myAge;
00046
00047 resolveLinkedPath (rsComm, dataObjInp->objPath, &specCollCache,
00048 &dataObjInp->condInput);
00049 remoteFlag = getAndConnRemoteZone (rsComm, dataObjInp, &rodsServerHost,
00050 REMOTE_OPEN);
00051
00052 if (remoteFlag < 0) {
00053 return (remoteFlag);
00054 } else if (remoteFlag == REMOTE_HOST) {
00055 status = rcDataObjTrim (rodsServerHost->conn, dataObjInp);
00056 return status;
00057 }
00058
00059
00060
00061
00062
00063 std::string hier;
00064 int local = LOCAL_HOST;
00065 rodsServerHost_t* host = 0;
00066 char* hier_char = getValByKey( &dataObjInp->condInput, RESC_HIER_STR_KW );
00067 if( hier_char == NULL ) {
00068
00069 addKeyVal(&dataObjInp->condInput, IN_REPL_KW, "");
00070 eirods::error ret = eirods::resource_redirect( eirods::EIRODS_CREATE_OPERATION, rsComm,
00071 dataObjInp, hier, host, local );
00072 if( !ret.ok() ) {
00073 std::stringstream msg;
00074 msg << __FUNCTION__;
00075 msg << " :: failed in eirods::resource_redirect for [";
00076 msg << dataObjInp->objPath << "]";
00077 eirods::log( PASSMSG( msg.str(), ret ) );
00078 return ret.code();
00079 }
00080
00081
00082
00083 addKeyVal( &dataObjInp->condInput, RESC_HIER_STR_KW, hier.c_str() );
00084
00085 }
00086
00087 if (getValByKey (&dataObjInp->condInput, IRODS_ADMIN_KW) != NULL) {
00088 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
00089 return (CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
00090 }
00091 accessPerm = NULL;
00092 } else {
00093 accessPerm = ACCESS_DELETE_OBJECT;
00094 }
00095
00096 status = getDataObjInfo (rsComm, dataObjInp, &dataObjInfoHead,
00097 accessPerm, 1);
00098
00099 if (status < 0) {
00100 rodsLog (LOG_ERROR,
00101 "rsDataObjTrim: getDataObjInfo for %s", dataObjInp->objPath);
00102 return (status);
00103 }
00104 status = resolveInfoForTrim (&dataObjInfoHead, &dataObjInp->condInput);
00105
00106 if (status < 0) {
00107 return (status);
00108 }
00109
00110 if ((tmpStr = getValByKey (&dataObjInp->condInput, AGE_KW)) != NULL) {
00111 myAge = atoi (tmpStr);
00112
00113 if (myAge > 0) myTime = time (0) - myAge * 60;
00114 }
00115
00116 tmpDataObjInfo = dataObjInfoHead;
00117 while (tmpDataObjInfo != NULL) {
00118 if (myTime == 0 || atoi (tmpDataObjInfo->dataModify) <= myTime) {
00119 if (getValByKey (&dataObjInp->condInput, DRYRUN_KW) == NULL) {
00120 status = dataObjUnlinkS (rsComm, dataObjInp, tmpDataObjInfo);
00121 if (status < 0) {
00122 if (retVal == 0) {
00123 retVal = status;
00124 }
00125 } else {
00126 retVal = 1;
00127 }
00128 } else {
00129 retVal = 1;
00130 }
00131 }
00132 tmpDataObjInfo = tmpDataObjInfo->next;
00133 }
00134
00135 freeAllDataObjInfo (dataObjInfoHead);
00136
00137 return (retVal);
00138 }
00139
00140
00141 int trimDataObjInfo(
00142 rsComm_t* rsComm,
00143 dataObjInfo_t* dataObjInfo ) {
00144
00145 dataObjInp_t dataObjInp;
00146 char tmpStr[NAME_LEN];
00147 int status;
00148
00149
00150
00151 eirods::hierarchy_parser parser;
00152 parser.set_string( dataObjInfo->rescHier );
00153 std::string cache_resc;
00154 parser.last_resc( cache_resc );
00155
00156 bzero( &dataObjInp, sizeof( dataObjInp ) );
00157 rstrcpy( dataObjInp.objPath, dataObjInfo->objPath, MAX_NAME_LEN );
00158 snprintf( tmpStr, NAME_LEN, "1" );
00159 addKeyVal( &dataObjInp.condInput, COPIES_KW, tmpStr );
00160
00161
00162
00163 std::stringstream str;
00164 str << dataObjInfo->replNum;
00165 addKeyVal( &dataObjInp.condInput, REPL_NUM_KW, str.str().c_str() );
00166 addKeyVal( &dataObjInp.condInput, RESC_HIER_STR_KW, dataObjInfo->rescHier );
00167
00168 status = rsDataObjTrim (rsComm, &dataObjInp);
00169 clearKeyVal (&dataObjInp.condInput);
00170 if (status < 0) {
00171 rodsLogError (LOG_ERROR, status,
00172 "trimDataObjInfo: rsDataObjTrim of %s error", dataObjInfo->objPath);
00173 }
00174 return status;
00175 }
00176
00177
00178