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
00147
00148
00149 memset (myColl, 0, MAX_NAME_LEN);
00150 memset (myData, 0, MAX_NAME_LEN);
00151
00152 if ((status = splitPathByKey (
00153 dataObjInp->objPath, myColl, myData, '/')) < 0) {
00154 return (OBJ_PATH_DOES_NOT_EXIST);
00155 }
00156
00157 memset (&genQueryInp, 0, sizeof (genQueryInp));
00158
00159 snprintf (condStr, MAX_NAME_LEN, "='%s'", myColl);
00160 addInxVal (&genQueryInp.sqlCondInp, COL_COLL_NAME, condStr);
00161 snprintf (condStr, MAX_NAME_LEN, "='%s'", myData);
00162 addInxVal (&genQueryInp.sqlCondInp, COL_DATA_NAME, condStr);
00163
00164 addInxIval (&genQueryInp.selectInp, COL_D_DATA_ID, 1);
00165 addInxIval (&genQueryInp.selectInp, COL_DATA_SIZE, 1);
00166 addInxIval (&genQueryInp.selectInp, COL_DATA_MODE, 1);
00167 addInxIval (&genQueryInp.selectInp, COL_D_REPL_STATUS, 1);
00168 addInxIval (&genQueryInp.selectInp, COL_D_DATA_CHECKSUM, 1);
00169 addInxIval (&genQueryInp.selectInp, COL_D_OWNER_NAME, 1);
00170 addInxIval (&genQueryInp.selectInp, COL_D_OWNER_ZONE, 1);
00171 addInxIval (&genQueryInp.selectInp, COL_D_CREATE_TIME, 1);
00172 addInxIval (&genQueryInp.selectInp, COL_D_MODIFY_TIME, 1);
00173
00174 genQueryInp.maxRows = MAX_SQL_ROWS;
00175
00176 status = rsGenQuery (rsComm, &genQueryInp, &genQueryOut);
00177
00178 clearGenQueryInp (&genQueryInp);
00179
00180 if (status >= 0) {
00181 if ((dataSize = getSqlResultByInx (genQueryOut, COL_DATA_SIZE))
00182 == NULL) {
00183 rodsLog (LOG_ERROR,
00184 "_rsObjStat: getSqlResultByInx for COL_DATA_SIZE failed");
00185 return (UNMATCHED_KEY_OR_INDEX);
00186 } else if ((dataMode = getSqlResultByInx (genQueryOut,
00187 COL_DATA_MODE)) == NULL) {
00188 rodsLog (LOG_ERROR,
00189 "_rsObjStat: getSqlResultByInx for COL_DATA_MODE failed");
00190 return (UNMATCHED_KEY_OR_INDEX);
00191 } else if ((replStatus = getSqlResultByInx (genQueryOut,
00192 COL_D_REPL_STATUS)) == NULL) {
00193 rodsLog (LOG_ERROR,
00194 "_rsObjStat: getSqlResultByInx for COL_D_REPL_STATUS failed");
00195 return (UNMATCHED_KEY_OR_INDEX);
00196 } else if ((dataId = getSqlResultByInx (genQueryOut,
00197 COL_D_DATA_ID)) == NULL) {
00198 rodsLog (LOG_ERROR,
00199 "_rsObjStat: getSqlResultByInx for COL_D_DATA_ID failed");
00200 return (UNMATCHED_KEY_OR_INDEX);
00201 } else if ((chksum = getSqlResultByInx (genQueryOut,
00202 COL_D_DATA_CHECKSUM)) == NULL) {
00203 rodsLog (LOG_ERROR,
00204 "_rsObjStat:getSqlResultByInx for COL_D_DATA_CHECKSUM failed");
00205 return (UNMATCHED_KEY_OR_INDEX);
00206 } else if ((ownerName = getSqlResultByInx (genQueryOut,
00207 COL_D_OWNER_NAME)) == NULL) {
00208 rodsLog (LOG_ERROR,
00209 "_rsObjStat:getSqlResultByInx for COL_D_OWNER_NAME failed");
00210 return (UNMATCHED_KEY_OR_INDEX);
00211 } else if ((ownerZone = getSqlResultByInx (genQueryOut,
00212 COL_D_OWNER_ZONE)) == NULL) {
00213 rodsLog (LOG_ERROR,
00214 "_rsObjStat:getSqlResultByInx for COL_D_OWNER_ZONE failed");
00215 return (UNMATCHED_KEY_OR_INDEX);
00216 } else if ((createTime = getSqlResultByInx (genQueryOut,
00217 COL_D_CREATE_TIME)) == NULL) {
00218 rodsLog (LOG_ERROR,
00219 "_rsObjStat:getSqlResultByInx for COL_D_CREATE_TIME failed");
00220 return (UNMATCHED_KEY_OR_INDEX);
00221 } else if ((modifyTime = getSqlResultByInx (genQueryOut,
00222 COL_D_MODIFY_TIME)) == NULL) {
00223 rodsLog (LOG_ERROR,
00224 "_rsObjStat:getSqlResultByInx for COL_D_MODIFY_TIME failed");
00225 return (UNMATCHED_KEY_OR_INDEX);
00226 } else {
00227 int i;
00228
00229 *rodsObjStatOut = (rodsObjStat_t *) malloc (sizeof (rodsObjStat_t));
00230 memset (*rodsObjStatOut, 0, sizeof (rodsObjStat_t));
00231 (*rodsObjStatOut)->objType = DATA_OBJ_T; status = (int)DATA_OBJ_T;
00232
00233
00234
00235 for (i = 0;i < genQueryOut->rowCnt; i++) {
00236 if (atoi (&replStatus->value[replStatus->len * i]) > 0) {
00237 rstrcpy ((*rodsObjStatOut)->dataId,
00238 &dataId->value[dataId->len * i], NAME_LEN);
00239 (*rodsObjStatOut)->objSize =
00240 strtoll (&dataSize->value[dataSize->len * i], 0, 0);
00241 (*rodsObjStatOut)->dataMode =
00242 atoi (&dataMode->value[dataMode->len * i]);
00243 rstrcpy ((*rodsObjStatOut)->chksum,
00244 &chksum->value[chksum->len * i], NAME_LEN);
00245 rstrcpy ((*rodsObjStatOut)->ownerName,
00246 &ownerName->value[ownerName->len * i], NAME_LEN);
00247 rstrcpy ((*rodsObjStatOut)->ownerZone,
00248 &ownerZone->value[ownerZone->len * i], NAME_LEN);
00249 rstrcpy ((*rodsObjStatOut)->createTime,
00250 &createTime->value[createTime->len * i], TIME_LEN);
00251 rstrcpy ((*rodsObjStatOut)->modifyTime,
00252 &modifyTime->value[modifyTime->len * i], TIME_LEN);
00253 break;
00254 }
00255 }
00256
00257 if (strlen ((*rodsObjStatOut)->dataId) == 0) {
00258
00259 rstrcpy ((*rodsObjStatOut)->dataId, dataId->value, NAME_LEN);
00260 (*rodsObjStatOut)->objSize = strtoll (dataSize->value, 0, 0);
00261 rstrcpy ((*rodsObjStatOut)->chksum, chksum->value, NAME_LEN);
00262 rstrcpy ((*rodsObjStatOut)->ownerName, ownerName->value,
00263 NAME_LEN);
00264 rstrcpy ((*rodsObjStatOut)->ownerZone, ownerZone->value,
00265 NAME_LEN);
00266 rstrcpy ((*rodsObjStatOut)->createTime, createTime->value,
00267 NAME_LEN);
00268 rstrcpy ((*rodsObjStatOut)->modifyTime, modifyTime->value,
00269 NAME_LEN);
00270 }
00271 }
00272 freeGenQueryOut (&genQueryOut);
00273 }
00274
00275 return (status);
00276 }
00277