00001
00002
00003
00004
00005
00006
00007
00008 #include "apiHeaderAll.h"
00009 #include "dataObjOpr.h"
00010 #include "objMetaOpr.h"
00011 #include "icatHighLevelRoutines.h"
00012
00013 #include "eirods_stacktrace.h"
00014 #include "eirods_file_object.h"
00015
00016 int
00017 rsBulkDataObjReg (rsComm_t *rsComm, genQueryOut_t *bulkDataObjRegInp,
00018 genQueryOut_t **bulkDataObjRegOut)
00019 {
00020 sqlResult_t *objPath;
00021 int status;
00022 rodsServerHost_t *rodsServerHost = NULL;
00023
00024 if (bulkDataObjRegInp->rowCnt <= 0) return 0;
00025
00026 if ((objPath =
00027 getSqlResultByInx (bulkDataObjRegInp, COL_DATA_NAME)) == NULL) {
00028 rodsLog (LOG_NOTICE,
00029 "rsBulkDataObjReg: getSqlResultByInx for COL_DATA_NAME failed");
00030 return (UNMATCHED_KEY_OR_INDEX);
00031 }
00032
00033 status = getAndConnRcatHost (rsComm, MASTER_RCAT, objPath->value,
00034 &rodsServerHost);
00035 if (status < 0 || rodsServerHost == NULL ) {
00036 return(status);
00037 }
00038
00039 if (rodsServerHost->localFlag == LOCAL_HOST) {
00040 #ifdef RODS_CAT
00041 status = _rsBulkDataObjReg (rsComm, bulkDataObjRegInp,
00042 bulkDataObjRegOut);
00043 #else
00044 status = SYS_NO_RCAT_SERVER_ERR;
00045 #endif
00046 } else {
00047 status = rcBulkDataObjReg (rodsServerHost->conn, bulkDataObjRegInp,
00048 bulkDataObjRegOut);
00049 }
00050
00051 return (status);
00052 }
00053
00054 int
00055 _rsBulkDataObjReg (rsComm_t *rsComm, genQueryOut_t *bulkDataObjRegInp,
00056 genQueryOut_t **bulkDataObjRegOut)
00057 {
00058 #ifdef RODS_CAT
00059 dataObjInfo_t dataObjInfo;
00060 sqlResult_t *objPath, *dataType, *dataSize, *rescName, *rescHier, *filePath,
00061 *dataMode, *oprType, *rescGroupName, *replNum, *chksum;
00062 char *tmpObjPath, *tmpDataType, *tmpDataSize, *tmpRescName, *tmpRescHier, *tmpFilePath,
00063 *tmpDataMode, *tmpOprType, *tmpRescGroupName, *tmpReplNum, *tmpChksum;
00064 sqlResult_t *objId;
00065 char *tmpObjId;
00066 int status, i;
00067
00068 if ((rescHier =
00069 getSqlResultByInx (bulkDataObjRegInp, COL_D_RESC_HIER)) == NULL) {
00070 rodsLog (LOG_NOTICE,
00071 "rsBulkDataObjReg: getSqlResultByInx for COL_D_RESC_HIER failed");
00072 return (UNMATCHED_KEY_OR_INDEX);
00073 }
00074
00075 if ((objPath =
00076 getSqlResultByInx (bulkDataObjRegInp, COL_DATA_NAME)) == NULL) {
00077 rodsLog (LOG_NOTICE,
00078 "rsBulkDataObjReg: getSqlResultByInx for COL_DATA_NAME failed");
00079 return (UNMATCHED_KEY_OR_INDEX);
00080 }
00081
00082 if ((dataType =
00083 getSqlResultByInx (bulkDataObjRegInp, COL_DATA_TYPE_NAME)) == NULL) {
00084 rodsLog (LOG_NOTICE,
00085 "rsBulkDataObjReg: getSqlResultByInx for COL_DATA_TYPE_NAME failed");
00086 return (UNMATCHED_KEY_OR_INDEX);
00087 }
00088 if ((dataSize =
00089 getSqlResultByInx (bulkDataObjRegInp, COL_DATA_SIZE)) == NULL) {
00090 rodsLog (LOG_NOTICE,
00091 "rsBulkDataObjReg: getSqlResultByInx for COL_DATA_SIZE failed");
00092 return (UNMATCHED_KEY_OR_INDEX);
00093 }
00094
00095 if ((rescName =
00096 getSqlResultByInx (bulkDataObjRegInp, COL_D_RESC_NAME)) == NULL) {
00097 rodsLog (LOG_NOTICE,
00098 "rsBulkDataObjReg: getSqlResultByInx for COL_D_RESC_NAME failed");
00099 return (UNMATCHED_KEY_OR_INDEX);
00100 }
00101
00102 if ((filePath =
00103 getSqlResultByInx (bulkDataObjRegInp, COL_D_DATA_PATH)) == NULL) {
00104 rodsLog (LOG_NOTICE,
00105 "rsBulkDataObjReg: getSqlResultByInx for COL_D_DATA_PATH failed");
00106 return (UNMATCHED_KEY_OR_INDEX);
00107 }
00108
00109 if ((dataMode =
00110 getSqlResultByInx (bulkDataObjRegInp, COL_DATA_MODE)) == NULL) {
00111 rodsLog (LOG_NOTICE,
00112 "rsBulkDataObjReg: getSqlResultByInx for COL_DATA_MODE failed");
00113 return (UNMATCHED_KEY_OR_INDEX);
00114 }
00115
00116 if ((oprType =
00117 getSqlResultByInx (bulkDataObjRegInp, OPR_TYPE_INX)) == NULL) {
00118 rodsLog (LOG_ERROR,
00119 "rsBulkDataObjReg: getSqlResultByInx for OPR_TYPE_INX failed");
00120 return (UNMATCHED_KEY_OR_INDEX);
00121 }
00122
00123 if ((rescGroupName =
00124 getSqlResultByInx (bulkDataObjRegInp, COL_RESC_GROUP_NAME)) == NULL) {
00125 rodsLog (LOG_ERROR,
00126 "rsBulkDataObjReg: getSqlResultByInx for COL_RESC_GROUP_NAME failed");
00127 return (UNMATCHED_KEY_OR_INDEX);
00128 }
00129
00130 if ((replNum =
00131 getSqlResultByInx (bulkDataObjRegInp, COL_DATA_REPL_NUM)) == NULL) {
00132 rodsLog (LOG_ERROR,
00133 "rsBulkDataObjReg: getSqlResultByInx for COL_DATA_REPL_NUM failed");
00134 return (UNMATCHED_KEY_OR_INDEX);
00135 }
00136
00137 chksum = getSqlResultByInx (bulkDataObjRegInp, COL_D_DATA_CHECKSUM);
00138
00139
00140 initBulkDataObjRegOut (bulkDataObjRegOut);
00141 if ((objId =
00142 getSqlResultByInx (*bulkDataObjRegOut, COL_D_DATA_ID)) == NULL) {
00143 rodsLog (LOG_ERROR,
00144 "rsBulkDataObjReg: getSqlResultByInx for COL_D_DATA_ID failed");
00145 return (UNMATCHED_KEY_OR_INDEX);
00146 }
00147
00148 (*bulkDataObjRegOut)->rowCnt = bulkDataObjRegInp->rowCnt;
00149 for (i = 0;i < bulkDataObjRegInp->rowCnt; i++) {
00150 tmpObjPath = &objPath->value[objPath->len * i];
00151 tmpDataType = &dataType->value[dataType->len * i];
00152 tmpDataSize = &dataSize->value[dataSize->len * i];
00153 tmpRescName = &rescName->value[rescName->len * i];
00154 tmpRescHier = &rescHier->value[rescHier->len * i];
00155 tmpFilePath = &filePath->value[filePath->len * i];
00156 tmpDataMode = &dataMode->value[dataMode->len * i];
00157 tmpOprType = &oprType->value[oprType->len * i];
00158 tmpRescGroupName = &rescGroupName->value[rescGroupName->len * i];
00159 tmpReplNum = &replNum->value[replNum->len * i];
00160 tmpObjId = &objId->value[objId->len * i];
00161
00162 bzero (&dataObjInfo, sizeof (dataObjInfo_t));
00163 dataObjInfo.flags = NO_COMMIT_FLAG;
00164 rstrcpy (dataObjInfo.objPath, tmpObjPath, MAX_NAME_LEN);
00165 rstrcpy (dataObjInfo.dataType, tmpDataType, NAME_LEN);
00166 dataObjInfo.dataSize = strtoll (tmpDataSize, 0, 0);
00167 rstrcpy (dataObjInfo.rescName, tmpRescName, NAME_LEN);
00168 rstrcpy (dataObjInfo.rescHier, tmpRescHier, MAX_NAME_LEN);
00169 rstrcpy (dataObjInfo.filePath, tmpFilePath, MAX_NAME_LEN);
00170 rstrcpy (dataObjInfo.dataMode, tmpDataMode, NAME_LEN);
00171 rstrcpy (dataObjInfo.rescGroupName, tmpRescGroupName, NAME_LEN);
00172 dataObjInfo.replNum = atoi (tmpReplNum);
00173 if (chksum != NULL) {
00174 tmpChksum = &chksum->value[chksum->len * i];
00175 if (strlen (tmpChksum) > 0) {
00176 rstrcpy (dataObjInfo.chksum, tmpChksum, NAME_LEN);
00177 }
00178 }
00179
00180 dataObjInfo.replStatus = NEWLY_CREATED_COPY;
00181 if (strcmp (tmpOprType, REGISTER_OPR) == 0) {
00182 status = svrRegDataObj (rsComm, &dataObjInfo);
00183 } else {
00184 status = modDataObjSizeMeta (rsComm, &dataObjInfo, tmpDataSize);
00185 }
00186 if (status >= 0) {
00187 snprintf (tmpObjId, NAME_LEN, "%lld", dataObjInfo.dataId);
00188
00189
00190
00191
00192 eirods::file_object_ptr file_obj(
00193 new eirods::file_object(
00194 rsComm,
00195 &dataObjInfo ) );
00196
00197 eirods::error ret = fileModified(rsComm, file_obj);
00198 if(!ret.ok()) {
00199 std::stringstream msg;
00200 msg << __FUNCTION__;
00201 msg << " - Failed to signal resource that the data object \"";
00202 msg << dataObjInfo.objPath;
00203 msg << "\" was registered";
00204 ret = PASSMSG(msg.str(), ret);
00205 eirods::log(ret);
00206 status = ret.code();
00207 }
00208
00209 } else {
00210 rodsLog (LOG_ERROR,
00211 "rsBulkDataObjReg: RegDataObj or ModDataObj failed for %s,stat=%d",
00212 tmpObjPath, status);
00213 chlRollback (rsComm);
00214 freeGenQueryOut (bulkDataObjRegOut);
00215 *bulkDataObjRegOut = NULL;
00216 return status;
00217 }
00218 }
00219 status = chlCommit(rsComm);
00220
00221 if (status < 0) {
00222 rodsLog (LOG_ERROR,
00223 "rsBulkDataObjReg: chlCommit failed, status = %d", status);
00224 freeGenQueryOut (bulkDataObjRegOut);
00225 *bulkDataObjRegOut = NULL;
00226 }
00227 return status;
00228 #else
00229 return (SYS_NO_RCAT_SERVER_ERR);
00230 #endif
00231
00232 }
00233
00234 int
00235 modDataObjSizeMeta (rsComm_t *rsComm, dataObjInfo_t *dataObjInfo,
00236 char *strDataSize)
00237 {
00238 modDataObjMeta_t modDataObjMetaInp;
00239 keyValPair_t regParam;
00240 char tmpStr[MAX_NAME_LEN];
00241 int status;
00242
00243 bzero (&modDataObjMetaInp, sizeof (modDataObjMetaInp));
00244 bzero (®Param, sizeof (regParam));
00245 addKeyVal (®Param, DATA_SIZE_KW, strDataSize);
00246 addKeyVal (®Param, ALL_REPL_STATUS_KW, "");
00247 snprintf (tmpStr, MAX_NAME_LEN, "%d", (int) time (NULL));
00248 addKeyVal (®Param, DATA_MODIFY_KW, tmpStr);
00249 if (strlen (dataObjInfo->chksum) > 0) {
00250 addKeyVal (®Param, CHKSUM_KW, dataObjInfo->chksum);
00251 }
00252 addKeyVal(®Param, IN_PDMO_KW, "");
00253 modDataObjMetaInp.dataObjInfo = dataObjInfo;
00254 modDataObjMetaInp.regParam = ®Param;
00255
00256 status = _rsModDataObjMeta (rsComm, &modDataObjMetaInp);
00257
00258 clearKeyVal (®Param);
00259
00260 return status;
00261 }
00262