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 file_obj(rsComm, tmpDataObjInfo);
00110 eirods::error ret = fileModified(rsComm, file_obj);
00111 if(!ret.ok()) {
00112 std::stringstream msg;
00113 msg << __FUNCTION__;
00114 msg << " - Failed to signal resource that the data object \"";
00115 msg << tmpDataObjInfo->objPath;
00116 msg << " was modified.";
00117 ret = PASSMSG(msg.str(), ret);
00118 eirods::log(ret);
00119 status = ret.code();
00120 }
00121 }
00122 tmpDataObjInfo = tmpDataObjInfo->next;
00123 }
00124 freeAllDataObjInfo (dataObjInfoHead);
00125 } else {
00126 status = chlModDataObjMeta (rsComm, dataObjInfo, regParam);
00127 if(status < 0) {
00128 char* sys_error;
00129 char* rods_error = rodsErrorName(status, &sys_error);
00130 std::stringstream msg;
00131 msg << __FUNCTION__;
00132 msg << " - Failed to modify the database for object \"";
00133 msg << dataObjInfo->objPath;
00134 msg << "\" - " << rods_error << " " << sys_error;
00135 eirods::error ret = ERROR(status, msg.str());
00136 eirods::log(ret);
00137 } else {
00138 eirods::file_object file_obj(rsComm, dataObjInfo);
00139 eirods::error ret = fileModified(rsComm, file_obj);
00140 if(!ret.ok()) {
00141 std::stringstream msg;
00142 msg << __FUNCTION__;
00143 msg << " - Failed to signal the resource that the data object \"";
00144 msg << dataObjInfo->objPath;
00145 msg << "\" was modified.";
00146 ret = PASSMSG(msg.str(), ret);
00147 eirods::log(ret);
00148 status = ret.code();
00149
00150 if(true) {
00151 eirods::stacktrace st;
00152 st.trace();
00153 st.dump();
00154 }
00155
00156 }
00157 }
00158 }
00159
00160
00161 if (status >= 0) {
00162 i = applyRule("acPostProcForModifyDataObjMeta",NULL, &rei2, NO_SAVE_REI);
00163 if (i < 0) {
00164 if (rei2.status < 0) {
00165 i = rei2.status;
00166 }
00167 rodsLog (LOG_ERROR,
00168 "_rsModDataObjMeta:acPostProcForModifyDataObjMeta error stat=%d",i);
00169 return i;
00170 }
00171 } else {
00172 rodsLog(LOG_NOTICE, "%s - Failed updating the database with object info.", __FUNCTION__);
00173 return status;
00174 }
00175
00176
00177 return (status);
00178 #else
00179 return (SYS_NO_RCAT_SERVER_ERR);
00180 #endif
00181
00182 }
00183
00184