00001
00002
00003
00004
00005
00006 #include "objStat.h"
00007 #include "rcMisc.h"
00008 #include "genQuery.h"
00009 #include "querySpecColl.h"
00010 #include "objMetaOpr.h"
00011 #include "collection.h"
00012 #include "specColl.h"
00013 #include "resource.h"
00014 #include "rcGlobalExtern.h"
00015 #include "rsGlobalExtern.h"
00016 #include "dataObjClose.h"
00017
00018 int
00019 rsObjStat (rsComm_t *rsComm, dataObjInp_t *dataObjInp,
00020 rodsObjStat_t **rodsObjStatOut)
00021 {
00022 int status;
00023 rodsServerHost_t *rodsServerHost = NULL;
00024 specCollCache_t *specCollCache = NULL;
00025 int linkCnt;
00026
00027 linkCnt = resolveLinkedPath (rsComm, dataObjInp->objPath, &specCollCache,
00028 NULL);
00029
00030 *rodsObjStatOut = NULL;
00031 status = getAndConnRcatHost (rsComm, SLAVE_RCAT, dataObjInp->objPath,
00032 &rodsServerHost);
00033 if (status < 0 || NULL == rodsServerHost ) {
00034 return(status);
00035 }
00036 if (rodsServerHost->localFlag == LOCAL_HOST) {
00037 #ifdef RODS_CAT
00038 status = _rsObjStat (rsComm, dataObjInp, rodsObjStatOut);
00039 #else
00040 status = SYS_NO_RCAT_SERVER_ERR;
00041 #endif
00042 } else {
00043 if (isLocalZone (dataObjInp->objPath)) {
00044
00045
00046 status = statPathInSpecColl (rsComm, dataObjInp->objPath, 1,
00047 rodsObjStatOut);
00048 if (status >= 0) {
00049
00050 return status;
00051 } else if (status != SYS_SPEC_COLL_NOT_IN_CACHE) {
00052
00053 if (linkCnt > 0 && *rodsObjStatOut != NULL) {
00054
00055 if ((*rodsObjStatOut)->specColl == NULL) {
00056 replSpecColl (&specCollCache->specColl,
00057 &(*rodsObjStatOut)->specColl);
00058 }
00059 rstrcpy ((*rodsObjStatOut)->specColl->objPath,
00060 dataObjInp->objPath, MAX_NAME_LEN);
00061 }
00062 return status;
00063 }
00064
00065 }
00066
00067 status = rcObjStat (rodsServerHost->conn, dataObjInp,
00068 rodsObjStatOut);
00069 if (status >= 0 && (*rodsObjStatOut)->specColl != NULL) {
00070
00071 queueSpecCollCacheWithObjStat (*rodsObjStatOut);
00072 }
00073 }
00074
00075 if (linkCnt > 0 && *rodsObjStatOut != NULL) {
00076
00077 if ((*rodsObjStatOut)->specColl == NULL) {
00078 replSpecColl (&specCollCache->specColl,
00079 &(*rodsObjStatOut)->specColl);
00080 }
00081 rstrcpy ((*rodsObjStatOut)->specColl->objPath, dataObjInp->objPath,
00082 MAX_NAME_LEN);
00083 }
00084 return (status);
00085 }
00086
00087 int
00088 _rsObjStat (rsComm_t *rsComm, dataObjInp_t *dataObjInp,
00089 rodsObjStat_t **rodsObjStatOut)
00090 {
00091
00092 int status;
00093 char *tmpStr;
00094 specCollCache_t *specCollCache;
00095
00096
00097 if ((tmpStr = getValByKey (&dataObjInp->condInput, SEL_OBJ_TYPE_KW)) ==
00098 NULL || strcmp (tmpStr, "dataObj") == 0) {
00099 status = dataObjStat (rsComm, dataObjInp, rodsObjStatOut);
00100 if (status >= 0) return (status);
00101 }
00102
00103 if (tmpStr == NULL || strcmp (tmpStr, "collection") == 0) {
00104 status = collStat (rsComm, dataObjInp, rodsObjStatOut);
00105
00106 if (status >= 0) {
00107 if ((*rodsObjStatOut)->specColl == NULL) {
00108 if (getSpecCollCache (rsComm, dataObjInp->objPath, 0,
00109 &specCollCache) >= 0) {
00110 replSpecColl (&specCollCache->specColl,
00111 &(*rodsObjStatOut)->specColl);
00112 }
00113 }
00114 return (status);
00115 }
00116 }
00117
00118
00119
00120 status = statPathInSpecColl (rsComm, dataObjInp->objPath, 0, rodsObjStatOut );
00121
00122
00123 if (status < 0)
00124 status = USER_FILE_DOES_NOT_EXIST;
00125 return (status);
00126 }
00127
00128 int
00129 dataObjStat (rsComm_t *rsComm, dataObjInp_t *dataObjInp,
00130 rodsObjStat_t **rodsObjStatOut)
00131 {
00132 genQueryInp_t genQueryInp;
00133 genQueryOut_t *genQueryOut = NULL;
00134 int status;
00135 char myColl[MAX_NAME_LEN], myData[MAX_NAME_LEN];
00136 char condStr[MAX_NAME_LEN];
00137 sqlResult_t *dataSize;
00138 sqlResult_t *dataMode;
00139 sqlResult_t *replStatus;
00140 sqlResult_t *dataId;
00141 sqlResult_t *chksum;
00142 sqlResult_t *ownerName;
00143 sqlResult_t *ownerZone;
00144 sqlResult_t *createTime;
00145 sqlResult_t *modifyTime;
00146 sqlResult_t *rescHier;
00147
00148
00149
00150 memset (myColl, 0, MAX_NAME_LEN);
00151 memset (myData, 0, MAX_NAME_LEN);
00152
00153 if ((status = splitPathByKey (
00154 dataObjInp->objPath, myColl, myData, '/')) < 0) {
00155 return (OBJ_PATH_DOES_NOT_EXIST);
00156 }
00157
00158 memset (&genQueryInp, 0, sizeof (genQueryInp));
00159
00160 snprintf (condStr, MAX_NAME_LEN, "='%s'", myColl);
00161 addInxVal (&genQueryInp.sqlCondInp, COL_COLL_NAME, condStr);
00162 snprintf (condStr, MAX_NAME_LEN, "='%s'", myData);
00163 addInxVal (&genQueryInp.sqlCondInp, COL_DATA_NAME, condStr);
00164
00165 addInxIval (&genQueryInp.selectInp, COL_D_DATA_ID, 1);
00166 addInxIval (&genQueryInp.selectInp, COL_DATA_SIZE, 1);
00167 addInxIval (&genQueryInp.selectInp, COL_DATA_MODE, 1);
00168 addInxIval (&genQueryInp.selectInp, COL_D_REPL_STATUS, 1);
00169 addInxIval (&genQueryInp.selectInp, COL_D_DATA_CHECKSUM, 1);
00170 addInxIval (&genQueryInp.selectInp, COL_D_OWNER_NAME, 1);
00171 addInxIval (&genQueryInp.selectInp, COL_D_OWNER_ZONE, 1);
00172 addInxIval (&genQueryInp.selectInp, COL_D_CREATE_TIME, 1);
00173 addInxIval (&genQueryInp.selectInp, COL_D_MODIFY_TIME, 1);
00174 addInxIval (&genQueryInp.selectInp, COL_D_RESC_HIER, 1);
00175 genQueryInp.maxRows = MAX_SQL_ROWS;
00176
00177 status = rsGenQuery (rsComm, &genQueryInp, &genQueryOut);
00178
00179 clearGenQueryInp (&genQueryInp);
00180
00181 if (status >= 0) {
00182 if ((dataSize = getSqlResultByInx (genQueryOut, COL_DATA_SIZE))
00183 == NULL) {
00184 rodsLog (LOG_ERROR,
00185 "_rsObjStat: getSqlResultByInx for COL_DATA_SIZE failed");
00186 return (UNMATCHED_KEY_OR_INDEX);
00187 } else if ((dataMode = getSqlResultByInx (genQueryOut,
00188 COL_DATA_MODE)) == NULL) {
00189 rodsLog (LOG_ERROR,
00190 "_rsObjStat: getSqlResultByInx for COL_DATA_MODE failed");
00191 return (UNMATCHED_KEY_OR_INDEX);
00192 } else if ((replStatus = getSqlResultByInx (genQueryOut,
00193 COL_D_REPL_STATUS)) == NULL) {
00194 rodsLog (LOG_ERROR,
00195 "_rsObjStat: getSqlResultByInx for COL_D_REPL_STATUS failed");
00196 return (UNMATCHED_KEY_OR_INDEX);
00197 } else if ((dataId = getSqlResultByInx (genQueryOut,
00198 COL_D_DATA_ID)) == NULL) {
00199 rodsLog (LOG_ERROR,
00200 "_rsObjStat: getSqlResultByInx for COL_D_DATA_ID failed");
00201 return (UNMATCHED_KEY_OR_INDEX);
00202 } else if ((chksum = getSqlResultByInx (genQueryOut,
00203 COL_D_DATA_CHECKSUM)) == NULL) {
00204 rodsLog (LOG_ERROR,
00205 "_rsObjStat:getSqlResultByInx for COL_D_DATA_CHECKSUM failed");
00206 return (UNMATCHED_KEY_OR_INDEX);
00207 } else if ((ownerName = getSqlResultByInx (genQueryOut,
00208 COL_D_OWNER_NAME)) == NULL) {
00209 rodsLog (LOG_ERROR,
00210 "_rsObjStat:getSqlResultByInx for COL_D_OWNER_NAME failed");
00211 return (UNMATCHED_KEY_OR_INDEX);
00212 } else if ((ownerZone = getSqlResultByInx (genQueryOut,
00213 COL_D_OWNER_ZONE)) == NULL) {
00214 rodsLog (LOG_ERROR,
00215 "_rsObjStat:getSqlResultByInx for COL_D_OWNER_ZONE failed");
00216 return (UNMATCHED_KEY_OR_INDEX);
00217 } else if ((createTime = getSqlResultByInx (genQueryOut,
00218 COL_D_CREATE_TIME)) == NULL) {
00219 rodsLog (LOG_ERROR,
00220 "_rsObjStat:getSqlResultByInx for COL_D_CREATE_TIME failed");
00221 return (UNMATCHED_KEY_OR_INDEX);
00222 } else if ((modifyTime = getSqlResultByInx (genQueryOut,
00223 COL_D_MODIFY_TIME)) == NULL) {
00224 rodsLog (LOG_ERROR,
00225 "_rsObjStat:getSqlResultByInx for COL_D_MODIFY_TIME failed");
00226 return (UNMATCHED_KEY_OR_INDEX);
00227 } else if ((rescHier = getSqlResultByInx (genQueryOut,
00228 COL_D_RESC_HIER)) == NULL) {
00229 rodsLog (LOG_ERROR,
00230 "_rsObjStat:getSqlResultByInx for COL_D_RESC_HIER failed");
00231 return (UNMATCHED_KEY_OR_INDEX);
00232 } else {
00233 int i;
00234
00235 *rodsObjStatOut = (rodsObjStat_t *) malloc (sizeof (rodsObjStat_t));
00236 memset (*rodsObjStatOut, 0, sizeof (rodsObjStat_t));
00237 (*rodsObjStatOut)->objType = DATA_OBJ_T; status = (int)DATA_OBJ_T;
00238
00239
00240
00241 for (i = 0;i < genQueryOut->rowCnt; i++) {
00242 if (atoi (&replStatus->value[replStatus->len * i]) > 0) {
00243 rstrcpy ((*rodsObjStatOut)->dataId,
00244 &dataId->value[dataId->len * i], NAME_LEN);
00245 (*rodsObjStatOut)->objSize =
00246 strtoll (&dataSize->value[dataSize->len * i], 0, 0);
00247 (*rodsObjStatOut)->dataMode =
00248 atoi (&dataMode->value[dataMode->len * i]);
00249 rstrcpy ((*rodsObjStatOut)->chksum,
00250 &chksum->value[chksum->len * i], NAME_LEN);
00251 rstrcpy ((*rodsObjStatOut)->ownerName,
00252 &ownerName->value[ownerName->len * i], NAME_LEN);
00253 rstrcpy ((*rodsObjStatOut)->ownerZone,
00254 &ownerZone->value[ownerZone->len * i], NAME_LEN);
00255 rstrcpy ((*rodsObjStatOut)->createTime,
00256 &createTime->value[createTime->len * i], TIME_LEN);
00257 rstrcpy ((*rodsObjStatOut)->modifyTime,
00258 &modifyTime->value[modifyTime->len * i], TIME_LEN);
00259 rstrcpy ((*rodsObjStatOut)->rescHier,
00260 &rescHier->value[rescHier->len * i], MAX_NAME_LEN);
00261 break;
00262 }
00263 }
00264
00265 if (strlen ((*rodsObjStatOut)->dataId) == 0) {
00266
00267 rstrcpy ((*rodsObjStatOut)->dataId, dataId->value, NAME_LEN);
00268 (*rodsObjStatOut)->objSize = strtoll (dataSize->value, 0, 0);
00269 rstrcpy ((*rodsObjStatOut)->chksum, chksum->value, NAME_LEN);
00270 rstrcpy ((*rodsObjStatOut)->ownerName, ownerName->value,
00271 NAME_LEN);
00272 rstrcpy ((*rodsObjStatOut)->ownerZone, ownerZone->value,
00273 NAME_LEN);
00274 rstrcpy ((*rodsObjStatOut)->createTime, createTime->value,
00275 TIME_LEN);
00276 rstrcpy ((*rodsObjStatOut)->modifyTime, modifyTime->value,
00277 TIME_LEN);
00278 rstrcpy ((*rodsObjStatOut)->rescHier, rescHier->value,
00279 MAX_NAME_LEN);
00280 }
00281 }
00282 freeGenQueryOut (&genQueryOut);
00283 }
00284
00285 return (status);
00286 }
00287