00001
00002
00003
00004
00005
00006 #include "regReplica.h"
00007 #include "objMetaOpr.h"
00008 #include "icatHighLevelRoutines.h"
00009
00010 #include "eirods_file_object.h"
00011
00012
00013 int
00014 rsRegReplica (rsComm_t *rsComm, regReplica_t *regReplicaInp)
00015 {
00016 int status;
00017 rodsServerHost_t *rodsServerHost = NULL;
00018 dataObjInfo_t *srcDataObjInfo;
00019
00020 srcDataObjInfo = regReplicaInp->srcDataObjInfo;
00021
00022 status = getAndConnRcatHost (rsComm, MASTER_RCAT, srcDataObjInfo->objPath,
00023 &rodsServerHost);
00024 if (status < 0 || NULL == rodsServerHost ) {
00025 return(status);
00026 }
00027 if (rodsServerHost->localFlag == LOCAL_HOST) {
00028 #ifdef RODS_CAT
00029 status = _rsRegReplica (rsComm, regReplicaInp);
00030 #else
00031 status = SYS_NO_RCAT_SERVER_ERR;
00032 #endif
00033 } else {
00034 status = rcRegReplica (rodsServerHost->conn, regReplicaInp);
00035 if (status >= 0) regReplicaInp->destDataObjInfo->replNum = status;
00036
00037 }
00038
00039 return (status);
00040 }
00041
00042 int
00043 _rsRegReplica (rsComm_t *rsComm, regReplica_t *regReplicaInp)
00044 {
00045 #ifdef RODS_CAT
00046 int status;
00047 dataObjInfo_t *srcDataObjInfo;
00048 dataObjInfo_t *destDataObjInfo;
00049 int savedClientAuthFlag;
00050
00051 srcDataObjInfo = regReplicaInp->srcDataObjInfo;
00052 destDataObjInfo = regReplicaInp->destDataObjInfo;
00053 if (getValByKey (®ReplicaInp->condInput, SU_CLIENT_USER_KW) != NULL) {
00054 savedClientAuthFlag = rsComm->clientUser.authInfo.authFlag;
00055 rsComm->clientUser.authInfo.authFlag = LOCAL_PRIV_USER_AUTH;
00056 status = chlRegReplica (rsComm, srcDataObjInfo, destDataObjInfo,
00057 ®ReplicaInp->condInput);
00058
00059 eirods::file_object_ptr file_obj(
00060 new eirods::file_object(
00061 rsComm,
00062 destDataObjInfo ) );
00063
00064 char* pdmo_kw = getValByKey(®ReplicaInp->condInput, IN_PDMO_KW);
00065 if(pdmo_kw != NULL) {
00066 file_obj->in_pdmo(pdmo_kw);
00067 }
00068
00069 eirods::error ret = fileModified(rsComm, file_obj);
00070 if(!ret.ok()) {
00071 std::stringstream msg;
00072 msg << __FUNCTION__;
00073 msg << " - Failed to signal resource that the data object \"";
00074 msg << destDataObjInfo->objPath;
00075 msg << "\" was registered";
00076 ret = PASSMSG(msg.str(), ret);
00077 eirods::log(ret);
00078 status = ret.code();
00079 }
00080
00081
00082
00083 rsComm->clientUser.authInfo.authFlag = savedClientAuthFlag;
00084 } else {
00085 status = chlRegReplica (rsComm, srcDataObjInfo, destDataObjInfo, ®ReplicaInp->condInput);
00086 if (status >= 0)
00087 status = destDataObjInfo->replNum;
00088 eirods::file_object_ptr file_obj(
00089 new eirods::file_object(
00090 rsComm,
00091 destDataObjInfo ) );
00092
00093 char* pdmo_kw = getValByKey(®ReplicaInp->condInput, IN_PDMO_KW);
00094 if(pdmo_kw != NULL) {
00095 file_obj->in_pdmo(pdmo_kw);
00096 }
00097
00098
00099 eirods::error ret = fileModified(rsComm, file_obj);
00100 if(!ret.ok()) {
00101 std::stringstream msg;
00102 msg << __FUNCTION__;
00103 msg << " - Failed to signal resource that the data object \"";
00104 msg << destDataObjInfo->objPath;
00105 msg << "\" was registered";
00106 ret = PASSMSG(msg.str(), ret);
00107 eirods::log(ret);
00108 status = ret.code();
00109 }
00110
00111
00112 }
00113
00114
00115 if( status == CAT_SUCCESS_BUT_WITH_NO_INFO ||
00116 status == CATALOG_ALREADY_HAS_ITEM_BY_THAT_NAME ) {
00117 int status2;
00118
00119
00120 status2 = checkDupReplica( rsComm, srcDataObjInfo->dataId,
00121 destDataObjInfo->rescName,
00122 destDataObjInfo->filePath);
00123 if (status2 >= 0) {
00124 destDataObjInfo->replNum = status2;
00125 destDataObjInfo->dataId = srcDataObjInfo->dataId;
00126 return status2;
00127 }
00128 }
00129
00130 return (status);
00131 #else
00132 return (SYS_NO_RCAT_SERVER_ERR);
00133 #endif
00134 }
00135