00001
00002
00003
00004
00005
00006
00007
00008 #include "modDataObjMeta.h"
00009 #include "icatHighLevelRoutines.h"
00010 #include "objMetaOpr.h"
00011 #include "dataObjOpr.h"
00012
00013 #include "eirods_file_object.h"
00014 #include "eirods_stacktrace.h"
00015
00016 int _call_file_modified_for_modification(
00017 rsComm_t* rsComm,
00018 modDataObjMeta_t* modDataObjMetaInp );
00019 int
00020 rsModDataObjMeta (rsComm_t *rsComm, modDataObjMeta_t *modDataObjMetaInp)
00021 {
00022 int status;
00023 rodsServerHost_t *rodsServerHost = NULL;
00024 dataObjInfo_t *dataObjInfo;
00025
00026 dataObjInfo = modDataObjMetaInp->dataObjInfo;
00027
00028 status = getAndConnRcatHost (rsComm, MASTER_RCAT, dataObjInfo->objPath,
00029 &rodsServerHost);
00030 if (status < 0 || NULL == rodsServerHost ) {
00031 return(status);
00032 }
00033 if (rodsServerHost->localFlag == LOCAL_HOST) {
00034 #ifdef RODS_CAT
00035 status = _rsModDataObjMeta (rsComm, modDataObjMetaInp);
00036 #else
00037 status = SYS_NO_RCAT_SERVER_ERR;
00038 #endif
00039 } else {
00040 status = rcModDataObjMeta (rodsServerHost->conn, modDataObjMetaInp);
00041 }
00042
00043 if( status >= 0 ) {
00044 status = _call_file_modified_for_modification( rsComm, modDataObjMetaInp );
00045 }
00046
00047 return (status);
00048 }
00049
00050 int
00051 _rsModDataObjMeta (rsComm_t *rsComm, modDataObjMeta_t *modDataObjMetaInp)
00052 {
00053 #ifdef RODS_CAT
00054 int status = 0;
00055 dataObjInfo_t *dataObjInfo;
00056 keyValPair_t *regParam;
00057 int i;
00058 ruleExecInfo_t rei2;
00059
00060 memset ((char*)&rei2, 0, sizeof (ruleExecInfo_t));
00061 rei2.rsComm = rsComm;
00062 if (rsComm != NULL) {
00063 rei2.uoic = &rsComm->clientUser;
00064 rei2.uoip = &rsComm->proxyUser;
00065 }
00066 rei2.doi = modDataObjMetaInp->dataObjInfo;
00067 rei2.condInputData = modDataObjMetaInp->regParam;
00068 regParam = modDataObjMetaInp->regParam;
00069 dataObjInfo = modDataObjMetaInp->dataObjInfo;
00070
00071 if (regParam->len == 0) {
00072 return (0);
00073 }
00074
00075
00076
00077
00078
00079
00080 rei2.doi = dataObjInfo;
00081 i = applyRule("acPreProcForModifyDataObjMeta",NULL, &rei2, NO_SAVE_REI);
00082 if (i < 0) {
00083 if (rei2.status < 0) {
00084 i = rei2.status;
00085 }
00086 rodsLog (LOG_ERROR,"_rsModDataObjMeta:acPreProcForModifyDataObjMeta error stat=%d", i);
00087
00088 return i;
00089 }
00090
00091
00092 if (getValByKey (regParam, ALL_KW) != NULL) {
00093
00094 dataObjInfo_t *dataObjInfoHead = NULL;
00095 dataObjInfo_t *tmpDataObjInfo;
00096 dataObjInp_t dataObjInp;
00097
00098 bzero (&dataObjInp, sizeof (dataObjInp));
00099 rstrcpy (dataObjInp.objPath, dataObjInfo->objPath, MAX_NAME_LEN);
00100 status = getDataObjInfoIncSpecColl (rsComm, &dataObjInp,&dataObjInfoHead);
00101
00102 if (status < 0) {
00103 rodsLog(LOG_NOTICE, "%s - Failed to get data objects.", __FUNCTION__);
00104 return status;
00105 }
00106 tmpDataObjInfo = dataObjInfoHead;
00107 while (tmpDataObjInfo != NULL) {
00108 if (tmpDataObjInfo->specColl != NULL)
00109 break;
00110 status = chlModDataObjMeta (rsComm, tmpDataObjInfo, regParam);
00111 if (status < 0) {
00112 rodsLog (LOG_ERROR,
00113 "_rsModDataObjMeta:chlModDataObjMeta %s error stat=%d",
00114 tmpDataObjInfo->objPath, status);
00115 } else {
00116 eirods::file_object_ptr file_obj(
00117 new eirods::file_object(
00118 rsComm,
00119 tmpDataObjInfo ) );
00120
00121 char* pdmo_kw = getValByKey(regParam, IN_PDMO_KW);
00122 if(pdmo_kw != NULL) {
00123 file_obj->in_pdmo(pdmo_kw);
00124
00125 }
00126
00127 eirods::error ret = fileModified(rsComm, file_obj);
00128 if(!ret.ok()) {
00129 std::stringstream msg;
00130 msg << __FUNCTION__;
00131 msg << " - Failed to signal resource that the data object \"";
00132 msg << tmpDataObjInfo->objPath;
00133 msg << " was modified.";
00134 ret = PASSMSG(msg.str(), ret);
00135 eirods::log(ret);
00136 status = ret.code();
00137 }
00138 }
00139 tmpDataObjInfo = tmpDataObjInfo->next;
00140 }
00141 freeAllDataObjInfo (dataObjInfoHead);
00142 } else {
00143 status = chlModDataObjMeta (rsComm, dataObjInfo, regParam);
00144 if(status < 0) {
00145 char* sys_error;
00146 char* rods_error = rodsErrorName(status, &sys_error);
00147 std::stringstream msg;
00148 msg << __FUNCTION__;
00149 msg << " - Failed to modify the database for object \"";
00150 msg << dataObjInfo->objPath;
00151 msg << "\" - " << rods_error << " " << sys_error;
00152 eirods::error ret = ERROR(status, msg.str());
00153 eirods::log(ret);
00154 } else {
00155 eirods::file_object_ptr file_obj(
00156 new eirods::file_object(
00157 rsComm,
00158 dataObjInfo ) );
00159
00160 char* pdmo_kw = getValByKey(regParam, IN_PDMO_KW);
00161 if(pdmo_kw != NULL) {
00162 file_obj->in_pdmo(pdmo_kw);
00163 }
00164 eirods::error ret = fileModified(rsComm, file_obj);
00165 if(!ret.ok()) {
00166 std::stringstream msg;
00167 msg << __FUNCTION__;
00168 msg << " - Failed to signal the resource that the data object \"";
00169 msg << dataObjInfo->objPath;
00170 msg << "\" was modified.";
00171 ret = PASSMSG(msg.str(), ret);
00172 eirods::log(ret);
00173 status = ret.code();
00174 }
00175 }
00176 }
00177
00178
00179 if (status >= 0) {
00180 i = applyRule("acPostProcForModifyDataObjMeta",NULL, &rei2, NO_SAVE_REI);
00181 if (i < 0) {
00182 if (rei2.status < 0) {
00183 i = rei2.status;
00184 }
00185 rodsLog (LOG_ERROR,
00186 "_rsModDataObjMeta:acPostProcForModifyDataObjMeta error stat=%d",i);
00187 return i;
00188 }
00189 } else {
00190 rodsLog(LOG_NOTICE, "%s - Failed updating the database with object info.", __FUNCTION__);
00191 return status;
00192 }
00193
00194
00195 return (status);
00196 #else
00197 return (SYS_NO_RCAT_SERVER_ERR);
00198 #endif
00199
00200 }
00201
00202 int _call_file_modified_for_modification(
00203 rsComm_t* rsComm,
00204 modDataObjMeta_t* modDataObjMetaInp ) {
00205 int status = 0;
00206 dataObjInfo_t *dataObjInfo;
00207 keyValPair_t *regParam;
00208 ruleExecInfo_t rei2;
00209
00210 memset ((char*)&rei2, 0, sizeof (ruleExecInfo_t));
00211 rei2.rsComm = rsComm;
00212 if (rsComm != NULL) {
00213 rei2.uoic = &rsComm->clientUser;
00214 rei2.uoip = &rsComm->proxyUser;
00215 }
00216 rei2.doi = modDataObjMetaInp->dataObjInfo;
00217 rei2.condInputData = modDataObjMetaInp->regParam;
00218 regParam = modDataObjMetaInp->regParam;
00219 dataObjInfo = modDataObjMetaInp->dataObjInfo;
00220
00221 if (regParam->len == 0) {
00222 return (0);
00223 }
00224
00225 if (getValByKey (regParam, ALL_KW) != NULL) {
00226
00227 dataObjInfo_t *dataObjInfoHead = NULL;
00228 dataObjInfo_t *tmpDataObjInfo;
00229 dataObjInp_t dataObjInp;
00230
00231 bzero (&dataObjInp, sizeof (dataObjInp));
00232 rstrcpy (dataObjInp.objPath, dataObjInfo->objPath, MAX_NAME_LEN);
00233 status = getDataObjInfoIncSpecColl (rsComm, &dataObjInp,&dataObjInfoHead);
00234
00235 if (status < 0) {
00236 rodsLog(LOG_NOTICE, "%s - Failed to get data objects.", __FUNCTION__);
00237 return status;
00238 }
00239 tmpDataObjInfo = dataObjInfoHead;
00240 while (tmpDataObjInfo != NULL) {
00241 if (tmpDataObjInfo->specColl != NULL)
00242 break;
00243
00244 eirods::file_object_ptr file_obj(
00245 new eirods::file_object(
00246 rsComm,
00247 tmpDataObjInfo ) );
00248
00249 char* pdmo_kw = getValByKey(regParam, IN_PDMO_KW);
00250 if(pdmo_kw != NULL) {
00251 file_obj->in_pdmo(pdmo_kw);
00252
00253 }
00254
00255 eirods::error ret = fileModified(rsComm, file_obj);
00256 if(!ret.ok()) {
00257 std::stringstream msg;
00258 msg << __FUNCTION__;
00259 msg << " - Failed to signal resource that the data object \"";
00260 msg << tmpDataObjInfo->objPath;
00261 msg << " was modified.";
00262 ret = PASSMSG(msg.str(), ret);
00263 eirods::log(ret);
00264 status = ret.code();
00265 }
00266
00267 tmpDataObjInfo = tmpDataObjInfo->next;
00268 }
00269 freeAllDataObjInfo (dataObjInfoHead);
00270 } else {
00271 eirods::file_object_ptr file_obj(
00272 new eirods::file_object(
00273 rsComm,
00274 dataObjInfo ) );
00275
00276 char* pdmo_kw = getValByKey(regParam, IN_PDMO_KW);
00277 if(pdmo_kw != NULL) {
00278 file_obj->in_pdmo(pdmo_kw);
00279 }
00280 eirods::error ret = fileModified(rsComm, file_obj);
00281 if(!ret.ok()) {
00282 std::stringstream msg;
00283 msg << __FUNCTION__;
00284 msg << " - Failed to signal the resource that the data object \"";
00285 msg << dataObjInfo->objPath;
00286 msg << "\" was modified.";
00287 ret = PASSMSG(msg.str(), ret);
00288 eirods::log(ret);
00289 status = ret.code();
00290 }
00291
00292 }
00293
00294 return status;
00295
00296 }
00297