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
00017 rsModDataObjMeta (rsComm_t *rsComm, modDataObjMeta_t *modDataObjMetaInp)
00018 {
00019 int status;
00020 rodsServerHost_t *rodsServerHost = NULL;
00021 dataObjInfo_t *dataObjInfo;
00022
00023 dataObjInfo = modDataObjMetaInp->dataObjInfo;
00024
00025 status = getAndConnRcatHost (rsComm, MASTER_RCAT, dataObjInfo->objPath,
00026 &rodsServerHost);
00027 if (status < 0 || NULL == rodsServerHost ) {
00028 return(status);
00029 }
00030 if (rodsServerHost->localFlag == LOCAL_HOST) {
00031 #ifdef RODS_CAT
00032 status = _rsModDataObjMeta (rsComm, modDataObjMetaInp);
00033 #else
00034 status = SYS_NO_RCAT_SERVER_ERR;
00035 #endif
00036 } else {
00037 status = rcModDataObjMeta (rodsServerHost->conn, modDataObjMetaInp);
00038 }
00039
00040 return (status);
00041 }
00042
00043 int
00044 _rsModDataObjMeta (rsComm_t *rsComm, modDataObjMeta_t *modDataObjMetaInp)
00045 {
00046 #ifdef RODS_CAT
00047 int status;
00048 dataObjInfo_t *dataObjInfo;
00049 keyValPair_t *regParam;
00050 int i;
00051 ruleExecInfo_t rei2;
00052
00053 memset ((char*)&rei2, 0, sizeof (ruleExecInfo_t));
00054 rei2.rsComm = rsComm;
00055 if (rsComm != NULL) {
00056 rei2.uoic = &rsComm->clientUser;
00057 rei2.uoip = &rsComm->proxyUser;
00058 }
00059 rei2.doi = modDataObjMetaInp->dataObjInfo;
00060 rei2.condInputData = modDataObjMetaInp->regParam;
00061 regParam = modDataObjMetaInp->regParam;
00062 dataObjInfo = modDataObjMetaInp->dataObjInfo;
00063
00064 if (regParam->len == 0) {
00065 return (0);
00066 }
00067
00068
00069
00070
00071
00072
00073 rei2.doi = dataObjInfo;
00074 i = applyRule("acPreProcForModifyDataObjMeta",NULL, &rei2, NO_SAVE_REI);
00075 if (i < 0) {
00076 if (rei2.status < 0) {
00077 i = rei2.status;
00078 }
00079 rodsLog (LOG_ERROR,"_rsModDataObjMeta:acPreProcForModifyDataObjMeta error stat=%d", i);
00080
00081 return i;
00082 }
00083
00084
00085 if (getValByKey (regParam, ALL_KW) != NULL) {
00086
00087 dataObjInfo_t *dataObjInfoHead = NULL;
00088 dataObjInfo_t *tmpDataObjInfo;
00089 dataObjInp_t dataObjInp;
00090
00091 bzero (&dataObjInp, sizeof (dataObjInp));
00092 rstrcpy (dataObjInp.objPath, dataObjInfo->objPath, MAX_NAME_LEN);
00093 status = getDataObjInfoIncSpecColl (rsComm, &dataObjInp,&dataObjInfoHead);
00094
00095 if (status < 0) {
00096 rodsLog(LOG_NOTICE, "%s - Failed to get data objects.", __FUNCTION__);
00097 return status;
00098 }
00099 tmpDataObjInfo = dataObjInfoHead;
00100 while (tmpDataObjInfo != NULL) {
00101 if (tmpDataObjInfo->specColl != NULL)
00102 break;
00103 status = chlModDataObjMeta (rsComm, tmpDataObjInfo, regParam);
00104 if (status < 0) {
00105 rodsLog (LOG_ERROR,
00106 "_rsModDataObjMeta:chlModDataObjMeta %s error stat=%d",
00107 tmpDataObjInfo->objPath, status);
00108 } else {
00109 eirods::file_object_ptr file_obj(
00110 new eirods::file_object(
00111 rsComm,
00112 tmpDataObjInfo ) );
00113
00114 char* pdmo_kw = getValByKey(regParam, IN_PDMO_KW);
00115 if(pdmo_kw != NULL) {
00116 file_obj->in_pdmo(pdmo_kw);
00117
00118 }
00119
00120 eirods::error ret = fileModified(rsComm, file_obj);
00121 if(!ret.ok()) {
00122 std::stringstream msg;
00123 msg << __FUNCTION__;
00124 msg << " - Failed to signal resource that the data object \"";
00125 msg << tmpDataObjInfo->objPath;
00126 msg << " was modified.";
00127 ret = PASSMSG(msg.str(), ret);
00128 eirods::log(ret);
00129 status = ret.code();
00130 }
00131 }
00132 tmpDataObjInfo = tmpDataObjInfo->next;
00133 }
00134 freeAllDataObjInfo (dataObjInfoHead);
00135 } else {
00136 status = chlModDataObjMeta (rsComm, dataObjInfo, regParam);
00137 if(status < 0) {
00138 char* sys_error;
00139 char* rods_error = rodsErrorName(status, &sys_error);
00140 std::stringstream msg;
00141 msg << __FUNCTION__;
00142 msg << " - Failed to modify the database for object \"";
00143 msg << dataObjInfo->objPath;
00144 msg << "\" - " << rods_error << " " << sys_error;
00145 eirods::error ret = ERROR(status, msg.str());
00146 eirods::log(ret);
00147 } else {
00148 eirods::file_object_ptr file_obj(
00149 new eirods::file_object(
00150 rsComm,
00151 dataObjInfo ) );
00152
00153 char* pdmo_kw = getValByKey(regParam, IN_PDMO_KW);
00154 if(pdmo_kw != NULL) {
00155 file_obj->in_pdmo(pdmo_kw);
00156 }
00157 eirods::error ret = fileModified(rsComm, file_obj);
00158 if(!ret.ok()) {
00159 std::stringstream msg;
00160 msg << __FUNCTION__;
00161 msg << " - Failed to signal the resource that the data object \"";
00162 msg << dataObjInfo->objPath;
00163 msg << "\" was modified.";
00164 ret = PASSMSG(msg.str(), ret);
00165 eirods::log(ret);
00166 status = ret.code();
00167 }
00168 }
00169 }
00170
00171
00172 if (status >= 0) {
00173 i = applyRule("acPostProcForModifyDataObjMeta",NULL, &rei2, NO_SAVE_REI);
00174 if (i < 0) {
00175 if (rei2.status < 0) {
00176 i = rei2.status;
00177 }
00178 rodsLog (LOG_ERROR,
00179 "_rsModDataObjMeta:acPostProcForModifyDataObjMeta error stat=%d",i);
00180 return i;
00181 }
00182 } else {
00183 rodsLog(LOG_NOTICE, "%s - Failed updating the database with object info.", __FUNCTION__);
00184 return status;
00185 }
00186
00187
00188 return (status);
00189 #else
00190 return (SYS_NO_RCAT_SERVER_ERR);
00191 #endif
00192
00193 }
00194
00195