00001
00002
00003
00004
00005
00006
00007
00008 #include "regDataObj.h"
00009 #include "icatHighLevelRoutines.h"
00010 #include "fileDriver.h"
00011
00012 #include "eirods_file_object.h"
00013
00014
00015
00016
00017 int
00018 rsRegDataObj (rsComm_t *rsComm, dataObjInfo_t *dataObjInfo,
00019 dataObjInfo_t **outDataObjInfo)
00020 {
00021 int status;
00022 rodsServerHost_t *rodsServerHost = NULL;
00023
00024 *outDataObjInfo = NULL;
00025
00026 status = getAndConnRcatHost (rsComm, MASTER_RCAT, dataObjInfo->objPath,
00027 &rodsServerHost);
00028 if (status < 0 || NULL == rodsServerHost ) {
00029 return(status);
00030 }
00031
00032 if (rodsServerHost->localFlag == LOCAL_HOST) {
00033 #ifdef RODS_CAT
00034 status = _rsRegDataObj (rsComm, dataObjInfo);
00035 if (status >= 0) {
00036 *outDataObjInfo = (dataObjInfo_t *) malloc (sizeof (dataObjInfo_t));
00037
00038 **outDataObjInfo = *dataObjInfo;
00039 }
00040 #else
00041 status = SYS_NO_RCAT_SERVER_ERR;
00042 #endif
00043 } else {
00044 status = rcRegDataObj (rodsServerHost->conn, dataObjInfo,
00045 outDataObjInfo);
00046 }
00047 return (status);
00048 }
00049
00050 int
00051 _rsRegDataObj (rsComm_t *rsComm, dataObjInfo_t *dataObjInfo)
00052 {
00053 #ifdef RODS_CAT
00054 int status;
00055 eirods::error ret;
00056 status = chlRegDataObj (rsComm, dataObjInfo);
00057 if(status < 0) {
00058 char* sys_error;
00059 char* rods_error = rodsErrorName(status, &sys_error);
00060 std::stringstream msg;
00061 msg << __FUNCTION__;
00062 msg << " - Failed to register data object \"" << dataObjInfo->objPath << "\"";
00063 msg << " - " << rods_error << " " << sys_error;
00064 ret = ERROR(status, msg.str());
00065 eirods::log(ret);
00066 } else {
00067 eirods::file_object file_obj(rsComm, dataObjInfo);
00068 ret = fileRegistered(rsComm, file_obj);
00069 if(!ret.ok()) {
00070 std::stringstream msg;
00071 msg << __FUNCTION__;
00072 msg << " - Failed to signal resource that the data object \"";
00073 msg << dataObjInfo->objPath;
00074 msg << "\" was registered";
00075 ret = PASSMSG(msg.str(), ret);
00076 eirods::log(ret);
00077 status = ret.code();
00078 }
00079 }
00080 return (status);
00081 #else
00082 return (SYS_NO_RCAT_SERVER_ERR);
00083 #endif
00084
00085 }
00086
00087 int
00088 svrRegDataObj (rsComm_t *rsComm, dataObjInfo_t *dataObjInfo)
00089 {
00090 int status;
00091 rodsServerHost_t *rodsServerHost = NULL;
00092
00093 if (dataObjInfo->specColl != NULL) {
00094 rodsLog (LOG_NOTICE,
00095 "svrRegDataObj: Reg path %s is in spec coll",
00096 dataObjInfo->objPath);
00097 return (SYS_REG_OBJ_IN_SPEC_COLL);
00098 }
00099
00100 status = getAndConnRcatHost (rsComm, MASTER_RCAT, dataObjInfo->objPath,
00101 &rodsServerHost);
00102 if (status < 0 || NULL == rodsServerHost ) {
00103 return(status);
00104 }
00105
00106 if (rodsServerHost->localFlag == LOCAL_HOST) {
00107 #ifdef RODS_CAT
00108 status = _rsRegDataObj (rsComm, dataObjInfo);
00109 #else
00110 status = SYS_NO_RCAT_SERVER_ERR;
00111 #endif
00112 } else {
00113 dataObjInfo_t *outDataObjInfo = NULL;
00114 status = rcRegDataObj (rodsServerHost->conn, dataObjInfo,
00115 &outDataObjInfo);
00116 if (status >= 0 && NULL != outDataObjInfo ) {
00117 dataObjInfo->dataId = outDataObjInfo->dataId;
00118 free (outDataObjInfo);
00119 }
00120 }
00121
00122 return (status);
00123 }
00124