00001
00002
00003
00004
00005 #include "dataObjPhymv.h"
00006 #include "dataObjRepl.h"
00007 #include "dataObjOpr.h"
00008 #include "rodsLog.h"
00009 #include "objMetaOpr.h"
00010 #include "specColl.h"
00011 #include "reGlobalsExtern.h"
00012 #include "reDefines.h"
00013 #include "reSysDataObjOpr.h"
00014 #include "dataObjCreate.h"
00015 #include "getRemoteZoneResc.h"
00016
00017 int
00018 rsDataObjPhymv250 (rsComm_t *rsComm, dataObjInp_t *dataObjInp,
00019 transStat_t **transStat)
00020 {
00021 int status;
00022 transferStat_t *transferStat = NULL;
00023
00024 status = rsDataObjPhymv (rsComm, dataObjInp, &transferStat);
00025
00026 if (transStat != NULL && status >= 0 && transferStat != NULL) {
00027 *transStat = (transStat_t *) malloc (sizeof (transStat_t));
00028 (*transStat)->numThreads = transferStat->numThreads;
00029 (*transStat)->bytesWritten = transferStat->bytesWritten;
00030 free (transferStat);
00031 }
00032 return status;
00033 }
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 int
00044 rsDataObjPhymv (rsComm_t *rsComm, dataObjInp_t *dataObjInp,
00045 transferStat_t **transStat)
00046 {
00047 int status;
00048 dataObjInfo_t *dataObjInfoHead = NULL;
00049 dataObjInfo_t *oldDataObjInfoHead = NULL;
00050 rescGrpInfo_t *myRescGrpInfo = NULL;
00051 ruleExecInfo_t rei;
00052 int multiCopyFlag;
00053 char *accessPerm;
00054 int remoteFlag;
00055 rodsServerHost_t *rodsServerHost;
00056 specCollCache_t *specCollCache = NULL;
00057
00058 resolveLinkedPath (rsComm, dataObjInp->objPath, &specCollCache,
00059 &dataObjInp->condInput);
00060 remoteFlag = getAndConnRemoteZone (rsComm, dataObjInp, &rodsServerHost,
00061 REMOTE_OPEN);
00062
00063 if (remoteFlag < 0) {
00064 return (remoteFlag);
00065 } else if (remoteFlag == REMOTE_HOST) {
00066 status = _rcDataObjPhymv (rodsServerHost->conn, dataObjInp,
00067 transStat);
00068 return status;
00069 }
00070
00071 *transStat = (transferStat_t*)malloc (sizeof (transferStat_t));
00072 memset (*transStat, 0, sizeof (transferStat_t));
00073
00074 if (getValByKey (&dataObjInp->condInput, IRODS_ADMIN_KW) != NULL) {
00075 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
00076 return (CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
00077 }
00078 accessPerm = NULL;
00079 } else {
00080 accessPerm = ACCESS_DELETE_OBJECT;
00081 }
00082
00083
00084 status = getRescGrpForCreate (rsComm, dataObjInp, &myRescGrpInfo);
00085 if (status < 0) return status;
00086
00087 initReiWithDataObjInp (&rei, rsComm, dataObjInp);
00088 status = applyRule ("acSetMultiReplPerResc", NULL, &rei, NO_SAVE_REI);
00089 if (strcmp (rei.statusStr, MULTI_COPIES_PER_RESC) == 0) {
00090 multiCopyFlag = 1;
00091 } else {
00092 multiCopyFlag = 0;
00093 }
00094
00095
00096 status = getDataObjInfo (rsComm, dataObjInp, &dataObjInfoHead,
00097 accessPerm, 1);
00098
00099 if (status < 0) {
00100 rodsLog (LOG_NOTICE,
00101 "rsDataObjPhymv: getDataObjInfo for %s", dataObjInp->objPath);
00102 return (status);
00103 }
00104
00105
00106 status = resolveInfoForPhymv (&dataObjInfoHead, &oldDataObjInfoHead,
00107 &myRescGrpInfo, &dataObjInp->condInput, multiCopyFlag);
00108 if (status < 0) {
00109 freeAllDataObjInfo (dataObjInfoHead);
00110 freeAllDataObjInfo (oldDataObjInfoHead);
00111 freeAllRescGrpInfo (myRescGrpInfo);
00112 if (status == CAT_NO_ROWS_FOUND) {
00113 return (0);
00114 } else {
00115 return (status);
00116 }
00117 }
00118
00119 status = _rsDataObjPhymv (rsComm, dataObjInp, dataObjInfoHead,
00120 myRescGrpInfo, *transStat, multiCopyFlag);
00121
00122 freeAllDataObjInfo (dataObjInfoHead);
00123 freeAllDataObjInfo (oldDataObjInfoHead);
00124 freeAllRescGrpInfo (myRescGrpInfo);
00125
00126 return (status);
00127 }
00128
00129 int
00130 _rsDataObjPhymv (rsComm_t *rsComm, dataObjInp_t *dataObjInp,
00131 dataObjInfo_t *srcDataObjInfoHead, rescGrpInfo_t *destRescGrpInfo,
00132 transferStat_t *transStat, int multiCopyFlag)
00133 {
00134 dataObjInfo_t *srcDataObjInfo;
00135 rescGrpInfo_t *tmpRescGrpInfo;
00136 rescInfo_t *tmpRescInfo;
00137 int status;
00138 int savedStatus = 0;
00139
00140 tmpRescGrpInfo = destRescGrpInfo;
00141 srcDataObjInfo = srcDataObjInfoHead;
00142 while (tmpRescGrpInfo != NULL) {
00143 tmpRescInfo = tmpRescGrpInfo->rescInfo;
00144 while (srcDataObjInfo != NULL) {
00145
00146 dataObjInp->oprType = PHYMV_OPR;
00147 status = _rsDataObjReplS (rsComm, dataObjInp, srcDataObjInfo,
00148 tmpRescInfo, tmpRescGrpInfo->rescGroupName, NULL, 0);
00149
00150 if (multiCopyFlag == 0) {
00151 if (status >= 0) {
00152 srcDataObjInfo = srcDataObjInfo->next;
00153 } else {
00154 savedStatus = status;
00155 }
00156
00157 break;
00158 } else {
00159 if (status < 0) {
00160 savedStatus = status;
00161
00162 break;
00163 }
00164 }
00165 srcDataObjInfo = srcDataObjInfo->next;
00166 }
00167 if (status >= 0)
00168 transStat->numThreads = dataObjInp->numThreads;
00169 tmpRescGrpInfo = tmpRescGrpInfo->next;
00170 }
00171
00172 if (srcDataObjInfo != NULL) {
00173
00174 if (savedStatus == 0) {
00175 status = SYS_COPY_ALREADY_IN_RESC;
00176 }
00177 } else {
00178 savedStatus = 0;
00179 }
00180
00181 return (savedStatus);
00182 }
00183