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 int status;
00092 char *tmpStr;
00093 specCollCache_t *specCollCache;
00094
00095
00096 if ((tmpStr = getValByKey (&dataObjInp->condInput, SEL_OBJ_TYPE_KW)) ==
00097 NULL || strcmp (tmpStr, "dataObj") == 0) {
00098 status = dataObjStat (rsComm, dataObjInp, rodsObjStatOut);
00099 if (status >= 0) return (status);
00100 }
00101
00102 if (tmpStr == NULL || strcmp (tmpStr, "collection") == 0) {
00103 status = collStat (rsComm, dataObjInp, rodsObjStatOut);
00104
00105 if (status >= 0) {
00106 if ((*rodsObjStatOut)->specColl == NULL) {
00107 if (getSpecCollCache (rsComm, dataObjInp->objPath, 0,
00108 &specCollCache) >= 0) {
00109 replSpecColl (&specCollCache->specColl,
00110 &(*rodsObjStatOut)->specColl);
00111 }
00112 }
00113 return (status);
00114 }
00115 }
00116
00117
00118
00119 status = statPathInSpecColl (rsComm, dataObjInp->objPath, 0,
00120 rodsObjStatOut);
00121
00122
00123 if (status < 0) status = USER_FILE_DOES_NOT_EXIST;
00124 return (status);
00125 }
00126
00127 int
00128 dataObjStat (rsComm_t *rsComm, dataObjInp_t *dataObjInp,
00129 rodsObjStat_t **rodsObjStatOut)
00130 {
00131 genQueryInp_t genQueryInp;
00132 genQueryOut_t *genQueryOut = NULL;
00133 int status;
00134 char myColl[MAX_NAME_LEN], myData[MAX_NAME_LEN];
00135 char condStr[MAX_NAME_LEN];
00136 sqlResult_t *dataSize;
00137 sqlResult_t *dataMode;
00138 sqlResult_t *replStatus;
00139 sqlResult_t *dataId;
00140 sqlResult_t *chksum;
00141 sqlResult_t *ownerName;
00142 sqlResult_t *ownerZone;
00143 sqlResult_t *createTime;
00144 sqlResult_t *modifyTime;
00145
00146
00147
00148 memset (myColl, 0, MAX_NAME_LEN);
00149 memset (myData, 0, MAX_NAME_LEN);
00150
00151 if ((status = splitPathByKey (
00152 dataObjInp->objPath, myColl, myData, '/')) < 0) {
00153 return (OBJ_PATH_DOES_NOT_EXIST);
00154 }
00155
00156 memset (&genQueryInp, 0, sizeof (genQueryInp));
00157
00158 snprintf (condStr, MAX_NAME_LEN, "='%s'", myColl);
00159 addInxVal (&genQueryInp.sqlCondInp, COL_COLL_NAME, condStr);
00160 snprintf (condStr, MAX_NAME_LEN, "='%s'", myData);
00161 addInxVal (&genQueryInp.sqlCondInp, COL_DATA_NAME, condStr);
00162
00163 addInxIval (&genQueryInp.selectInp, COL_D_DATA_ID, 1);
00164 addInxIval (&genQueryInp.selectInp, COL_DATA_SIZE, 1);
00165 addInxIval (&genQueryInp.selectInp, COL_DATA_MODE, 1);
00166 addInxIval (&genQueryInp.selectInp, COL_D_REPL_STATUS, 1);
00167 addInxIval (&genQueryInp.selectInp, COL_D_DATA_CHECKSUM, 1);
00168 addInxIval (&genQueryInp.selectInp, COL_D_OWNER_NAME, 1);
00169 addInxIval (&genQueryInp.selectInp, COL_D_OWNER_ZONE, 1);
00170 addInxIval (&genQueryInp.selectInp, COL_D_CREATE_TIME, 1);
00171 addInxIval (&genQueryInp.selectInp, COL_D_MODIFY_TIME, 1);
00172
00173 genQueryInp.maxRows = MAX_SQL_ROWS;
00174
00175 status = rsGenQuery (rsComm, &genQueryInp, &genQueryOut);
00176
00177 clearGenQueryInp (&genQueryInp);
00178
00179 if (status >= 0) {
00180 if ((dataSize = getSqlResultByInx (genQueryOut, COL_DATA_SIZE))
00181 == NULL) {
00182 rodsLog (LOG_ERROR,
00183 "_rsObjStat: getSqlResultByInx for COL_DATA_SIZE failed");
00184 return (UNMATCHED_KEY_OR_INDEX);
00185 } else if ((dataMode = getSqlResultByInx (genQueryOut,
00186 COL_DATA_MODE)) == NULL) {
00187 rodsLog (LOG_ERROR,
00188 "_rsObjStat: getSqlResultByInx for COL_DATA_MODE failed");
00189 return (UNMATCHED_KEY_OR_INDEX);
00190 } else if ((replStatus = getSqlResultByInx (genQueryOut,
00191 COL_D_REPL_STATUS)) == NULL) {
00192 rodsLog (LOG_ERROR,
00193 "_rsObjStat: getSqlResultByInx for COL_D_REPL_STATUS failed");
00194 return (UNMATCHED_KEY_OR_INDEX);
00195 } else if ((dataId = getSqlResultByInx (genQueryOut,
00196 COL_D_DATA_ID)) == NULL) {
00197 rodsLog (LOG_ERROR,
00198 "_rsObjStat: getSqlResultByInx for COL_D_DATA_ID failed");
00199 return (UNMATCHED_KEY_OR_INDEX);
00200 } else if ((chksum = getSqlResultByInx (genQueryOut,
00201 COL_D_DATA_CHECKSUM)) == NULL) {
00202 rodsLog (LOG_ERROR,
00203 "_rsObjStat:getSqlResultByInx for COL_D_DATA_CHECKSUM failed");
00204 return (UNMATCHED_KEY_OR_INDEX);
00205 } else if ((ownerName = getSqlResultByInx (genQueryOut,
00206 COL_D_OWNER_NAME)) == NULL) {
00207 rodsLog (LOG_ERROR,
00208 "_rsObjStat:getSqlResultByInx for COL_D_OWNER_NAME failed");
00209 return (UNMATCHED_KEY_OR_INDEX);
00210 } else if ((ownerZone = getSqlResultByInx (genQueryOut,
00211 COL_D_OWNER_ZONE)) == NULL) {
00212 rodsLog (LOG_ERROR,
00213 "_rsObjStat:getSqlResultByInx for COL_D_OWNER_ZONE failed");
00214 return (UNMATCHED_KEY_OR_INDEX);
00215 } else if ((createTime = getSqlResultByInx (genQueryOut,
00216 COL_D_CREATE_TIME)) == NULL) {
00217 rodsLog (LOG_ERROR,
00218 "_rsObjStat:getSqlResultByInx for COL_D_CREATE_TIME failed");
00219 return (UNMATCHED_KEY_OR_INDEX);
00220 } else if ((modifyTime = getSqlResultByInx (genQueryOut,
00221 COL_D_MODIFY_TIME)) == NULL) {
00222 rodsLog (LOG_ERROR,
00223 "_rsObjStat:getSqlResultByInx for COL_D_MODIFY_TIME failed");
00224 return (UNMATCHED_KEY_OR_INDEX);
00225 } else {
00226 int i;
00227
00228 *rodsObjStatOut = (rodsObjStat_t *) malloc (sizeof (rodsObjStat_t));
00229 memset (*rodsObjStatOut, 0, sizeof (rodsObjStat_t));
00230 (*rodsObjStatOut)->objType = DATA_OBJ_T; status = (int)DATA_OBJ_T;
00231
00232
00233
00234 for (i = 0;i < genQueryOut->rowCnt; i++) {
00235 if (atoi (&replStatus->value[replStatus->len * i]) > 0) {
00236 rstrcpy ((*rodsObjStatOut)->dataId,
00237 &dataId->value[dataId->len * i], NAME_LEN);
00238 (*rodsObjStatOut)->objSize =
00239 strtoll (&dataSize->value[dataSize->len * i], 0, 0);
00240 (*rodsObjStatOut)->dataMode =
00241 atoi (&dataMode->value[dataMode->len * i]);
00242 rstrcpy ((*rodsObjStatOut)->chksum,
00243 &chksum->value[chksum->len * i], NAME_LEN);
00244 rstrcpy ((*rodsObjStatOut)->ownerName,
00245 &ownerName->value[ownerName->len * i], NAME_LEN);
00246 rstrcpy ((*rodsObjStatOut)->ownerZone,
00247 &ownerZone->value[ownerZone->len * i], NAME_LEN);
00248 rstrcpy ((*rodsObjStatOut)->createTime,
00249 &createTime->value[createTime->len * i], TIME_LEN);
00250 rstrcpy ((*rodsObjStatOut)->modifyTime,
00251 &modifyTime->value[modifyTime->len * i], TIME_LEN);
00252 break;
00253 }
00254 }
00255
00256 if (strlen ((*rodsObjStatOut)->dataId) == 0) {
00257
00258 rstrcpy ((*rodsObjStatOut)->dataId, dataId->value, NAME_LEN);
00259 (*rodsObjStatOut)->objSize = strtoll (dataSize->value, 0, 0);
00260 rstrcpy ((*rodsObjStatOut)->chksum, chksum->value, NAME_LEN);
00261 rstrcpy ((*rodsObjStatOut)->ownerName, ownerName->value,
00262 NAME_LEN);
00263 rstrcpy ((*rodsObjStatOut)->ownerZone, ownerZone->value,
00264 NAME_LEN);
00265 rstrcpy ((*rodsObjStatOut)->createTime, createTime->value,
00266 NAME_LEN);
00267 rstrcpy ((*rodsObjStatOut)->modifyTime, modifyTime->value,
00268 NAME_LEN);
00269 }
00270 }
00271 freeGenQueryOut (&genQueryOut);
00272 }
00273
00274 return (status);
00275 }
00276