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