00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "rods.h"
00020 #include "rcMisc.h"
00021 #include "eirods_error.h"
00022 #include "eirods_zone_info.h"
00023 #include "eirods_sql_logger.h"
00024 #include "eirods_string_tokenize.h"
00025 #include "eirods_log.h"
00026 #include "eirods_tmp_string.h"
00027 #include "eirods_children_parser.h"
00028 #include "eirods_stacktrace.h"
00029 #include "eirods_hierarchy_parser.h"
00030
00031 #include "icatMidLevelRoutines.h"
00032 #include "icatMidLevelHelpers.h"
00033 #include "icatHighLevelRoutines.h"
00034 #include "icatLowLevel.h"
00035
00036 #include <string>
00037 #include <iostream>
00038 #include <sstream>
00039 #include <vector>
00040
00041 extern int get64RandomBytes(char *buf);
00042
00043 static char prevChalSig[200];
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 #define AP_READ "read"
00072 #define AP_WRITE "write"
00073 #define AP_OWN "own"
00074 #define AP_NULL "null"
00075
00076 #define MAX_PASSWORDS 40
00077
00078
00079
00080
00081
00082
00083
00084 #define TEMP_PASSWORD_TIME 120
00085
00086 #define PASSWORD_SCRAMBLE_PREFIX ".E_"
00087 #define PASSWORD_KEY_ENV_VAR "irodsPKey"
00088 #define PASSWORD_DEFAULT_KEY "a9_3fker"
00089
00090 int logSQL=0;
00091
00092 static int _delColl(rsComm_t *rsComm, collInfo_t *collInfo);
00093 static int removeAVUs();
00094
00095 icatSessionStruct icss={0};
00096 char localZone[MAX_NAME_LEN]="";
00097
00098 int creatingUserByGroupAdmin=0;
00099
00100
00101
00102
00103
00104 int chlDebug(char *debugMode) {
00105 if (strstr(debugMode, "SQL")) {
00106 logSQL=1;
00107 chlDebugGenQuery(1);
00108 chlDebugGenUpdate(1);
00109 cmlDebug(2);
00110 }
00111 else {
00112 if (strstr(debugMode, "sql")) {
00113 logSQL=1;
00114 chlDebugGenQuery(1);
00115 chlDebugGenUpdate(1);
00116 cmlDebug(1);
00117 }
00118 else {
00119 logSQL=0;
00120 chlDebugGenQuery(0);
00121 chlDebugGenUpdate(0);
00122 cmlDebug(0);
00123 }
00124 }
00125 return(0);
00126 }
00127
00128
00129
00130
00131
00132 static int
00133 icatDescramble(char *pw) {
00134 char *cp1, *cp2, *cp3;
00135 int i,len;
00136 char pw2[MAX_PASSWORD_LEN+10];
00137 char unscrambled[MAX_PASSWORD_LEN+10];
00138
00139 len = strlen(PASSWORD_SCRAMBLE_PREFIX);
00140 cp1=pw;
00141 cp2=PASSWORD_SCRAMBLE_PREFIX;
00142 for (i=0;i<len;i++) {
00143 if (*cp1++ != *cp2++) {
00144 return 0;
00145 }
00146 }
00147 strncpy(pw2, cp1, MAX_PASSWORD_LEN);
00148 cp3 = getenv(PASSWORD_KEY_ENV_VAR);
00149 if (cp3==NULL) {
00150 cp3 = PASSWORD_DEFAULT_KEY;
00151 }
00152 obfDecodeByKey(pw2, cp3, unscrambled);
00153 strncpy(pw, unscrambled, MAX_PASSWORD_LEN);
00154
00155 return 0;
00156 }
00157
00158
00159
00160
00161
00162 static int
00163 icatScramble(char *pw) {
00164 char *cp1;
00165 char newPw[MAX_PASSWORD_LEN+10];
00166 char scrambled[MAX_PASSWORD_LEN+10];
00167
00168 cp1 = getenv(PASSWORD_KEY_ENV_VAR);
00169 if (cp1==NULL) {
00170 cp1 = PASSWORD_DEFAULT_KEY;
00171 }
00172 obfEncodeByKey(pw, cp1, scrambled);
00173 strncpy(newPw, PASSWORD_SCRAMBLE_PREFIX, MAX_PASSWORD_LEN);
00174 strncat(newPw, scrambled, MAX_PASSWORD_LEN);
00175 strncpy(pw, newPw, MAX_PASSWORD_LEN);
00176 return 0;
00177 }
00178
00179
00180
00181
00182
00183 int chlOpen(char *DBUser, char *DBpasswd) {
00184 int i;
00185 if (logSQL!=0) rodsLog(LOG_SQL, "chlOpen");
00186 strncpy(icss.databaseUsername, DBUser, DB_USERNAME_LEN);
00187 strncpy(icss.databasePassword, DBpasswd, DB_PASSWORD_LEN);
00188 i = cmlOpen(&icss);
00189 if (i != 0) {
00190 rodsLog(LOG_NOTICE, "chlOpen cmlOpen failure %d",i);
00191 }
00192 else {
00193 icss.status=1;
00194 }
00195 return(i);
00196 }
00197
00198
00199
00200
00201
00202 int chlClose() {
00203 int i;
00204
00205 i = cmlClose(&icss);
00206 if (i == 0) icss.status=0;
00207 return(i);
00208 }
00209
00210 int chlIsConnected() {
00211 if (logSQL!=0) rodsLog(LOG_SQL, "chlIsConnected");
00212 return(icss.status);
00213 }
00214
00215
00216
00217
00218
00219
00220
00221
00222 icatSessionStruct *
00223 chlGetRcs()
00224 {
00225 if (logSQL!=0) rodsLog(LOG_SQL, "chlGetRcs");
00226 if (icss.status != 1) {
00227 return(NULL);
00228 }
00229 return(&icss);
00230 }
00231
00232
00233
00234
00235 int
00236 _rollback(const char *functionName) {
00237 int status;
00238 #if ORA_ICAT
00239 status = 0;
00240 #else
00241
00242
00243 status = cmlExecuteNoAnswerSql("rollback", &icss);
00244 if (status == 0) {
00245 rodsLog(LOG_NOTICE,
00246 "%s cmlExecuteNoAnswerSql(rollback) succeeded", functionName);
00247 }
00248 else {
00249 rodsLog(LOG_NOTICE,
00250 "%s cmlExecuteNoAnswerSql(rollback) failure %d",
00251 functionName, status);
00252 }
00253 #endif
00254
00255 return(status);
00256 }
00257
00258
00259
00260
00261
00262
00263
00264 int
00265 getLocalZone()
00266 {
00267 std::string local_zone;
00268 eirods::error e = eirods::zone_info::get_instance()->get_local_zone(icss, logSQL, local_zone);
00269 strncpy(localZone, local_zone.c_str(), MAX_NAME_LEN);
00270 return e.code();
00271 }
00272
00273
00274
00275
00276
00277 char *
00278 chlGetLocalZone() {
00279 getLocalZone();
00280 return(localZone);
00281 }
00282
00283
00284
00285
00286 static int
00287 _updateRescObjCount(
00288 const std::string& _resc_name,
00289 const std::string& _zone,
00290 int _amount) {
00291
00292 int result = 0;
00293 int status;
00294 char resc_id[MAX_NAME_LEN];
00295 char myTime[50];
00296 eirods::sql_logger logger(__FUNCTION__, logSQL);
00297 eirods::hierarchy_parser hparse;
00298
00299 resc_id[0] = '\0';
00300
00301 std::stringstream ss;
00302 if((status = cmlGetStringValueFromSql("select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
00303 resc_id, MAX_NAME_LEN, _resc_name.c_str(), _zone.c_str(), 0,
00304 &icss)) != 0) {
00305 if(status == CAT_NO_ROWS_FOUND) {
00306 result = CAT_INVALID_RESOURCE;
00307 } else {
00308 _rollback(__FUNCTION__);
00309 result = status;
00310 }
00311 } else {
00312 std::stringstream ss;
00313 ss << "update R_RESC_MAIN set resc_objcount=resc_objcount+";
00314 ss << _amount;
00315 ss << ", modify_ts=? where resc_id=?";
00316
00317 getNowStr(myTime);
00318 cllBindVarCount = 0;
00319
00320 cllBindVars[cllBindVarCount++] = myTime;
00321 cllBindVars[cllBindVarCount++] = resc_id;
00322
00323 if((status = cmlExecuteNoAnswerSql(ss.str().c_str(), &icss)) != 0) {
00324 std::stringstream ss;
00325 ss << __FUNCTION__ << " cmlExecuteNoAnswerSql update failure " << status;
00326 eirods::log(LOG_NOTICE, ss.str());
00327 _rollback(__FUNCTION__);
00328 result = status;
00329 }
00330 }
00331 return result;
00332 }
00333
00334
00335
00336
00337 static int
00338 _updateObjCountOfResources(
00339 const std::string _resc_hier,
00340 const std::string _zone,
00341 int _amount) {
00342 int result = 0;
00343 eirods::hierarchy_parser hparse;
00344
00345 hparse.set_string(_resc_hier);
00346 for(eirods::hierarchy_parser::const_iterator it = hparse.begin();
00347 result == 0 && it != hparse.end(); ++it) {
00348 result = _updateRescObjCount(*it, _zone, _amount);
00349 }
00350 return result;
00351 }
00352
00353
00354
00355
00356 int
00357 chlUpdateRescObjCount(
00358 const std::string& _resc,
00359 int _delta) {
00360
00361 int result = 0;
00362 int ret;
00363 if((ret = getLocalZone()) != 0) {
00364 std::stringstream msg;
00365 msg << __FUNCTION__ << " - Failed to set the local zone.";
00366 eirods::log(LOG_ERROR, msg.str());
00367 result = ret;
00368 } else if((ret = _updateRescObjCount(_resc, localZone, _delta)) != 0) {
00369 std::stringstream msg;
00370 msg << __FUNCTION__ << " - Failed to update the object count for resource \"" << _resc << "\"";
00371 eirods::log(LOG_ERROR, msg.str());
00372 result = ret;
00373 }
00374
00375 return result;
00376 }
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391 int chlModDataObjMeta(rsComm_t *rsComm, dataObjInfo_t *dataObjInfo,
00392 keyValPair_t *regParam) {
00393 int i, j, status, upCols;
00394 rodsLong_t iVal = 0;
00395 int status2;
00396
00397 int mode=0;
00398
00399 char logicalFileName[MAX_NAME_LEN];
00400 char logicalDirName[MAX_NAME_LEN];
00401 char *theVal;
00402 char replNum1[MAX_NAME_LEN];
00403
00404 char *whereColsAndConds[10];
00405 char *whereValues[10];
00406 char idVal[MAX_NAME_LEN];
00407 int numConditions;
00408 char oldCopy[NAME_LEN];
00409 char newCopy[NAME_LEN];
00410 int adminMode;
00411
00412 int maxCols=90;
00413 char *updateCols[90];
00414 char *updateVals[90];
00415
00416
00417
00418
00419 int dataTypeIndex=1;
00420
00421 char *regParamNames[]={
00422 REPL_NUM_KW, DATA_TYPE_KW, DATA_SIZE_KW,
00423 RESC_NAME_KW,FILE_PATH_KW, DATA_OWNER_KW, DATA_OWNER_ZONE_KW,
00424 REPL_STATUS_KW, CHKSUM_KW, DATA_EXPIRY_KW,
00425 DATA_COMMENTS_KW, DATA_CREATE_KW, DATA_MODIFY_KW, RESC_GROUP_NAME_KW,
00426 DATA_MODE_KW, RESC_HIER_STR_KW, "END"
00427 };
00428
00429
00430
00431 char *colNames[]={
00432 "data_repl_num", "data_type_name", "data_size",
00433 "resc_name", "data_path", "data_owner_name", "data_owner_zone",
00434 "data_is_dirty", "data_checksum", "data_expiry_ts",
00435 "r_comment", "create_ts", "modify_ts", "resc_group_name",
00436 "data_mode", "resc_hier"
00437 };
00438 int DATA_EXPIRY_TS_IX=9;
00439 int MODIFY_TS_IX=12;
00440
00441 char objIdString[MAX_NAME_LEN];
00442 char *neededAccess;
00443
00444 if (logSQL!=0) rodsLog(LOG_SQL, "chlModDataObjMeta");
00445
00446 if (regParam == NULL || dataObjInfo == NULL) {
00447 return (CAT_INVALID_ARGUMENT);
00448 }
00449
00450 adminMode=0;
00451 theVal = getValByKey(regParam, IRODS_ADMIN_KW);
00452 if (theVal != NULL) {
00453 adminMode=1;
00454 }
00455
00456
00457 for (i=0, j=0; i<maxCols; i++) {
00458 if (strcmp(regParamNames[i],"END")==0) break;
00459 theVal = getValByKey(regParam, regParamNames[i]);
00460 if (theVal != NULL) {
00461 updateCols[j]=colNames[i];
00462 updateVals[j]=theVal;
00463 if (i==DATA_EXPIRY_TS_IX) {
00464
00465
00466 if (strcmp(colNames[i],"data_expiry_ts") == 0) {
00467 if (strlen(theVal) < 11) {
00468 static char theVal2[20];
00469 time_t myTimeValue;
00470 myTimeValue=atoll(theVal);
00471 snprintf(theVal2, sizeof theVal2, "%011d", (int)myTimeValue);
00472 updateVals[j]=theVal2;
00473 }
00474 }
00475 }
00476
00477 if (i==MODIFY_TS_IX) {
00478
00479
00480 if (strcmp(colNames[i],"modify_ts") == 0) {
00481 if (strlen(theVal) < 11) {
00482 static char theVal3[20];
00483 time_t myTimeValue;
00484 myTimeValue=atoll(theVal);
00485 snprintf(theVal3, sizeof theVal3, "%011d", (int)myTimeValue);
00486 updateVals[j]=theVal3;
00487 }
00488 }
00489 }
00490
00491 j++;
00492
00493
00494 if (i==dataTypeIndex) {
00495 status = cmlCheckNameToken("data_type",
00496 theVal, &icss);
00497 if (status !=0 ) {
00498 std::stringstream msg;
00499 msg << __FUNCTION__;
00500 msg << " - Invalid data type specified.";
00501 addRErrorMsg (&rsComm->rError, 0, msg.str().c_str());
00502 return(CAT_INVALID_DATA_TYPE);
00503 }
00504 }
00505 }
00506 }
00507 upCols=j;
00508
00509
00510
00511
00512
00513
00514
00515 neededAccess = ACCESS_MODIFY_METADATA;
00516 if (upCols==1 && strcmp(updateCols[0],"chksum")==0) {
00517 neededAccess = ACCESS_READ_OBJECT;
00518 }
00519
00520
00521
00522 theVal = getValByKey(regParam, DATA_EXPIRY_KW);
00523 if (theVal != NULL) {
00524 neededAccess = ACCESS_DELETE_OBJECT;
00525 }
00526
00527 if (dataObjInfo->dataId <= 0) {
00528 status = splitPathByKey(dataObjInfo->objPath,
00529 logicalDirName, logicalFileName, '/');
00530
00531 if (logSQL!=0) rodsLog(LOG_SQL, "chlModDataObjMeta SQL 1 ");
00532 status = cmlGetIntegerValueFromSql(
00533 "select coll_id from R_COLL_MAIN where coll_name=?", &iVal,
00534 logicalDirName, 0, 0, 0, 0, &icss);
00535
00536 if (status != 0) {
00537 char errMsg[105];
00538 snprintf(errMsg, 100, "collection '%s' is unknown",
00539 logicalDirName);
00540 addRErrorMsg (&rsComm->rError, 0, errMsg);
00541 _rollback("chlModDataObjMeta");
00542 return(CAT_UNKNOWN_COLLECTION);
00543 }
00544 snprintf(objIdString, MAX_NAME_LEN, "%lld", iVal);
00545
00546 if (logSQL!=0) rodsLog(LOG_SQL, "chlModDataObjMeta SQL 2");
00547 status = cmlGetIntegerValueFromSql(
00548 "select data_id from R_DATA_MAIN where coll_id=? and data_name=?",
00549 &iVal, objIdString, logicalFileName, 0, 0, 0, &icss);
00550 if (status != 0) {
00551 std::stringstream msg;
00552 msg << __FUNCTION__;
00553 msg << " - Failed to find file in database by its logical path.";
00554 addRErrorMsg (&rsComm->rError, 0, msg.str().c_str());
00555 _rollback("chlModDataObjMeta");
00556 return(CAT_UNKNOWN_FILE);
00557 }
00558
00559 dataObjInfo->dataId = iVal;
00560
00561 }
00562
00563 snprintf(objIdString, MAX_NAME_LEN, "%lld", dataObjInfo->dataId);
00564
00565 if (adminMode) {
00566 if (rsComm->clientUser.authInfo.authFlag != LOCAL_PRIV_USER_AUTH) {
00567 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
00568 }
00569 }
00570 else {
00571 status = cmlCheckDataObjId(objIdString, rsComm->clientUser.userName,
00572 rsComm->clientUser.rodsZone, neededAccess, &icss);
00573 if (status != 0) {
00574 theVal = getValByKey(regParam, ACL_COLLECTION_KW);
00575 if (theVal != NULL && dataObjInfo->objPath != NULL &&
00576 upCols==1 && strcmp(updateCols[0],"data_path")==0) {
00577 int len, iVal = 0;
00578
00579
00580
00581
00582 len = strlen(theVal);
00583 if (strncmp(theVal, dataObjInfo->objPath, len) == 0) {
00584
00585 iVal = cmlCheckDir(theVal,
00586 rsComm->clientUser.userName,
00587 rsComm->clientUser.rodsZone,
00588 ACCESS_OWN,
00589 &icss);
00590 }
00591 if (iVal > 0) status=0;
00592
00593 }
00594 if (status) {
00595 _rollback("chlModDataObjMeta");
00596 return(CAT_NO_ACCESS_PERMISSION);
00597 }
00598 }
00599 }
00600
00601 whereColsAndConds[0]="data_id=";
00602 snprintf(idVal, MAX_NAME_LEN, "%lld", dataObjInfo->dataId);
00603 whereValues[0]=idVal;
00604 numConditions=1;
00605
00606
00607
00608
00609
00610
00611 if (getValByKey(regParam, ALL_KW) == NULL) {
00612 j = numConditions;
00613 whereColsAndConds[j]="data_repl_num=";
00614 snprintf(replNum1, MAX_NAME_LEN, "%d", dataObjInfo->replNum);
00615 whereValues[j]=replNum1;
00616 numConditions++;
00617 }
00618
00619 mode =0;
00620 if (getValByKey(regParam, ALL_REPL_STATUS_KW)) {
00621 mode=1;
00622
00623 }
00624
00625
00626
00627 char* new_resc_hier = getValByKey(regParam, RESC_HIER_STR_KW);
00628 if(new_resc_hier != NULL) {
00629 std::stringstream id_stream;
00630 id_stream << dataObjInfo->dataId;
00631 std::stringstream repl_stream;
00632 repl_stream << dataObjInfo->replNum;
00633 char resc_hier[MAX_NAME_LEN];
00634 if((status = cmlGetStringValueFromSql("select resc_hier from R_DATA_MAIN where data_id=? and data_repl_num=?",
00635 resc_hier, MAX_NAME_LEN, id_stream.str().c_str(), repl_stream.str().c_str(),
00636 0, &icss)) != 0) {
00637 std::stringstream msg;
00638 msg << __FUNCTION__;
00639 msg << " - Failed to get the resc hierarchy from object with id: ";
00640 msg << id_stream.str();
00641 msg << " and replNum: ";
00642 msg << repl_stream.str();
00643 eirods::log(LOG_NOTICE, msg.str());
00644 return status;
00645 }
00646
00647 else if((status = _updateObjCountOfResources(resc_hier, rsComm->clientUser.rodsZone, -1)) != 0) {
00648 return status;
00649 } else if((status = _updateObjCountOfResources(new_resc_hier, rsComm->clientUser.rodsZone, +1)) != 0) {
00650 return status;
00651 }
00652 }
00653
00654 if (mode == 0) {
00655 if (logSQL!=0) rodsLog(LOG_SQL, "chlModDataObjMeta SQL 4");
00656 status = cmlModifySingleTable("R_DATA_MAIN", updateCols, updateVals,
00657 whereColsAndConds, whereValues, upCols,
00658 numConditions, &icss);
00659 } else {
00660
00661 j = upCols;
00662 updateCols[j]="data_is_dirty";
00663 snprintf(newCopy, NAME_LEN, "%d", NEWLY_CREATED_COPY);
00664 updateVals[j]=newCopy;
00665 upCols++;
00666 if (logSQL!=0) rodsLog(LOG_SQL, "chlModDataObjMeta SQL 5");
00667 status = cmlModifySingleTable("R_DATA_MAIN", updateCols, updateVals,
00668 whereColsAndConds, whereValues, upCols,
00669 numConditions, &icss);
00670 if (status == 0) {
00671 j = numConditions-1;
00672 whereColsAndConds[j]="data_repl_num!=";
00673 snprintf(replNum1, MAX_NAME_LEN, "%d", dataObjInfo->replNum);
00674 whereValues[j]=replNum1;
00675
00676 updateCols[0]="data_is_dirty";
00677 snprintf(oldCopy, NAME_LEN, "%d", OLD_COPY);
00678 updateVals[0]=oldCopy;
00679 if (logSQL!=0) rodsLog(LOG_SQL, "chlModDataObjMeta SQL 6");
00680 status2 = cmlModifySingleTable("R_DATA_MAIN", updateCols, updateVals,
00681 whereColsAndConds, whereValues, 1,
00682 numConditions, &icss);
00683
00684 if (status2 != 0 && status2 != CAT_SUCCESS_BUT_WITH_NO_INFO) {
00685
00686 rodsLog(LOG_NOTICE,
00687 "chlModDataObjMeta cmlModifySingleTable failure for other replicas %d",
00688 status2);
00689 _rollback("chlModDataObjMeta");
00690 return(status2);
00691 }
00692
00693 }
00694 }
00695 if (status != 0) {
00696 _rollback("chlModDataObjMeta");
00697 rodsLog(LOG_NOTICE,
00698 "chlModDataObjMeta cmlModifySingleTable failure %d",
00699 status);
00700 return(status);
00701 }
00702
00703 if ( !(dataObjInfo->flags & NO_COMMIT_FLAG) ) {
00704 status = cmlExecuteNoAnswerSql("commit", &icss);
00705 if (status != 0) {
00706 rodsLog(LOG_NOTICE,
00707 "chlModDataObjMeta cmlExecuteNoAnswerSql commit failure %d",
00708 status);
00709 return(status);
00710 }
00711 }
00712 return status;
00713 }
00714
00715
00716
00717
00718
00719
00720 int chlRegDataObj(rsComm_t *rsComm, dataObjInfo_t *dataObjInfo) {
00721 char myTime[50];
00722 char logicalFileName[MAX_NAME_LEN];
00723 char logicalDirName[MAX_NAME_LEN];
00724 rodsLong_t seqNum;
00725 rodsLong_t iVal;
00726 char dataIdNum[MAX_NAME_LEN];
00727 char collIdNum[MAX_NAME_LEN];
00728 char dataReplNum[MAX_NAME_LEN];
00729 char dataSizeNum[MAX_NAME_LEN];
00730 char dataStatusNum[MAX_NAME_LEN];
00731 int status;
00732 int inheritFlag;
00733
00734 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegDataObj");
00735 if (!icss.status) {
00736 return(CATALOG_NOT_CONNECTED);
00737 }
00738
00739 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegDataObj SQL 1 ");
00740 seqNum = cmlGetNextSeqVal(&icss);
00741 if (seqNum < 0) {
00742 rodsLog(LOG_NOTICE, "chlRegDataObj cmlGetNextSeqVal failure %d",
00743 seqNum);
00744 _rollback("chlRegDataObj");
00745 return(seqNum);
00746 }
00747 snprintf(dataIdNum, MAX_NAME_LEN, "%lld", seqNum);
00748 dataObjInfo->dataId=seqNum;
00749
00750 status = splitPathByKey(dataObjInfo->objPath,
00751 logicalDirName, logicalFileName, '/');
00752
00753
00754
00755
00756 iVal = cmlCheckDirAndGetInheritFlag(logicalDirName,
00757 rsComm->clientUser.userName,
00758 rsComm->clientUser.rodsZone,
00759 ACCESS_MODIFY_OBJECT, &inheritFlag, &icss);
00760 if (iVal < 0) {
00761 char errMsg[105];
00762 if (iVal==CAT_UNKNOWN_COLLECTION) {
00763 snprintf(errMsg, 100, "collection '%s' is unknown",
00764 logicalDirName);
00765 addRErrorMsg (&rsComm->rError, 0, errMsg);
00766 }
00767 if (iVal==CAT_NO_ACCESS_PERMISSION) {
00768 snprintf(errMsg, 100, "no permission to update collection '%s'",
00769 logicalDirName);
00770 addRErrorMsg (&rsComm->rError, 0, errMsg);
00771 }
00772 return (iVal);
00773 }
00774 snprintf(collIdNum, MAX_NAME_LEN, "%lld", iVal);
00775
00776
00777 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegDataObj SQL 4");
00778 status = cmlGetIntegerValueFromSql(
00779 "select coll_id from R_COLL_MAIN where coll_name=?",
00780 &iVal,
00781 dataObjInfo->objPath, 0, 0, 0, 0, &icss);
00782 if (status == 0) {
00783 return(CAT_NAME_EXISTS_AS_COLLECTION);
00784 }
00785
00786 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegDataObj SQL 5");
00787 status = cmlCheckNameToken("data_type",
00788 dataObjInfo->dataType, &icss);
00789 if (status !=0 ) {
00790 return(CAT_INVALID_DATA_TYPE);
00791 }
00792
00793 snprintf(dataReplNum, MAX_NAME_LEN, "%d", dataObjInfo->replNum);
00794 snprintf(dataStatusNum, MAX_NAME_LEN, "%d", dataObjInfo->replStatus);
00795 snprintf(dataSizeNum, MAX_NAME_LEN, "%lld", dataObjInfo->dataSize);
00796 getNowStr(myTime);
00797
00798 cllBindVars[0]=dataIdNum;
00799 cllBindVars[1]=collIdNum;
00800 cllBindVars[2]=logicalFileName;
00801 cllBindVars[3]=dataReplNum;
00802 cllBindVars[4]=dataObjInfo->version;
00803 cllBindVars[5]=dataObjInfo->dataType;
00804 cllBindVars[6]=dataSizeNum;
00805 cllBindVars[7]=dataObjInfo->rescGroupName;
00806 cllBindVars[8]=dataObjInfo->rescName;
00807 cllBindVars[9]=dataObjInfo->rescHier;
00808 cllBindVars[10]=dataObjInfo->filePath;
00809 cllBindVars[11]=rsComm->clientUser.userName;
00810 cllBindVars[12]=rsComm->clientUser.rodsZone;
00811 cllBindVars[13]=dataStatusNum;
00812 cllBindVars[14]=dataObjInfo->chksum;
00813 cllBindVars[15]=dataObjInfo->dataMode;
00814 cllBindVars[16]=myTime;
00815 cllBindVars[17]=myTime;
00816 cllBindVarCount=18;
00817 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegDataObj SQL 6");
00818 status = cmlExecuteNoAnswerSql(
00819 "insert into R_DATA_MAIN (data_id, coll_id, data_name, data_repl_num, data_version, data_type_name, data_size, resc_group_name, resc_name, resc_hier, data_path, data_owner_name, data_owner_zone, data_is_dirty, data_checksum, data_mode, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
00820 &icss);
00821 if (status != 0) {
00822 rodsLog(LOG_NOTICE,
00823 "chlRegDataObj cmlExecuteNoAnswerSql failure %d",status);
00824 _rollback("chlRegDataObj");
00825 return(status);
00826 }
00827
00828 if((status = _updateObjCountOfResources(dataObjInfo->rescHier, rsComm->clientUser.rodsZone, 1)) != 0) {
00829 return status;
00830 }
00831
00832 if (inheritFlag) {
00833
00834
00835 cllBindVars[0]=dataIdNum;
00836 cllBindVars[1]=myTime;
00837 cllBindVars[2]=myTime;
00838 cllBindVars[3]=collIdNum;
00839 cllBindVarCount=4;
00840 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegDataObj SQL 7");
00841 status = cmlExecuteNoAnswerSql(
00842 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) (select ?, user_id, access_type_id, ?, ? from R_OBJT_ACCESS where object_id = ?)",
00843 &icss);
00844 if (status != 0) {
00845 rodsLog(LOG_NOTICE,
00846 "chlRegDataObj cmlExecuteNoAnswerSql insert access failure %d",
00847 status);
00848 _rollback("chlRegDataObj");
00849 return(status);
00850 }
00851 }
00852 else {
00853 cllBindVars[0]=dataIdNum;
00854 cllBindVars[1]=rsComm->clientUser.userName;
00855 cllBindVars[2]=rsComm->clientUser.rodsZone;
00856 cllBindVars[3]=ACCESS_OWN;
00857 cllBindVars[4]=myTime;
00858 cllBindVars[5]=myTime;
00859 cllBindVarCount=6;
00860 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegDataObj SQL 8");
00861 status = cmlExecuteNoAnswerSql(
00862 "insert into R_OBJT_ACCESS values (?, (select user_id from R_USER_MAIN where user_name=? and zone_name=?), (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ?)",
00863 &icss);
00864 if (status != 0) {
00865 rodsLog(LOG_NOTICE,
00866 "chlRegDataObj cmlExecuteNoAnswerSql insert access failure %d",
00867 status);
00868 _rollback("chlRegDataObj");
00869 return(status);
00870 }
00871 }
00872
00873 status = cmlAudit3(AU_REGISTER_DATA_OBJ, dataIdNum,
00874 rsComm->clientUser.userName,
00875 rsComm->clientUser.rodsZone, "", &icss);
00876 if (status != 0) {
00877 rodsLog(LOG_NOTICE,
00878 "chlRegDataObj cmlAudit3 failure %d",
00879 status);
00880 _rollback("chlRegDataObj");
00881 return(status);
00882 }
00883
00884
00885 if ( !(dataObjInfo->flags & NO_COMMIT_FLAG) ) {
00886 status = cmlExecuteNoAnswerSql("commit", &icss);
00887 if (status != 0) {
00888 rodsLog(LOG_NOTICE,
00889 "chlRegDataObj cmlExecuteNoAnswerSql commit failure %d",
00890 status);
00891 return(status);
00892 }
00893 }
00894
00895 return(0);
00896 }
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906 int chlRegReplica(rsComm_t *rsComm, dataObjInfo_t *srcDataObjInfo,
00907 dataObjInfo_t *dstDataObjInfo, keyValPair_t *condInput) {
00908 char myTime[50];
00909 char logicalFileName[MAX_NAME_LEN];
00910 char logicalDirName[MAX_NAME_LEN];
00911 rodsLong_t iVal;
00912 rodsLong_t status;
00913 char tSQL[MAX_SQL_SIZE];
00914 char *cVal[30];
00915 int i;
00916 int statementNumber;
00917 int nextReplNum;
00918 char nextRepl[30];
00919 char theColls[]="data_id, coll_id, data_name, data_repl_num, data_version, data_type_name, data_size, resc_group_name, resc_name, resc_hier, data_path, data_owner_name, data_owner_zone, data_is_dirty, data_status, data_checksum, data_expiry_ts, data_map_id, data_mode, r_comment, create_ts, modify_ts";
00920 int IX_DATA_REPL_NUM=3;
00921 int IX_RESC_GROUP_NAME=7;
00922 int IX_RESC_NAME=8;
00923 int IX_RESC_HIER=9;
00924 int IX_DATA_PATH=10;
00925
00926 int IX_DATA_MODE=18;
00927 int IX_CREATE_TS=20;
00928 int IX_MODIFY_TS=21;
00929 int IX_RESC_NAME2=22;
00930 int IX_DATA_PATH2=23;
00931 int IX_DATA_ID2=24;
00932 int nColumns=25;
00933
00934 char objIdString[MAX_NAME_LEN];
00935 char replNumString[MAX_NAME_LEN];
00936 int adminMode;
00937 char *theVal;
00938
00939 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegReplica");
00940
00941 adminMode=0;
00942 if (condInput != NULL) {
00943 theVal = getValByKey(condInput, IRODS_ADMIN_KW);
00944 if (theVal != NULL) {
00945 adminMode=1;
00946 }
00947 }
00948
00949 if (!icss.status) {
00950 return(CATALOG_NOT_CONNECTED);
00951 }
00952
00953 status = splitPathByKey(srcDataObjInfo->objPath,
00954 logicalDirName, logicalFileName, '/');
00955
00956 if (adminMode) {
00957 if (rsComm->clientUser.authInfo.authFlag != LOCAL_PRIV_USER_AUTH) {
00958 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
00959 }
00960 }
00961 else {
00962
00963 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegReplica SQL 1 ");
00964 status = cmlCheckDataObjOnly(logicalDirName, logicalFileName,
00965 rsComm->clientUser.userName,
00966 rsComm->clientUser.rodsZone,
00967 ACCESS_READ_OBJECT, &icss);
00968 if (status < 0) {
00969 _rollback("chlRegReplica");
00970 return(status);
00971 }
00972 }
00973
00974
00975 snprintf(objIdString, MAX_NAME_LEN, "%lld", srcDataObjInfo->dataId);
00976 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegReplica SQL 2");
00977 status = cmlGetIntegerValueFromSql(
00978 "select max(data_repl_num) from R_DATA_MAIN where data_id = ?",
00979 &iVal, objIdString, 0, 0, 0, 0, &icss);
00980
00981 if (status != 0) {
00982 _rollback("chlRegReplica");
00983 return(status);
00984 }
00985
00986 nextReplNum = iVal+1;
00987 snprintf(nextRepl, sizeof nextRepl, "%d", nextReplNum);
00988 dstDataObjInfo->replNum = nextReplNum;
00989 snprintf(replNumString, MAX_NAME_LEN, "%d", srcDataObjInfo->replNum);
00990 snprintf(tSQL, MAX_SQL_SIZE,
00991 "select %s from R_DATA_MAIN where data_id = ? and data_repl_num = ?",
00992 theColls);
00993 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegReplica SQL 3");
00994 status = cmlGetOneRowFromSqlV2(tSQL, cVal, nColumns,
00995 objIdString, replNumString, &icss);
00996 if (status < 0) {
00997 _rollback("chlRegReplica");
00998 return(status);
00999 }
01000 statementNumber = status;
01001
01002 cVal[IX_DATA_REPL_NUM]=nextRepl;
01003 cVal[IX_RESC_NAME]=dstDataObjInfo->rescName;
01004 cVal[IX_RESC_HIER]=dstDataObjInfo->rescHier;
01005 cVal[IX_RESC_GROUP_NAME]=dstDataObjInfo->rescGroupName;
01006 cVal[IX_DATA_PATH]=dstDataObjInfo->filePath;
01007 cVal[IX_DATA_MODE]=dstDataObjInfo->dataMode;
01008
01009
01010 getNowStr(myTime);
01011 cVal[IX_MODIFY_TS]=myTime;
01012 cVal[IX_CREATE_TS]=myTime;
01013
01014 cVal[IX_RESC_NAME2]=dstDataObjInfo->rescName;
01015 cVal[IX_DATA_PATH2]=dstDataObjInfo->filePath;
01016 cVal[IX_DATA_ID2]=objIdString;
01017
01018
01019 for (i=0;i<nColumns;i++) {
01020 cllBindVars[i]=cVal[i];
01021 }
01022 cllBindVarCount = nColumns;
01023 #if (defined ORA_ICAT || defined MY_ICAT) // JMC - backport 4685
01024
01025 snprintf(tSQL, MAX_SQL_SIZE, "insert into R_DATA_MAIN ( %s ) select ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? from DUAL where not exists (select data_id from R_DATA_MAIN where resc_name=? and data_path=? and data_id=?)",
01026 theColls);
01027 #else
01028
01029 snprintf(tSQL, MAX_SQL_SIZE, "insert into R_DATA_MAIN ( %s ) select ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? where not exists (select data_id from R_DATA_MAIN where resc_name=? and data_path=? and data_id=?)",
01030 theColls);
01031
01032 #endif
01033 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegReplica SQL 4");
01034 status = cmlExecuteNoAnswerSql(tSQL, &icss);
01035 if (status < 0) {
01036 rodsLog(LOG_NOTICE,
01037 "chlRegReplica cmlExecuteNoAnswerSql(insert) failure %d",
01038 status);
01039 _rollback("chlRegReplica");
01040 return(status);
01041 }
01042
01043 if((status = _updateObjCountOfResources(dstDataObjInfo->rescHier, rsComm->clientUser.rodsZone, +1)) != 0) {
01044 return status;
01045 }
01046
01047 cmlFreeStatement(statementNumber, &icss);
01048 if (status < 0) {
01049 rodsLog(LOG_NOTICE, "chlRegReplica cmlFreeStatement failure %d", status);
01050 return(status);
01051 }
01052
01053 status = cmlAudit3(AU_REGISTER_DATA_REPLICA, objIdString,
01054 rsComm->clientUser.userName,
01055 rsComm->clientUser.rodsZone, nextRepl, &icss);
01056 if (status != 0) {
01057 rodsLog(LOG_NOTICE,
01058 "chlRegDataReplica cmlAudit3 failure %d",
01059 status);
01060 _rollback("chlRegReplica");
01061 return(status);
01062 }
01063
01064 status = cmlExecuteNoAnswerSql("commit", &icss);
01065 if (status != 0) {
01066 rodsLog(LOG_NOTICE,
01067 "chlRegReplica cmlExecuteNoAnswerSql commit failure %d",
01068 status);
01069 return(status);
01070 }
01071
01072 return(0);
01073 }
01074
01075
01076
01077
01078
01079
01080
01081 void removeMetaMapAndAVU(char *dataObjNumber) {
01082 char tSQL[MAX_SQL_SIZE];
01083 int status;
01084 cllBindVars[0]=dataObjNumber;
01085 cllBindVarCount=1;
01086 if (logSQL!=0) rodsLog(LOG_SQL, "removeMetaMapAndAVU SQL 1 ");
01087 snprintf(tSQL, MAX_SQL_SIZE,
01088 "delete from R_OBJT_METAMAP where object_id=?");
01089 status = cmlExecuteNoAnswerSql(tSQL, &icss);
01090
01091
01092
01093
01094
01095 if (status == 0) {
01096 #ifdef METADATA_CLEANUP
01097 removeAVUs();
01098 #endif
01099 }
01100 return;
01101 }
01102
01103
01104
01105
01106 static int removeAVUs() {
01107 char tSQL[MAX_SQL_SIZE];
01108 int status;
01109
01110 if (logSQL!=0) rodsLog(LOG_SQL, "removeAVUs SQL 1 ");
01111 cllBindVarCount=0;
01112
01113 #if ORA_ICAT
01114 snprintf(tSQL, MAX_SQL_SIZE,
01115 "delete from R_META_MAIN where meta_id in (select meta_id from R_META_MAIN minus select meta_id from R_OBJT_METAMAP)");
01116 #elif MY_ICAT
01117
01118
01119 snprintf(tSQL, MAX_SQL_SIZE,
01120 "delete from R_META_MAIN where meta_id not in (select meta_id from R_OBJT_METAMAP)");
01121 #else
01122
01123 snprintf(tSQL, MAX_SQL_SIZE,
01124 "delete from R_META_MAIN where meta_id in (select meta_id from R_META_MAIN except select meta_id from R_OBJT_METAMAP)");
01125 #endif
01126 status = cmlExecuteNoAnswerSql(tSQL, &icss);
01127 rodsLog (LOG_NOTICE, "removeAVUs status=%d\n",status);
01128
01129 return status;
01130 }
01131
01132
01133
01134
01135 bool
01136 _dataIsLastRepl(
01137 dataObjInfo_t* _dataObjInfo) {
01138
01139 bool result = true;
01140 int status;
01141 eirods::sql_logger logger("_dataIsLastRepl", logSQL);
01142 static const unsigned int length = 30;
01143 char cVal[length];
01144
01145 logger.log();
01146 std::stringstream id_stream;
01147 id_stream << _dataObjInfo->dataId;
01148 std::string id_string = id_stream.str();
01149 std::stringstream repl_stream;
01150 repl_stream << _dataObjInfo->replNum;
01151 std::string repl_string = repl_stream.str();
01152 status = cmlGetStringValueFromSql("select data_repl_num from R_DATA_MAIN where data_id=? and data_repl_num!=?",
01153 cVal, length, id_string.c_str(), repl_string.c_str(), 0, &icss);
01154 if(status != 0) {
01155 result = false;
01156 }
01157 return result;
01158 }
01159
01160
01161
01162
01163
01164
01165
01166 int chlUnregDataObj (rsComm_t *rsComm, dataObjInfo_t *dataObjInfo,
01167 keyValPair_t *condInput) {
01168 char logicalFileName[MAX_NAME_LEN];
01169 char logicalDirName[MAX_NAME_LEN];
01170 rodsLong_t status;
01171 char tSQL[MAX_SQL_SIZE];
01172 char replNumber[30];
01173 char dataObjNumber[30];
01174 char cVal[MAX_NAME_LEN];
01175 int adminMode;
01176 int trashMode;
01177 char *theVal;
01178 char checkPath[MAX_NAME_LEN];
01179
01180 dataObjNumber[0]='\0';
01181 if (logSQL!=0) rodsLog(LOG_SQL, "chlUnregDataObj");
01182
01183 if (!icss.status) {
01184 return(CATALOG_NOT_CONNECTED);
01185 }
01186
01187 adminMode=0;
01188 trashMode=0;
01189 if (condInput != NULL) {
01190 theVal = getValByKey(condInput, IRODS_ADMIN_KW);
01191 if (theVal != NULL) {
01192 adminMode=1;
01193 }
01194 theVal = getValByKey(condInput, IRODS_ADMIN_RMTRASH_KW);
01195 if (theVal != NULL) {
01196 adminMode=1;
01197 trashMode=1;
01198 }
01199 }
01200
01201 status = splitPathByKey(dataObjInfo->objPath,
01202 logicalDirName, logicalFileName, '/');
01203
01204
01205 if (adminMode==0) {
01206
01207 if (logSQL!=0) rodsLog(LOG_SQL, "chlUnregDataObj SQL 1 ");
01208 status = cmlCheckDataObjOnly(logicalDirName, logicalFileName,
01209 rsComm->clientUser.userName,
01210 rsComm->clientUser.rodsZone,
01211 ACCESS_DELETE_OBJECT, &icss);
01212 if (status < 0) {
01213 _rollback("chlUnregDataObj");
01214 return(status);
01215 }
01216 snprintf(dataObjNumber, sizeof dataObjNumber, "%lld", status);
01217 }
01218 else {
01219 if (rsComm->clientUser.authInfo.authFlag != LOCAL_PRIV_USER_AUTH) {
01220 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
01221 }
01222 if (trashMode) {
01223 int len;
01224 status = getLocalZone();
01225 if (status != 0) return(status);
01226 snprintf(checkPath, MAX_NAME_LEN, "/%s/trash", localZone);
01227 len = strlen(checkPath);
01228 if (strncmp(checkPath, logicalDirName, len) != 0) {
01229 addRErrorMsg (&rsComm->rError, 0,
01230 "TRASH_KW but not zone/trash path");
01231 return(CAT_INVALID_ARGUMENT);
01232 }
01233 if (dataObjInfo->dataId > 0) {
01234 snprintf(dataObjNumber, sizeof dataObjNumber, "%lld",
01235 dataObjInfo->dataId);
01236 }
01237 }
01238 else {
01239 if (dataObjInfo->replNum >= 0 && dataObjInfo->dataId >= 0) {
01240
01241 snprintf(dataObjNumber, sizeof dataObjNumber, "%lld",
01242 dataObjInfo->dataId);
01243 snprintf(replNumber, sizeof replNumber, "%d", dataObjInfo->replNum);
01244 if (logSQL!=0) rodsLog(LOG_SQL, "chlUnregDataObj SQL 2");
01245 status = cmlGetStringValueFromSql(
01246 "select data_repl_num from R_DATA_MAIN where data_id=? and data_repl_num!=?",
01247 cVal,
01248 sizeof cVal,
01249 dataObjNumber,
01250 replNumber,
01251 0,
01252 &icss);
01253 if (status != 0) {
01254 addRErrorMsg (&rsComm->rError, 0,
01255 "This is the last replica, removal by admin not allowed");
01256 return(CAT_LAST_REPLICA);
01257 }
01258 }
01259 else {
01260 addRErrorMsg (&rsComm->rError, 0,
01261 "dataId and replNum required");
01262 _rollback("chlUnregDataObj");
01263 return (CAT_INVALID_ARGUMENT);
01264 }
01265 }
01266 }
01267
01268
01269 std::string resc_hier;
01270 if(!dataObjInfo->rescHier || strlen(dataObjInfo->rescHier) == 0) {
01271 if(dataObjInfo->replNum >= 0) {
01272 snprintf(replNumber, sizeof replNumber, "%d", dataObjInfo->replNum);
01273 if((status = cmlGetStringValueFromSql("select resc_hier from R_DATA_MAIN where data_id=? and data_repl_num=?",
01274 cVal, sizeof cVal, dataObjNumber, replNumber, 0, &icss)) != 0) {
01275 return status;
01276 }
01277 } else {
01278 if((status = cmlGetStringValueFromSql("select resc_hier from R_DATA_MAIN where data_id=?",
01279 cVal, sizeof cVal, dataObjNumber, 0, 0, &icss)) != 0) {
01280 return status;
01281 }
01282 }
01283 resc_hier = std::string(cVal);
01284 } else {
01285 resc_hier = std::string(dataObjInfo->rescHier);
01286 }
01287
01288 cllBindVars[0]=logicalDirName;
01289 cllBindVars[1]=logicalFileName;
01290 if (dataObjInfo->replNum >= 0) {
01291 snprintf(replNumber, sizeof replNumber, "%d", dataObjInfo->replNum);
01292 cllBindVars[2]=replNumber;
01293 cllBindVarCount=3;
01294 if (logSQL!=0) rodsLog(LOG_SQL, "chlUnregDataObj SQL 4");
01295 snprintf(tSQL, MAX_SQL_SIZE,
01296 "delete from R_DATA_MAIN where coll_id=(select coll_id from R_COLL_MAIN where coll_name=?) and data_name=? and data_repl_num=?");
01297 }
01298 else {
01299 cllBindVarCount=2;
01300 if (logSQL!=0) rodsLog(LOG_SQL, "chlUnregDataObj SQL 5");
01301 snprintf(tSQL, MAX_SQL_SIZE,
01302 "delete from R_DATA_MAIN where coll_id=(select coll_id from R_COLL_MAIN where coll_name=?) and data_name=?");
01303 }
01304 status = cmlExecuteNoAnswerSql(tSQL, &icss);
01305 if (status != 0) {
01306 if (status == CAT_SUCCESS_BUT_WITH_NO_INFO) {
01307 char errMsg[105];
01308 status = CAT_UNKNOWN_FILE;
01309 snprintf(errMsg, 100, "data object '%s' is unknown",
01310 logicalFileName);
01311 addRErrorMsg (&rsComm->rError, 0, errMsg);
01312 return(status);
01313 }
01314 _rollback("chlUnregDataObj");
01315 return(status);
01316 }
01317
01318
01319 if((status = _updateObjCountOfResources(resc_hier, rsComm->clientUser.rodsZone, -1)) != 0) {
01320 return status;
01321 }
01322
01323
01324 if (dataObjNumber[0]!='\0') {
01325 cllBindVars[0]=dataObjNumber;
01326 cllBindVars[1]=dataObjNumber;
01327 cllBindVarCount=2;
01328 if (logSQL!=0) rodsLog(LOG_SQL, "chlUnregDataObj SQL 3");
01329 status = cmlExecuteNoAnswerSql(
01330 "delete from R_OBJT_ACCESS where object_id=? and not exists (select * from R_DATA_MAIN where data_id=?)", &icss);
01331 if (status == 0) {
01332 removeMetaMapAndAVU(dataObjNumber);
01333 }
01334 }
01335
01336
01337 if (dataObjNumber[0]!='\0') {
01338 status = cmlAudit3(AU_UNREGISTER_DATA_OBJ, dataObjNumber,
01339 rsComm->clientUser.userName,
01340 rsComm->clientUser.rodsZone, "", &icss);
01341 }
01342 else {
01343 status = cmlAudit3(AU_UNREGISTER_DATA_OBJ, "0",
01344 rsComm->clientUser.userName,
01345 rsComm->clientUser.rodsZone,
01346 dataObjInfo->objPath, &icss);
01347 }
01348 if (status != 0) {
01349 rodsLog(LOG_NOTICE,
01350 "chlUnregDataObj cmlAudit3 failure %d",
01351 status);
01352 _rollback("chlUnregDataObj");
01353 return(status);
01354 }
01355
01356
01357 status = cmlExecuteNoAnswerSql("commit", &icss);
01358 if (status != 0) {
01359 rodsLog(LOG_NOTICE,
01360 "chlUnregDataObj cmlExecuteNoAnswerSql commit failure %d",
01361 status);
01362 return(status);
01363 }
01364
01365 return(status);
01366
01367 }
01368
01369
01370
01371
01372
01373
01374
01375 int chlRegRuleExec(rsComm_t *rsComm,
01376 ruleExecSubmitInp_t *ruleExecSubmitInp) {
01377 char myTime[50];
01378 rodsLong_t seqNum;
01379 char ruleExecIdNum[MAX_NAME_LEN];
01380 int status;
01381
01382 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegRuleExec");
01383 if (!icss.status) {
01384 return(CATALOG_NOT_CONNECTED);
01385 }
01386
01387 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegRuleExec SQL 1 ");
01388 seqNum = cmlGetNextSeqVal(&icss);
01389 if (seqNum < 0) {
01390 rodsLog(LOG_NOTICE, "chlRegRuleExec cmlGetNextSeqVal failure %d",
01391 seqNum);
01392 _rollback("chlRegRuleExec");
01393 return(seqNum);
01394 }
01395 snprintf(ruleExecIdNum, MAX_NAME_LEN, "%lld", seqNum);
01396
01397
01398 strncpy(ruleExecSubmitInp->ruleExecId,ruleExecIdNum, NAME_LEN);
01399
01400 getNowStr(myTime);
01401
01402 cllBindVars[0]=ruleExecIdNum;
01403 cllBindVars[1]=ruleExecSubmitInp->ruleName;
01404 cllBindVars[2]=ruleExecSubmitInp->reiFilePath;
01405 cllBindVars[3]=ruleExecSubmitInp->userName;
01406 cllBindVars[4]=ruleExecSubmitInp->exeAddress;
01407 cllBindVars[5]=ruleExecSubmitInp->exeTime;
01408 cllBindVars[6]=ruleExecSubmitInp->exeFrequency;
01409 cllBindVars[7]=ruleExecSubmitInp->priority;
01410 cllBindVars[8]=ruleExecSubmitInp->estimateExeTime;
01411 cllBindVars[9]=ruleExecSubmitInp->notificationAddr;
01412 cllBindVars[10]=myTime;
01413 cllBindVars[11]=myTime;
01414
01415 cllBindVarCount=12;
01416 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegRuleExec SQL 2");
01417 status = cmlExecuteNoAnswerSql(
01418 "insert into R_RULE_EXEC (rule_exec_id, rule_name, rei_file_path, user_name, exe_address, exe_time, exe_frequency, priority, estimated_exe_time, notification_addr, create_ts, modify_ts) values (?,?,?,?,?,?,?,?,?,?,?,?)",
01419 &icss);
01420 if (status != 0) {
01421 rodsLog(LOG_NOTICE,
01422 "chlRegRuleExec cmlExecuteNoAnswerSql(insert) failure %d",status);
01423 _rollback("chlRegRuleExec");
01424 return(status);
01425
01426 }
01427
01428
01429 status = cmlAudit3(AU_REGISTER_DELAYED_RULE, ruleExecIdNum,
01430 rsComm->clientUser.userName,
01431 rsComm->clientUser.rodsZone,
01432 ruleExecSubmitInp->ruleName, &icss);
01433 if (status != 0) {
01434 rodsLog(LOG_NOTICE,
01435 "chlRegRuleExec cmlAudit3 failure %d",
01436 status);
01437 _rollback("chlRegRuleExec");
01438 return(status);
01439 }
01440
01441 status = cmlExecuteNoAnswerSql("commit", &icss);
01442 if (status != 0) {
01443 rodsLog(LOG_NOTICE,
01444 "chlRegRuleExec cmlExecuteNoAnswerSql commit failure %d",
01445 status);
01446 return(status);
01447 }
01448
01449 return(0);
01450 }
01451
01452
01453
01454
01455
01456
01457
01458
01459
01460 int chlModRuleExec(rsComm_t *rsComm, char *ruleExecId,
01461 keyValPair_t *regParam) {
01462 int i, j, status;
01463
01464 char tSQL[MAX_SQL_SIZE];
01465 char *theVal;
01466
01467 int maxCols=90;
01468
01469
01470
01471
01472 char *regParamNames[]={
01473 RULE_NAME_KW, RULE_REI_FILE_PATH_KW, RULE_USER_NAME_KW,
01474 RULE_EXE_ADDRESS_KW, RULE_EXE_TIME_KW,
01475 RULE_EXE_FREQUENCY_KW, RULE_PRIORITY_KW, RULE_ESTIMATE_EXE_TIME_KW,
01476 RULE_NOTIFICATION_ADDR_KW, RULE_LAST_EXE_TIME_KW,
01477 RULE_EXE_STATUS_KW,
01478 "END"
01479 };
01480 char *colNames[]={
01481 "rule_name", "rei_file_path", "user_name",
01482 "exe_address", "exe_time", "exe_frequency", "priority",
01483 "estimated_exe_time", "notification_addr",
01484 "last_exe_time", "exe_status",
01485 "create_ts", "modify_ts",
01486 };
01487
01488 if (logSQL!=0) rodsLog(LOG_SQL, "chlModRuleExec");
01489
01490 if (regParam == NULL || ruleExecId == NULL) {
01491 return (CAT_INVALID_ARGUMENT);
01492 }
01493
01494 snprintf(tSQL, MAX_SQL_SIZE, "update R_RULE_EXEC set ");
01495
01496 for (i=0, j=0; i<maxCols; i++) {
01497 if (strcmp(regParamNames[i],"END")==0) break;
01498 theVal = getValByKey(regParam, regParamNames[i]);
01499 if (theVal != NULL) {
01500 if (j>0) rstrcat(tSQL, "," , MAX_SQL_SIZE);
01501 rstrcat(tSQL, colNames[i] , MAX_SQL_SIZE);
01502 rstrcat(tSQL, "=?", MAX_SQL_SIZE);
01503 cllBindVars[j++]=theVal;
01504 }
01505 }
01506
01507 if (j == 0) {
01508 return (CAT_INVALID_ARGUMENT);
01509 }
01510
01511 rstrcat(tSQL, "where rule_exec_id=?", MAX_SQL_SIZE);
01512 cllBindVars[j++]=ruleExecId;
01513 cllBindVarCount=j;
01514
01515 if (logSQL!=0) rodsLog(LOG_SQL, "chlModRuleExec SQL 1 ");
01516 status = cmlExecuteNoAnswerSql(tSQL, &icss);
01517
01518 if (status != 0) {
01519 _rollback("chlModRuleExec");
01520 rodsLog(LOG_NOTICE,
01521 "chlModRuleExec cmlExecuteNoAnswer(update) failure %d",
01522 status);
01523 return(status);
01524 }
01525
01526
01527 status = cmlAudit3(AU_MODIFY_DELAYED_RULE, ruleExecId,
01528 rsComm->clientUser.userName,
01529 rsComm->clientUser.rodsZone,
01530 "", &icss);
01531 if (status != 0) {
01532 rodsLog(LOG_NOTICE,
01533 "chlModRuleExec cmlAudit3 failure %d",
01534 status);
01535 _rollback("chlModRuleExec");
01536 return(status);
01537 }
01538
01539
01540 status = cmlExecuteNoAnswerSql("commit", &icss);
01541 if (status != 0) {
01542 rodsLog(LOG_NOTICE,
01543 "chlModRuleExecMeta cmlExecuteNoAnswerSql commit failure %d",
01544 status);
01545 return(status);
01546 }
01547 return status;
01548 }
01549
01550
01551 int chlDelRuleExec(rsComm_t *rsComm,
01552 char *ruleExecId) {
01553 int status;
01554 char userName[MAX_NAME_LEN+2];
01555
01556 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelRuleExec");
01557
01558 if (!icss.status) {
01559 return(CATALOG_NOT_CONNECTED);
01560 }
01561
01562 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
01563 if (rsComm->proxyUser.authInfo.authFlag == LOCAL_USER_AUTH) {
01564 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelRuleExec SQL 1 ");
01565 status = cmlGetStringValueFromSql(
01566 "select user_name from R_RULE_EXEC where rule_exec_id=?",
01567 userName, MAX_NAME_LEN, ruleExecId, 0, 0, &icss);
01568 if (strncmp(userName, rsComm->clientUser.userName, MAX_NAME_LEN)
01569 != 0) {
01570 return(CAT_NO_ACCESS_PERMISSION);
01571 }
01572 }
01573 else {
01574 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
01575 }
01576 }
01577
01578 cllBindVars[cllBindVarCount++]=ruleExecId;
01579 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelRuleExec SQL 2 ");
01580 status = cmlExecuteNoAnswerSql(
01581 "delete from R_RULE_EXEC where rule_exec_id=?",
01582 &icss);
01583 if (status != 0) {
01584 rodsLog(LOG_NOTICE,
01585 "chlDelRuleExec delete failure %d",
01586 status);
01587 _rollback("chlDelRuleExec");
01588 return(status);
01589 }
01590
01591
01592 status = cmlAudit3(AU_DELETE_DELAYED_RULE, ruleExecId,
01593 rsComm->clientUser.userName,
01594 rsComm->clientUser.rodsZone,
01595 "", &icss);
01596 if (status != 0) {
01597 rodsLog(LOG_NOTICE,
01598 "chlDelRuleExec cmlAudit3 failure %d",
01599 status);
01600 _rollback("chlDelRuleExec");
01601 return(status);
01602 }
01603
01604 status = cmlExecuteNoAnswerSql("commit", &icss);
01605 if (status != 0) {
01606 rodsLog(LOG_NOTICE,
01607 "chlDelRuleExec cmlExecuteNoAnswerSql commit failure %d",
01608 status);
01609 return(status);
01610 }
01611 return(status);
01612 }
01613
01614
01615
01616
01617
01618
01619
01620
01621
01622
01623
01624
01625
01626 int chlTest(rsComm_t *rsComm, char *name) {
01627 dataObjInfo_t dataObjInfo;
01628
01629 strcpy(dataObjInfo.objPath, name);
01630 dataObjInfo.replNum=1;
01631 strcpy(dataObjInfo.version, "12");
01632 strcpy(dataObjInfo.dataType, "URL");
01633 dataObjInfo.dataSize=42;
01634
01635 strcpy(dataObjInfo.rescName, "resc A");
01636
01637 strcpy(dataObjInfo.filePath, "/scratch/slocal/test1");
01638
01639 dataObjInfo.replStatus=5;
01640
01641 return (chlRegDataObj(rsComm, &dataObjInfo));
01642 }
01643
01644 int
01645 _canConnectToCatalog(
01646 rsComm_t* _rsComm)
01647 {
01648 int result = 0;
01649 if (!icss.status) {
01650 result = CATALOG_NOT_CONNECTED;
01651 } else if (_rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
01652 result = CAT_INSUFFICIENT_PRIVILEGE_LEVEL;
01653 } else if (_rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
01654 result = CAT_INSUFFICIENT_PRIVILEGE_LEVEL;
01655 }
01656 return result;
01657 }
01658
01659 int
01660 _resolveHostName(
01661 rsComm_t* _rsComm,
01662 rescInfo_t* _rescInfo)
01663 {
01664 int result = 0;
01665 struct hostent *myHostEnt;
01666
01667 myHostEnt = gethostbyname(_rescInfo->rescLoc);
01668 if (myHostEnt <= 0) {
01669 char errMsg[155];
01670 snprintf(errMsg, 150,
01671 "Warning, resource host address '%s' is not a valid DNS entry, gethostbyname failed.",
01672 _rescInfo->rescLoc);
01673 addRErrorMsg (&_rsComm->rError, 0, errMsg);
01674 }
01675 if (strcmp(_rescInfo->rescLoc, "localhost") == 0) {
01676 addRErrorMsg( &_rsComm->rError, 0,
01677 "Warning, resource host address 'localhost' will not work properly as it maps to the local host from each client.");
01678 }
01679
01680 return result;
01681 }
01682
01683 bool
01684 _childIsValid(
01685 const std::string& _new_child) {
01686
01687
01688 bool result = true;
01689 char parent[MAX_NAME_LEN];
01690 int status;
01691
01692
01693 std::string resc_name;
01694 eirods::children_parser parser;
01695 parser.set_string(_new_child);
01696 parser.first_child(resc_name);
01697
01698
01699 eirods::sql_logger logger("_childIsValid", logSQL);
01700 logger.log();
01701 parent[0] = '\0';
01702 if((status = cmlGetStringValueFromSql("select resc_parent from R_RESC_MAIN where resc_name=? and zone_name=?",
01703 parent, MAX_NAME_LEN, resc_name.c_str(), localZone, 0, &icss)) != 0) {
01704 if(status == CAT_NO_ROWS_FOUND) {
01705 std::stringstream ss;
01706 ss << "Child resource \"" << resc_name << "\" not found";
01707 eirods::log(LOG_NOTICE, ss.str());
01708 } else {
01709 _rollback("_childIsValid");
01710 }
01711 result = false;
01712
01713 } else if(strlen(parent) != 0) {
01714
01715 std::stringstream ss;
01716 ss << "Child resource \"" << resc_name << "\" already has a parent \"" << parent << "\"";
01717 eirods::log(LOG_NOTICE, ss.str());
01718 result = false;
01719 }
01720 return result;
01721 }
01722
01723 int
01724 _updateRescChildren(
01725 char* _resc_id,
01726 const std::string& _new_child_string) {
01727
01728 int result = 0;
01729 int status;
01730 char children[MAX_PATH_ALLOWED];
01731 char myTime[50];
01732 eirods::sql_logger logger("_updateRescChildren", logSQL);
01733
01734 if((status = cmlGetStringValueFromSql("select resc_children from R_RESC_MAIN where resc_id=?",
01735 children, MAX_PATH_ALLOWED, _resc_id, 0, 0, &icss)) != 0) {
01736 _rollback("_updateRescChildren");
01737 result = status;
01738 } else {
01739 std::string children_string(children);
01740 std::stringstream ss;
01741 if(children_string.empty()) {
01742 ss << _new_child_string;
01743 } else {
01744 ss << children_string << ";" << _new_child_string;
01745 }
01746 std::string combined_children = ss.str();
01747
01748
01749 char* tmp_children = strdup(combined_children.c_str());
01750 getNowStr(myTime);
01751 cllBindVarCount = 0;
01752 cllBindVars[cllBindVarCount++] = tmp_children;
01753 cllBindVars[cllBindVarCount++] = myTime;
01754 cllBindVars[cllBindVarCount++] = _resc_id;
01755 logger.log();
01756 if((status = cmlExecuteNoAnswerSql("update R_RESC_MAIN set resc_children=?, modify_ts=? "
01757 "where resc_id=?", &icss)) != 0) {
01758 std::stringstream ss;
01759 ss << "_updateRescChildren cmlExecuteNoAnswerSql update failure " << status;
01760 eirods::log(LOG_NOTICE, ss.str());
01761 _rollback("_updateRescChildren");
01762 result = status;
01763 }
01764 free(tmp_children);
01765 }
01766 return result;
01767 }
01768
01769 int
01770 _updateChildParent(
01771 const std::string& _new_child,
01772 const std::string& _parent) {
01773
01774 int result = 0;
01775 char resc_id[MAX_NAME_LEN];
01776 char myTime[50];
01777 eirods::sql_logger logger("_updateChildParent", logSQL);
01778 int status;
01779
01780
01781 eirods::children_parser parser;
01782 std::string child;
01783 parser.set_string(_new_child);
01784 parser.first_child(child);
01785
01786
01787 resc_id[0] = '\0';
01788 if((status = cmlGetStringValueFromSql("select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
01789 resc_id, MAX_NAME_LEN, child.c_str(), localZone, 0,
01790 &icss)) != 0) {
01791 if(status == CAT_NO_ROWS_FOUND) {
01792 result = CAT_INVALID_RESOURCE;
01793 } else {
01794 _rollback("_updateChildParent");
01795 result = status;
01796 }
01797 } else {
01798
01799
01800
01801 char* tmp_parent = strdup(_parent.c_str());
01802 getNowStr(myTime);
01803 cllBindVarCount = 0;
01804 cllBindVars[cllBindVarCount++] = tmp_parent;
01805 cllBindVars[cllBindVarCount++] = myTime;
01806 cllBindVars[cllBindVarCount++] = resc_id;
01807 logger.log();
01808 if((status = cmlExecuteNoAnswerSql("update R_RESC_MAIN set resc_parent=?, modify_ts=? "
01809 "where resc_id=?", &icss)) != 0) {
01810 std::stringstream ss;
01811 ss << "_updateChildParent cmlExecuteNoAnswerSql update failure " << status;
01812 eirods::log(LOG_NOTICE, ss.str());
01813 _rollback("_updateChildParent");
01814 result = status;
01815 }
01816 free(tmp_parent);
01817
01818 }
01819
01820 return result;
01821 }
01822
01823 eirods::error chlRescObjCount(
01824 const std::string& _resc_name,
01825 rodsLong_t & _rtn_obj_count)
01826 {
01827 eirods::error result = SUCCESS();
01828 rodsLong_t obj_count = 0;
01829 char obj_count_string[MAX_NAME_LEN];
01830 int status;
01831
01832 if((status = cmlGetIntegerValueFromSql("select resc_objcount from R_RESC_MAIN where resc_name=?",
01833 &obj_count, _resc_name.c_str(), 0, 0, 0, 0, &icss)) != 0) {
01834 _rollback(__FUNCTION__);
01835 std::stringstream msg;
01836 msg << __FUNCTION__ << " - Failed to get object count for resource: \"" << _resc_name << "\"";
01837 result = ERROR(status, msg.str());
01838 } else {
01839 _rtn_obj_count = obj_count;
01840 }
01841
01842 return result;
01843 }
01844
01845
01846
01847
01848 bool
01849 _rescHasData(
01850 const std::string& _resc_name) {
01851
01852 bool result = false;
01853 eirods::sql_logger logger("_rescHasData", logSQL);
01854 int status;
01855 char obj_count_string[MAX_NAME_LEN];
01856 static const char* func_name = "_rescHasData";
01857 rodsLong_t obj_count;
01858
01859 logger.log();
01860 if((status = cmlGetIntegerValueFromSql("select resc_objcount from R_RESC_MAIN where resc_name=?",
01861 &obj_count, _resc_name.c_str(), 0, 0, 0, 0, &icss)) != 0) {
01862 _rollback(func_name);
01863 } else {
01864 if(obj_count > 0) {
01865 result = true;
01866 }
01867 }
01868 return result;
01869 }
01870
01871
01872
01873
01874 bool
01875 _childHasData(
01876 const std::string& _child) {
01877
01878 bool result = true;
01879 eirods::children_parser parser;
01880 parser.set_string(_child);
01881 std::string child;
01882 parser.first_child(child);
01883 result = _rescHasData(child);
01884 return result;
01885 }
01886
01887
01888
01889
01890 int
01891 chlAddChildResc(
01892 rsComm_t* rsComm,
01893 rescInfo_t* rescInfo)
01894 {
01895 int result = 0;
01896
01897 int status;
01898 static const char* func_name = "chlAddChildResc";
01899 eirods::sql_logger logger(func_name, logSQL);
01900 std::string new_child_string(rescInfo->rescChildren);
01901 char resc_id[MAX_NAME_LEN];
01902
01903 logger.log();
01904
01905 if(!(result = _canConnectToCatalog(rsComm))) {
01906
01907 if((status = getLocalZone())) {
01908 result = status;
01909
01910 } else if (rescInfo->zoneName != NULL && strlen(rescInfo->zoneName) > 0 && strcmp(rescInfo->zoneName, localZone) !=0) {
01911 addRErrorMsg (&rsComm->rError, 0,
01912 "Currently, resources must be in the local zone");
01913 result = CAT_INVALID_ZONE;
01914
01915 } else if(_childHasData(new_child_string)) {
01916 char errMsg[105];
01917 snprintf(errMsg, 100,
01918 "resource '%s' contains one or more dataObjects",
01919 rescInfo->rescName);
01920 addRErrorMsg (&rsComm->rError, 0, errMsg);
01921 result = CAT_RESOURCE_NOT_EMPTY;
01922 } else {
01923
01924 logger.log();
01925
01926 resc_id[0] = '\0';
01927 if((status = cmlGetStringValueFromSql("select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
01928 resc_id, MAX_NAME_LEN, rescInfo->rescName, localZone, 0,
01929 &icss)) != 0) {
01930 if(status == CAT_NO_ROWS_FOUND) {
01931 result = CAT_INVALID_RESOURCE;
01932 } else {
01933 _rollback(func_name);
01934 result = status;
01935 }
01936 } else if(_childIsValid(new_child_string)) {
01937 if((status = _updateRescChildren(resc_id, new_child_string)) != 0) {
01938 result = status;
01939 } else if((status = _updateChildParent(new_child_string, std::string(rescInfo->rescName))) != 0) {
01940 result = status;
01941 } else {
01942
01943
01944 char commentStr[1024];
01945 snprintf(commentStr, sizeof commentStr, "%s %s", rescInfo->rescName, new_child_string.c_str());
01946 if((status = cmlAudit3(AU_ADD_CHILD_RESOURCE, resc_id, rsComm->clientUser.userName, rsComm->clientUser.rodsZone,
01947 commentStr, &icss)) != 0) {
01948 std::stringstream ss;
01949 ss << func_name << " cmlAudit3 failure " << status;
01950 eirods::log(LOG_NOTICE, ss.str());
01951 _rollback(func_name);
01952 result = status;
01953 } else if((status = cmlExecuteNoAnswerSql("commit", &icss)) != 0) {
01954 std::stringstream ss;
01955 ss << func_name<< " cmlExecuteNoAnswerSql commit failure " << status;
01956 eirods::log(LOG_NOTICE, ss.str());
01957 result = status;
01958 }
01959 }
01960 } else {
01961 char errMsg[105];
01962 snprintf(errMsg, 100,
01963 "resource '%s' is not a valid resource",
01964 rescInfo->rescName);
01965 addRErrorMsg (&rsComm->rError, 0, errMsg);
01966 result = CAT_INVALID_RESOURCE_NAME;
01967
01968 }
01969 }
01970 }
01971 return result;
01972 }
01973
01974
01975 int chlRegResc(rsComm_t *rsComm,
01976 rescInfo_t *rescInfo) {
01977 rodsLong_t seqNum;
01978 char idNum[MAX_SQL_SIZE];
01979 int status;
01980 char myTime[50];
01981 struct hostent *myHostEnt;
01982
01983 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegResc");
01984
01985
01986
01987 if( strlen( rescInfo->rescName ) < 1 ) {
01988 addRErrorMsg( &rsComm->rError, 0, "resource name is empty" );
01989 return CAT_INVALID_RESOURCE_NAME;
01990 }
01991
01992
01993
01994 if( strlen( rescInfo->rescType ) < 1 ) {
01995 addRErrorMsg( &rsComm->rError, 0, "resource type is empty" );
01996 return CAT_INVALID_RESOURCE_TYPE;
01997 }
01998
01999 if (!icss.status) {
02000 return(CATALOG_NOT_CONNECTED);
02001 }
02002
02003 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
02004 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
02005 }
02006 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
02007 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
02008 }
02009
02010 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegResc SQL 1 ");
02011 seqNum = cmlGetNextSeqVal(&icss);
02012 if (seqNum < 0) {
02013 rodsLog(LOG_NOTICE, "chlRegResc cmlGetNextSeqVal failure %d",
02014 seqNum);
02015 _rollback("chlRegResc");
02016 return(seqNum);
02017 }
02018 snprintf(idNum, MAX_SQL_SIZE, "%lld", seqNum);
02019
02020 status = getLocalZone();
02021 if (status != 0) return(status);
02022
02023 if (rescInfo->zoneName != NULL && strlen(rescInfo->zoneName) > 0) {
02024 if (strcmp(rescInfo->zoneName, localZone) !=0) {
02025 addRErrorMsg (&rsComm->rError, 0,
02026 "Currently, resources must be in the local zone");
02027 return(CAT_INVALID_ZONE);
02028 }
02029 }
02030
02031 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegResc SQL 2");
02032
02033
02034
02035
02036
02037
02038
02039
02040
02041 if( eirods::EMPTY_RESC_HOST != rescInfo->rescLoc ) {
02042
02043
02044 myHostEnt = gethostbyname(rescInfo->rescLoc);
02045 if (myHostEnt <= 0) {
02046 char errMsg[155];
02047 snprintf(errMsg, 150,
02048 "Warning, resource host address '%s' is not a valid DNS entry, gethostbyname failed.",
02049 rescInfo->rescLoc);
02050 addRErrorMsg (&rsComm->rError, 0, errMsg);
02051 }
02052 if (strcmp(rescInfo->rescLoc, "localhost") == 0) {
02053 addRErrorMsg( &rsComm->rError, 0,
02054 "Warning, resource host address 'localhost' will not work properly as it maps to the local host from each client.");
02055 }
02056
02057 }
02058 #if 0
02059 if (false &&
02060 (strcmp(rescInfo->rescType, "database") !=0) &&
02061 (strcmp(rescInfo->rescType, "mso") !=0) ) {
02062 if (strlen(rescInfo->rescVaultPath)<1) {
02063 return(CAT_INVALID_RESOURCE_VAULT_PATH);
02064 }
02065 }
02066 #endif
02067
02068 status = getLocalZone();
02069 if (status != 0) return(status);
02070
02071 getNowStr(myTime);
02072
02073 cllBindVars[0]=idNum;
02074 cllBindVars[1]=rescInfo->rescName;
02075 cllBindVars[2]=localZone;
02076 cllBindVars[3]=rescInfo->rescType;
02077 cllBindVars[4]=rescInfo->rescClass;
02078 cllBindVars[5]=rescInfo->rescLoc;
02079 cllBindVars[6]=rescInfo->rescVaultPath;
02080 cllBindVars[7]=myTime;
02081 cllBindVars[8]=myTime;
02082 cllBindVars[9]=rescInfo->rescChildren;
02083 cllBindVars[10]=rescInfo->rescContext;
02084 cllBindVars[11]=rescInfo->rescParent;
02085 cllBindVars[12]="0";
02086 cllBindVarCount=13;
02087
02088 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegResc SQL 4");
02089 status = cmlExecuteNoAnswerSql(
02090 "insert into R_RESC_MAIN (resc_id, resc_name, zone_name, resc_type_name, resc_class_name, resc_net, resc_def_path, create_ts, modify_ts, resc_children, resc_context, resc_parent, resc_objcount) values (?,?,?,?,?,?,?,?,?,?,?,?,?)",
02091 &icss);
02092
02093 if (status != 0) {
02094 rodsLog(LOG_NOTICE,
02095 "chlRegResc cmlExectuteNoAnswerSql(insert) failure %d",
02096 status);
02097 _rollback("chlRegResc");
02098 return(status);
02099 }
02100
02101
02102 status = cmlAudit3(AU_REGISTER_RESOURCE, idNum,
02103 rsComm->clientUser.userName,
02104 rsComm->clientUser.rodsZone,
02105 rescInfo->rescName, &icss);
02106 if (status != 0) {
02107 rodsLog(LOG_NOTICE,
02108 "chlRegResc cmlAudit3 failure %d",
02109 status);
02110 _rollback("chlRegResc");
02111 return(status);
02112 }
02113
02114 status = cmlExecuteNoAnswerSql("commit", &icss);
02115 if (status != 0) {
02116 rodsLog(LOG_NOTICE,
02117 "chlRegResc cmlExecuteNoAnswerSql commit failure %d",status);
02118 return(status);
02119 }
02120 return(status);
02121 }
02122
02123 int
02124 _removeRescChild(
02125 char* _resc_id,
02126 const std::string& _child_string) {
02127
02128 int result = 0;
02129 int status;
02130 char children[MAX_PATH_ALLOWED];
02131 char myTime[50];
02132 eirods::sql_logger logger("_removeRescChild", logSQL);
02133
02134
02135 if((status = cmlGetStringValueFromSql("select resc_children from R_RESC_MAIN where resc_id=?",
02136 children, MAX_PATH_ALLOWED, _resc_id, 0, 0, &icss)) != 0) {
02137 _rollback("_updateRescChildren");
02138 result = status;
02139 } else {
02140
02141
02142 eirods::children_parser parser;
02143 eirods::error ret = parser.set_string(children);
02144 if(!ret.ok()) {
02145 std::stringstream ss;
02146 ss << "_removeChildFromResource resource has invalid children string \"" << children << "\'";
02147 ss << ret.result();
02148 eirods::log(LOG_NOTICE, ss.str());
02149 result = CAT_INVALID_CHILD;
02150 } else {
02151
02152
02153 ret = parser.remove_child(_child_string);
02154 if(!ret.ok()) {
02155 std::stringstream ss;
02156 ss << "_removeChildFromResource parent has no child \"" << _child_string << "\'";
02157 ss << ret.result();
02158 eirods::log(LOG_NOTICE, ss.str());
02159 result = CAT_INVALID_CHILD;
02160 } else {
02161
02162
02163
02164 std::string children_string;
02165 parser.str(children_string);
02166 eirods::tmp_string tmp_children(children_string.c_str());
02167 getNowStr(myTime);
02168 cllBindVarCount = 0;
02169 cllBindVars[cllBindVarCount++] = tmp_children.str();
02170 cllBindVars[cllBindVarCount++] = myTime;
02171 cllBindVars[cllBindVarCount++] = _resc_id;
02172 logger.log();
02173 if((status = cmlExecuteNoAnswerSql("update R_RESC_MAIN set resc_children=?, modify_ts=? "
02174 "where resc_id=?", &icss)) != 0) {
02175 std::stringstream ss;
02176 ss << "_removeRescChild cmlExecuteNoAnswerSql update failure " << status;
02177 eirods::log(LOG_NOTICE, ss.str());
02178 _rollback("_removeRescChild");
02179 result = status;
02180 }
02181 }
02182 }
02183 }
02184 return result;
02185 }
02186
02187
02188
02189
02190 static bool
02191 _rescHasChildren(
02192 const std::string _resc_name) {
02193
02194 bool result = false;
02195 int status;
02196 char children[MAX_NAME_LEN];
02197 eirods::sql_logger logger("_rescHasChildren", logSQL);
02198
02199 logger.log();
02200 if((status = cmlGetStringValueFromSql("select resc_children from R_RESC_MAIN where resc_name=?",
02201 children, MAX_NAME_LEN, _resc_name.c_str(), 0, 0, &icss)) !=0) {
02202 if(status != CAT_NO_ROWS_FOUND) {
02203 _rollback("_rescHasChildren");
02204 }
02205 result = false;
02206 } else if(strlen(children) != 0) {
02207 result = true;
02208 }
02209 return result;
02210 }
02211
02212
02213
02214
02215 int
02216 chlDelChildResc(
02217 rsComm_t* rsComm,
02218 rescInfo_t* rescInfo) {
02219
02220 eirods::sql_logger logger("chlDelChildResc", logSQL);
02221 int result = 0;
02222 int status;
02223 char resc_id[MAX_NAME_LEN];
02224 std::string child_string(rescInfo->rescChildren);
02225 std::string child;
02226 eirods::children_parser parser;
02227 parser.set_string(child_string);
02228 parser.first_child(child);
02229
02230 if(!(result = _canConnectToCatalog(rsComm))) {
02231 if((status = getLocalZone())) {
02232 result = status;
02233 } else if(_rescHasData(child) || _rescHasChildren(child)) {
02234 char errMsg[105];
02235 snprintf(errMsg, 100,
02236 "resource '%s' contains one or more dataObjects",
02237 child.c_str());
02238 addRErrorMsg (&rsComm->rError, 0, errMsg);
02239 result = CAT_RESOURCE_NOT_EMPTY;
02240 } else {
02241 logger.log();
02242
02243 resc_id[0] = '\0';
02244 if((status = cmlGetStringValueFromSql("select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
02245 resc_id, MAX_NAME_LEN, rescInfo->rescName, localZone, 0,
02246 &icss)) != 0) {
02247 if(status == CAT_NO_ROWS_FOUND) {
02248 result = CAT_INVALID_RESOURCE;
02249 } else {
02250 _rollback("chlDelChildResc");
02251 result = status;
02252 }
02253 } else if((status = _updateChildParent(child, std::string(""))) != 0) {
02254 result = status;
02255 } else if((status = _removeRescChild(resc_id, child)) != 0) {
02256 result = status;
02257 } else {
02258
02259
02260 char commentStr[1024];
02261 snprintf(commentStr, sizeof commentStr, "%s %s", rescInfo->rescName, child_string.c_str());
02262 if((status = cmlAudit3(AU_DEL_CHILD_RESOURCE, resc_id, rsComm->clientUser.userName, rsComm->clientUser.rodsZone,
02263 commentStr, &icss)) != 0) {
02264 std::stringstream ss;
02265 ss << "chlDelChildResc cmlAudit3 failure " << status;
02266 eirods::log(LOG_NOTICE, ss.str());
02267 _rollback("chlDelChildResc");
02268 result = status;
02269 } else if((status = cmlExecuteNoAnswerSql("commit", &icss)) != 0) {
02270 std::stringstream ss;
02271 ss << "chlDelChildResc cmlExecuteNoAnswerSql commit failure " << status;
02272 eirods::log(LOG_NOTICE, ss.str());
02273 result = status;
02274 }
02275 }
02276 }
02277 }
02278 return result;
02279 }
02280
02281 bool
02282 _rescHasParentOrChild(
02283 char* rescId) {
02284
02285 bool result = false;
02286 char parent[MAX_NAME_LEN];
02287 char children[MAX_NAME_LEN];
02288 int status;
02289 eirods::sql_logger logger("_rescHasParentOrChild", logSQL);
02290
02291 logger.log();
02292 parent[0] = '\0';
02293 children[0] = '\0';
02294 if((status = cmlGetStringValueFromSql("select resc_parent from R_RESC_MAIN where resc_id=?",
02295 parent, MAX_NAME_LEN, rescId, 0, 0, &icss)) != 0) {
02296 if(status == CAT_NO_ROWS_FOUND) {
02297 std::stringstream ss;
02298 ss << "Resource \"" << rescId << "\" not found";
02299 eirods::log(LOG_NOTICE, ss.str());
02300 } else {
02301 _rollback("_rescHasParentOrChild");
02302 }
02303 result = false;
02304 } else if(strlen(parent) != 0) {
02305 result = true;
02306 } else if((status = cmlGetStringValueFromSql("select resc_children from R_RESC_MAIN where resc_id=?",
02307 children, MAX_NAME_LEN, rescId, 0, 0, &icss)) !=0) {
02308 if(status != CAT_NO_ROWS_FOUND) {
02309 _rollback("_rescHasParentOrChild");
02310 }
02311 result = false;
02312 } else if(strlen(children) != 0) {
02313 result = true;
02314 }
02315 return result;
02316
02317 }
02318
02319
02320 int chlDelResc(rsComm_t *rsComm, rescInfo_t *rescInfo, int _dryrun ) {
02321
02322 int status;
02323 char rescId[MAX_NAME_LEN];
02324
02325 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelResc");
02326
02327 if (!icss.status) {
02328 return(CATALOG_NOT_CONNECTED);
02329 }
02330
02331 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
02332 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
02333 }
02334 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
02335 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
02336 }
02337
02338
02339
02340 if (strncmp(rescInfo->rescName, BUNDLE_RESC, strlen(BUNDLE_RESC))==0) {
02341 char errMsg[155];
02342 snprintf(errMsg, 150,
02343 "%s is a built-in resource needed for bundle operations.",
02344 BUNDLE_RESC);
02345 addRErrorMsg (&rsComm->rError, 0, errMsg);
02346 return(CAT_PSEUDO_RESC_MODIFY_DISALLOWED);
02347 }
02348
02349
02350 if (_rescHasData(rescInfo->rescName)) {
02351 char errMsg[105];
02352 snprintf(errMsg, 100,
02353 "resource '%s' contains one or more dataObjects",
02354 rescInfo->rescName);
02355 addRErrorMsg (&rsComm->rError, 0, errMsg);
02356 return(CAT_RESOURCE_NOT_EMPTY);
02357 }
02358
02359 status = getLocalZone();
02360 if (status != 0) return(status);
02361
02362
02363 rescId[0]='\0';
02364 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelResc SQL 2 ");
02365 status = cmlGetStringValueFromSql(
02366 "select resc_id from R_RESC_MAIN where resc_name=?",
02367 rescId, MAX_NAME_LEN, rescInfo->rescName, 0, 0, &icss);
02368 if (status != 0) {
02369 if (status == CAT_SUCCESS_BUT_WITH_NO_INFO) {
02370 char errMsg[105];
02371 snprintf(errMsg, 100,
02372 "resource '%s' does not exist",
02373 rescInfo->rescName);
02374 addRErrorMsg (&rsComm->rError, 0, errMsg);
02375 return(status);
02376 }
02377 _rollback("chlDelResc");
02378 return(status);
02379 }
02380
02381 if(_rescHasParentOrChild(rescId)) {
02382 char errMsg[105];
02383 snprintf(errMsg, 100,
02384 "resource '%s' has a parent or child",
02385 rescInfo->rescName);
02386 addRErrorMsg (&rsComm->rError, 0, errMsg);
02387 return(CAT_RESOURCE_NOT_EMPTY);
02388 }
02389
02390 cllBindVars[cllBindVarCount++]=rescInfo->rescName;
02391 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelResc SQL 3");
02392 status = cmlExecuteNoAnswerSql(
02393 "delete from R_RESC_MAIN where resc_name=?",
02394 &icss);
02395 if (status != 0) {
02396 if (status == CAT_SUCCESS_BUT_WITH_NO_INFO) {
02397 char errMsg[105];
02398 snprintf(errMsg, 100,
02399 "resource '%s' does not exist",
02400 rescInfo->rescName);
02401 addRErrorMsg (&rsComm->rError, 0, errMsg);
02402 return(status);
02403 }
02404 _rollback("chlDelResc");
02405 return(status);
02406 }
02407
02408
02409 cllBindVars[cllBindVarCount++]=rescId;
02410 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelResc SQL 4");
02411 status = cmlExecuteNoAnswerSql(
02412 "delete from R_RESC_GROUP where resc_id=?",
02413 &icss);
02414 if (status != 0 &&
02415 status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
02416 rodsLog(LOG_NOTICE,
02417 "chlDelResc delete from R_RESC_GROUP failure %d",
02418 status);
02419 _rollback("chlDelResc");
02420 return(status);
02421 }
02422
02423
02424
02425 removeMetaMapAndAVU(rescId);
02426
02427
02428
02429 status = cmlAudit3(AU_DELETE_RESOURCE,
02430 rescId,
02431 rsComm->clientUser.userName,
02432 rsComm->clientUser.rodsZone,
02433 rescInfo->rescName,
02434 &icss);
02435 if (status != 0) {
02436 rodsLog(LOG_NOTICE,
02437 "chlDelResc cmlAudit3 failure %d",
02438 status);
02439 _rollback("chlDelResc");
02440 return(status);
02441 }
02442
02443 if( _dryrun ) {
02444 _rollback( "chlDelResc" );
02445 return status;
02446 }
02447
02448 status = cmlExecuteNoAnswerSql("commit", &icss);
02449 if (status != 0) {
02450 rodsLog(LOG_NOTICE,
02451 "chlDelResc cmlExecuteNoAnswerSql commit failure %d",
02452 status);
02453 return(status);
02454 }
02455 return(status);
02456 }
02457
02458
02459
02460
02461
02462
02463
02464
02465
02466
02467
02468
02469
02470
02471 int chlRollback(rsComm_t *rsComm) {
02472 int status;
02473 if (logSQL!=0) rodsLog(LOG_SQL, "chlRollback - SQL 1 ");
02474 status = cmlExecuteNoAnswerSql("rollback", &icss);
02475 if (status != 0) {
02476 rodsLog(LOG_NOTICE,
02477 "chlRollback cmlExecuteNoAnswerSql failure %d",
02478 status);
02479 }
02480 return(status);
02481 }
02482
02483
02484
02485
02486
02487
02488
02489
02490 int chlCommit(rsComm_t *rsComm) {
02491 int status;
02492 if (logSQL!=0) rodsLog(LOG_SQL, "chlCommit - SQL 1 ");
02493 status = cmlExecuteNoAnswerSql("commit", &icss);
02494 if (status != 0) {
02495 rodsLog(LOG_NOTICE,
02496 "chlCommit cmlExecuteNoAnswerSql failure %d",
02497 status);
02498 }
02499 return(status);
02500 }
02501
02502
02503 int chlDelUserRE(rsComm_t *rsComm, userInfo_t *userInfo) {
02504 int status;
02505 char iValStr[200];
02506 char zoneToUse[MAX_NAME_LEN];
02507 char userStr[200];
02508 char userName2[NAME_LEN];
02509 char zoneName[NAME_LEN];
02510
02511 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelUserRE");
02512
02513 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
02514 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
02515 }
02516 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
02517 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
02518 }
02519
02520 status = getLocalZone();
02521 if (status != 0) return(status);
02522
02523 strncpy(zoneToUse, localZone, MAX_NAME_LEN);
02524 if (strlen(userInfo->rodsZone)>0) {
02525 strncpy(zoneToUse, userInfo->rodsZone, MAX_NAME_LEN);
02526 }
02527
02528 status = parseUserName(userInfo->userName, userName2, zoneName);
02529 if (zoneName[0]!='\0') {
02530 rstrcpy(zoneToUse, zoneName, NAME_LEN);
02531 }
02532
02533 if (strncmp(rsComm->clientUser.userName, userName2, sizeof(userName2))==0 &&
02534 strncmp(rsComm->clientUser.rodsZone, zoneToUse, sizeof(zoneToUse))==0) {
02535 addRErrorMsg (&rsComm->rError, 0, "Cannot remove your own admin account, probably unintended");
02536 return(CAT_INVALID_USER);
02537 }
02538
02539
02540 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelUserRE SQL 1 ");
02541 status = cmlGetStringValueFromSql(
02542 "select user_id from R_USER_MAIN where user_name=? and zone_name=?",
02543 iValStr, 200, userName2, zoneToUse, 0, &icss);
02544 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO ||
02545 status==CAT_NO_ROWS_FOUND) {
02546 addRErrorMsg (&rsComm->rError, 0, "Invalid user");
02547 return(CAT_INVALID_USER);
02548 }
02549 if (status != 0) {
02550 _rollback("chlDelUserRE");
02551 return(status);
02552 }
02553
02554 cllBindVars[cllBindVarCount++]=userName2;
02555 cllBindVars[cllBindVarCount++]=zoneToUse;
02556 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelUserRE SQL 2");
02557 status = cmlExecuteNoAnswerSql(
02558 "delete from R_USER_MAIN where user_name=? and zone_name=?",
02559 &icss);
02560 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) return(CAT_INVALID_USER);
02561 if (status != 0) {
02562 _rollback("chlDelUserRE");
02563 return(status);
02564 }
02565
02566 cllBindVars[cllBindVarCount++]=iValStr;
02567 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelUserRE SQL 3");
02568 status = cmlExecuteNoAnswerSql(
02569 "delete from R_USER_PASSWORD where user_id=?",
02570 &icss);
02571 if (status!=0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
02572 char errMsg[MAX_NAME_LEN+40];
02573 rodsLog(LOG_NOTICE,
02574 "chlDelUserRE delete password failure %d",
02575 status);
02576 snprintf(errMsg, sizeof errMsg, "Error removing password entry");
02577 addRErrorMsg (&rsComm->rError, 0, errMsg);
02578 _rollback("chlDelUserRE");
02579 return(status);
02580 }
02581
02582
02583
02584 cllBindVars[cllBindVarCount++]=iValStr;
02585 cllBindVars[cllBindVarCount++]=iValStr;
02586 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelUserRE SQL 4");
02587 status = cmlExecuteNoAnswerSql(
02588 "delete from R_USER_GROUP where user_id=? or group_user_id=?",
02589 &icss);
02590 if (status!=0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
02591 char errMsg[MAX_NAME_LEN+40];
02592 rodsLog(LOG_NOTICE,
02593 "chlDelUserRE delete user_group entry failure %d",
02594 status);
02595 snprintf(errMsg, sizeof errMsg, "Error removing user_group entry");
02596 addRErrorMsg (&rsComm->rError, 0, errMsg);
02597 _rollback("chlDelUserRE");
02598 return(status);
02599 }
02600
02601
02602 cllBindVars[cllBindVarCount++]=iValStr;
02603 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelUserRE SQL 4");
02604 status = cmlExecuteNoAnswerSql(
02605 "delete from R_USER_AUTH where user_id=?",
02606 &icss);
02607 if (status!=0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
02608 char errMsg[MAX_NAME_LEN+40];
02609 rodsLog(LOG_NOTICE,
02610 "chlDelUserRE delete user_auth entries failure %d",
02611 status);
02612 snprintf(errMsg, sizeof errMsg, "Error removing user_auth entries");
02613 addRErrorMsg (&rsComm->rError, 0, errMsg);
02614 _rollback("chlDelUserRE");
02615 return(status);
02616 }
02617
02618
02619 removeMetaMapAndAVU(iValStr);
02620
02621
02622 snprintf(userStr, sizeof userStr, "%s#%s",
02623 userName2, zoneToUse);
02624 status = cmlAudit3(AU_DELETE_USER_RE,
02625 iValStr,
02626 rsComm->clientUser.userName,
02627 rsComm->clientUser.rodsZone,
02628 userStr,
02629 &icss);
02630 if (status != 0) {
02631 rodsLog(LOG_NOTICE,
02632 "chlDelUserRE cmlAudit3 failure %d",
02633 status);
02634 _rollback("chlDelUserRE");
02635 return(status);
02636 }
02637
02638 return(0);
02639 }
02640
02641
02642
02643
02644
02645
02646
02647 int chlRegCollByAdmin(rsComm_t *rsComm, collInfo_t *collInfo)
02648 {
02649 char myTime[50];
02650 char logicalEndName[MAX_NAME_LEN];
02651 char logicalParentDirName[MAX_NAME_LEN];
02652 rodsLong_t iVal;
02653 char collIdNum[MAX_NAME_LEN];
02654 char nextStr[MAX_NAME_LEN];
02655 char currStr[MAX_NAME_LEN];
02656 char currStr2[MAX_SQL_SIZE];
02657 int status;
02658 char tSQL[MAX_SQL_SIZE];
02659 char userName2[NAME_LEN];
02660 char zoneName[NAME_LEN];
02661
02662 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegCollByAdmin");
02663
02664 if (!icss.status) {
02665 return(CATALOG_NOT_CONNECTED);
02666 }
02667
02668
02669
02670 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH ||
02671 rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
02672 int status2;
02673 status2 = cmlCheckGroupAdminAccess(
02674 rsComm->clientUser.userName,
02675 rsComm->clientUser.rodsZone,
02676 "", &icss);
02677 if (status2 != 0) return(status2);
02678 if (creatingUserByGroupAdmin==0) {
02679 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
02680 }
02681
02682 }
02683
02684 if (collInfo==0) {
02685 return(CAT_INVALID_ARGUMENT);
02686 }
02687
02688 status = splitPathByKey(collInfo->collName,
02689 logicalParentDirName, logicalEndName, '/');
02690
02691 if (strlen(logicalParentDirName)==0) {
02692 strcpy(logicalParentDirName, "/");
02693 strcpy(logicalEndName, collInfo->collName+1);
02694 }
02695
02696
02697 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegCollByAdmin SQL 1 ");
02698 status = cmlGetIntegerValueFromSql(
02699 "select coll_id from R_COLL_MAIN where coll_name=?",
02700 &iVal, logicalParentDirName, 0, 0, 0, 0, &icss);
02701 if (status < 0) {
02702 char errMsg[MAX_NAME_LEN+40];
02703 if (status == CAT_NO_ROWS_FOUND) {
02704 snprintf(errMsg, sizeof errMsg,
02705 "collection '%s' is unknown, cannot create %s under it",
02706 logicalParentDirName, logicalEndName);
02707 addRErrorMsg (&rsComm->rError, 0, errMsg);
02708 return(status);
02709 }
02710 _rollback("chlRegCollByAdmin");
02711 return(status);
02712 }
02713
02714 snprintf(collIdNum, MAX_NAME_LEN, "%d", status);
02715
02716
02717 cllNextValueString("R_ObjectID", nextStr, MAX_NAME_LEN);
02718
02719 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegCollByAdmin SQL 2");
02720 snprintf(tSQL, MAX_SQL_SIZE,
02721 "insert into R_COLL_MAIN (coll_id, parent_coll_name, coll_name, coll_owner_name, coll_owner_zone, coll_type, coll_info1, coll_info2, create_ts, modify_ts) values (%s, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
02722 nextStr);
02723
02724 getNowStr(myTime);
02725
02726 status = getLocalZone();
02727 if (status != 0) return(status);
02728
02729
02730 status = parseUserName(collInfo->collOwnerName, userName2, zoneName);
02731 if (zoneName[0]=='\0') {
02732 rstrcpy(zoneName, localZone, NAME_LEN);
02733 }
02734
02735 cllBindVars[cllBindVarCount++]=logicalParentDirName;
02736 cllBindVars[cllBindVarCount++]=collInfo->collName;
02737 cllBindVars[cllBindVarCount++]=userName2;
02738 if (strlen(collInfo->collOwnerZone)>0) {
02739 cllBindVars[cllBindVarCount++]=collInfo->collOwnerZone;
02740 }
02741 else {
02742 cllBindVars[cllBindVarCount++]=zoneName;
02743 }
02744 if (collInfo->collType != NULL) {
02745 cllBindVars[cllBindVarCount++]=collInfo->collType;
02746 }
02747 else {
02748 cllBindVars[cllBindVarCount++]="";
02749 }
02750 if (collInfo->collInfo1 != NULL) {
02751 cllBindVars[cllBindVarCount++]=collInfo->collInfo1;
02752 }
02753 else {
02754 cllBindVars[cllBindVarCount++]="";
02755 }
02756 if (collInfo->collInfo2 != NULL) {
02757 cllBindVars[cllBindVarCount++]=collInfo->collInfo2;
02758 }
02759 else {
02760 cllBindVars[cllBindVarCount++]="";
02761 }
02762 cllBindVars[cllBindVarCount++]=myTime;
02763 cllBindVars[cllBindVarCount++]=myTime;
02764 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegCollByAdmin SQL 3");
02765 status = cmlExecuteNoAnswerSql(tSQL,
02766 &icss);
02767 if (status != 0) {
02768 char errMsg[105];
02769 if (status == CATALOG_ALREADY_HAS_ITEM_BY_THAT_NAME) {
02770 snprintf(errMsg, 100, "Error %d %s",
02771 status,
02772 "CATALOG_ALREADY_HAS_ITEM_BY_THAT_NAME"
02773 );
02774 addRErrorMsg (&rsComm->rError, 0, errMsg);
02775 }
02776
02777 rodsLog(LOG_NOTICE,
02778 "chlRegCollByAdmin cmlExecuteNoAnswerSQL(insert) failure %d"
02779 ,status);
02780 _rollback("chlRegCollByAdmin");
02781 return(status);
02782 }
02783
02784
02785 cllCurrentValueString("R_ObjectID", currStr, MAX_NAME_LEN);
02786 snprintf(currStr2, MAX_SQL_SIZE, " %s ", currStr);
02787
02788 cllBindVars[cllBindVarCount++]=userName2;
02789 cllBindVars[cllBindVarCount++]=zoneName;
02790 cllBindVars[cllBindVarCount++]=ACCESS_OWN;
02791 cllBindVars[cllBindVarCount++]=myTime;
02792 cllBindVars[cllBindVarCount++]=myTime;
02793
02794 snprintf(tSQL, MAX_SQL_SIZE,
02795 "insert into R_OBJT_ACCESS values (%s, (select user_id from R_USER_MAIN where user_name=? and zone_name=?), (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ?)",
02796 currStr2);
02797 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegCollByAdmin SQL 4");
02798 status = cmlExecuteNoAnswerSql(tSQL, &icss);
02799 if (status != 0) {
02800 rodsLog(LOG_NOTICE,
02801 "chlRegCollByAdmin cmlExecuteNoAnswerSql(insert access) failure %d",
02802 status);
02803 _rollback("chlRegCollByAdmin");
02804 return(status);
02805 }
02806
02807
02808 status = cmlAudit4(AU_REGISTER_COLL_BY_ADMIN,
02809 currStr2,
02810 "",
02811 userName2,
02812 zoneName,
02813 rsComm->clientUser.userName,
02814 &icss);
02815 if (status != 0) {
02816 rodsLog(LOG_NOTICE,
02817 "chlRegCollByAdmin cmlAudit4 failure %d",
02818 status);
02819 _rollback("chlRegCollByAdmin");
02820 return(status);
02821 }
02822
02823 return(0);
02824 }
02825
02826
02827
02828
02829
02830
02831
02832
02833
02834
02835 int chlRegColl(rsComm_t *rsComm, collInfo_t *collInfo) {
02836 char myTime[50];
02837 char logicalEndName[MAX_NAME_LEN];
02838 char logicalParentDirName[MAX_NAME_LEN];
02839 rodsLong_t iVal;
02840 char collIdNum[MAX_NAME_LEN];
02841 char nextStr[MAX_NAME_LEN];
02842 char currStr[MAX_NAME_LEN];
02843 char currStr2[MAX_SQL_SIZE];
02844 rodsLong_t status;
02845 char tSQL[MAX_SQL_SIZE];
02846 int inheritFlag;
02847
02848 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegColl");
02849
02850 if (!icss.status) {
02851 return(CATALOG_NOT_CONNECTED);
02852 }
02853
02854 status = splitPathByKey(collInfo->collName,
02855 logicalParentDirName, logicalEndName, '/');
02856
02857 if (strlen(logicalParentDirName)==0) {
02858 strcpy(logicalParentDirName, "/");
02859 strcpy(logicalEndName, collInfo->collName+1);
02860 }
02861
02862
02863
02864 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegColl SQL 1 ");
02865 status = cmlCheckDirAndGetInheritFlag(logicalParentDirName,
02866 rsComm->clientUser.userName,
02867 rsComm->clientUser.rodsZone,
02868 ACCESS_MODIFY_OBJECT, &inheritFlag, &icss);
02869 if (status < 0) {
02870 char errMsg[105];
02871 if (status == CAT_UNKNOWN_COLLECTION) {
02872 snprintf(errMsg, 100, "collection '%s' is unknown",
02873 logicalParentDirName);
02874 addRErrorMsg (&rsComm->rError, 0, errMsg);
02875 return(status);
02876 }
02877 _rollback("chlRegColl");
02878 return(status);
02879 }
02880 snprintf(collIdNum, MAX_NAME_LEN, "%lld", status);
02881
02882
02883 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegColl SQL 2");
02884 status = cmlGetIntegerValueFromSql(
02885 "select data_id from R_DATA_MAIN where data_name=? and coll_id=?",
02886 &iVal, logicalEndName, collIdNum, 0, 0, 0, &icss);
02887
02888 if (status == 0) {
02889 return(CAT_NAME_EXISTS_AS_DATAOBJ);
02890 }
02891
02892
02893
02894 cllNextValueString("R_ObjectID", nextStr, MAX_NAME_LEN);
02895
02896 getNowStr(myTime);
02897
02898 cllBindVars[cllBindVarCount++]=logicalParentDirName;
02899 cllBindVars[cllBindVarCount++]=collInfo->collName;
02900 cllBindVars[cllBindVarCount++]=rsComm->clientUser.userName;
02901 cllBindVars[cllBindVarCount++]=rsComm->clientUser.rodsZone;
02902 if (collInfo->collType != NULL) {
02903 cllBindVars[cllBindVarCount++]=collInfo->collType;
02904 }
02905 else {
02906 cllBindVars[cllBindVarCount++]="";
02907 }
02908 if (collInfo->collInfo1 != NULL) {
02909 cllBindVars[cllBindVarCount++]=collInfo->collInfo1;
02910 }
02911 else {
02912 cllBindVars[cllBindVarCount++]="";
02913 }
02914 if (collInfo->collInfo2 != NULL) {
02915 cllBindVars[cllBindVarCount++]=collInfo->collInfo2;
02916 }
02917 else {
02918 cllBindVars[cllBindVarCount++]="";
02919 }
02920 cllBindVars[cllBindVarCount++]=myTime;
02921 cllBindVars[cllBindVarCount++]=myTime;
02922 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegColl SQL 3");
02923 snprintf(tSQL, MAX_SQL_SIZE,
02924 "insert into R_COLL_MAIN (coll_id, parent_coll_name, coll_name, coll_owner_name, coll_owner_zone, coll_type, coll_info1, coll_info2, create_ts, modify_ts) values (%s, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
02925 nextStr);
02926 status = cmlExecuteNoAnswerSql(tSQL,
02927 &icss);
02928 if (status != 0) {
02929 rodsLog(LOG_NOTICE,
02930 "chlRegColl cmlExecuteNoAnswerSql(insert) failure %d",status);
02931 _rollback("chlRegColl");
02932 return(status);
02933 }
02934
02935
02936 cllCurrentValueString("R_ObjectID", currStr, MAX_NAME_LEN);
02937 snprintf(currStr2, MAX_SQL_SIZE, " %s ", currStr);
02938
02939 if (inheritFlag) {
02940
02941
02942 cllBindVars[0]=myTime;
02943 cllBindVars[1]=myTime;
02944 cllBindVars[2]=collIdNum;
02945 cllBindVarCount=3;
02946 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegColl SQL 4");
02947 snprintf(tSQL, MAX_SQL_SIZE,
02948 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) (select %s, user_id, access_type_id, ?, ? from R_OBJT_ACCESS where object_id = ?)",
02949 currStr2);
02950 status = cmlExecuteNoAnswerSql(tSQL, &icss);
02951
02952 if (status == 0) {
02953 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegColl SQL 5");
02954 #if ORA_ICAT
02955 char newCollectionID[MAX_NAME_LEN];
02956
02957
02958
02959
02960 status = cmlGetCurrentSeqVal(&icss);
02961
02962 if (status > 0) {
02963
02964 snprintf(newCollectionID, MAX_SQL_SIZE, "%lld", status);
02965 cllBindVars[cllBindVarCount++]="1";
02966 cllBindVars[cllBindVarCount++]=myTime;
02967 cllBindVars[cllBindVarCount++]=newCollectionID;
02968 status = cmlExecuteNoAnswerSql(
02969 "update R_COLL_MAIN set coll_inheritance=?, modify_ts=? where coll_id=?",
02970 &icss);
02971 }
02972 #else
02973
02974
02975
02976
02977 cllBindVars[cllBindVarCount++]="1";
02978 cllBindVars[cllBindVarCount++]=myTime;
02979 snprintf(tSQL, MAX_SQL_SIZE,
02980 "update R_COLL_MAIN set coll_inheritance=?, modify_ts=? where coll_id=%s",
02981 currStr2);
02982 status = cmlExecuteNoAnswerSql(tSQL, &icss);
02983 #endif
02984 }
02985 }
02986 else {
02987 cllBindVars[cllBindVarCount++]=rsComm->clientUser.userName;
02988 cllBindVars[cllBindVarCount++]=rsComm->clientUser.rodsZone;
02989 cllBindVars[cllBindVarCount++]=ACCESS_OWN;
02990 cllBindVars[cllBindVarCount++]=myTime;
02991 cllBindVars[cllBindVarCount++]=myTime;
02992 snprintf(tSQL, MAX_SQL_SIZE,
02993 "insert into R_OBJT_ACCESS values (%s, (select user_id from R_USER_MAIN where user_name=? and zone_name=?), (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ?)",
02994 currStr2);
02995 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegColl SQL 6");
02996 status = cmlExecuteNoAnswerSql(tSQL, &icss);
02997 }
02998 if (status != 0) {
02999 rodsLog(LOG_NOTICE,
03000 "chlRegColl cmlExecuteNoAnswerSql(insert access) failure %d",
03001 status);
03002 _rollback("chlRegColl");
03003 return(status);
03004 }
03005
03006
03007 status = cmlAudit4(AU_REGISTER_COLL,
03008 currStr2,
03009 "",
03010 rsComm->clientUser.userName,
03011 rsComm->clientUser.rodsZone,
03012 collInfo->collName,
03013 &icss);
03014 if (status != 0) {
03015 rodsLog(LOG_NOTICE,
03016 "chlRegColl cmlAudit4 failure %d",
03017 status);
03018 _rollback("chlRegColl");
03019 return(status);
03020 }
03021
03022 status = cmlExecuteNoAnswerSql("commit", &icss);
03023 if (status != 0) {
03024 rodsLog(LOG_NOTICE,
03025 "chlRegColl cmlExecuteNoAnswerSql commit failure %d",
03026 status);
03027 return(status);
03028 }
03029
03030 return(status);
03031 }
03032
03033
03034
03035
03036
03037
03038
03039
03040
03041
03042 int chlModColl(rsComm_t *rsComm, collInfo_t *collInfo) {
03043 char myTime[50];
03044 rodsLong_t status;
03045 char tSQL[MAX_SQL_SIZE];
03046 int count;
03047 rodsLong_t iVal;
03048 char iValStr[60];
03049
03050 if (logSQL!=0) rodsLog(LOG_SQL, "chlModColl");
03051
03052 if( NULL == collInfo ) {
03053 rodsLog( LOG_ERROR, "chlModColl :: null input parameter collInfo" );
03054 return -1;
03055 }
03056
03057 if (!icss.status) {
03058 return(CATALOG_NOT_CONNECTED);
03059 }
03060
03061
03062 iVal = cmlCheckDir(collInfo->collName, rsComm->clientUser.userName,
03063 rsComm->clientUser.rodsZone,
03064 ACCESS_MODIFY_OBJECT, &icss);
03065
03066 if (iVal < 0) {
03067 char errMsg[105];
03068 if (iVal==CAT_UNKNOWN_COLLECTION) {
03069 snprintf(errMsg, 100, "collection '%s' is unknown",
03070 collInfo->collName);
03071 addRErrorMsg (&rsComm->rError, 0, errMsg);
03072 return(CAT_UNKNOWN_COLLECTION);
03073 }
03074 if (iVal==CAT_NO_ACCESS_PERMISSION) {
03075 snprintf(errMsg, 100, "no permission to update collection '%s'",
03076 collInfo->collName);
03077 addRErrorMsg (&rsComm->rError, 0, errMsg);
03078 return (CAT_NO_ACCESS_PERMISSION);
03079 }
03080 return(iVal);
03081 }
03082
03083
03084
03085
03086
03087 strncpy(tSQL, "update R_COLL_MAIN set ", MAX_SQL_SIZE);
03088 count=0;
03089 if (collInfo->collType != NULL && strlen(collInfo->collType)>0) {
03090 if (strcmp(collInfo->collType,"NULL_SPECIAL_VALUE")==0) {
03091
03092 cllBindVars[cllBindVarCount++]="";
03093 }
03094 else {
03095 cllBindVars[cllBindVarCount++]=collInfo->collType;
03096 }
03097 strncat(tSQL, "coll_type=? ", MAX_SQL_SIZE);
03098 count++;
03099 }
03100 if (collInfo->collInfo1 != NULL && strlen(collInfo->collInfo1)>0) {
03101 if (strcmp(collInfo->collInfo1,"NULL_SPECIAL_VALUE")==0) {
03102
03103 cllBindVars[cllBindVarCount++]="";
03104 } else {
03105 cllBindVars[cllBindVarCount++]=collInfo->collInfo1;
03106 }
03107 if (count>0) strncat(tSQL, ",", MAX_SQL_SIZE);
03108 strncat(tSQL, "coll_info1=? ", MAX_SQL_SIZE);
03109 count++;
03110 }
03111 if (collInfo->collInfo2 != NULL && strlen(collInfo->collInfo2)>0) {
03112 if (strcmp(collInfo->collInfo2,"NULL_SPECIAL_VALUE")==0) {
03113
03114 cllBindVars[cllBindVarCount++]="";
03115 } else {
03116 cllBindVars[cllBindVarCount++]=collInfo->collInfo2;
03117 }
03118 if (count>0) strncat(tSQL, ",", MAX_SQL_SIZE);
03119 strncat(tSQL, "coll_info2=? ", MAX_SQL_SIZE);
03120 count++;
03121 }
03122 if (count==0) return(CAT_INVALID_ARGUMENT);
03123 getNowStr(myTime);
03124 cllBindVars[cllBindVarCount++]=myTime;
03125 cllBindVars[cllBindVarCount++]=collInfo->collName;
03126 strncat(tSQL, ", modify_ts=? where coll_name=?", MAX_SQL_SIZE);
03127
03128 if (logSQL!=0) rodsLog(LOG_SQL, "chlModColl SQL 1");
03129 status = cmlExecuteNoAnswerSql(tSQL,
03130 &icss);
03131
03132
03133 snprintf(iValStr, sizeof iValStr, "%lld", iVal);
03134 status = cmlAudit3(AU_REGISTER_COLL,
03135 iValStr,
03136 rsComm->clientUser.userName,
03137 rsComm->clientUser.rodsZone,
03138 collInfo->collName,
03139 &icss);
03140 if (status != 0) {
03141 rodsLog(LOG_NOTICE,
03142 "chlModColl cmlAudit3 failure %d",
03143 status);
03144 return(status);
03145 }
03146
03147
03148 if (status != 0) {
03149 rodsLog(LOG_NOTICE,
03150 "chlModColl cmlExecuteNoAnswerSQL(update) failure %d", status);
03151 return(status);
03152 }
03153 return(0);
03154 }
03155
03156
03157
03158 int chlRegZone(rsComm_t *rsComm,
03159 char *zoneName, char *zoneType, char *zoneConnInfo,
03160 char *zoneComment) {
03161 char nextStr[MAX_NAME_LEN];
03162 char tSQL[MAX_SQL_SIZE];
03163 int status;
03164 char myTime[50];
03165
03166 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegZone");
03167
03168 if (!icss.status) {
03169 return(CATALOG_NOT_CONNECTED);
03170 }
03171
03172 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03173 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03174 }
03175 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03176 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03177 }
03178
03179 if (strncmp(zoneType, "remote", 6) != 0) {
03180 addRErrorMsg (&rsComm->rError, 0,
03181 "Currently, only zones of type 'remote' are allowed");
03182 return(CAT_INVALID_ARGUMENT);
03183 }
03184
03185
03186 cllNextValueString("R_ObjectID", nextStr, MAX_NAME_LEN);
03187
03188 getNowStr(myTime);
03189
03190 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegZone SQL 1 ");
03191 cllBindVars[cllBindVarCount++]=zoneName;
03192 cllBindVars[cllBindVarCount++]=zoneConnInfo;
03193 cllBindVars[cllBindVarCount++]=zoneComment;
03194 cllBindVars[cllBindVarCount++]=myTime;
03195 cllBindVars[cllBindVarCount++]=myTime;
03196
03197 snprintf(tSQL, MAX_SQL_SIZE,
03198 "insert into R_ZONE_MAIN (zone_id, zone_name, zone_type_name, zone_conn_string, r_comment, create_ts, modify_ts) values (%s, ?, 'remote', ?, ?, ?, ?)",
03199 nextStr);
03200 status = cmlExecuteNoAnswerSql(tSQL,
03201 &icss);
03202 if (status != 0) {
03203 rodsLog(LOG_NOTICE,
03204 "chlRegZone cmlExecuteNoAnswerSql(insert) failure %d",status);
03205 _rollback("chlRegZone");
03206 return(status);
03207 }
03208
03209
03210 status = cmlAudit3(AU_REGISTER_ZONE, "0",
03211 rsComm->clientUser.userName,
03212 rsComm->clientUser.rodsZone,
03213 "", &icss);
03214 if (status != 0) {
03215 rodsLog(LOG_NOTICE,
03216 "chlRegResc cmlAudit3 failure %d",
03217 status);
03218 return(status);
03219 }
03220
03221
03222 status = cmlExecuteNoAnswerSql("commit", &icss);
03223 if (status != 0) {
03224 rodsLog(LOG_NOTICE,
03225 "chlRegZone cmlExecuteNoAnswerSql commit failure %d",
03226 status);
03227 return(status);
03228 }
03229
03230 return(0);
03231 }
03232
03233
03234
03235 int chlModZone(rsComm_t *rsComm, char *zoneName, char *option,
03236 char *optionValue) {
03237 int status, OK;
03238 char myTime[50];
03239 char zoneId[MAX_NAME_LEN];
03240 char commentStr[200];
03241
03242 if (logSQL!=0) rodsLog(LOG_SQL, "chlModZone");
03243
03244 if (zoneName == NULL || option==NULL || optionValue==NULL) {
03245 return (CAT_INVALID_ARGUMENT);
03246 }
03247
03248 if (*zoneName == '\0' || *option == '\0' || *optionValue=='\0') {
03249 return (CAT_INVALID_ARGUMENT);
03250 }
03251
03252 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03253 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03254 }
03255 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03256 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03257 }
03258
03259 status = getLocalZone();
03260 if (status != 0) return(status);
03261
03262 zoneId[0]='\0';
03263 if (logSQL!=0) rodsLog(LOG_SQL, "chlModZone SQL 1 ");
03264 status = cmlGetStringValueFromSql(
03265 "select zone_id from R_ZONE_MAIN where zone_name=?",
03266 zoneId, MAX_NAME_LEN, zoneName, "", 0, &icss);
03267 if (status != 0) {
03268 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_ZONE);
03269 return(status);
03270 }
03271
03272 getNowStr(myTime);
03273 OK=0;
03274 if (strcmp(option, "comment")==0) {
03275 cllBindVars[cllBindVarCount++]=optionValue;
03276 cllBindVars[cllBindVarCount++]=myTime;
03277 cllBindVars[cllBindVarCount++]=zoneId;
03278 if (logSQL!=0) rodsLog(LOG_SQL, "chlModZone SQL 3");
03279 status = cmlExecuteNoAnswerSql(
03280 "update R_ZONE_MAIN set r_comment = ?, modify_ts=? where zone_id=?",
03281 &icss);
03282 if (status != 0) {
03283 rodsLog(LOG_NOTICE,
03284 "chlModZone cmlExecuteNoAnswerSql update failure %d",
03285 status);
03286 return(status);
03287 }
03288 OK=1;
03289 }
03290 if (strcmp(option, "conn")==0) {
03291 cllBindVars[cllBindVarCount++]=optionValue;
03292 cllBindVars[cllBindVarCount++]=myTime;
03293 cllBindVars[cllBindVarCount++]=zoneId;
03294 if (logSQL!=0) rodsLog(LOG_SQL, "chlModZone SQL 5");
03295 status = cmlExecuteNoAnswerSql(
03296 "update R_ZONE_MAIN set zone_conn_string = ?, modify_ts=? where zone_id=?",
03297 &icss);
03298 if (status != 0) {
03299 rodsLog(LOG_NOTICE,
03300 "chlModZone cmlExecuteNoAnswerSql update failure %d",
03301 status);
03302 return(status);
03303 }
03304 OK=1;
03305 }
03306 if (strcmp(option, "name")==0) {
03307 if (strcmp(zoneName,localZone)==0) {
03308 addRErrorMsg (&rsComm->rError, 0,
03309 "It is not valid to rename the local zone via chlModZone; iadmin should use acRenameLocalZone");
03310 return (CAT_INVALID_ARGUMENT);
03311 }
03312 cllBindVars[cllBindVarCount++]=optionValue;
03313 cllBindVars[cllBindVarCount++]=myTime;
03314 cllBindVars[cllBindVarCount++]=zoneId;
03315 if (logSQL!=0) rodsLog(LOG_SQL, "chlModZone SQL 5");
03316 status = cmlExecuteNoAnswerSql(
03317 "update R_ZONE_MAIN set zone_name = ?, modify_ts=? where zone_id=?",
03318 &icss);
03319 if (status != 0) {
03320 rodsLog(LOG_NOTICE,
03321 "chlModZone cmlExecuteNoAnswerSql update failure %d",
03322 status);
03323 return(status);
03324 }
03325 OK=1;
03326 }
03327 if (OK==0) {
03328 return (CAT_INVALID_ARGUMENT);
03329 }
03330
03331
03332 snprintf(commentStr, sizeof commentStr, "%s %s", option, optionValue);
03333 status = cmlAudit3(AU_MOD_ZONE,
03334 zoneId,
03335 rsComm->clientUser.userName,
03336 rsComm->clientUser.rodsZone,
03337 commentStr,
03338 &icss);
03339 if (status != 0) {
03340 rodsLog(LOG_NOTICE,
03341 "chlModZone cmlAudit3 failure %d",
03342 status);
03343 return(status);
03344 }
03345
03346 status = cmlExecuteNoAnswerSql("commit", &icss);
03347 if (status != 0) {
03348 rodsLog(LOG_NOTICE,
03349 "chlModZone cmlExecuteNoAnswerSql commit failure %d",
03350 status);
03351 return(status);
03352 }
03353 return(0);
03354 }
03355
03356
03357 int chlRenameColl(rsComm_t *rsComm, char *oldCollName, char *newCollName) {
03358 int status;
03359 rodsLong_t status1;
03360
03361
03362
03363 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameColl SQL 1 ");
03364
03365 status1 = cmlCheckDir(oldCollName,
03366 rsComm->clientUser.userName,
03367 rsComm->clientUser.rodsZone,
03368 ACCESS_OWN,
03369 &icss);
03370
03371 if (status1 < 0) {
03372 return(status1);
03373 }
03374
03375
03376 status = chlRenameObject(rsComm, status1, newCollName);
03377 return(status);
03378 }
03379
03380
03381
03382 int chlRenameLocalZone(rsComm_t *rsComm, char *oldZoneName, char *newZoneName) {
03383 int status;
03384 char zoneId[MAX_NAME_LEN];
03385 char myTime[50];
03386 char commentStr[200];
03387
03388 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameLocalZone");
03389
03390 if (!icss.status) {
03391 return(CATALOG_NOT_CONNECTED);
03392 }
03393
03394 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03395 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03396 }
03397 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03398 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03399 }
03400
03401 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameLocalZone SQL 1 ");
03402 getLocalZone();
03403
03404 if (strcmp(localZone, oldZoneName) != 0) {
03405 return(CAT_INVALID_ARGUMENT);
03406 }
03407
03408
03409 zoneId[0]='\0';
03410 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameLocalZone SQL 2 ");
03411 status = cmlGetStringValueFromSql(
03412 "select zone_id from R_ZONE_MAIN where zone_name=?",
03413 zoneId, MAX_NAME_LEN, newZoneName, "", 0, &icss);
03414 if (status != CAT_NO_ROWS_FOUND) return(CAT_INVALID_ZONE);
03415
03416 getNowStr(myTime);
03417
03418
03419
03420
03421
03422 snprintf(commentStr, sizeof commentStr, "renamed local zone %s to %s",
03423 oldZoneName, newZoneName);
03424 status = cmlAudit3(AU_MOD_ZONE,
03425 "0",
03426 rsComm->clientUser.userName,
03427 rsComm->clientUser.rodsZone,
03428 commentStr,
03429 &icss);
03430 if (status != 0) {
03431 rodsLog(LOG_NOTICE,
03432 "chlRenameLocalZone cmlAudit3 failure %d",
03433 status);
03434 return(status);
03435 }
03436
03437
03438 cllBindVars[cllBindVarCount++]=newZoneName;
03439 cllBindVars[cllBindVarCount++]=myTime;
03440 cllBindVars[cllBindVarCount++]=oldZoneName;
03441 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameLocalZone SQL 3 ");
03442 status = cmlExecuteNoAnswerSql(
03443 "update R_COLL_MAIN set coll_owner_zone = ?, modify_ts=? where coll_owner_zone=?",
03444 &icss);
03445 if (status != 0) {
03446 rodsLog(LOG_NOTICE,
03447 "chlRenameLocalZone cmlExecuteNoAnswerSql update failure %d",
03448 status);
03449 return(status);
03450 }
03451
03452
03453 cllBindVars[cllBindVarCount++]=newZoneName;
03454 cllBindVars[cllBindVarCount++]=myTime;
03455 cllBindVars[cllBindVarCount++]=oldZoneName;
03456 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameLocalZone SQL 4 ");
03457 status = cmlExecuteNoAnswerSql(
03458 "update R_DATA_MAIN set data_owner_zone = ?, modify_ts=? where data_owner_zone=?",
03459 &icss);
03460 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
03461 rodsLog(LOG_NOTICE,
03462 "chlRenameLocalZone cmlExecuteNoAnswerSql update failure %d",
03463 status);
03464 return(status);
03465 }
03466
03467
03468 cllBindVars[cllBindVarCount++]=newZoneName;
03469 cllBindVars[cllBindVarCount++]=myTime;
03470 cllBindVars[cllBindVarCount++]=oldZoneName;
03471 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameLocalZone SQL 5 ");
03472 status = cmlExecuteNoAnswerSql(
03473 "update R_RESC_MAIN set zone_name = ?, modify_ts=? where zone_name=?",
03474 &icss);
03475 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
03476 rodsLog(LOG_NOTICE,
03477 "chlRenameLocalZone cmlExecuteNoAnswerSql update failure %d",
03478 status);
03479 return(status);
03480 }
03481
03482
03483 cllBindVars[cllBindVarCount++]=newZoneName;
03484 cllBindVars[cllBindVarCount++]=myTime;
03485 cllBindVars[cllBindVarCount++]=oldZoneName;
03486 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameLocalZone SQL 6 ");
03487 status = cmlExecuteNoAnswerSql(
03488 "update R_RULE_MAIN set rule_owner_zone=?, modify_ts=? where rule_owner_zone=?",
03489 &icss);
03490 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
03491 rodsLog(LOG_NOTICE,
03492 "chlRenameLocalZone cmlExecuteNoAnswerSql update failure %d",
03493 status);
03494 return(status);
03495 }
03496
03497
03498 cllBindVars[cllBindVarCount++]=newZoneName;
03499 cllBindVars[cllBindVarCount++]=myTime;
03500 cllBindVars[cllBindVarCount++]=oldZoneName;
03501 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameLocalZone SQL 7 ");
03502 status = cmlExecuteNoAnswerSql(
03503 "update R_USER_MAIN set zone_name=?, modify_ts=? where zone_name=?",
03504 &icss);
03505 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
03506 rodsLog(LOG_NOTICE,
03507 "chlRenameLocalZone cmlExecuteNoAnswerSql update failure %d",
03508 status);
03509 return(status);
03510 }
03511
03512
03513 cllBindVars[cllBindVarCount++]=newZoneName;
03514 cllBindVars[cllBindVarCount++]=myTime;
03515 cllBindVars[cllBindVarCount++]=oldZoneName;
03516 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameLocalZone SQL 8 ");
03517 status = cmlExecuteNoAnswerSql(
03518 "update R_ZONE_MAIN set zone_name=?, modify_ts=? where zone_name=?",
03519 &icss);
03520 if (status != 0) {
03521 rodsLog(LOG_NOTICE,
03522 "chlRenameLocalZone cmlExecuteNoAnswerSql update failure %d",
03523 status);
03524 return(status);
03525 }
03526
03527 return(0);
03528 }
03529
03530
03531 int chlDelZone(rsComm_t *rsComm, char *zoneName) {
03532 int status;
03533 char zoneType[MAX_NAME_LEN];
03534
03535 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelZone");
03536
03537 if (!icss.status) {
03538 return(CATALOG_NOT_CONNECTED);
03539 }
03540
03541 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03542 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03543 }
03544 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03545 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03546 }
03547
03548 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelZone SQL 1 ");
03549
03550 status = cmlGetStringValueFromSql(
03551 "select zone_type_name from R_ZONE_MAIN where zone_name=?",
03552 zoneType, MAX_NAME_LEN, zoneName, 0, 0, &icss);
03553 if (status != 0) {
03554 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_ZONE);
03555 return(status);
03556 }
03557
03558 if (strcmp(zoneType, "remote") != 0) {
03559 addRErrorMsg (&rsComm->rError, 0,
03560 "It is not permitted to remove the local zone");
03561 return(CAT_INVALID_ARGUMENT);
03562 }
03563
03564 cllBindVars[cllBindVarCount++]=zoneName;
03565 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelZone 2");
03566 status = cmlExecuteNoAnswerSql(
03567 "delete from R_ZONE_MAIN where zone_name = ?",
03568 &icss);
03569 if (status != 0) {
03570 rodsLog(LOG_NOTICE,
03571 "chlDelZone cmlExecuteNoAnswerSql delete failure %d",
03572 status);
03573 return(status);
03574 }
03575
03576
03577 status = cmlAudit3(AU_DELETE_ZONE,
03578 "0",
03579 rsComm->clientUser.userName,
03580 rsComm->clientUser.rodsZone,
03581 zoneName,
03582 &icss);
03583 if (status != 0) {
03584 rodsLog(LOG_NOTICE,
03585 "chlDelZone cmlAudit3 failure %d",
03586 status);
03587 _rollback("chlDelZone");
03588 return(status);
03589 }
03590
03591 status = cmlExecuteNoAnswerSql("commit", &icss);
03592 if (status != 0) {
03593 rodsLog(LOG_NOTICE,
03594 "chlDelZone cmlExecuteNoAnswerSql commit failure %d",
03595 status);
03596 return(status);
03597 }
03598
03599 return(0);
03600 }
03601
03602
03603
03604
03605
03606
03607
03608
03609
03610
03611
03612
03613
03614
03615
03616
03617
03618
03619
03620
03621
03622
03623
03624
03625
03626 int chlSimpleQuery(rsComm_t *rsComm, char *sql,
03627 char *arg1, char *arg2, char *arg3, char *arg4,
03628 int format, int *control,
03629 char *outBuf, int maxOutBuf) {
03630 int stmtNum, status, nCols, i, needToGet, didGet;
03631 int rowSize;
03632 int rows;
03633 int OK;
03634
03635 char *allowedSQL[]={
03636 "select token_name from R_TOKN_MAIN where token_namespace = 'token_namespace'",
03637 "select token_name from R_TOKN_MAIN where token_namespace = ?",
03638 "select * from R_TOKN_MAIN where token_namespace = ? and token_name like ?",
03639 "select resc_name from R_RESC_MAIN",
03640 "select * from R_RESC_MAIN where resc_name=?",
03641 "select zone_name from R_ZONE_MAIN",
03642 "select * from R_ZONE_MAIN where zone_name=?",
03643 "select user_name from R_USER_MAIN where user_type_name='rodsgroup'",
03644 "select user_name||'#'||zone_name from R_USER_MAIN, R_USER_GROUP where R_USER_GROUP.user_id=R_USER_MAIN.user_id and R_USER_GROUP.group_user_id=(select user_id from R_USER_MAIN where user_name=?)",
03645 "select * from R_DATA_MAIN where data_id=?",
03646 "select data_name, data_id, data_repl_num from R_DATA_MAIN where coll_id =(select coll_id from R_COLL_MAIN where coll_name=?)",
03647 "select coll_name from R_COLL_MAIN where parent_coll_name=?",
03648 "select * from R_USER_MAIN where user_name=?",
03649 "select user_name||'#'||zone_name from R_USER_MAIN where user_type_name != 'rodsgroup'",
03650 "select R_RESC_GROUP.resc_group_name, R_RESC_GROUP.resc_id, resc_name, R_RESC_GROUP.create_ts, R_RESC_GROUP.modify_ts from R_RESC_MAIN, R_RESC_GROUP where R_RESC_MAIN.resc_id = R_RESC_GROUP.resc_id and resc_group_name=?",
03651 "select distinct resc_group_name from R_RESC_GROUP",
03652 "select coll_id from R_COLL_MAIN where coll_name = ?",
03653 "select * from R_USER_MAIN where user_name=? and zone_name=?",
03654 "select user_name from R_USER_MAIN where zone_name=? and user_type_name != 'rodsgroup'",
03655 "select zone_name from R_ZONE_MAIN where zone_type_name=?",
03656 "select user_name, user_auth_name from R_USER_AUTH, R_USER_MAIN where R_USER_AUTH.user_id = R_USER_MAIN.user_id and R_USER_MAIN.user_name=?",
03657 "select user_name, user_auth_name from R_USER_AUTH, R_USER_MAIN where R_USER_AUTH.user_id = R_USER_MAIN.user_id and R_USER_MAIN.user_name=? and R_USER_MAIN.zone_name=?",
03658 "select user_name, user_auth_name from R_USER_AUTH, R_USER_MAIN where R_USER_AUTH.user_id = R_USER_MAIN.user_id",
03659 "select user_name, user_auth_name from R_USER_AUTH, R_USER_MAIN where R_USER_AUTH.user_id = R_USER_MAIN.user_id and R_USER_AUTH.user_auth_name=?",
03660 "select user_name, R_USER_MAIN.zone_name, resc_name, quota_limit, quota_over, R_QUOTA_MAIN.modify_ts from R_QUOTA_MAIN, R_USER_MAIN, R_RESC_MAIN where R_USER_MAIN.user_id = R_QUOTA_MAIN.user_id and R_RESC_MAIN.resc_id = R_QUOTA_MAIN.resc_id",
03661 "select user_name, R_USER_MAIN.zone_name, resc_name, quota_limit, quota_over, R_QUOTA_MAIN.modify_ts from R_QUOTA_MAIN, R_USER_MAIN, R_RESC_MAIN where R_USER_MAIN.user_id = R_QUOTA_MAIN.user_id and R_RESC_MAIN.resc_id = R_QUOTA_MAIN.resc_id and user_name=? and R_USER_MAIN.zone_name=?",
03662 "select user_name, R_USER_MAIN.zone_name, quota_limit, quota_over, R_QUOTA_MAIN.modify_ts from R_QUOTA_MAIN, R_USER_MAIN where R_USER_MAIN.user_id = R_QUOTA_MAIN.user_id and R_QUOTA_MAIN.resc_id = 0",
03663 "select user_name, R_USER_MAIN.zone_name, quota_limit, quota_over, R_QUOTA_MAIN.modify_ts from R_QUOTA_MAIN, R_USER_MAIN where R_USER_MAIN.user_id = R_QUOTA_MAIN.user_id and R_QUOTA_MAIN.resc_id = 0 and user_name=? and R_USER_MAIN.zone_name=?",
03664 ""
03665 };
03666
03667 if (logSQL!=0) rodsLog(LOG_SQL, "chlSimpleQuery");
03668
03669 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03670 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03671 }
03672 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03673 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03674 }
03675
03676
03677 OK=0;
03678 for (i=0;;i++) {
03679 if (strlen(allowedSQL[i]) < 1) break;
03680 if (strcasecmp(allowedSQL[i], sql)==0) {
03681 OK=1;
03682 break;
03683 }
03684 }
03685
03686 if (OK == 0) {
03687 return(CAT_INVALID_ARGUMENT);
03688 }
03689
03690
03691
03692 if (i==0 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 1 ");
03693 if (i==1 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 2");
03694 if (i==2 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 3");
03695 if (i==3 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 4");
03696 if (i==4 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 5");
03697 if (i==5 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 6");
03698 if (i==6 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 7");
03699 if (i==7 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 8");
03700 if (i==8 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 9");
03701 if (i==9 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 10");
03702 if (i==10 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 11");
03703 if (i==11 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 12");
03704 if (i==12 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 13");
03705 if (i==13 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 14");
03706
03707
03708
03709 if (i==17 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 18");
03710 if (i==18 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 19");
03711 if (i==19 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 20");
03712 if (i==20 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 21");
03713 if (i==21 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 22");
03714 if (i==22 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 23");
03715 if (i==23 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 24");
03716 if (i==24 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 25");
03717 if (i==25 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 26");
03718 if (i==26 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 27");
03719 if (i==27 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 28");
03720
03721 outBuf[0]='\0';
03722 needToGet=1;
03723 didGet=0;
03724 rowSize=0;
03725 rows=0;
03726 if (*control==0) {
03727 status = cmlGetFirstRowFromSqlBV(sql, arg1, arg2, arg3, arg4,
03728 &stmtNum, &icss);
03729 if (status < 0) {
03730 if (status != CAT_NO_ROWS_FOUND) {
03731 rodsLog(LOG_NOTICE,
03732 "chlSimpleQuery cmlGetFirstRowFromSqlBV failure %d",
03733 status);
03734 }
03735 return(status);
03736 }
03737 didGet=1;
03738 needToGet=0;
03739 *control = stmtNum+1;
03740 }
03741 else {
03742 stmtNum = *control - 1;
03743 }
03744
03745 for (;;) {
03746 if (needToGet) {
03747 status = cmlGetNextRowFromStatement(stmtNum, &icss);
03748 if (status == CAT_NO_ROWS_FOUND) {
03749 *control = 0;
03750 if (didGet) {
03751 if (format == 2) {
03752 i = strlen(outBuf);
03753 outBuf[i-1]='\0';
03754 }
03755 return(0);
03756 }
03757 return(status);
03758 }
03759 if (status < 0) {
03760 rodsLog(LOG_NOTICE,
03761 "chlSimpleQuery cmlGetNextRowFromStatement failure %d",
03762 status);
03763 return(status);
03764 }
03765 *control = stmtNum+1;
03766 didGet=1;
03767 }
03768 needToGet=1;
03769 nCols = icss.stmtPtr[stmtNum]->numOfCols;
03770 if (rows==0 && format==3) {
03771 for (i = 0; i < nCols ; i++ ) {
03772 rstrcat(outBuf, icss.stmtPtr[stmtNum]->resultColName[i],maxOutBuf);
03773 rstrcat(outBuf, " ", maxOutBuf);
03774 }
03775 if (i != nCols-1) {
03776
03777 rstrcat(outBuf, " ", maxOutBuf);
03778 }
03779
03780 }
03781 rows++;
03782 for (i = 0; i < nCols ; i++ ) {
03783 if (format==1 || format==3) {
03784 if (strlen(icss.stmtPtr[stmtNum]->resultValue[i])==0) {
03785 rstrcat(outBuf, "- ", maxOutBuf);
03786 }
03787 else {
03788 rstrcat(outBuf, icss.stmtPtr[stmtNum]->resultValue[i],
03789 maxOutBuf);
03790 rstrcat(outBuf, " ", maxOutBuf);
03791 }
03792 }
03793 if (format == 2) {
03794 rstrcat(outBuf, icss.stmtPtr[stmtNum]->resultColName[i],maxOutBuf);
03795 rstrcat(outBuf, ": ", maxOutBuf);
03796 rstrcat(outBuf, icss.stmtPtr[stmtNum]->resultValue[i], maxOutBuf);
03797 rstrcat(outBuf, "\n", maxOutBuf);
03798 }
03799 }
03800 rstrcat(outBuf, "\n", maxOutBuf);
03801 if (rowSize==0) rowSize=strlen(outBuf);
03802 if ((int) strlen(outBuf)+rowSize+20 > maxOutBuf) {
03803 return(0);
03804 }
03805 }
03806 }
03807
03808
03809
03810 int chlDelCollByAdmin(rsComm_t *rsComm, collInfo_t *collInfo) {
03811 rodsLong_t iVal;
03812 char logicalEndName[MAX_NAME_LEN];
03813 char logicalParentDirName[MAX_NAME_LEN];
03814 char collIdNum[MAX_NAME_LEN];
03815 int status;
03816
03817 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelCollByAdmin");
03818
03819 if (!icss.status) {
03820 return(CATALOG_NOT_CONNECTED);
03821 }
03822
03823 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03824 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03825 }
03826 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03827 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03828 }
03829
03830 if (collInfo==0) {
03831 return(CAT_INVALID_ARGUMENT);
03832 }
03833
03834 status = splitPathByKey(collInfo->collName,
03835 logicalParentDirName, logicalEndName, '/');
03836
03837 if (strlen(logicalParentDirName)==0) {
03838 strcpy(logicalParentDirName, "/");
03839 strcpy(logicalEndName, collInfo->collName+1);
03840 }
03841
03842
03843 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelCollByAdmin SQL 1 ");
03844 status = cmlGetIntegerValueFromSql(
03845 "select coll_id from R_COLL_MAIN where parent_coll_name=? union select coll_id from R_DATA_MAIN where coll_id=(select coll_id from R_COLL_MAIN where coll_name=?)",
03846 &iVal, collInfo->collName, collInfo->collName, 0, 0, 0, &icss);
03847
03848 if (status != CAT_NO_ROWS_FOUND) {
03849 if (status == 0) {
03850 char errMsg[105];
03851 snprintf(errMsg, 100, "collection '%s' is not empty",
03852 collInfo->collName);
03853 addRErrorMsg (&rsComm->rError, 0, errMsg);
03854 return(CAT_COLLECTION_NOT_EMPTY);
03855 }
03856 _rollback("chlDelCollByAdmin");
03857 return(status);
03858 }
03859
03860
03861 cllBindVars[cllBindVarCount++]=collInfo->collName;
03862 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelCollByAdmin SQL 2");
03863 status = cmlExecuteNoAnswerSql(
03864 "delete from R_OBJT_ACCESS where object_id=(select coll_id from R_COLL_MAIN where coll_name=?)",
03865 &icss);
03866 if (status != 0) {
03867
03868 rodsLog(LOG_NOTICE,
03869 "chlDelCollByAdmin delete access failure %d",
03870 status);
03871 _rollback("chlDelCollByAdmin");
03872 }
03873
03874
03875 snprintf(collIdNum, MAX_NAME_LEN, "%lld", iVal);
03876 removeMetaMapAndAVU(collIdNum);
03877
03878
03879 status = cmlAudit4(AU_DELETE_COLL_BY_ADMIN,
03880 "select coll_id from R_COLL_MAIN where coll_name=?",
03881 collInfo->collName,
03882 rsComm->clientUser.userName,
03883 rsComm->clientUser.rodsZone,
03884 collInfo->collName,
03885 &icss);
03886 if (status != 0) {
03887 rodsLog(LOG_NOTICE,
03888 "chlDelCollByAdmin cmlAudit4 failure %d",
03889 status);
03890 _rollback("chlDelCollByAdmin");
03891 return(status);
03892 }
03893
03894
03895
03896 cllBindVars[cllBindVarCount++]=collInfo->collName;
03897 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelCollByAdmin SQL 3");
03898 status = cmlExecuteNoAnswerSql("delete from R_COLL_MAIN where coll_name=?",
03899 &icss);
03900
03901 if (status != 0) {
03902 char errMsg[105];
03903 snprintf(errMsg, 100, "collection '%s' is unknown",
03904 collInfo->collName);
03905 addRErrorMsg (&rsComm->rError, 0, errMsg);
03906 _rollback("chlDelCollByAdmin");
03907 return(CAT_UNKNOWN_COLLECTION);
03908 }
03909
03910 return(0);
03911 }
03912
03913
03914
03915 int chlDelColl(rsComm_t *rsComm, collInfo_t *collInfo) {
03916
03917 int status;
03918
03919 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelColl");
03920
03921 status = _delColl(rsComm, collInfo);
03922 if (status != 0) return(status);
03923
03924 status = cmlExecuteNoAnswerSql("commit", &icss);
03925 if (status != 0) {
03926 rodsLog(LOG_NOTICE,
03927 "chlDelColl cmlExecuteNoAnswerSql commit failure %d",
03928 status);
03929 _rollback("chlDelColl");
03930 return(status);
03931 }
03932 return(0);
03933 }
03934
03935
03936
03937
03938 static int _delColl(rsComm_t *rsComm, collInfo_t *collInfo) {
03939 rodsLong_t iVal;
03940 char logicalEndName[MAX_NAME_LEN];
03941 char logicalParentDirName[MAX_NAME_LEN];
03942 char collIdNum[MAX_NAME_LEN];
03943 char parentCollIdNum[MAX_NAME_LEN];
03944 rodsLong_t status;
03945
03946 if (logSQL!=0) rodsLog(LOG_SQL, "_delColl");
03947
03948 if (!icss.status) {
03949 return(CATALOG_NOT_CONNECTED);
03950 }
03951
03952 status = splitPathByKey(collInfo->collName,
03953 logicalParentDirName, logicalEndName, '/');
03954
03955 if (strlen(logicalParentDirName)==0) {
03956 strcpy(logicalParentDirName, "/");
03957 strcpy(logicalEndName, collInfo->collName+1);
03958 }
03959
03960
03961
03962 if (logSQL!=0) rodsLog(LOG_SQL, "_delColl SQL 1 ");
03963 status = cmlCheckDir(logicalParentDirName,
03964 rsComm->clientUser.userName,
03965 rsComm->clientUser.rodsZone,
03966 ACCESS_MODIFY_OBJECT,
03967 &icss);
03968 if (status < 0) {
03969 char errMsg[105];
03970 if (status == CAT_UNKNOWN_COLLECTION) {
03971 snprintf(errMsg, 100, "collection '%s' is unknown",
03972 logicalParentDirName);
03973 addRErrorMsg (&rsComm->rError, 0, errMsg);
03974 return(status);
03975 }
03976 _rollback("_delColl");
03977 return(status);
03978 }
03979 snprintf(parentCollIdNum, MAX_NAME_LEN, "%lld", status);
03980
03981
03982
03983 if (logSQL!=0) rodsLog(LOG_SQL, "_delColl SQL 2");
03984 status = cmlCheckDir(collInfo->collName,
03985 rsComm->clientUser.userName,
03986 rsComm->clientUser.rodsZone,
03987 ACCESS_DELETE_OBJECT,
03988 &icss);
03989 if (status < 0) return(status);
03990 snprintf(collIdNum, MAX_NAME_LEN, "%lld", status);
03991
03992
03993 if (logSQL!=0) rodsLog(LOG_SQL, "_delColl SQL 3");
03994 status = cmlGetIntegerValueFromSql(
03995 "select coll_id from R_COLL_MAIN where parent_coll_name=? union select coll_id from R_DATA_MAIN where coll_id=(select coll_id from R_COLL_MAIN where coll_name=?)",
03996 &iVal, collInfo->collName, collInfo->collName, 0, 0, 0, &icss);
03997 if (status != CAT_NO_ROWS_FOUND) {
03998 return(CAT_COLLECTION_NOT_EMPTY);
03999 }
04000
04001
04002
04003
04004
04005 cllBindVars[cllBindVarCount++]=collInfo->collName;
04006 cllBindVars[cllBindVarCount++]=collIdNum;
04007 if (logSQL!=0) rodsLog(LOG_SQL, "_delColl SQL 4");
04008 status = cmlExecuteNoAnswerSql(
04009 "delete from R_COLL_MAIN where coll_name=? and coll_id=?",
04010 &icss);
04011 if (status != 0) {
04012 rodsLog(LOG_NOTICE,
04013 "_delColl cmlExecuteNoAnswerSql delete failure %d",
04014 status);
04015 _rollback("_delColl");
04016 return(status);
04017 }
04018
04019
04020 cllBindVars[cllBindVarCount++]=collIdNum;
04021 if (logSQL!=0) rodsLog(LOG_SQL, "_delColl SQL 5");
04022 status = cmlExecuteNoAnswerSql(
04023 "delete from R_OBJT_ACCESS where object_id=?",
04024 &icss);
04025 if (status != 0) {
04026 rodsLog(LOG_NOTICE,
04027 "_delColl cmlExecuteNoAnswerSql delete access failure %d",
04028 status);
04029 _rollback("_delColl");
04030 }
04031
04032
04033 removeMetaMapAndAVU(collIdNum);
04034
04035
04036 status = cmlAudit3(AU_DELETE_COLL,
04037 collIdNum,
04038 rsComm->clientUser.userName,
04039 rsComm->clientUser.rodsZone,
04040 collInfo->collName,
04041 &icss);
04042 if (status != 0) {
04043 rodsLog(LOG_NOTICE,
04044 "chlModColl cmlAudit3 failure %d",
04045 status);
04046 _rollback("_delColl");
04047 return(status);
04048 }
04049
04050 return(status);
04051 }
04052
04053
04054
04055
04056
04057
04058
04059
04060
04061
04062
04063
04064
04065 int chlCheckAuth(rsComm_t *rsComm, char *challenge, char *response,
04066 char *username,
04067 int *userPrivLevel, int *clientPrivLevel) {
04068
04069 int status;
04070 char md5Buf[CHALLENGE_LEN+MAX_PASSWORD_LEN+2];
04071 char digest[RESPONSE_LEN+2];
04072 MD5_CTX context;
04073 char *cp;
04074 int i, OK, k;
04075 char userType[MAX_NAME_LEN];
04076 static int prevFailure=0;
04077 char pwInfoArray[MAX_PASSWORD_LEN*MAX_PASSWORDS*3];
04078 char goodPw[MAX_PASSWORD_LEN+10];
04079 char goodPwExpiry[MAX_PASSWORD_LEN+10];
04080 char goodPwTs[MAX_PASSWORD_LEN+10];
04081 rodsLong_t expireTime;
04082 char *cpw;
04083 int nPasswords;
04084 char myTime[50];
04085 time_t nowTime;
04086 time_t pwExpireMaxCreateTime;
04087 char expireStr[50];
04088 char expireStrCreate[50];
04089 char myUserZone[MAX_NAME_LEN];
04090 char userName2[NAME_LEN+2];
04091 char userZone[NAME_LEN+2];
04092 #if defined(OS_AUTH)
04093 int doOsAuthentication = 0;
04094 char *os_auth_flag;
04095 #endif
04096
04097 if (logSQL!=0) rodsLog(LOG_SQL, "chlCheckAuth");
04098
04099 if (prevFailure > 1) {
04100
04101 if (prevFailure > 5) sleep(20);
04102 sleep(2);
04103 }
04104 *userPrivLevel = NO_USER_AUTH;
04105 *clientPrivLevel = NO_USER_AUTH;
04106
04107 memset(md5Buf, 0, sizeof(md5Buf));
04108 strncpy(md5Buf, challenge, CHALLENGE_LEN);
04109 snprintf(prevChalSig,sizeof prevChalSig,
04110 "%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x",
04111 (unsigned char)md5Buf[0], (unsigned char)md5Buf[1],
04112 (unsigned char)md5Buf[2], (unsigned char)md5Buf[3],
04113 (unsigned char)md5Buf[4], (unsigned char)md5Buf[5],
04114 (unsigned char)md5Buf[6], (unsigned char)md5Buf[7],
04115 (unsigned char)md5Buf[8], (unsigned char)md5Buf[9],
04116 (unsigned char)md5Buf[10],(unsigned char)md5Buf[11],
04117 (unsigned char)md5Buf[12],(unsigned char)md5Buf[13],
04118 (unsigned char)md5Buf[14],(unsigned char)md5Buf[15]);
04119 #if defined(OS_AUTH)
04120
04121
04122
04123
04124
04125 os_auth_flag = strstr(username, OS_AUTH_FLAG);
04126 if (os_auth_flag) {
04127 *os_auth_flag = 0;
04128 doOsAuthentication = 1;
04129 }
04130 #endif
04131
04132 status = parseUserName(username, userName2, userZone);
04133 if (userZone[0]=='\0') {
04134 status = getLocalZone();
04135 if (status != 0) return(status);
04136 strncpy(myUserZone, localZone, MAX_NAME_LEN);
04137 }
04138 else {
04139 strncpy(myUserZone, userZone, MAX_NAME_LEN);
04140 }
04141
04142 #if defined(OS_AUTH)
04143 if (doOsAuthentication) {
04144 if ((status = osauthVerifyResponse(challenge, userName2, response))) {
04145 return status;
04146 }
04147 goto checkLevel;
04148 }
04149 #endif
04150
04151 if (logSQL!=0) rodsLog(LOG_SQL, "chlCheckAuth SQL 1 ");
04152
04153 status = cmlGetMultiRowStringValuesFromSql(
04154 "select rcat_password, pass_expiry_ts, R_USER_PASSWORD.create_ts from R_USER_PASSWORD, R_USER_MAIN where user_name=? and zone_name=? and R_USER_MAIN.user_id = R_USER_PASSWORD.user_id",
04155 pwInfoArray, MAX_PASSWORD_LEN,
04156 MAX_PASSWORDS*3,
04157 userName2, myUserZone, &icss);
04158 if (status < 3) {
04159 if (status == CAT_NO_ROWS_FOUND) {
04160 status = CAT_INVALID_USER;
04161 if (strncmp(ANONYMOUS_USER, userName2, NAME_LEN)==0) {
04162
04163 goto checkLevel;
04164 }
04165 }
04166 return(status);
04167 }
04168
04169 nPasswords=status/3;
04170 goodPwExpiry[0]='\0';
04171 goodPwTs[0]='\0';
04172
04173 cpw=pwInfoArray;
04174 for (k=0;k<MAX_PASSWORDS && k<nPasswords;k++) {
04175 memset(md5Buf, 0, sizeof(md5Buf));
04176 strncpy(md5Buf, challenge, CHALLENGE_LEN);
04177 icatDescramble(cpw);
04178 strncpy(md5Buf+CHALLENGE_LEN, cpw, MAX_PASSWORD_LEN);
04179
04180 MD5Init (&context);
04181 MD5Update (&context, (unsigned char *) md5Buf, CHALLENGE_LEN+MAX_PASSWORD_LEN);
04182 MD5Final ((unsigned char *) digest, &context);
04183
04184 for (i=0;i<RESPONSE_LEN;i++) {
04185 if (digest[i]=='\0') digest[i]++;
04186
04187 }
04188
04189 cp = response;
04190 OK=1;
04191 for (i=0;i<RESPONSE_LEN;i++) {
04192 if (*cp++ != digest[i]) OK=0;
04193 }
04194
04195 memset(md5Buf, 0, sizeof(md5Buf));
04196 if (OK==1) {
04197 rstrcpy(goodPw, cpw, MAX_PASSWORD_LEN);
04198 cpw+=MAX_PASSWORD_LEN;
04199 rstrcpy(goodPwExpiry, cpw, MAX_PASSWORD_LEN);
04200 cpw+=MAX_PASSWORD_LEN;
04201 rstrcpy(goodPwTs, cpw, MAX_PASSWORD_LEN);
04202 break;
04203 }
04204 cpw+=MAX_PASSWORD_LEN*3;
04205 }
04206 memset(pwInfoArray, 0, sizeof(pwInfoArray));
04207
04208 if (OK==0) {
04209 prevFailure++;
04210 return(CAT_INVALID_AUTHENTICATION);
04211 }
04212
04213 expireTime=atoll(goodPwExpiry);
04214 getNowStr(myTime);
04215 nowTime=atoll(myTime);
04216 if (expireTime < 1000) {
04217
04218
04219
04220 time_t createTime;
04221 int returnExpired;
04222
04223
04224
04225 returnExpired=0;
04226 getNowStr(myTime);
04227 nowTime=atoll(myTime);
04228 createTime=atoll(goodPwTs);
04229 if (createTime==0 || nowTime==0 ) returnExpired=1;
04230 if (createTime+expireTime < nowTime) returnExpired=1;
04231
04232
04233
04234
04235 cllBindVars[cllBindVarCount++]=goodPw;
04236 if (logSQL!=0) rodsLog(LOG_SQL, "chlCheckAuth SQL 2");
04237 status = cmlExecuteNoAnswerSql(
04238 "delete from R_USER_PASSWORD where rcat_password=?",
04239 &icss);
04240 if (status !=0) {
04241 rodsLog(LOG_NOTICE,
04242 "chlCheckAuth cmlExecuteNoAnswerSql delete failure %d",
04243 status);
04244 _rollback("chlCheckAuth");
04245 return(status);
04246 }
04247
04248
04249
04250 if (logSQL!=0) rodsLog(LOG_SQL, "chlCheckAuth SQL 3");
04251 snprintf(expireStr, sizeof expireStr, "%d", TEMP_PASSWORD_TIME);
04252 cllBindVars[cllBindVarCount++]=expireStr;
04253
04254 pwExpireMaxCreateTime = nowTime-TEMP_PASSWORD_TIME;
04255
04256 snprintf(expireStrCreate, sizeof expireStrCreate, "%011d",
04257 (int)pwExpireMaxCreateTime);
04258 cllBindVars[cllBindVarCount++]=expireStrCreate;
04259
04260 status = cmlExecuteNoAnswerSql(
04261 "delete from R_USER_PASSWORD where pass_expiry_ts = ? and create_ts < ?",
04262 &icss);
04263 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
04264 rodsLog(LOG_NOTICE,
04265 "chlCheckAuth cmlExecuteNoAnswerSql delete2 failure %d",
04266 status);
04267 _rollback("chlCheckAuth");
04268 return(status);
04269 }
04270
04271 memset(goodPw, 0, MAX_PASSWORD_LEN);
04272 if (returnExpired) return(CAT_PASSWORD_EXPIRED);
04273
04274 if (logSQL!=0) rodsLog(LOG_SQL, "chlCheckAuth SQL 4");
04275 status = cmlExecuteNoAnswerSql("commit", &icss);
04276 if (status != 0) {
04277 rodsLog(LOG_NOTICE,
04278 "chlCheckAuth cmlExecuteNoAnswerSql commit failure %d",
04279 status);
04280 return(status);
04281 }
04282 memset(goodPw, 0, MAX_PASSWORD_LEN);
04283 if (returnExpired) return(CAT_PASSWORD_EXPIRED);
04284 }
04285
04286
04287 checkLevel:
04288
04289 if (logSQL!=0) rodsLog(LOG_SQL, "chlCheckAuth SQL 5");
04290 status = cmlGetStringValueFromSql(
04291 "select user_type_name from R_USER_MAIN where user_name=? and zone_name=?",
04292 userType, MAX_NAME_LEN, userName2, myUserZone, 0, &icss);
04293 if (status !=0) {
04294 if (status == CAT_NO_ROWS_FOUND) {
04295 status = CAT_INVALID_USER;
04296 }
04297 else {
04298 _rollback("chlCheckAuth");
04299 }
04300 return(status);
04301 }
04302 *userPrivLevel = LOCAL_USER_AUTH;
04303 if (strcmp(userType, "rodsadmin") == 0) {
04304 *userPrivLevel = LOCAL_PRIV_USER_AUTH;
04305
04306
04307 if (strcmp( rsComm->clientUser.userName, userName2)==0 &&
04308 strcmp( rsComm->clientUser.rodsZone, userZone)==0) {
04309 *clientPrivLevel = LOCAL_PRIV_USER_AUTH;
04310 }
04311 else {
04312 if (rsComm->clientUser.userName[0]=='\0') {
04313
04314
04315
04316
04317
04318
04319
04320
04321
04322
04323
04324
04325 *clientPrivLevel = REMOTE_USER_AUTH;
04326 prevFailure=0;
04327 return(0);
04328 }
04329 else {
04330 if (logSQL!=0) rodsLog(LOG_SQL, "chlCheckAuth SQL 6");
04331 status = cmlGetStringValueFromSql(
04332 "select user_type_name from R_USER_MAIN where user_name=? and zone_name=?",
04333 userType, MAX_NAME_LEN, rsComm->clientUser.userName,
04334 rsComm->clientUser.rodsZone, 0, &icss);
04335 if (status !=0) {
04336 if (status == CAT_NO_ROWS_FOUND) {
04337 status = CAT_INVALID_CLIENT_USER;
04338 }
04339 else {
04340 _rollback("chlCheckAuth");
04341 }
04342 return(status);
04343 }
04344 *clientPrivLevel = LOCAL_USER_AUTH;
04345 if (strcmp(userType, "rodsadmin") == 0) {
04346 *clientPrivLevel = LOCAL_PRIV_USER_AUTH;
04347 }
04348 }
04349 }
04350 }
04351
04352 prevFailure=0;
04353 return(0);
04354 }
04355
04356
04357
04358
04359
04360
04361
04362
04363
04364 int chlMakeTempPw(rsComm_t *rsComm, char *pwValueToHash) {
04365 int status;
04366 char md5Buf[100];
04367 unsigned char digest[RESPONSE_LEN+2];
04368 MD5_CTX context;
04369 int i;
04370 char password[MAX_PASSWORD_LEN+10];
04371 char newPw[MAX_PASSWORD_LEN+10];
04372 char myTime[50];
04373 char myTimeExp[50];
04374 char rBuf[200];
04375 char hashValue[50];
04376 int j=0;
04377 char tSQL[MAX_SQL_SIZE];
04378
04379 if (logSQL!=0) rodsLog(LOG_SQL, "chlMakeTempPw");
04380
04381 if (logSQL!=0) rodsLog(LOG_SQL, "chlMakeTempPw SQL 1 ");
04382
04383 snprintf(tSQL, MAX_SQL_SIZE,
04384 "select rcat_password from R_USER_PASSWORD, R_USER_MAIN where user_name=? and R_USER_MAIN.zone_name=? and R_USER_MAIN.user_id = R_USER_PASSWORD.user_id and pass_expiry_ts != '%d'",
04385 TEMP_PASSWORD_TIME);
04386
04387 status = cmlGetStringValueFromSql(tSQL,
04388 password, MAX_PASSWORD_LEN,
04389 rsComm->clientUser.userName,
04390 rsComm->clientUser.rodsZone, 0, &icss);
04391 if (status !=0) {
04392 if (status == CAT_NO_ROWS_FOUND) {
04393 status = CAT_INVALID_USER;
04394 }
04395 else {
04396 _rollback("chlMakeTempPw");
04397 }
04398 return(status);
04399 }
04400
04401 icatDescramble(password);
04402
04403 j=0;
04404 get64RandomBytes(rBuf);
04405 for (i=0;i<50 && j<MAX_PASSWORD_LEN-1;i++) {
04406 char c;
04407 c = rBuf[i] &0x7f;
04408 if (c < '0') c+='0';
04409 if ( (c > 'a' && c < 'z') || (c > 'A' && c < 'Z') ||
04410 (c > '0' && c < '9') ){
04411 hashValue[j++]=c;
04412 }
04413 }
04414 hashValue[j]='\0';
04415
04416
04417
04418
04419 memset(md5Buf, 0, sizeof(md5Buf));
04420 strncpy(md5Buf, hashValue, 100);
04421 strncat(md5Buf, password, 100);
04422
04423 MD5Init (&context);
04424 MD5Update (&context, (unsigned char *) md5Buf, 100);
04425 MD5Final ((unsigned char *) digest, &context);
04426
04427 md5ToStr(digest, newPw);
04428
04429
04430 rstrcpy(pwValueToHash, hashValue, MAX_PASSWORD_LEN);
04431
04432
04433
04434
04435 getNowStr(myTime);
04436 sprintf(myTimeExp, "%d", TEMP_PASSWORD_TIME);
04437
04438 cllBindVars[cllBindVarCount++]=rsComm->clientUser.userName;
04439 cllBindVars[cllBindVarCount++]=rsComm->clientUser.rodsZone,
04440 cllBindVars[cllBindVarCount++]=newPw;
04441 cllBindVars[cllBindVarCount++]=myTimeExp;
04442 cllBindVars[cllBindVarCount++]=myTime;
04443 cllBindVars[cllBindVarCount++]=myTime;
04444 if (logSQL!=0) rodsLog(LOG_SQL, "chlMakeTempPw SQL 2");
04445 status = cmlExecuteNoAnswerSql(
04446 "insert into R_USER_PASSWORD (user_id, rcat_password, pass_expiry_ts, create_ts, modify_ts) values ((select user_id from R_USER_MAIN where user_name=? and zone_name=?), ?, ?, ?, ?)",
04447 &icss);
04448 if (status !=0) {
04449 rodsLog(LOG_NOTICE,
04450 "chlMakeTempPw cmlExecuteNoAnswerSql insert failure %d",
04451 status);
04452 _rollback("chlMakeTempPw");
04453 return(status);
04454 }
04455
04456 status = cmlExecuteNoAnswerSql("commit", &icss);
04457 if (status != 0) {
04458 rodsLog(LOG_NOTICE,
04459 "chlMakeTempPw cmlExecuteNoAnswerSql commit failure %d",
04460 status);
04461 return(status);
04462 }
04463
04464 memset(newPw, 0, MAX_PASSWORD_LEN);
04465 return(0);
04466 }
04467
04468
04469
04470
04471
04472
04473 int decodePw(rsComm_t *rsComm, char *in, char *out) {
04474 int status;
04475 char *cp;
04476 char password[MAX_PASSWORD_LEN];
04477 char upassword[MAX_PASSWORD_LEN+10];
04478 char rand[]=
04479 "1gCBizHWbwIYyWLo";
04480 int pwLen1, pwLen2;
04481
04482 if (logSQL!=0) rodsLog(LOG_SQL, "decodePw - SQL 1 ");
04483 status = cmlGetStringValueFromSql(
04484 "select rcat_password from R_USER_PASSWORD, R_USER_MAIN where user_name=? and R_USER_MAIN.zone_name=? and R_USER_MAIN.user_id = R_USER_PASSWORD.user_id",
04485 password, MAX_PASSWORD_LEN,
04486 rsComm->clientUser.userName,
04487 rsComm->clientUser.rodsZone,
04488 0, &icss);
04489 if (status !=0) {
04490 if (status == CAT_NO_ROWS_FOUND) {
04491 status = CAT_INVALID_USER;
04492 }
04493 else {
04494 _rollback("decodePw");
04495 }
04496 return(status);
04497 }
04498
04499 icatDescramble(password);
04500
04501 obfDecodeByKeyV2(in, password, prevChalSig, upassword);
04502
04503 pwLen1=strlen(upassword);
04504
04505 memset(password, 0, MAX_PASSWORD_LEN);
04506
04507 cp = strstr(upassword, rand);
04508 if (cp !=NULL) *cp='\0';
04509
04510 pwLen2 = strlen(upassword);
04511
04512 if (pwLen2 > MAX_PASSWORD_LEN-5 && pwLen2==pwLen1) {
04513
04514 char errMsg[160];
04515 snprintf(errMsg, 150,
04516 "Error with password encoding.\nPlease try connecting directly to the ICAT host (setenv irodsHost)");
04517 addRErrorMsg (&rsComm->rError, 0, errMsg);
04518 return(CAT_PASSWORD_ENCODING_ERROR);
04519 }
04520 strcpy(out, upassword);
04521 memset(upassword, 0, MAX_PASSWORD_LEN);
04522
04523 return(0);
04524 }
04525
04526
04527
04528
04529
04530 int chlModUser(rsComm_t *rsComm, char *userName, char *option,
04531 char *newValue) {
04532 int status;
04533 int opType;
04534 char decoded[MAX_PASSWORD_LEN+20];
04535 char tSQL[MAX_SQL_SIZE];
04536 char form1[]="update R_USER_MAIN set %s=?, modify_ts=? where user_name=? and zone_name=?";
04537 char form2[]="update R_USER_MAIN set %s=%s, modify_ts=? where user_name=? and zone_name=?";
04538 char form3[]="update R_USER_PASSWORD set rcat_password=?, modify_ts=? where user_id=?";
04539 char form4[]="insert into R_USER_PASSWORD (user_id, rcat_password, pass_expiry_ts, create_ts, modify_ts) values ((select user_id from R_USER_MAIN where user_name=? and zone_name=?), ?, ?, ?, ?)";
04540 char form5[]="insert into R_USER_AUTH (user_id, user_auth_name, create_ts) values ((select user_id from R_USER_MAIN where user_name=? and zone_name=?), ?, ?)";
04541 char form6[]="delete from R_USER_AUTH where user_id = (select user_id from R_USER_MAIN where user_name=? and zone_name=?) and user_auth_name = ?";
04542 char myTime[50];
04543 rodsLong_t iVal;
04544
04545 int auditId;
04546 char auditComment[110];
04547 char auditUserName[110];
04548 int userSettingOwnPassword;
04549 int groupAdminSettingPassword;
04550
04551 char userName2[NAME_LEN];
04552 char zoneName[NAME_LEN];
04553
04554 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser");
04555
04556 if (userName == NULL || option == NULL || newValue==NULL) {
04557 return (CAT_INVALID_ARGUMENT);
04558 }
04559
04560 if (*userName == '\0' || *option == '\0' || newValue=='\0') {
04561 return (CAT_INVALID_ARGUMENT);
04562 }
04563
04564 userSettingOwnPassword=0;
04565
04566
04567 groupAdminSettingPassword=0;
04568 if (rsComm->clientUser.authInfo.authFlag >= LOCAL_PRIV_USER_AUTH &&
04569 rsComm->proxyUser.authInfo.authFlag >= LOCAL_PRIV_USER_AUTH) {
04570
04571 }
04572 else {
04573
04574 if ( strcmp(option,"password")!=0) {
04575
04576 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
04577 }
04578 if ( strcmp(userName, rsComm->clientUser.userName)==0) {
04579 userSettingOwnPassword=1;
04580 }
04581 else {
04582 int status2;
04583 status2 = cmlCheckGroupAdminAccess(
04584 rsComm->clientUser.userName,
04585 rsComm->clientUser.rodsZone,
04586 "", &icss);
04587 if (status2 != 0) return(status2);
04588 groupAdminSettingPassword=1;
04589 }
04590
04591 if (userSettingOwnPassword==0 && groupAdminSettingPassword==0) {
04592 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
04593 }
04594 }
04595
04596 status = getLocalZone();
04597 if (status != 0) return(status);
04598
04599 tSQL[0]='\0';
04600 opType=0;
04601
04602 getNowStr(myTime);
04603
04604 auditComment[0]='\0';
04605 strncpy(auditUserName,userName,100);
04606
04607 status = parseUserName(userName, userName2, zoneName);
04608 if (zoneName[0]=='\0') {
04609 rstrcpy(zoneName, localZone, NAME_LEN);
04610 }
04611 if (status != 0) {
04612 return (CAT_INVALID_ARGUMENT);
04613 }
04614
04615 #if 0
04616
04617
04618 if (strcmp(option,"name" )==0 ||
04619 strcmp(option,"user_name" )==0) {
04620 snprintf(tSQL, MAX_SQL_SIZE, form1,
04621 "user_name");
04622 cllBindVars[cllBindVarCount++]=newValue;
04623 cllBindVars[cllBindVarCount++]=myTime;
04624 cllBindVars[cllBindVarCount++]=userName2;
04625 cllBindVars[cllBindVarCount++]=zoneName;
04626 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUserSQLxx1x");
04627 auditId = AU_MOD_USER_NAME;
04628 strncpy(auditComment, userName, 100);
04629 strncpy(auditUserName,newValue,100);
04630 }
04631 #endif
04632 if (strcmp(option,"type")==0 ||
04633 strcmp(option,"user_type_name")==0) {
04634 char tsubSQL[MAX_SQL_SIZE];
04635 snprintf(tsubSQL, MAX_SQL_SIZE, "(select token_name from R_TOKN_MAIN where token_namespace='user_type' and token_name=?)");
04636 cllBindVars[cllBindVarCount++]=newValue;
04637 snprintf(tSQL, MAX_SQL_SIZE, form2,
04638 "user_type_name", tsubSQL);
04639 cllBindVars[cllBindVarCount++]=myTime;
04640 cllBindVars[cllBindVarCount++]=userName2;
04641 cllBindVars[cllBindVarCount++]=zoneName;
04642 opType=1;
04643 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 2");
04644 auditId = AU_MOD_USER_TYPE;
04645 strncpy(auditComment, newValue, 100);
04646 }
04647 if (strcmp(option,"zone")==0 ||
04648 strcmp(option,"zone_name")==0) {
04649 snprintf(tSQL, MAX_SQL_SIZE, form1, "zone_name");
04650 cllBindVars[cllBindVarCount++]=newValue;
04651 cllBindVars[cllBindVarCount++]=myTime;
04652 cllBindVars[cllBindVarCount++]=userName2;
04653 cllBindVars[cllBindVarCount++]=zoneName;
04654 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 3");
04655 auditId = AU_MOD_USER_ZONE;
04656 strncpy(auditComment, newValue, 100);
04657 strncpy(auditUserName,userName,100);
04658 }
04659 if (strcmp(option,"addAuth")==0) {
04660 opType=4;
04661 rstrcpy(tSQL, form5, MAX_SQL_SIZE);
04662 cllBindVars[cllBindVarCount++]=userName2;
04663 cllBindVars[cllBindVarCount++]=zoneName;
04664 cllBindVars[cllBindVarCount++]=newValue;
04665 cllBindVars[cllBindVarCount++]=myTime;
04666 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 4");
04667 auditId = AU_ADD_USER_AUTH_NAME;
04668 strncpy(auditComment, newValue, 100);
04669 }
04670 if (strcmp(option,"rmAuth")==0) {
04671 rstrcpy(tSQL, form6, MAX_SQL_SIZE);
04672 cllBindVars[cllBindVarCount++]=userName2;
04673 cllBindVars[cllBindVarCount++]=zoneName;
04674 cllBindVars[cllBindVarCount++]=newValue;
04675 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 5");
04676 auditId = AU_DELETE_USER_AUTH_NAME;
04677 strncpy(auditComment, newValue, 100);
04678
04679 }
04680
04681 if (strcmp(option,"info")==0 ||
04682 strcmp(option,"user_info")==0) {
04683 snprintf(tSQL, MAX_SQL_SIZE, form1,
04684 "user_info");
04685 cllBindVars[cllBindVarCount++]=newValue;
04686 cllBindVars[cllBindVarCount++]=myTime;
04687 cllBindVars[cllBindVarCount++]=userName2;
04688 cllBindVars[cllBindVarCount++]=zoneName;
04689 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 6");
04690 auditId = AU_MOD_USER_INFO;
04691 strncpy(auditComment, newValue, 100);
04692 }
04693 if (strcmp(option,"comment")==0 ||
04694 strcmp(option,"r_comment")==0) {
04695 snprintf(tSQL, MAX_SQL_SIZE, form1,
04696 "r_comment");
04697 cllBindVars[cllBindVarCount++]=newValue;
04698 cllBindVars[cllBindVarCount++]=myTime;
04699 cllBindVars[cllBindVarCount++]=userName2;
04700 cllBindVars[cllBindVarCount++]=zoneName;
04701 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 7");
04702 auditId = AU_MOD_USER_COMMENT;
04703 strncpy(auditComment, newValue, 100);
04704 }
04705 if (strcmp(option,"password")==0) {
04706 int i;
04707 char userIdStr[MAX_NAME_LEN];
04708 i = decodePw(rsComm, newValue, decoded);
04709
04710 icatScramble(decoded);
04711
04712 if (i) return(i);
04713 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 8");
04714 i = cmlGetStringValueFromSql(
04715 "select R_USER_PASSWORD.user_id from R_USER_PASSWORD, R_USER_MAIN where R_USER_MAIN.user_name=? and R_USER_MAIN.zone_name=? and R_USER_MAIN.user_id = R_USER_PASSWORD.user_id",
04716 userIdStr, MAX_NAME_LEN, userName2, zoneName, 0, &icss);
04717 if (i != 0 && i !=CAT_NO_ROWS_FOUND) return(i);
04718 if (i == 0) {
04719 if (groupAdminSettingPassword == 1) {
04720
04721 return( CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
04722 }
04723 rstrcpy(tSQL, form3, MAX_SQL_SIZE);
04724 cllBindVars[cllBindVarCount++]=decoded;
04725 cllBindVars[cllBindVarCount++]=myTime;
04726 cllBindVars[cllBindVarCount++]=userIdStr;
04727 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 9");
04728 }
04729 else {
04730 opType=4;
04731 rstrcpy(tSQL, form4, MAX_SQL_SIZE);
04732 cllBindVars[cllBindVarCount++]=userName2;
04733 cllBindVars[cllBindVarCount++]=zoneName;
04734 cllBindVars[cllBindVarCount++]=decoded;
04735 cllBindVars[cllBindVarCount++]="9999-12-31-23.59.01";
04736 cllBindVars[cllBindVarCount++]=myTime;
04737 cllBindVars[cllBindVarCount++]=myTime;
04738 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 10");
04739 }
04740 auditId = AU_MOD_USER_PASSWORD;
04741 }
04742
04743 if (tSQL[0]=='\0') {
04744 return (CAT_INVALID_ARGUMENT);
04745 }
04746
04747 status = cmlExecuteNoAnswerSql(tSQL, &icss);
04748 memset(decoded, 0, MAX_PASSWORD_LEN);
04749
04750 if (status != 0 ) {
04751 if (opType==1) {
04752 int status2;
04753 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 11");
04754 status2 = cmlGetIntegerValueFromSql(
04755 "select token_name from R_TOKN_MAIN where token_namespace='user_type' and token_name=?",
04756 &iVal, newValue, 0, 0, 0, 0, &icss);
04757 if (status2 != 0) {
04758 char errMsg[105];
04759 snprintf(errMsg, 100, "user_type '%s' is not valid",
04760 newValue);
04761 addRErrorMsg (&rsComm->rError, 0, errMsg);
04762
04763 rodsLog(LOG_NOTICE,
04764 "chlModUser invalid user_type");
04765 return(CAT_INVALID_USER_TYPE);
04766 }
04767 }
04768 if (opType==4) {
04769
04770 int status2;
04771 _rollback("chlModUser");
04772 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 12");
04773 status2 = cmlGetIntegerValueFromSql(
04774 "select user_id from R_USER_MAIN where user_name=? and zone_name=?",
04775 &iVal, userName2, zoneName, 0, 0, 0, &icss);
04776 if (status2 != 0) {
04777 rodsLog(LOG_NOTICE,
04778 "chlModUser invalid user %s zone %s", userName2, zoneName);
04779 return(CAT_INVALID_USER);
04780 }
04781 }
04782 rodsLog(LOG_NOTICE,
04783 "chlModUser cmlExecuteNoAnswerSql failure %d",
04784 status);
04785 return(status);
04786 }
04787
04788 status = cmlAudit1(auditId, rsComm->clientUser.userName,
04789 localZone, auditUserName, auditComment, &icss);
04790 if (status != 0) {
04791 rodsLog(LOG_NOTICE,
04792 "chlModUser cmlAudit1 failure %d",
04793 status);
04794 _rollback("chlModUser");
04795 return(status);
04796 }
04797
04798 status = cmlExecuteNoAnswerSql("commit", &icss);
04799 if (status != 0) {
04800 rodsLog(LOG_NOTICE,
04801 "chlModUser cmlExecuteNoAnswerSql commit failure %d",
04802 status);
04803 return(status);
04804 }
04805 return(0);
04806 }
04807
04808
04809
04810
04811 int chlModGroup(rsComm_t *rsComm, char *groupName, char *option,
04812 char *userName, char *userZone) {
04813 int status, OK;
04814 char myTime[50];
04815 char userId[MAX_NAME_LEN];
04816 char groupId[MAX_NAME_LEN];
04817 char commentStr[100];
04818 char zoneToUse[MAX_NAME_LEN];
04819
04820 char userName2[NAME_LEN];
04821 char zoneName[NAME_LEN];
04822
04823
04824 if (logSQL!=0) rodsLog(LOG_SQL, "chlModGroup");
04825
04826 if (groupName == NULL || option == NULL || userName==NULL) {
04827 return (CAT_INVALID_ARGUMENT);
04828 }
04829
04830 if (*groupName == '\0' || *option == '\0' || userName=='\0') {
04831 return (CAT_INVALID_ARGUMENT);
04832 }
04833
04834 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH ||
04835 rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
04836 int status2;
04837 status2 = cmlCheckGroupAdminAccess(
04838 rsComm->clientUser.userName,
04839 rsComm->clientUser.rodsZone, groupName, &icss);
04840 if (status2 != 0) return(status2);
04841 }
04842
04843 status = getLocalZone();
04844 if (status != 0) return(status);
04845
04846 strncpy(zoneToUse, localZone, MAX_NAME_LEN);
04847 if (userZone != NULL && *userZone != '\0') {
04848 strncpy(zoneToUse, userZone, MAX_NAME_LEN);
04849 }
04850
04851 status = parseUserName(userName, userName2, zoneName);
04852 if (zoneName[0]!='\0') {
04853 rstrcpy(zoneToUse, zoneName, NAME_LEN);
04854 }
04855
04856 userId[0]='\0';
04857 if (logSQL!=0) rodsLog(LOG_SQL, "chlModGroup SQL 1 ");
04858 status = cmlGetStringValueFromSql(
04859 "select user_id from R_USER_MAIN where user_name=? and R_USER_MAIN.zone_name=? and user_type_name !='rodsgroup'",
04860 userId, MAX_NAME_LEN, userName2, zoneToUse, 0, &icss);
04861 if (status != 0) {
04862 if (status==CAT_NO_ROWS_FOUND) {
04863 return(CAT_INVALID_USER);
04864 }
04865 _rollback("chlModGroup");
04866 return(status);
04867 }
04868
04869 groupId[0]='\0';
04870 if (logSQL!=0) rodsLog(LOG_SQL, "chlModGroup SQL 2");
04871 status = cmlGetStringValueFromSql(
04872 "select user_id from R_USER_MAIN where user_name=? and R_USER_MAIN.zone_name=? and user_type_name='rodsgroup'",
04873 groupId, MAX_NAME_LEN, groupName, localZone, 0, &icss);
04874 if (status != 0) {
04875 if (status==CAT_NO_ROWS_FOUND) {
04876 return(CAT_INVALID_GROUP);
04877 }
04878 _rollback("chlModGroup");
04879 return(status);
04880 }
04881 OK=0;
04882 if (strcmp(option, "remove")==0) {
04883 if (logSQL!=0) rodsLog(LOG_SQL, "chlModGroup SQL 3");
04884 cllBindVars[cllBindVarCount++]=groupId;
04885 cllBindVars[cllBindVarCount++]=userId;
04886 status = cmlExecuteNoAnswerSql(
04887 "delete from R_USER_GROUP where group_user_id = ? and user_id = ?",
04888 &icss);
04889 if (status != 0) {
04890 rodsLog(LOG_NOTICE,
04891 "chlModGroup cmlExecuteNoAnswerSql delete failure %d",
04892 status);
04893 _rollback("chlModGroup");
04894 return(status);
04895 }
04896 OK=1;
04897 }
04898
04899 if (strcmp(option, "add")==0) {
04900 getNowStr(myTime);
04901 cllBindVars[cllBindVarCount++]=groupId;
04902 cllBindVars[cllBindVarCount++]=userId;
04903 cllBindVars[cllBindVarCount++]=myTime;
04904 cllBindVars[cllBindVarCount++]=myTime;
04905 if (logSQL!=0) rodsLog(LOG_SQL, "chlModGroup SQL 4");
04906 status = cmlExecuteNoAnswerSql(
04907 "insert into R_USER_GROUP (group_user_id, user_id , create_ts, modify_ts) values (?, ?, ?, ?)",
04908 &icss);
04909 if (status != 0) {
04910 rodsLog(LOG_NOTICE,
04911 "chlModGroup cmlExecuteNoAnswerSql delete failure %d",
04912 status);
04913 _rollback("chlModGroup");
04914 return(status);
04915 }
04916 OK=1;
04917 }
04918
04919 if (OK==0) {
04920 return (CAT_INVALID_ARGUMENT);
04921 }
04922
04923
04924 snprintf(commentStr, sizeof commentStr, "%s %s", option, userId);
04925 status = cmlAudit3(AU_MOD_GROUP,
04926 groupId,
04927 rsComm->clientUser.userName,
04928 rsComm->clientUser.rodsZone,
04929 commentStr,
04930 &icss);
04931 if (status != 0) {
04932 rodsLog(LOG_NOTICE,
04933 "chlModGroup cmlAudit3 failure %d",
04934 status);
04935 _rollback("chlModGroup");
04936 return(status);
04937 }
04938
04939 status = cmlExecuteNoAnswerSql("commit", &icss);
04940 if (status != 0) {
04941 rodsLog(LOG_NOTICE,
04942 "chlModGroup cmlExecuteNoAnswerSql commit failure %d",
04943 status);
04944 return(status);
04945 }
04946 return(0);
04947 }
04948
04949
04950 int chlModResc(rsComm_t *rsComm, char *rescName, char *option,
04951 char *optionValue) {
04952
04953 int status, OK;
04954 char myTime[50];
04955 char rescId[MAX_NAME_LEN];
04956 char rescPath[MAX_NAME_LEN]="";
04957 char rescPathMsg[MAX_NAME_LEN+100];
04958 char commentStr[200];
04959 struct hostent *myHostEnt;
04960
04961 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc");
04962
04963 if (rescName == NULL || option==NULL || optionValue==NULL) {
04964 return (CAT_INVALID_ARGUMENT);
04965 }
04966
04967 if (*rescName == '\0' || *option == '\0' || *optionValue=='\0') {
04968 return (CAT_INVALID_ARGUMENT);
04969 }
04970
04971 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
04972 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
04973 }
04974 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
04975 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
04976 }
04977
04978
04979
04980 if (strncmp(rescName, BUNDLE_RESC, strlen(BUNDLE_RESC))==0) {
04981 char errMsg[155];
04982 snprintf(errMsg, 150,
04983 "%s is a built-in resource needed for bundle operations.",
04984 BUNDLE_RESC);
04985 addRErrorMsg (&rsComm->rError, 0, errMsg);
04986 return(CAT_PSEUDO_RESC_MODIFY_DISALLOWED);
04987 }
04988
04989 status = getLocalZone();
04990 if (status != 0) return(status);
04991
04992 rescId[0]='\0';
04993 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 1 ");
04994 status = cmlGetStringValueFromSql(
04995 "select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
04996 rescId, MAX_NAME_LEN, rescName, localZone, 0, &icss);
04997 if (status != 0) {
04998 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
04999 _rollback("chlModResc");
05000 return(status);
05001 }
05002
05003 getNowStr(myTime);
05004 OK=0;
05005 if (strcmp(option, "info")==0) {
05006 cllBindVars[cllBindVarCount++]=optionValue;
05007 cllBindVars[cllBindVarCount++]=myTime;
05008 cllBindVars[cllBindVarCount++]=rescId;
05009 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 2");
05010 status = cmlExecuteNoAnswerSql(
05011 "update R_RESC_MAIN set resc_info=?, modify_ts=? where resc_id=?",
05012 &icss);
05013 if (status != 0) {
05014 rodsLog(LOG_NOTICE,
05015 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05016 status);
05017 _rollback("chlModResc");
05018 return(status);
05019 }
05020 OK=1;
05021 }
05022 if (strcmp(option, "comment")==0) {
05023 cllBindVars[cllBindVarCount++]=optionValue;
05024 cllBindVars[cllBindVarCount++]=myTime;
05025 cllBindVars[cllBindVarCount++]=rescId;
05026 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 3");
05027 status = cmlExecuteNoAnswerSql(
05028 "update R_RESC_MAIN set r_comment = ?, modify_ts=? where resc_id=?",
05029 &icss);
05030 if (status != 0) {
05031 rodsLog(LOG_NOTICE,
05032 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05033 status);
05034 _rollback("chlModResc");
05035 return(status);
05036 }
05037 OK=1;
05038 }
05039 if (strcmp(option, "freespace")==0) {
05040 int inType=0;
05041 if (*optionValue=='+') {
05042 inType=1;
05043 optionValue++;
05044 }
05045 if (*optionValue=='-') {
05046 inType=2;
05047 optionValue++;
05048 }
05049 cllBindVars[cllBindVarCount++]=optionValue;
05050 cllBindVars[cllBindVarCount++]=myTime;
05051 cllBindVars[cllBindVarCount++]=myTime;
05052 cllBindVars[cllBindVarCount++]=rescId;
05053 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 4");
05054 if (inType==0) {
05055 status = cmlExecuteNoAnswerSql(
05056 "update R_RESC_MAIN set free_space = ?, free_space_ts = ?, modify_ts=? where resc_id=?",
05057 &icss);
05058 }
05059 if (inType==1) {
05060 #if ORA_ICAT
05061
05062 status = cmlExecuteNoAnswerSql(
05063 "update R_RESC_MAIN set free_space = cast(free_space as integer) + cast(? as integer), free_space_ts = ?, modify_ts=? where resc_id=?",
05064 &icss);
05065 #elif MY_ICAT
05066 status = cmlExecuteNoAnswerSql(
05067 "update R_RESC_MAIN set free_space = free_space + ?, free_space_ts = ?, modify_ts=? where resc_id=?",
05068 &icss);
05069 #else
05070 status = cmlExecuteNoAnswerSql(
05071 "update R_RESC_MAIN set free_space = cast(free_space as bigint) + cast(? as bigint), free_space_ts = ?, modify_ts=? where resc_id=?",
05072 &icss);
05073 #endif
05074 }
05075 if (inType==2) {
05076 #if ORA_ICAT
05077
05078 status = cmlExecuteNoAnswerSql(
05079 "update R_RESC_MAIN set free_space = cast(free_space as integer) - cast(? as integer), free_space_ts = ?, modify_ts=? where resc_id=?",
05080 &icss);
05081 #elif MY_ICAT
05082 status = cmlExecuteNoAnswerSql(
05083 "update R_RESC_MAIN set free_space = free_space - ?, free_space_ts = ?, modify_ts=? where resc_id=?",
05084 &icss);
05085 #else
05086 status = cmlExecuteNoAnswerSql(
05087 "update R_RESC_MAIN set free_space = cast(free_space as bigint) - cast(? as bigint), free_space_ts = ?, modify_ts=? where resc_id=?",
05088 &icss);
05089 #endif
05090 }
05091 if (status != 0) {
05092 rodsLog(LOG_NOTICE,
05093 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05094 status);
05095 _rollback("chlModResc");
05096 return(status);
05097 }
05098 OK=1;
05099 }
05100 if (strcmp(option, "host")==0) {
05101
05102
05103 myHostEnt = gethostbyname(optionValue);
05104 if (myHostEnt <= 0) {
05105 char errMsg[155];
05106 snprintf(errMsg, 150,
05107 "Warning, resource host address '%s' is not a valid DNS entry, gethostbyname failed.",
05108 optionValue);
05109 addRErrorMsg (&rsComm->rError, 0, errMsg);
05110 }
05111 if (strcmp(optionValue, "localhost") == 0) {
05112 addRErrorMsg (&rsComm->rError, 0,
05113 "Warning, resource host address 'localhost' will not work properly as it maps to the local host from each client.");
05114 }
05115
05116
05117 cllBindVars[cllBindVarCount++]=optionValue;
05118 cllBindVars[cllBindVarCount++]=myTime;
05119 cllBindVars[cllBindVarCount++]=rescId;
05120 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 5");
05121 status = cmlExecuteNoAnswerSql(
05122 "update R_RESC_MAIN set resc_net = ?, modify_ts=? where resc_id=?",
05123 &icss);
05124 if (status != 0) {
05125 rodsLog(LOG_NOTICE,
05126 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05127 status);
05128 _rollback("chlModResc");
05129 return(status);
05130 }
05131 OK=1;
05132 }
05133 if (strcmp(option, "type")==0) {
05134 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 6");
05135 status = cmlCheckNameToken("resc_type", optionValue, &icss);
05136 if (status !=0 ) {
05137 char errMsg[105];
05138 snprintf(errMsg, 100, "resource_type '%s' is not valid",
05139 optionValue);
05140 addRErrorMsg (&rsComm->rError, 0, errMsg);
05141 return(CAT_INVALID_RESOURCE_TYPE);
05142 }
05143
05144 cllBindVars[cllBindVarCount++]=optionValue;
05145 cllBindVars[cllBindVarCount++]=myTime;
05146 cllBindVars[cllBindVarCount++]=rescId;
05147 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 7");
05148 status = cmlExecuteNoAnswerSql(
05149 "update R_RESC_MAIN set resc_type_name = ?, modify_ts=? where resc_id=?",
05150 &icss);
05151 if (status != 0) {
05152 rodsLog(LOG_NOTICE,
05153 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05154 status);
05155 _rollback("chlModResc");
05156 return(status);
05157 }
05158 OK=1;
05159 }
05160
05161 if (strcmp(option, "class")==0) {
05162 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 8");
05163 status = cmlCheckNameToken("resc_class", optionValue, &icss);
05164 if (status !=0 ) {
05165 char errMsg[105];
05166 snprintf(errMsg, 100, "resource_class '%s' is not valid",
05167 optionValue);
05168 addRErrorMsg (&rsComm->rError, 0, errMsg);
05169 return(CAT_INVALID_RESOURCE_CLASS);
05170 }
05171
05172 cllBindVars[cllBindVarCount++]=optionValue;
05173 cllBindVars[cllBindVarCount++]=myTime;
05174 cllBindVars[cllBindVarCount++]=rescId;
05175 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 9");
05176 status = cmlExecuteNoAnswerSql(
05177 "update R_RESC_MAIN set resc_class_name = ?, modify_ts=? where resc_id=?",
05178 &icss);
05179 if (status != 0) {
05180 rodsLog(LOG_NOTICE,
05181 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05182 status);
05183 _rollback("chlModResc");
05184 return(status);
05185 }
05186 OK=1;
05187 }
05188
05189 if (strcmp(option, "path")==0) {
05190 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 10");
05191 status = cmlGetStringValueFromSql(
05192 "select resc_def_path from R_RESC_MAIN where resc_id=?",
05193 rescPath, MAX_NAME_LEN, rescId, 0, 0, &icss);
05194 if (status != 0) {
05195 rodsLog(LOG_NOTICE,
05196 "chlModResc cmlGetStringValueFromSql query failure %d",
05197 status);
05198 _rollback("chlModResc");
05199 return(status);
05200 }
05201
05202 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 11");
05203
05204 cllBindVars[cllBindVarCount++]=optionValue;
05205 cllBindVars[cllBindVarCount++]=myTime;
05206 cllBindVars[cllBindVarCount++]=rescId;
05207 status = cmlExecuteNoAnswerSql(
05208 "update R_RESC_MAIN set resc_def_path=?, modify_ts=? where resc_id=?",
05209 &icss);
05210 if (status != 0) {
05211 rodsLog(LOG_NOTICE,
05212 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05213 status);
05214 _rollback("chlModResc");
05215 return(status);
05216 }
05217 OK=1;
05218 }
05219
05220 if (strcmp(option, "status")==0) {
05221 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 12");
05222 cllBindVars[cllBindVarCount++]=optionValue;
05223 cllBindVars[cllBindVarCount++]=myTime;
05224 cllBindVars[cllBindVarCount++]=rescId;
05225 status = cmlExecuteNoAnswerSql(
05226 "update R_RESC_MAIN set resc_status=?, modify_ts=? where resc_id=?",
05227 &icss);
05228 if (status != 0) {
05229 rodsLog(LOG_NOTICE,
05230 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05231 status);
05232 _rollback("chlModResc");
05233 return(status);
05234 }
05235 OK=1;
05236 }
05237
05238 if (strcmp(option, "name")==0) {
05239 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 13");
05240 cllBindVars[cllBindVarCount++]=optionValue;
05241 cllBindVars[cllBindVarCount++]=myTime;
05242 cllBindVars[cllBindVarCount++]=rescId;
05243
05244 status = cmlExecuteNoAnswerSql(
05245 "update R_RESC_MAIN set resc_name=?, modify_ts=? where resc_id=?",
05246 &icss);
05247 if (status != 0) {
05248 rodsLog(LOG_NOTICE,
05249 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05250 status);
05251 _rollback("chlModResc");
05252 return(status);
05253 }
05254
05255 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 14");
05256 cllBindVars[cllBindVarCount++]=optionValue;
05257 cllBindVars[cllBindVarCount++]=rescName;
05258 status = cmlExecuteNoAnswerSql(
05259 "update R_DATA_MAIN set resc_name=? where resc_name=?",
05260 &icss);
05261 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
05262 if (status != 0) {
05263 rodsLog(LOG_NOTICE,
05264 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05265 status);
05266 _rollback("chlModResc");
05267 return(status);
05268 }
05269
05270 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 15");
05271 cllBindVars[cllBindVarCount++]=optionValue;
05272 cllBindVars[cllBindVarCount++]=rescName;
05273 status = cmlExecuteNoAnswerSql(
05274 "update R_SERVER_LOAD set resc_name=? where resc_name=?",
05275 &icss);
05276 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
05277 if (status != 0) {
05278 rodsLog(LOG_NOTICE,
05279 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05280 status);
05281 _rollback("chlModResc");
05282 return(status);
05283 }
05284
05285 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 16");
05286 cllBindVars[cllBindVarCount++]=optionValue;
05287 cllBindVars[cllBindVarCount++]=rescName;
05288 status = cmlExecuteNoAnswerSql(
05289 "update R_SERVER_LOAD_DIGEST set resc_name=? where resc_name=?",
05290 &icss);
05291 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
05292 if (status != 0) {
05293 rodsLog(LOG_NOTICE,
05294 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05295 status);
05296 _rollback("chlModResc");
05297 return(status);
05298 }
05299
05300 OK=1;
05301 }
05302
05303 if (strcmp(option, "context")==0) {
05304 cllBindVars[cllBindVarCount++]=optionValue;
05305 cllBindVars[cllBindVarCount++]=myTime;
05306 cllBindVars[cllBindVarCount++]=rescId;
05307 status = cmlExecuteNoAnswerSql(
05308 "update R_RESC_MAIN set resc_context=?, modify_ts=? where resc_id=?",
05309 &icss);
05310 if (status != 0) {
05311 rodsLog(LOG_NOTICE,
05312 "chlModResc cmlExecuteNoAnswerSql update failure for resc context %d",
05313 status);
05314 _rollback("chlModResc");
05315 return(status);
05316 }
05317 OK=1;
05318 }
05319
05320 if (OK==0) {
05321 return (CAT_INVALID_ARGUMENT);
05322 }
05323
05324
05325 snprintf(commentStr, sizeof commentStr, "%s %s", option, optionValue);
05326 status = cmlAudit3(AU_MOD_RESC,
05327 rescId,
05328 rsComm->clientUser.userName,
05329 rsComm->clientUser.rodsZone,
05330 commentStr,
05331 &icss);
05332 if (status != 0) {
05333 rodsLog(LOG_NOTICE,
05334 "chlModResc cmlAudit3 failure %d",
05335 status);
05336 _rollback("chlModResc");
05337 return(status);
05338 }
05339
05340 status = cmlExecuteNoAnswerSql("commit", &icss);
05341 if (status != 0) {
05342 rodsLog(LOG_NOTICE,
05343 "chlModResc cmlExecuteNoAnswerSql commit failure %d",
05344 status);
05345 return(status);
05346 }
05347
05348 if (rescPath[0]!='\0') {
05349
05350
05351 snprintf(rescPathMsg, sizeof(rescPathMsg), "Previous resource path: %s",
05352 rescPath);
05353 addRErrorMsg (&rsComm->rError, 0, rescPathMsg);
05354 }
05355
05356 return(0);
05357 }
05358
05359
05360 int chlModRescDataPaths(rsComm_t *rsComm, char *rescName, char *oldPath,
05361 char *newPath, char *userName) {
05362 char rescId[MAX_NAME_LEN];
05363 int status, len, rows;
05364 char *cptr;
05365
05366 char userZone[NAME_LEN];
05367 char zoneToUse[NAME_LEN];
05368 char userName2[NAME_LEN];
05369
05370 char oldPath2[MAX_NAME_LEN];
05371
05372 if (logSQL!=0) rodsLog(LOG_SQL, "chlModRescDataPaths");
05373
05374 if (rescName == NULL || oldPath==NULL || newPath==NULL) {
05375 return (CAT_INVALID_ARGUMENT);
05376 }
05377
05378 if (*rescName == '\0' || *oldPath == '\0' || *newPath=='\0') {
05379 return (CAT_INVALID_ARGUMENT);
05380 }
05381
05382
05383 if (*oldPath != '/' or *newPath != '/') {
05384 return (CAT_INVALID_ARGUMENT);
05385 }
05386 len = strlen(oldPath);
05387 cptr = oldPath+len-1;
05388 if (*cptr != '/') return (CAT_INVALID_ARGUMENT);
05389 len = strlen(newPath);
05390 cptr = newPath+len-1;
05391 if (*cptr != '/') return (CAT_INVALID_ARGUMENT);
05392
05393 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
05394 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
05395 }
05396 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
05397 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
05398 }
05399
05400 status = getLocalZone();
05401 if (status != 0) return(status);
05402
05403 rescId[0]='\0';
05404 if (logSQL!=0) rodsLog(LOG_SQL, "chlModRescDataPaths SQL 1 ");
05405 status = cmlGetStringValueFromSql(
05406 "select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
05407 rescId, MAX_NAME_LEN, rescName, localZone, 0, &icss);
05408 if (status != 0) {
05409 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
05410 _rollback("chlModRescDataPaths");
05411 return(status);
05412 }
05413
05414
05415
05416
05417 strncpy(oldPath2, oldPath, sizeof(oldPath2));
05418 strncat(oldPath2, "%", sizeof(oldPath2));
05419
05420 if (userName != NULL && *userName != '\0') {
05421 strncpy(zoneToUse, localZone, NAME_LEN);
05422 status = parseUserName(userName, userName2, userZone);
05423 if (userZone[0]!='\0') {
05424 rstrcpy(zoneToUse, userZone, NAME_LEN);
05425 }
05426
05427 if (logSQL!=0) rodsLog(LOG_SQL, "chlModRescDataPaths SQL 2");
05428 cllBindVars[cllBindVarCount++]=oldPath;
05429 cllBindVars[cllBindVarCount++]=newPath;
05430 cllBindVars[cllBindVarCount++]=rescName;
05431 cllBindVars[cllBindVarCount++]=oldPath2;
05432 cllBindVars[cllBindVarCount++]=userName2;
05433 cllBindVars[cllBindVarCount++]=zoneToUse;
05434 status = cmlExecuteNoAnswerSql(
05435 "update R_DATA_MAIN DM set data_path = replace (DM.data_path, ?, ?) where resc_name=? and data_path like ? and data_owner_name=? and data_owner_zone=?",
05436 &icss);
05437 }
05438 else {
05439 if (logSQL!=0) rodsLog(LOG_SQL, "chlModRescDataPaths SQL 3");
05440 cllBindVars[cllBindVarCount++]=oldPath;
05441 cllBindVars[cllBindVarCount++]=newPath;
05442 cllBindVars[cllBindVarCount++]=rescName;
05443 cllBindVars[cllBindVarCount++]=oldPath2;
05444 status = cmlExecuteNoAnswerSql(
05445 "update R_DATA_MAIN DM set data_path = replace (DM.data_path, ?, ?) where resc_name=? and data_path like ?",
05446 &icss);
05447 }
05448 if (status != 0) {
05449 rodsLog(LOG_NOTICE,
05450 "chlModRescDataPaths cmlExecuteNoAnswerSql update failure %d",
05451 status);
05452 _rollback("chlModResc");
05453 return(status);
05454 }
05455
05456 rows = cllGetRowCount(&icss,-1);
05457
05458 status = cmlExecuteNoAnswerSql("commit", &icss);
05459 if (status != 0) {
05460 rodsLog(LOG_NOTICE,
05461 "chlModResc cmlExecuteNoAnswerSql commit failure %d",
05462 status);
05463 return(status);
05464 }
05465
05466 if (rows > 0) {
05467 char rowsMsg[100];
05468 snprintf(rowsMsg, 100, "%d rows updated",
05469 rows);
05470 status = addRErrorMsg (&rsComm->rError, 0, rowsMsg);
05471 }
05472
05473 return(0);
05474 }
05475
05476
05477
05478
05479
05480
05481 int chlModRescFreeSpace(rsComm_t *rsComm, char *rescName, int updateValue) {
05482 int status;
05483 char myTime[50];
05484 char updateValueStr[MAX_NAME_LEN];
05485
05486 if (logSQL!=0) rodsLog(LOG_SQL, "chlModRescFreeSpace");
05487
05488 if (rescName == NULL) {
05489 return (CAT_INVALID_ARGUMENT);
05490 }
05491
05492 if (*rescName == '\0') {
05493 return (CAT_INVALID_ARGUMENT);
05494 }
05495
05496
05497
05498
05499
05500 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
05501 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
05502 }
05503 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
05504 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
05505 }
05506
05507 status = getLocalZone();
05508 if (status != 0) return(status);
05509
05510 getNowStr(myTime);
05511
05512 snprintf(updateValueStr,MAX_NAME_LEN, "%d", updateValue);
05513
05514 cllBindVars[cllBindVarCount++]=updateValueStr;
05515 cllBindVars[cllBindVarCount++]=myTime;
05516 cllBindVars[cllBindVarCount++]=rescName;
05517
05518 if (logSQL!=0) rodsLog(LOG_SQL, "chlModRescFreeSpace SQL 1 ");
05519 status = cmlExecuteNoAnswerSql(
05520 "update R_RESC_MAIN set free_space = ?, free_space_ts=? where resc_name=?",
05521 &icss);
05522 if (status != 0) {
05523 rodsLog(LOG_NOTICE,
05524 "chlModRescFreeSpace cmlExecuteNoAnswerSql update failure %d",
05525 status);
05526 _rollback("chlModRescFreeSpace");
05527 return(status);
05528 }
05529
05530
05531 status = cmlAudit4(AU_MOD_RESC_FREE_SPACE,
05532 "select resc_id from R_RESC_MAIN where resc_name=?",
05533 rescName,
05534 rsComm->clientUser.userName,
05535 rsComm->clientUser.rodsZone,
05536 updateValueStr,
05537 &icss);
05538 if (status != 0) {
05539 rodsLog(LOG_NOTICE,
05540 "chlModRescFreeSpace cmlAudit4 failure %d",
05541 status);
05542 _rollback("chlModRescFreeSpace");
05543 return(status);
05544 }
05545
05546 return(0);
05547 }
05548
05549
05550 int chlModRescGroup(rsComm_t *rsComm, char *rescGroupName, char *option,
05551 char *rescName) {
05552 int status, OK;
05553 char myTime[50];
05554 char rescId[MAX_NAME_LEN];
05555 rodsLong_t seqNum;
05556 char rescGroupId[MAX_NAME_LEN];
05557 char dataObjNumber[MAX_NAME_LEN];
05558 char commentStr[200];
05559
05560 if (logSQL!=0) rodsLog(LOG_SQL, "chl-Mod-Resc-Group");
05561
05562 if (rescGroupName == NULL || option==NULL || rescName==NULL) {
05563 return (CAT_INVALID_ARGUMENT);
05564 }
05565
05566 if (*rescGroupName == '\0' || *option == '\0' || *rescName=='\0') {
05567 return (CAT_INVALID_ARGUMENT);
05568 }
05569
05570 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
05571 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
05572 }
05573 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
05574 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
05575 }
05576
05577 status = getLocalZone();
05578 if (status != 0) return(status);
05579
05580 rescId[0]='\0';
05581 if (logSQL!=0) rodsLog(LOG_SQL, "chl-Mod-Resc-Group S Q L 1 ");
05582 status = cmlGetStringValueFromSql(
05583 "select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
05584 rescId, MAX_NAME_LEN, rescName, localZone, 0, &icss);
05585 if (status != 0) {
05586 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
05587 _rollback("chlModRescGroup");
05588 return(status);
05589 }
05590
05591 getNowStr(myTime);
05592 OK=0;
05593 if (strcmp(option, "add")==0) {
05594
05595 rescGroupId[0]='\0';
05596 if (logSQL!=0) rodsLog(LOG_SQL, "chl-Mod-Resc-Group S Q L 2a ");
05597 status = cmlGetStringValueFromSql(
05598 "select distinct resc_group_id from R_RESC_GROUP where resc_group_name=?",
05599 rescGroupId, MAX_NAME_LEN, rescGroupName, 0, 0, &icss);
05600 if (status != 0) {
05601 if (status==CAT_NO_ROWS_FOUND) {
05602
05603 if (logSQL!=0) rodsLog(LOG_SQL, "chl-Mod-Resc-Group S Q L 2b ");
05604 seqNum = cmlGetNextSeqVal(&icss);
05605 if (seqNum < 0) {
05606 rodsLog(LOG_NOTICE, "chlModRescGroup cmlGetNextSeqVal failure %d",
05607 seqNum);
05608 _rollback("chlModRescGroup");
05609 return(seqNum);
05610 }
05611 snprintf(rescGroupId, MAX_NAME_LEN, "%lld", seqNum);
05612 } else {
05613 _rollback("chlModRescGroup");
05614 return(status);
05615 }
05616 }
05617
05618 cllBindVars[cllBindVarCount++]=rescGroupName;
05619 cllBindVars[cllBindVarCount++]=rescGroupId;
05620 cllBindVars[cllBindVarCount++]=rescId;
05621 cllBindVars[cllBindVarCount++]=myTime;
05622 cllBindVars[cllBindVarCount++]=myTime;
05623 if (logSQL!=0) rodsLog(LOG_SQL, "chl-Mod-Resc-Group S Q L 2");
05624 status = cmlExecuteNoAnswerSql(
05625 "insert into R_RESC_GROUP (resc_group_name, resc_group_id, resc_id , create_ts, modify_ts) values (?, ?, ?, ?, ?)",
05626 &icss);
05627 if (status != 0) {
05628 rodsLog(LOG_NOTICE,
05629 "chlModRescGroup cmlExecuteNoAnswerSql insert failure %d",
05630 status);
05631 _rollback("chlModRescGroup");
05632 return(status);
05633 }
05634 OK=1;
05635 }
05636
05637 if (strcmp(option, "remove")==0) {
05638
05639 dataObjNumber[0]='\0';
05640 if (logSQL!=0) rodsLog(LOG_SQL, "chl-Mod-Resc-Group S Q L 3a ");
05641 status = cmlGetStringValueFromSql(
05642 "select distinct resc_group_id from R_RESC_GROUP where resc_id=? and resc_group_name=?",
05643 dataObjNumber, MAX_NAME_LEN, rescId, rescGroupName, 0, &icss);
05644 if (status != 0) {
05645 _rollback("chlModRescGroup");
05646 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
05647 return(status);
05648 }
05649
05650
05651 cllBindVars[cllBindVarCount++]=rescGroupName;
05652 cllBindVars[cllBindVarCount++]=rescId;
05653 if (logSQL!=0) rodsLog(LOG_SQL, "chl-Mod-Resc-Group S Q L 3b");
05654 status = cmlExecuteNoAnswerSql(
05655 "delete from R_RESC_GROUP where resc_group_name=? and resc_id=?",
05656 &icss);
05657 if (status != 0) {
05658 rodsLog(LOG_NOTICE,
05659 "chlModRescGroup cmlExecuteNoAnswerSql delete failure %d",
05660 status);
05661 _rollback("chlModRescGroup");
05662 return(status);
05663 }
05664
05665
05666 rescGroupId[0]='\0';
05667 if (logSQL!=0) rodsLog(LOG_SQL, "chl-Mod-Resc-Group S Q L 3c ");
05668 status = cmlGetStringValueFromSql(
05669 "select distinct resc_group_id from R_RESC_GROUP where resc_group_name=?",
05670 rescGroupId, MAX_NAME_LEN, rescGroupName, 0, 0, &icss);
05671 if (status != 0) {
05672 if (status==CAT_NO_ROWS_FOUND) {
05673
05674 removeMetaMapAndAVU(dataObjNumber);
05675 }
05676 }
05677 OK=1;
05678 }
05679
05680 if (OK==0) {
05681 return (CAT_INVALID_ARGUMENT);
05682 }
05683
05684
05685 snprintf(commentStr, sizeof commentStr, "%s %s", option, rescGroupName);
05686 status = cmlAudit3(AU_MOD_RESC_GROUP,
05687 rescId,
05688 rsComm->clientUser.userName,
05689 rsComm->clientUser.rodsZone,
05690 commentStr,
05691 &icss);
05692 if (status != 0) {
05693 rodsLog(LOG_NOTICE,
05694 "chlModRescGroup cmlAudit3 failure %d",
05695 status);
05696 _rollback("chlModRescGroup");
05697 return(status);
05698 }
05699
05700 status = cmlExecuteNoAnswerSql("commit", &icss);
05701 if (status != 0) {
05702 rodsLog(LOG_NOTICE,
05703 "chlModRescGroup cmlExecuteNoAnswerSql commit failure %d",
05704 status);
05705 return(status);
05706 }
05707 return(0);
05708 }
05709
05710
05711
05712
05713 int chlRegUserRE(rsComm_t *rsComm, userInfo_t *userInfo) {
05714 char myTime[50];
05715 int status;
05716 char seqStr[MAX_NAME_LEN];
05717 char auditSQL[MAX_SQL_SIZE];
05718 char userZone[MAX_NAME_LEN];
05719 char zoneId[MAX_NAME_LEN];
05720
05721 int zoneForm;
05722 char userName2[NAME_LEN];
05723 char zoneName[NAME_LEN];
05724
05725 static char lastValidUserType[MAX_NAME_LEN]="";
05726 static char userTypeTokenName[MAX_NAME_LEN]="";
05727
05728 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegUserRE");
05729
05730 if (!icss.status) {
05731 return(CATALOG_NOT_CONNECTED);
05732 }
05733
05734 if (userInfo==0) {
05735 return(CAT_INVALID_ARGUMENT);
05736 }
05737
05738 if (userInfo->userType==0) {
05739 return(CAT_INVALID_ARGUMENT);
05740 }
05741
05742
05743 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH ||
05744 rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
05745 int status2;
05746 status2 = cmlCheckGroupAdminAccess(
05747 rsComm->clientUser.userName,
05748 rsComm->clientUser.rodsZone,
05749 "",
05750 &icss);
05751 if (status2 != 0) return(status2);
05752 creatingUserByGroupAdmin=1;
05753 }
05754
05755
05756
05757
05758
05759
05760 if ( *userInfo->userType=='\0' ||
05761 strcmp(userInfo->userType, lastValidUserType)!=0 ) {
05762 char errMsg[105];
05763 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegUserRE SQL 1 ");
05764 status = cmlGetStringValueFromSql(
05765 "select token_name from R_TOKN_MAIN where token_namespace='user_type' and token_name=?",
05766 userTypeTokenName, MAX_NAME_LEN, userInfo->userType, 0, 0, &icss);
05767 if (status==0) {
05768 strncpy(lastValidUserType, userInfo->userType, MAX_NAME_LEN);
05769 }
05770 else {
05771 snprintf(errMsg, 100, "user_type '%s' is not valid",
05772 userInfo->userType);
05773 addRErrorMsg (&rsComm->rError, 0, errMsg);
05774 return(CAT_INVALID_USER_TYPE);
05775 }
05776 }
05777
05778 status = getLocalZone();
05779 if (status != 0) return(status);
05780
05781 if (strlen(userInfo->rodsZone)>0) {
05782 zoneForm=1;
05783 strncpy(userZone, userInfo->rodsZone, MAX_NAME_LEN);
05784 }
05785 else {
05786 zoneForm=0;
05787 strncpy(userZone, localZone, MAX_NAME_LEN);
05788 }
05789
05790 status = parseUserName(userInfo->userName, userName2, zoneName);
05791 if (zoneName[0]!='\0') {
05792 rstrcpy(userZone, zoneName, NAME_LEN);
05793 zoneForm=2;
05794 }
05795 if (status != 0) {
05796 return (CAT_INVALID_ARGUMENT);
05797 }
05798
05799 if (zoneForm) {
05800
05801 zoneId[0]='\0';
05802 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegUserRE SQL 5 ");
05803 status = cmlGetStringValueFromSql(
05804 "select zone_id from R_ZONE_MAIN where zone_name=?",
05805 zoneId, MAX_NAME_LEN, userZone, "", 0, &icss);
05806 if (status != 0) {
05807 if (status==CAT_NO_ROWS_FOUND) {
05808 char errMsg[105];
05809 snprintf(errMsg, 100,
05810 "zone '%s' does not exist",
05811 userZone);
05812 addRErrorMsg (&rsComm->rError, 0, errMsg);
05813 return(CAT_INVALID_ZONE);
05814 }
05815 return(status);
05816 }
05817 }
05818
05819 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegUserRE SQL 2");
05820 status = cmlGetNextSeqStr(seqStr, MAX_NAME_LEN, &icss);
05821 if (status != 0) {
05822 rodsLog(LOG_NOTICE, "chlRegUserRE cmlGetNextSeqStr failure %d",
05823 status);
05824 return(status);
05825 }
05826
05827 getNowStr(myTime);
05828
05829 cllBindVars[cllBindVarCount++]=seqStr;
05830 cllBindVars[cllBindVarCount++]=userName2;
05831 cllBindVars[cllBindVarCount++]=userTypeTokenName;
05832 cllBindVars[cllBindVarCount++]=userZone;
05833 cllBindVars[cllBindVarCount++]=myTime;
05834 cllBindVars[cllBindVarCount++]=myTime;
05835
05836 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegUserRE SQL 3");
05837 status = cmlExecuteNoAnswerSql(
05838 "insert into R_USER_MAIN (user_id, user_name, user_type_name, zone_name, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?)",
05839 &icss);
05840
05841 if (status != 0) {
05842 if (status == CATALOG_ALREADY_HAS_ITEM_BY_THAT_NAME) {
05843 char errMsg[105];
05844 snprintf(errMsg, 100, "Error %d %s",
05845 status,
05846 "CATALOG_ALREADY_HAS_ITEM_BY_THAT_NAME"
05847 );
05848 addRErrorMsg (&rsComm->rError, 0, errMsg);
05849 }
05850 _rollback("chlRegUserRE");
05851 rodsLog(LOG_NOTICE,
05852 "chlRegUserRE insert failure %d",status);
05853 return(status);
05854 }
05855
05856
05857 cllBindVars[cllBindVarCount++]=seqStr;
05858 cllBindVars[cllBindVarCount++]=seqStr;
05859 cllBindVars[cllBindVarCount++]=myTime;
05860 cllBindVars[cllBindVarCount++]=myTime;
05861
05862 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegUserRE SQL 4");
05863 status = cmlExecuteNoAnswerSql(
05864 "insert into R_USER_GROUP (group_user_id, user_id, create_ts, modify_ts) values (?, ?, ?, ?)",
05865 &icss);
05866 if (status != 0) {
05867 rodsLog(LOG_NOTICE,
05868 "chlRegUserRE insert into R_USER_GROUP failure %d",status);
05869 _rollback("chlRegUserRE");
05870 return(status);
05871 }
05872
05873
05874
05875
05876
05877
05878
05879 if (strlen(userInfo->authInfo.authStr) > 0) {
05880 status = chlModUser(rsComm, userInfo->userName, "addAuth",
05881 userInfo->authInfo.authStr);
05882 if (status != 0) {
05883 rodsLog(LOG_NOTICE,
05884 "chlRegUserRE chlModUser insert auth failure %d",status);
05885 _rollback("chlRegUserRE");
05886 return(status);
05887 }
05888 }
05889
05890
05891 snprintf(auditSQL, MAX_SQL_SIZE-1,
05892 "select user_id from R_USER_MAIN where user_name=? and zone_name='%s'",
05893 userZone);
05894 status = cmlAudit4(AU_REGISTER_USER_RE,
05895 auditSQL,
05896 userName2,
05897 rsComm->clientUser.userName,
05898 rsComm->clientUser.rodsZone,
05899 userZone,
05900 &icss);
05901 if (status != 0) {
05902 rodsLog(LOG_NOTICE,
05903 "chlRegUserRE cmlAudit4 failure %d",
05904 status);
05905 _rollback("chlRegUserRE");
05906 return(status);
05907 }
05908
05909
05910 return(status);
05911 }
05912
05913 int
05914 convertTypeOption(char *typeStr) {
05915 if (strcmp(typeStr, "-d") == 0) return(1);
05916 if (strcmp(typeStr, "-D") == 0) return(1);
05917 if (strcmp(typeStr, "-c") == 0) return(2);
05918 if (strcmp(typeStr, "-C") == 0) return(2);
05919 if (strcmp(typeStr, "-r") == 0) return(3);
05920 if (strcmp(typeStr, "-R") == 0) return(3);
05921 if (strcmp(typeStr, "-u") == 0) return(4);
05922 if (strcmp(typeStr, "-U") == 0) return(4);
05923 if (strcmp(typeStr, "-g") == 0) return(5);
05924 if (strcmp(typeStr, "-G") == 0) return(5);
05925 return (0);
05926 }
05927
05928
05929
05930
05931
05932 rodsLong_t checkAndGetObjectId(rsComm_t *rsComm, char *type,
05933 char *name, char *access) {
05934 int itype;
05935 char logicalEndName[MAX_NAME_LEN];
05936 char logicalParentDirName[MAX_NAME_LEN];
05937 rodsLong_t status;
05938 rodsLong_t objId;
05939 char userName[NAME_LEN];
05940 char userZone[NAME_LEN];
05941
05942
05943 if (logSQL!=0) rodsLog(LOG_SQL, "checkAndGetObjectId");
05944
05945 if (!icss.status) {
05946 return(CATALOG_NOT_CONNECTED);
05947 }
05948
05949 if (type == NULL || *type=='\0') {
05950 return (CAT_INVALID_ARGUMENT);
05951 }
05952
05953 if (name == NULL || *name=='\0') {
05954 return (CAT_INVALID_ARGUMENT);
05955 }
05956
05957 itype = convertTypeOption(type);
05958 if (itype==0) return(CAT_INVALID_ARGUMENT);
05959
05960 if (itype==1) {
05961 status = splitPathByKey(name,
05962 logicalParentDirName, logicalEndName, '/');
05963 if (strlen(logicalParentDirName)==0) {
05964 strcpy(logicalParentDirName, "/");
05965 strcpy(logicalEndName, name);
05966 }
05967 if (logSQL!=0) rodsLog(LOG_SQL, "checkAndGetObjectId SQL 1 ");
05968 status = cmlCheckDataObjOnly(logicalParentDirName, logicalEndName,
05969 rsComm->clientUser.userName,
05970 rsComm->clientUser.rodsZone,
05971 access, &icss);
05972 if (status < 0) {
05973 _rollback("checkAndGetObjectId");
05974 return(status);
05975 }
05976 objId=status;
05977 }
05978
05979 if (itype==2) {
05980
05981
05982 if (logSQL!=0) rodsLog(LOG_SQL, "checkAndGetObjectId SQL 2");
05983 status = cmlCheckDir(name,
05984 rsComm->clientUser.userName,
05985 rsComm->clientUser.rodsZone,
05986 access, &icss);
05987 if (status < 0) {
05988 char errMsg[105];
05989 if (status == CAT_UNKNOWN_COLLECTION) {
05990 snprintf(errMsg, 100, "collection '%s' is unknown",
05991 name);
05992 addRErrorMsg (&rsComm->rError, 0, errMsg);
05993 }
05994 return(status);
05995 }
05996 objId=status;
05997 }
05998
05999 if (itype==3) {
06000 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
06001 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
06002 }
06003
06004 status = getLocalZone();
06005 if (status != 0) return(status);
06006
06007 objId=0;
06008 if (logSQL!=0) rodsLog(LOG_SQL, "checkAndGetObjectId SQL 3");
06009 status = cmlGetIntegerValueFromSql(
06010 "select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
06011 &objId, name, localZone, 0, 0, 0, &icss);
06012 if (status != 0) {
06013 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
06014 _rollback("checkAndGetObjectId");
06015 return(status);
06016 }
06017 }
06018
06019 if (itype==4) {
06020 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
06021 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
06022 }
06023
06024 status = parseUserName(name, userName, userZone);
06025 if (userZone[0]=='\0') {
06026 status = getLocalZone();
06027 if (status != 0) return(status);
06028 strncpy(userZone, localZone, NAME_LEN);
06029 }
06030
06031 objId=0;
06032 if (logSQL!=0) rodsLog(LOG_SQL, "checkAndGetObjectId SQL 4");
06033 status = cmlGetIntegerValueFromSql(
06034 "select user_id from R_USER_MAIN where user_name=? and zone_name=?",
06035 &objId, userName, userZone, 0, 0, 0, &icss);
06036 if (status != 0) {
06037 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_USER);
06038 _rollback("checkAndGetObjectId");
06039 return(status);
06040 }
06041 }
06042
06043 if (itype==5) {
06044 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
06045 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
06046 }
06047
06048 status = getLocalZone();
06049 if (status != 0) return(status);
06050
06051 objId=0;
06052 if (logSQL!=0) rodsLog(LOG_SQL, "checkAndGetObjectId S Q L 5");
06053 status = cmlGetIntegerValueFromSql(
06054 "select distinct resc_group_id from R_RESC_GROUP where resc_group_name=?",
06055 &objId, name, 0, 0, 0, 0, &icss);
06056 if (status != 0) {
06057 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
06058 _rollback("checkAndGetObjectId");
06059 return(status);
06060 }
06061 }
06062
06063 return(objId);
06064 }
06065
06066
06067
06068
06069
06070
06071 rodsLong_t
06072 findAVU(char *attribute, char *value, char *units) {
06073 rodsLong_t status;
06074
06075
06076 rodsLong_t iVal;
06077 iVal=0;
06078 if (*units!='\0') {
06079 if (logSQL!=0) rodsLog(LOG_SQL, "findAVU SQL 1");
06080 status = cmlGetIntegerValueFromSql(
06081 "select meta_id from R_META_MAIN where meta_attr_name=? and meta_attr_value=? and meta_attr_unit=?",
06082 &iVal, attribute, value, units, 0, 0, &icss);
06083 }
06084 else {
06085 if (logSQL!=0) rodsLog(LOG_SQL, "findAVU SQL 2");
06086 status = cmlGetIntegerValueFromSql(
06087 "select meta_id from R_META_MAIN where meta_attr_name=? and meta_attr_value=? and (meta_attr_unit='' or meta_attr_unit IS NULL)",
06088 &iVal, attribute, value, 0, 0, 0, &icss);
06089 }
06090 if (status == 0) {
06091 status = iVal;
06092 return(status);
06093 }
06094
06095
06096 return(status);
06097 }
06098
06099
06100
06101
06102
06103 int
06104 findOrInsertAVU(char *attribute, char *value, char *units) {
06105 char nextStr[MAX_NAME_LEN];
06106 char myTime[50];
06107 rodsLong_t status, seqNum;
06108 rodsLong_t iVal;
06109 iVal = findAVU(attribute, value, units);
06110 if (iVal > 0) {
06111 return iVal;
06112 }
06113 if (logSQL!=0) rodsLog(LOG_SQL, "findOrInsertAVU SQL 1");
06114
06115 status = cmlGetNextSeqVal(&icss);
06116 if (status < 0) {
06117 rodsLog(LOG_NOTICE, "findAVU cmlGetNextSeqVal failure %d",
06118 status);
06119 return(status);
06120 }
06121 seqNum = status;
06122
06123 snprintf(nextStr, sizeof nextStr, "%lld", seqNum);
06124
06125 getNowStr(myTime);
06126
06127 cllBindVars[cllBindVarCount++]=nextStr;
06128 cllBindVars[cllBindVarCount++]=attribute;
06129 cllBindVars[cllBindVarCount++]=value;
06130 cllBindVars[cllBindVarCount++]=units;
06131 cllBindVars[cllBindVarCount++]=myTime;
06132 cllBindVars[cllBindVarCount++]=myTime;
06133
06134 if (logSQL!=0) rodsLog(LOG_SQL, "findOrInsertAVU SQL 2");
06135 status = cmlExecuteNoAnswerSql(
06136 "insert into R_META_MAIN (meta_id, meta_attr_name, meta_attr_value, meta_attr_unit, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?)",
06137 &icss);
06138 if (status < 0) {
06139 rodsLog(LOG_NOTICE, "findOrInsertAVU insert failure %d", status);
06140 return(status);
06141 }
06142 return(seqNum);
06143 }
06144
06145
06146
06147
06148 int chlSetAVUMetadata(rsComm_t *rsComm, char *type,
06149 char *name, char *attribute, char *newValue,
06150 char *newUnit) {
06151 int status;
06152 char myTime[50];
06153 rodsLong_t objId;
06154 char metaIdStr[MAX_NAME_LEN*2];
06155 char objIdStr[MAX_NAME_LEN];
06156
06157 memset(metaIdStr, 0, sizeof(metaIdStr));
06158 if (logSQL != 0) rodsLog(LOG_SQL, "chlSetAVUMetadata");
06159
06160 if (!icss.status) {
06161 return(CATALOG_NOT_CONNECTED);
06162 }
06163
06164 if (logSQL != 0) rodsLog(LOG_SQL, "chlSetAVUMetadata SQL 1 ");
06165 objId = checkAndGetObjectId(rsComm, type, name, ACCESS_CREATE_METADATA);
06166 if (objId < 0) return objId;
06167 snprintf(objIdStr, MAX_NAME_LEN, "%lld", objId);
06168
06169 if (logSQL != 0) rodsLog(LOG_SQL, "chlSetAVUMetadata SQL 2");
06170
06171 status = cmlGetMultiRowStringValuesFromSql("select meta_id from R_OBJT_METAMAP where meta_id in (select meta_id from R_META_MAIN where meta_attr_name=? AND meta_id in (select meta_id from R_OBJT_METAMAP where object_id=?))",
06172 metaIdStr, MAX_NAME_LEN, 2, attribute, objIdStr, &icss);
06173
06174 if (status <= 0) {
06175 if (status == CAT_NO_ROWS_FOUND) {
06176
06177 status = chlAddAVUMetadata(rsComm, 0, type, name, attribute,
06178 newValue, newUnit);
06179 } else {
06180 rodsLog(LOG_NOTICE,
06181 "chlSetAVUMetadata cmlGetMultiRowStringValuesFromSql failure %d",
06182 status);
06183 }
06184 return status;
06185 }
06186
06187 if (status > 1) {
06188
06189 status = chlDeleteAVUMetadata(rsComm, 1, type, name, attribute, "%",
06190 "%", 1);
06191 if (status != 0) {
06192 _rollback("chlSetAVUMetadata");
06193 return(status);
06194 }
06195 status = chlAddAVUMetadata(rsComm, 0, type, name, attribute,
06196 newValue, newUnit);
06197 return status;
06198 }
06199
06200
06201
06202 rodsLog(LOG_NOTICE, "chlSetAVUMetadata found metaId %s", metaIdStr);
06203
06204 if (logSQL != 0) rodsLog(LOG_SQL, "chlSetAVUMetadata SQL 4");
06205 status = cmlGetMultiRowStringValuesFromSql("select meta_id from R_META_MAIN where meta_attr_name=?",
06206 metaIdStr, MAX_NAME_LEN, 2, attribute, objIdStr, &icss);
06207 if (status <= 0) {
06208 rodsLog(LOG_NOTICE,
06209 "chlSetAVUMetadata cmlGetMultiRowStringValueFromSql failure %d",
06210 status);
06211 return(status);
06212 }
06213 if (status > 1) {
06214
06215
06216
06217 status = chlDeleteAVUMetadata(rsComm, 1, type, name, attribute,
06218 "%", "%", 1);
06219 if (status != 0) {
06220 _rollback("chlSetAVUMetadata");
06221 return(status);
06222 }
06223 status = chlAddAVUMetadata(rsComm, 0, type, name, attribute,
06224 newValue, newUnit);
06225 }
06226 else {
06227 getNowStr(myTime);
06228 cllBindVarCount = 0;
06229 cllBindVars[cllBindVarCount++] = newValue;
06230 if (newUnit != NULL && *newUnit!='\0') {
06231 cllBindVars[cllBindVarCount++] = newUnit;
06232 }
06233 cllBindVars[cllBindVarCount++] = myTime;
06234 cllBindVars[cllBindVarCount++] = attribute;
06235 cllBindVars[cllBindVarCount++] = metaIdStr;
06236 if (newUnit != NULL && *newUnit!='\0') {
06237 if (logSQL != 0) rodsLog(LOG_SQL, "chlSetAVUMetadata SQL 5");
06238 status = cmlExecuteNoAnswerSql(
06239 "update R_META_MAIN set meta_attr_value=?,meta_attr_unit=?,modify_ts=? where meta_attr_name=? and meta_id=?",
06240 &icss);
06241 }
06242 else {
06243 if (logSQL != 0) rodsLog(LOG_SQL, "chlSetAVUMetadata SQL 6");
06244 status = cmlExecuteNoAnswerSql(
06245 "update R_META_MAIN set meta_attr_value=?,modify_ts=? where meta_attr_name=? and meta_id=?",
06246 &icss);
06247 }
06248 if (status != 0) {
06249 rodsLog(LOG_NOTICE,
06250 "chlSetAVUMetadata cmlExecuteNoAnswerSql update failure %d",
06251 status);
06252 _rollback("chlSetAVUMetadata");
06253 return(status);
06254 }
06255 }
06256
06257
06258 status = cmlAudit3(AU_ADD_AVU_METADATA,
06259 objIdStr,
06260 rsComm->clientUser.userName,
06261 rsComm->clientUser.rodsZone,
06262 type,
06263 &icss);
06264 if (status != 0) {
06265 rodsLog(LOG_NOTICE,
06266 "chlSetAVUMetadata cmlAudit3 failure %d",
06267 status);
06268 _rollback("chlSetAVUMetadata");
06269 return(status);
06270 }
06271
06272 status = cmlExecuteNoAnswerSql("commit", &icss);
06273 if (status != 0) {
06274 rodsLog(LOG_NOTICE,
06275 "chlSetAVUMetadata cmlExecuteNoAnswerSql commit failure %d",
06276 status);
06277 return(status);
06278 }
06279
06280 return(status);
06281 }
06282
06283
06284
06285
06286
06287
06288
06289
06290
06291 #define ACCESS_MAX 999999
06292
06293
06294 int
06295 chlAddAVUMetadataWild(rsComm_t *rsComm, int adminMode, char *type,
06296 char *name, char *attribute, char *value, char *units) {
06297 rodsLong_t status, status2;
06298 rodsLong_t seqNum;
06299 int numObjects;
06300 int nAccess=0;
06301 static int accessNeeded=ACCESS_MAX;
06302 rodsLong_t iVal;
06303 char collection[MAX_NAME_LEN];
06304 char objectName[MAX_NAME_LEN];
06305 char myTime[50];
06306 char seqNumStr[MAX_NAME_LEN];
06307 int itype;
06308
06309 itype = convertTypeOption(type);
06310 if (itype!=1) return(CAT_INVALID_ARGUMENT);
06311
06312 status = splitPathByKey(name, collection, objectName, '/');
06313 if (strlen(collection)==0) {
06314 strcpy(collection, "/");
06315 strcpy(objectName, name);
06316 }
06317
06318
06319
06320
06321
06322
06323
06324
06325
06326
06327 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadataWild SQL 1");
06328 status = cmlGetIntegerValueFromSql(
06329 "select count(DM.data_id) from R_DATA_MAIN DM, R_COLL_MAIN CM where DM.data_name like ? and DM.coll_id=CM.coll_id and CM.coll_name like ?",
06330 &iVal, objectName, collection, 0, 0, 0, &icss);
06331 if (status != 0) {
06332 rodsLog(LOG_NOTICE,
06333 "chlAddAVUMetadataWild get count failure %d",
06334 status);
06335 _rollback("chlAddAVUMetadataWild");
06336 return(status);
06337 }
06338 numObjects = iVal;
06339 if (numObjects == 0) {
06340 return(CAT_NO_ROWS_FOUND);
06341 }
06342
06343
06344
06345
06346
06347 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadataWild SQL 2");
06348 #if ORA_ICAT
06349
06350
06351 status = cmlExecuteNoAnswerSql("purge recyclebin",
06352 &icss);
06353 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
06354 if (status != 0) {
06355 rodsLog(LOG_NOTICE,
06356 "chlAddAVUMetadata cmlExecuteNoAnswerSql (drop table ACCESS_VIEW_ONE) failure %d",
06357 status);
06358 }
06359 status = cmlExecuteNoAnswerSql("drop table ACCESS_VIEW_ONE",
06360 &icss);
06361 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
06362 if (status != 0) {
06363 rodsLog(LOG_NOTICE,
06364 "chlAddAVUMetadata cmlExecuteNoAnswerSql (drop table ACCESS_VIEW_ONE) failure %d",
06365 status);
06366 }
06367
06368 status = cmlExecuteNoAnswerSql("create table ACCESS_VIEW_ONE (access_type_id integer, data_id integer)",
06369 &icss);
06370 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
06371 if (status != 0) {
06372 rodsLog(LOG_NOTICE,
06373 "chlAddAVUMetadata cmlExecuteNoAnswerSql (create table ACCESS_VIEW_ONE) failure %d",
06374 status);
06375 _rollback("chlAddAVUMetadataWild");
06376 return(status);
06377 }
06378
06379 cllBindVars[cllBindVarCount++]=objectName;
06380 cllBindVars[cllBindVarCount++]=collection;
06381 cllBindVars[cllBindVarCount++]=rsComm->clientUser.userName;
06382 cllBindVars[cllBindVarCount++]=rsComm->clientUser.rodsZone;
06383 status = cmlExecuteNoAnswerSql(
06384 "insert into ACCESS_VIEW_ONE (access_type_id, data_id) (select access_type_id, DM.data_id from R_DATA_MAIN DM, R_OBJT_ACCESS OA, R_USER_GROUP UG, R_USER_MAIN UM, R_COLL_MAIN CM where DM.data_name like ? and DM.coll_id=CM.coll_id and CM.coll_name like ? and UM.user_name=? and UM.zone_name=? and UM.user_type_name!='rodsgroup' and UM.user_id = UG.user_id and OA.object_id = DM.data_id and UG.group_user_id = OA.user_id)",
06385 &icss);
06386 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
06387 if (status==CAT_NO_ROWS_FOUND) status=CAT_NO_ACCESS_PERMISSION;
06388 if (status != 0) {
06389 rodsLog(LOG_NOTICE,
06390 "chlAddAVUMetadata cmlExecuteNoAnswerSql (create view) failure %d",
06391 status);
06392 _rollback("chlAddAVUMetadataWild");
06393 return(status);
06394 }
06395 #else
06396 cllBindVars[cllBindVarCount++]=objectName;
06397 cllBindVars[cllBindVarCount++]=collection;
06398 cllBindVars[cllBindVarCount++]=rsComm->clientUser.userName;
06399 cllBindVars[cllBindVarCount++]=rsComm->clientUser.rodsZone;
06400 status = cmlExecuteNoAnswerSql(
06401 "create view ACCESS_VIEW_ONE as select access_type_id, DM.data_id from R_DATA_MAIN DM, R_OBJT_ACCESS OA, R_USER_GROUP UG, R_USER_MAIN UM, R_COLL_MAIN CM where DM.data_name like ? and DM.coll_id=CM.coll_id and CM.coll_name like ? and UM.user_name=? and UM.zone_name=? and UM.user_type_name!='rodsgroup' and UM.user_id = UG.user_id and OA.object_id = DM.data_id and UG.group_user_id = OA.user_id",
06402 &icss);
06403 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
06404 if (status==CAT_NO_ROWS_FOUND) status=CAT_NO_ACCESS_PERMISSION;
06405 if (status != 0) {
06406 rodsLog(LOG_NOTICE,
06407 "chlAddAVUMetadata cmlExecuteNoAnswerSql (create view) failure %d",
06408 status);
06409 _rollback("chlAddAVUMetadataWild");
06410 return(status);
06411 }
06412 #endif
06413
06414
06415
06416
06417
06418
06419 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadataWild SQL 3");
06420 #if (defined ORA_ICAT || defined MY_ICAT)
06421 status = cmlExecuteNoAnswerSql(
06422 "create or replace view ACCESS_VIEW_TWO as select max(access_type_id) max from ACCESS_VIEW_ONE group by data_id",
06423 &icss);
06424 #else
06425 status = cmlExecuteNoAnswerSql(
06426 "create or replace view ACCESS_VIEW_TWO as select max(access_type_id) from ACCESS_VIEW_ONE group by data_id",
06427 &icss);
06428 #endif
06429 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
06430 if (status==CAT_NO_ROWS_FOUND) status=CAT_NO_ACCESS_PERMISSION;
06431 if (status != 0) {
06432 rodsLog(LOG_NOTICE,
06433 "chlAddAVUMetadata cmlExecuteNoAnswerSql (create view) failure %d",
06434 status);
06435 _rollback("chlAddAVUMetadataWild");
06436 return(status);
06437 }
06438
06439 if (accessNeeded>=ACCESS_MAX) {
06440 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadataWild SQL 4");
06441 status = cmlGetIntegerValueFromSql(
06442 "select token_id from R_TOKN_MAIN where token_name = 'modify metadata' and token_namespace = 'access_type'",
06443 &iVal, 0, 0, 0, 0, 0, &icss);
06444 if (status==0) accessNeeded = iVal;
06445 }
06446
06447
06448
06449 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadataWild SQL 5");
06450 iVal=-1;
06451 status = cmlGetIntegerValueFromSql(
06452 "select min(max) from ACCESS_VIEW_TWO",
06453 &iVal, 0, 0, 0, 0, 0, &icss);
06454
06455 if (status==CAT_NO_ROWS_FOUND) status=CAT_NO_ACCESS_PERMISSION;
06456
06457 if (status==0) {
06458 if (iVal < accessNeeded) {
06459 status = CAT_NO_ACCESS_PERMISSION;
06460 }
06461 }
06462
06463
06464
06465
06466 if (status==0) {
06467 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadataWild SQL 6");
06468 status = cmlGetIntegerValueFromSql(
06469 "select count(*) from ACCESS_VIEW_TWO",
06470 &iVal, 0, 0, 0, 0, 0, &icss);
06471 if (status==0) {
06472 nAccess = iVal;
06473 if (numObjects > nAccess) status=CAT_NO_ACCESS_PERMISSION;
06474 }
06475 }
06476
06477 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadataWild SQL 7");
06478 #if ORA_ICAT
06479 status2 = cmlExecuteNoAnswerSql(
06480 "drop table ACCESS_VIEW_ONE",
06481 &icss);
06482 if (status2==CAT_SUCCESS_BUT_WITH_NO_INFO) status2=0;
06483 if (status2==0) {
06484 status2 = cmlExecuteNoAnswerSql(
06485 "drop view ACCESS_VIEW_TWO",
06486 &icss);
06487 if (status2==CAT_SUCCESS_BUT_WITH_NO_INFO) status2=0;
06488 }
06489 #else
06490 status2 = cmlExecuteNoAnswerSql(
06491 "drop view ACCESS_VIEW_TWO, ACCESS_VIEW_ONE",
06492 &icss);
06493 if (status2==CAT_SUCCESS_BUT_WITH_NO_INFO) status2=0;
06494 #endif
06495
06496 if (status2 != 0) {
06497 rodsLog(LOG_NOTICE,
06498 "chlAddAVUMetadataWild cmlExecuteNoAnswerSql (drop view (or table)) failure %d",
06499 status2);
06500 }
06501
06502 if (status != 0) return(status);
06503
06504
06505
06506
06507 status = findOrInsertAVU(attribute, value, units);
06508 if (status<0) {
06509 rodsLog(LOG_NOTICE,
06510 "chlAddAVUMetadataWild findOrInsertAVU failure %d",
06511 status);
06512 _rollback("chlAddAVUMetadata");
06513 return(status);
06514 }
06515 seqNum = status;
06516
06517 getNowStr(myTime);
06518 snprintf(seqNumStr, sizeof seqNumStr, "%lld", seqNum);
06519 cllBindVars[cllBindVarCount++]=seqNumStr;
06520 cllBindVars[cllBindVarCount++]=myTime;
06521 cllBindVars[cllBindVarCount++]=myTime;
06522 cllBindVars[cllBindVarCount++]=objectName;
06523 cllBindVars[cllBindVarCount++]=collection;
06524 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadataWild SQL 8");
06525 status = cmlExecuteNoAnswerSql(
06526 "insert into R_OBJT_METAMAP (object_id, meta_id, create_ts, modify_ts) select DM.data_id, ?, ?, ? from R_DATA_MAIN DM, R_COLL_MAIN CM where DM.data_name like ? and DM.coll_id=CM.coll_id and CM.coll_name like ?",
06527 &icss);
06528 if (status != 0) {
06529 rodsLog(LOG_NOTICE,
06530 "chlAddAVUMetadataWild cmlExecuteNoAnswerSql insert failure %d",
06531 status);
06532 _rollback("chlAddAVUMetadataWild");
06533 return(status);
06534 }
06535
06536
06537 status = cmlAudit3(AU_ADD_AVU_WILD_METADATA,
06538 seqNumStr,
06539 rsComm->clientUser.userName,
06540 rsComm->clientUser.rodsZone,
06541 name,
06542 &icss);
06543 if (status != 0) {
06544 rodsLog(LOG_NOTICE,
06545 "chlAddAVUMetadataWild cmlAudit3 failure %d",
06546 status);
06547 _rollback("chlAddAVUMetadataWild");
06548 return(status);
06549 }
06550
06551
06552
06553 status = cmlExecuteNoAnswerSql("commit", &icss);
06554 if (status != 0) {
06555 rodsLog(LOG_NOTICE,
06556 "chlAddAVUMetadataWild cmlExecuteNoAnswerSql commit failure %d",
06557 status);
06558 return(status);
06559 }
06560
06561 if (status != 0) return(status);
06562 return(numObjects);
06563 }
06564
06565
06566
06567 int chlAddAVUMetadata(rsComm_t *rsComm, int adminMode, char *type,
06568 char *name, char *attribute, char *value, char *units) {
06569 int itype;
06570 char myTime[50];
06571 char logicalEndName[MAX_NAME_LEN];
06572 char logicalParentDirName[MAX_NAME_LEN];
06573 rodsLong_t seqNum, iVal;
06574 rodsLong_t objId, status;
06575 char objIdStr[MAX_NAME_LEN];
06576 char seqNumStr[MAX_NAME_LEN];
06577 char userName[NAME_LEN];
06578 char userZone[NAME_LEN];
06579
06580 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadata");
06581
06582 if (!icss.status) {
06583 return(CATALOG_NOT_CONNECTED);
06584 }
06585
06586 if (type == NULL || *type=='\0') {
06587 return (CAT_INVALID_ARGUMENT);
06588 }
06589
06590 if (name == NULL || *name=='\0') {
06591 return (CAT_INVALID_ARGUMENT);
06592 }
06593
06594 if (attribute == NULL || *attribute=='\0') {
06595 return (CAT_INVALID_ARGUMENT);
06596 }
06597
06598 if (value == NULL || *value=='\0') {
06599 return (CAT_INVALID_ARGUMENT);
06600 }
06601
06602 if (adminMode==1) {
06603 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
06604 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
06605 }
06606 }
06607
06608 if (units == NULL) units="";
06609
06610 itype = convertTypeOption(type);
06611 if (itype==0) return(CAT_INVALID_ARGUMENT);
06612
06613 if (itype==1) {
06614 status = splitPathByKey(name,
06615 logicalParentDirName, logicalEndName, '/');
06616 if (strlen(logicalParentDirName)==0) {
06617 strcpy(logicalParentDirName, "/");
06618 strcpy(logicalEndName, name);
06619 }
06620 if (adminMode==1) {
06621 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadata SQL 1 ");
06622 status = cmlGetIntegerValueFromSql(
06623 "select data_id from R_DATA_MAIN DM, R_COLL_MAIN CM where DM.data_name=? and DM.coll_id=CM.coll_id and CM.coll_name=?",
06624 &iVal, logicalEndName, logicalParentDirName, 0, 0, 0, &icss);
06625 if (status==0) status=iVal;
06626 }
06627 else {
06628 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadata SQL 2");
06629 status = cmlCheckDataObjOnly(logicalParentDirName, logicalEndName,
06630 rsComm->clientUser.userName,
06631 rsComm->clientUser.rodsZone,
06632 ACCESS_CREATE_METADATA, &icss);
06633 }
06634 if (status < 0) {
06635 _rollback("chlAddAVUMetadata");
06636 return(status);
06637 }
06638 objId=status;
06639 }
06640
06641 if (itype==2) {
06642 if (adminMode==1) {
06643 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadata SQL 3");
06644 status = cmlGetIntegerValueFromSql(
06645 "select coll_id from R_COLL_MAIN where coll_name=?",
06646 &iVal, name, 0, 0, 0, 0, &icss);
06647 if (status==0) status=iVal;
06648 }
06649 else {
06650
06651
06652 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadata SQL 4");
06653 status = cmlCheckDir(name,
06654 rsComm->clientUser.userName,
06655 rsComm->clientUser.rodsZone,
06656 ACCESS_CREATE_METADATA, &icss);
06657 }
06658 if (status < 0) {
06659 char errMsg[105];
06660 _rollback("chlAddAVUMetadata");
06661 if (status == CAT_UNKNOWN_COLLECTION) {
06662 snprintf(errMsg, 100, "collection '%s' is unknown",
06663 name);
06664 addRErrorMsg (&rsComm->rError, 0, errMsg);
06665 } else {
06666 _rollback("chlAddAVUMetadata");
06667 }
06668 return(status);
06669 }
06670 objId=status;
06671 }
06672
06673 if (itype==3) {
06674 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
06675 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
06676 }
06677
06678 status = getLocalZone();
06679 if (status != 0) return(status);
06680
06681 objId=0;
06682 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadata SQL 5");
06683 status = cmlGetIntegerValueFromSql(
06684 "select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
06685 &objId, name, localZone, 0, 0, 0, &icss);
06686 if (status != 0) {
06687 _rollback("chlAddAVUMetadata");
06688 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
06689 return(status);
06690 }
06691 }
06692
06693 if (itype==4) {
06694 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
06695 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
06696 }
06697
06698 status = parseUserName(name, userName, userZone);
06699 if (userZone[0]=='\0') {
06700 status = getLocalZone();
06701 if (status != 0) return(status);
06702 strncpy(userZone, localZone, NAME_LEN);
06703 }
06704
06705 objId=0;
06706 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadata SQL 6");
06707 status = cmlGetIntegerValueFromSql(
06708 "select user_id from R_USER_MAIN where user_name=? and zone_name=?",
06709 &objId, userName, userZone, 0, 0, 0, &icss);
06710 if (status != 0) {
06711 _rollback("chlAddAVUMetadata");
06712 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_USER);
06713 return(status);
06714 }
06715 }
06716
06717 if (itype==5) {
06718 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
06719 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
06720 }
06721
06722 status = getLocalZone();
06723 if (status != 0) return(status);
06724
06725 objId=0;
06726 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadata SQL 7");
06727 status = cmlGetIntegerValueFromSql(
06728 "select distinct resc_group_id from R_RESC_GROUP where resc_group_name=?",
06729 &objId, name, 0, 0, 0, 0, &icss);
06730 if (status != 0) {
06731 _rollback("chlAddAVUMetadata");
06732 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
06733 return(status);
06734 }
06735 }
06736
06737 status = findOrInsertAVU(attribute, value, units);
06738 if (status<0) {
06739 rodsLog(LOG_NOTICE,
06740 "chlAddAVUMetadata findOrInsertAVU failure %d",
06741 status);
06742 _rollback("chlAddAVUMetadata");
06743 return(status);
06744 }
06745 seqNum = status;
06746
06747 getNowStr(myTime);
06748 snprintf(objIdStr, sizeof objIdStr, "%lld", objId);
06749 snprintf(seqNumStr, sizeof seqNumStr, "%lld", seqNum);
06750 cllBindVars[cllBindVarCount++]=objIdStr;
06751 cllBindVars[cllBindVarCount++]=seqNumStr;
06752 cllBindVars[cllBindVarCount++]=myTime;
06753 cllBindVars[cllBindVarCount++]=myTime;
06754 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadata SQL 7");
06755 status = cmlExecuteNoAnswerSql(
06756 "insert into R_OBJT_METAMAP (object_id, meta_id, create_ts, modify_ts) values (?, ?, ?, ?)",
06757 &icss);
06758 if (status != 0) {
06759 rodsLog(LOG_NOTICE,
06760 "chlAddAVUMetadata cmlExecuteNoAnswerSql insert failure %d",
06761 status);
06762 _rollback("chlAddAVUMetadata");
06763 return(status);
06764 }
06765
06766
06767 status = cmlAudit3(AU_ADD_AVU_METADATA,
06768 objIdStr,
06769 rsComm->clientUser.userName,
06770 rsComm->clientUser.rodsZone,
06771 type,
06772 &icss);
06773 if (status != 0) {
06774 rodsLog(LOG_NOTICE,
06775 "chlAddAVUMetadata cmlAudit3 failure %d",
06776 status);
06777 _rollback("chlAddAVUMetadata");
06778 return(status);
06779 }
06780
06781 status = cmlExecuteNoAnswerSql("commit", &icss);
06782 if (status != 0) {
06783 rodsLog(LOG_NOTICE,
06784 "chlAddAVUMetadata cmlExecuteNoAnswerSql commit failure %d",
06785 status);
06786 return(status);
06787 }
06788
06789 return(status);
06790 }
06791
06792
06793
06794
06795 int
06796 checkModArgType(char *arg) {
06797 if (arg == NULL || *arg=='\0')
06798 return(CAT_INVALID_ARGUMENT);
06799 if (*(arg+1)!=':') return(0);
06800 if (*arg=='n') return(1);
06801 if (*arg=='v') return(2);
06802 if (*arg=='u') return(3);
06803 return(0);
06804 }
06805
06806
06807 int chlModAVUMetadata(rsComm_t *rsComm, char *type,
06808 char *name, char *attribute, char *value,
06809 char *unitsOrArg0, char *arg1, char *arg2, char *arg3) {
06810 int status, atype;
06811 char myUnits[MAX_NAME_LEN]="";
06812 char *addAttr="", *addValue="", *addUnits="";
06813 int newUnits=0;
06814 if (unitsOrArg0 == NULL || *unitsOrArg0=='\0')
06815 return(CAT_INVALID_ARGUMENT);
06816 atype = checkModArgType(unitsOrArg0);
06817 if (atype==0) strncpy(myUnits, unitsOrArg0, MAX_NAME_LEN);
06818
06819 status = chlDeleteAVUMetadata(rsComm, 0, type, name, attribute, value,
06820 myUnits, 1);
06821 if (status != 0) {
06822 _rollback("chlModAVUMetadata");
06823 return(status);
06824 }
06825
06826 if (atype==1) {
06827 addAttr=unitsOrArg0+2;
06828 }
06829 if (atype==2) {
06830 addValue=unitsOrArg0+2;
06831 }
06832 if (atype==3) {
06833 addUnits=unitsOrArg0+2;
06834 }
06835
06836 atype = checkModArgType(arg1);
06837 if (atype==1) {
06838 addAttr=arg1+2;
06839 }
06840 if (atype==2) {
06841 addValue=arg1+2;
06842 }
06843 if (atype==3) {
06844 addUnits=arg1+2;
06845 }
06846
06847 atype = checkModArgType(arg2);
06848 if (atype==1) {
06849 addAttr=arg2+2;
06850 }
06851 if (atype==2) {
06852 addValue=arg2+2;
06853 }
06854 if (atype==3) {
06855 addUnits=arg2+2;
06856 }
06857
06858 atype = checkModArgType(arg3);
06859 if (atype==1) {
06860 addAttr=arg3+2;
06861 }
06862 if (atype==2) {
06863 addValue=arg3+2;
06864 }
06865 if (atype==3) {
06866 addUnits=arg3+2;
06867 newUnits=1;
06868 }
06869
06870 if (*addAttr=='\0' &&
06871 *addValue=='\0' &&
06872 *addUnits=='\0') {
06873 _rollback("chlModAVUMetadata");
06874 return (CAT_INVALID_ARGUMENT);
06875 }
06876
06877 if (*addAttr=='\0') addAttr=attribute;
06878 if (*addValue=='\0') addValue=value;
06879 if (*addUnits=='\0' && newUnits==0) addUnits=myUnits;
06880
06881 status = chlAddAVUMetadata(rsComm, 0, type, name, addAttr, addValue,
06882 addUnits);
06883 return(status);
06884
06885 }
06886
06887
06888
06889
06890 int chlDeleteAVUMetadata(rsComm_t *rsComm, int option, char *type,
06891 char *name, char *attribute, char *value,
06892 char *units, int noCommit ) {
06893 int itype;
06894 char logicalEndName[MAX_NAME_LEN];
06895 char logicalParentDirName[MAX_NAME_LEN];
06896 rodsLong_t status;
06897 rodsLong_t objId;
06898 char objIdStr[MAX_NAME_LEN];
06899 int allowNullUnits;
06900 char userName[NAME_LEN];
06901 char userZone[NAME_LEN];
06902
06903 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata");
06904
06905 if (!icss.status) {
06906 return(CATALOG_NOT_CONNECTED);
06907 }
06908
06909 if (type == NULL || *type=='\0') {
06910 return (CAT_INVALID_ARGUMENT);
06911 }
06912
06913 if (name == NULL || *name=='\0') {
06914 return (CAT_INVALID_ARGUMENT);
06915 }
06916
06917 if (option != 2) {
06918 if (attribute == NULL || *attribute=='\0') {
06919 return (CAT_INVALID_ARGUMENT);
06920 }
06921
06922 if (value == NULL || *value=='\0') {
06923 return (CAT_INVALID_ARGUMENT);
06924 }
06925 }
06926
06927 if (units == NULL) units="";
06928
06929 itype = convertTypeOption(type);
06930 if (itype==0) return(CAT_INVALID_ARGUMENT);
06931
06932 if (itype==1) {
06933 status = splitPathByKey(name,
06934 logicalParentDirName, logicalEndName, '/');
06935 if (strlen(logicalParentDirName)==0) {
06936 strcpy(logicalParentDirName, "/");
06937 strcpy(logicalEndName, name);
06938 }
06939 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata SQL 1 ");
06940 status = cmlCheckDataObjOnly(logicalParentDirName, logicalEndName,
06941 rsComm->clientUser.userName,
06942 rsComm->clientUser.rodsZone,
06943 ACCESS_DELETE_METADATA, &icss);
06944 if (status < 0) {
06945 _rollback("chlDeleteAVUMetadata");
06946 return(status);
06947 }
06948 objId=status;
06949 }
06950
06951 if (itype==2) {
06952
06953
06954 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata SQL 2");
06955 status = cmlCheckDir(name,
06956 rsComm->clientUser.userName,
06957 rsComm->clientUser.rodsZone,
06958 ACCESS_DELETE_METADATA, &icss);
06959 if (status < 0) {
06960 char errMsg[105];
06961 if (status == CAT_UNKNOWN_COLLECTION) {
06962 snprintf(errMsg, 100, "collection '%s' is unknown",
06963 name);
06964 addRErrorMsg (&rsComm->rError, 0, errMsg);
06965 }
06966 return(status);
06967 }
06968 objId=status;
06969 }
06970
06971 if (itype==3) {
06972 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
06973 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
06974 }
06975
06976 status = getLocalZone();
06977 if (status != 0) return(status);
06978
06979 objId=0;
06980 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata SQL 3");
06981 status = cmlGetIntegerValueFromSql(
06982 "select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
06983 &objId, name, localZone, 0, 0, 0, &icss);
06984 if (status != 0) {
06985 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
06986 _rollback("chlDeleteAVUMetadata");
06987 return(status);
06988 }
06989 }
06990
06991 if (itype==4) {
06992 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
06993 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
06994 }
06995
06996 status = parseUserName(name, userName, userZone);
06997 if (userZone[0]=='\0') {
06998 status = getLocalZone();
06999 if (status != 0) return(status);
07000 strncpy(userZone, localZone, NAME_LEN);
07001 }
07002
07003 objId=0;
07004 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata SQL 4");
07005 status = cmlGetIntegerValueFromSql(
07006 "select user_id from R_USER_MAIN where user_name=? and zone_name=?",
07007 &objId, userName, userZone, 0, 0, 0, &icss);
07008 if (status != 0) {
07009 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_USER);
07010 _rollback("chlDeleteAVUMetadata");
07011 return(status);
07012 }
07013 }
07014
07015 if (itype==5) {
07016 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
07017 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
07018 }
07019
07020 status = getLocalZone();
07021 if (status != 0) return(status);
07022
07023 objId=0;
07024 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata SQL 5");
07025 status = cmlGetIntegerValueFromSql(
07026 "select resc_group_id from R_RESC_GROUP where resc_group_name=?",
07027 &objId, name, 0, 0, 0, 0, &icss);
07028 if (status != 0) {
07029 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
07030 _rollback("chlDeleteAVUMetadata");
07031 return(status);
07032 }
07033 }
07034
07035
07036 snprintf(objIdStr, MAX_NAME_LEN, "%lld", objId);
07037
07038 if (option==2) {
07039 cllBindVars[cllBindVarCount++]=objIdStr;
07040 cllBindVars[cllBindVarCount++]=attribute;
07041
07042 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata SQL 9");
07043 status = cmlExecuteNoAnswerSql(
07044 "delete from R_OBJT_METAMAP where object_id=? and meta_id =?",
07045 &icss);
07046 if (status != 0) {
07047 rodsLog(LOG_NOTICE,
07048 "chlDeleteAVUMetadata cmlExecuteNoAnswerSql delete failure %d",
07049 status);
07050 _rollback("chlDeleteAVUMetadata");
07051 return(status);
07052 }
07053
07054
07055 #ifdef METADATA_CLEANUP
07056 removeAVUs();
07057 #endif
07058
07059
07060 status = cmlAudit3(AU_DELETE_AVU_METADATA,
07061 objIdStr,
07062 rsComm->clientUser.userName,
07063 rsComm->clientUser.rodsZone,
07064 type,
07065 &icss);
07066 if (status != 0) {
07067 rodsLog(LOG_NOTICE,
07068 "chlDeleteAVUMetadata cmlAudit3 failure %d",
07069 status);
07070 _rollback("chlDeleteAVUMetadata");
07071 return(status);
07072 }
07073
07074 if (noCommit != 1) {
07075 status = cmlExecuteNoAnswerSql("commit", &icss);
07076 if (status != 0) {
07077 rodsLog(LOG_NOTICE,
07078 "chlDeleteAVUMetadata cmlExecuteNoAnswerSql commit failure %d",
07079 status);
07080 return(status);
07081 }
07082 }
07083 return(status);
07084 }
07085
07086 cllBindVars[cllBindVarCount++]=objIdStr;
07087 cllBindVars[cllBindVarCount++]=attribute;
07088 cllBindVars[cllBindVarCount++]=value;
07089 cllBindVars[cllBindVarCount++]=units;
07090
07091 allowNullUnits=0;
07092 if (*units=='\0') {
07093 allowNullUnits=1;
07094 }
07095 if (option==1 && *units=='%' && *(units+1)=='\0') {
07096 allowNullUnits=1;
07097 }
07098
07099 if (allowNullUnits) {
07100 if (option==1) {
07101 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata SQL 5");
07102 status = cmlExecuteNoAnswerSql(
07103 "delete from R_OBJT_METAMAP where object_id=? and meta_id IN (select meta_id from R_META_MAIN where meta_attr_name like ? and meta_attr_value like ? and (meta_attr_unit like ? or meta_attr_unit IS NULL) )",
07104 &icss);
07105 }
07106 else {
07107 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata SQL 6");
07108 status = cmlExecuteNoAnswerSql(
07109 "delete from R_OBJT_METAMAP where object_id=? and meta_id IN (select meta_id from R_META_MAIN where meta_attr_name = ? and meta_attr_value = ? and (meta_attr_unit = ? or meta_attr_unit IS NULL) )",
07110 &icss);
07111 }
07112 }
07113 else {
07114 if (option==1) {
07115 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata SQL 7");
07116 status = cmlExecuteNoAnswerSql(
07117 "delete from R_OBJT_METAMAP where object_id=? and meta_id IN (select meta_id from R_META_MAIN where meta_attr_name like ? and meta_attr_value like ? and meta_attr_unit like ?)",
07118 &icss);
07119 }
07120 else {
07121 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata SQL 8");
07122 status = cmlExecuteNoAnswerSql(
07123 "delete from R_OBJT_METAMAP where object_id=? and meta_id IN (select meta_id from R_META_MAIN where meta_attr_name = ? and meta_attr_value = ? and meta_attr_unit = ?)",
07124 &icss);
07125 }
07126 }
07127 if (status != 0) {
07128 rodsLog(LOG_NOTICE,
07129 "chlDeleteAVUMetadata cmlExecuteNoAnswerSql delete failure %d",
07130 status);
07131 _rollback("chlDeleteAVUMetadata");
07132 return(status);
07133 }
07134
07135
07136 #ifdef METADATA_CLEANUP
07137 removeAVUs();
07138 #endif
07139
07140
07141 status = cmlAudit3(AU_DELETE_AVU_METADATA,
07142 objIdStr,
07143 rsComm->clientUser.userName,
07144 rsComm->clientUser.rodsZone,
07145 type,
07146 &icss);
07147 if (status != 0) {
07148 rodsLog(LOG_NOTICE,
07149 "chlDeleteAVUMetadata cmlAudit3 failure %d",
07150 status);
07151 _rollback("chlDeleteAVUMetadata");
07152 return(status);
07153 }
07154
07155 if (noCommit != 1) {
07156 status = cmlExecuteNoAnswerSql("commit", &icss);
07157 if (status != 0) {
07158 rodsLog(LOG_NOTICE,
07159 "chlDeleteAVUMetadata cmlExecuteNoAnswerSql commit failure %d",
07160 status);
07161 return(status);
07162 }
07163 }
07164
07165 return(status);
07166 }
07167
07168
07169
07170 int chlCopyAVUMetadata(rsComm_t *rsComm, char *type1, char *type2,
07171 char *name1, char *name2) {
07172 char myTime[50];
07173 int status;
07174 rodsLong_t objId1, objId2;
07175 char objIdStr1[MAX_NAME_LEN];
07176 char objIdStr2[MAX_NAME_LEN];
07177
07178 if (logSQL!=0) rodsLog(LOG_SQL, "chlCopyAVUMetadata");
07179
07180 if (!icss.status) {
07181 return(CATALOG_NOT_CONNECTED);
07182 }
07183
07184 if (logSQL!=0) rodsLog(LOG_SQL, "chlCopyAVUMetadata SQL 1 ");
07185 objId1 = checkAndGetObjectId(rsComm, type1, name1, ACCESS_READ_METADATA);
07186 if (objId1 < 0) return(objId1);
07187
07188 if (logSQL!=0) rodsLog(LOG_SQL, "chlCopyAVUMetadata SQL 2");
07189 objId2 = checkAndGetObjectId(rsComm, type2, name2, ACCESS_CREATE_METADATA);
07190
07191 if (objId2 < 0) return(objId2);
07192
07193 snprintf(objIdStr1, MAX_NAME_LEN, "%lld", objId1);
07194 snprintf(objIdStr2, MAX_NAME_LEN, "%lld", objId2);
07195
07196 getNowStr(myTime);
07197 cllBindVars[cllBindVarCount++]=objIdStr2;
07198 cllBindVars[cllBindVarCount++]=myTime;
07199 cllBindVars[cllBindVarCount++]=myTime;
07200 cllBindVars[cllBindVarCount++]=objIdStr1;
07201 if (logSQL!=0) rodsLog(LOG_SQL, "chlCopyAVUMetadata SQL 3");
07202 status = cmlExecuteNoAnswerSql(
07203 "insert into R_OBJT_METAMAP (object_id, meta_id, create_ts, modify_ts) select ?, meta_id, ?, ? from R_OBJT_METAMAP where object_id=?",
07204 &icss);
07205 if (status != 0) {
07206 rodsLog(LOG_NOTICE,
07207 "chlCopyAVUMetadata cmlExecuteNoAnswerSql insert failure %d",
07208 status);
07209 _rollback("chlCopyAVUMetadata");
07210 return(status);
07211 }
07212
07213
07214 status = cmlAudit3(AU_COPY_AVU_METADATA,
07215 objIdStr1,
07216 rsComm->clientUser.userName,
07217 rsComm->clientUser.rodsZone,
07218 objIdStr2,
07219 &icss);
07220 if (status != 0) {
07221 rodsLog(LOG_NOTICE,
07222 "chlCopyAVUMetadata cmlAudit3 failure %d",
07223 status);
07224 _rollback("chlCopyAVUMetadata");
07225 return(status);
07226 }
07227
07228 status = cmlExecuteNoAnswerSql("commit", &icss);
07229 if (status != 0) {
07230 rodsLog(LOG_NOTICE,
07231 "chlCopyAVUMetadata cmlExecuteNoAnswerSql commit failure %d",
07232 status);
07233 return(status);
07234 }
07235
07236 return(status);
07237 }
07238
07239
07240 void
07241 makeEscapedPath(char *inPath, char *outPath, int size) {
07242 int i;
07243 for (i=0;i<size-1;i++) {
07244 if (*inPath=='%' || *inPath=='_') {
07245 *outPath++='\\';
07246 }
07247 if (*inPath=='\0') {
07248 *outPath++=*inPath++;
07249 break;
07250 }
07251 *outPath++=*inPath++;
07252 }
07253 return;
07254 }
07255
07256
07257
07258 int _modInheritance(int inheritFlag, int recursiveFlag, char *collIdStr, char *pathName) {
07259 rodsLong_t status;
07260 char myTime[50];
07261 char newValue[10];
07262 char pathStart[MAX_NAME_LEN*2];
07263 char auditStr[30];
07264
07265 if (recursiveFlag==0) {
07266 strcpy(auditStr, "inheritance non-recursive ");
07267 }
07268 else {
07269 strcpy(auditStr, "inheritance recursive ");
07270 }
07271
07272 if (inheritFlag==1) {
07273 newValue[0]='1';
07274 newValue[1]='\0';
07275 }
07276 else {
07277 newValue[0]='0';
07278 newValue[1]='\0';
07279 }
07280 strcat(auditStr, newValue);
07281
07282 getNowStr(myTime);
07283
07284
07285 if (recursiveFlag==0) {
07286
07287 if (logSQL!=0) rodsLog(LOG_SQL, "_modInheritance SQL 1");
07288
07289 cllBindVars[cllBindVarCount++]=newValue;
07290 cllBindVars[cllBindVarCount++]=myTime;
07291 cllBindVars[cllBindVarCount++]=collIdStr;
07292 status = cmlExecuteNoAnswerSql(
07293 "update R_COLL_MAIN set coll_inheritance=?, modify_ts=? where coll_id=?",
07294 &icss);
07295 }
07296 else {
07297
07298 makeEscapedPath(pathName, pathStart, sizeof(pathStart));
07299 strncat(pathStart, "/%", sizeof(pathStart));
07300
07301 cllBindVars[cllBindVarCount++]=newValue;
07302 cllBindVars[cllBindVarCount++]=myTime;
07303 cllBindVars[cllBindVarCount++]=pathName;
07304 cllBindVars[cllBindVarCount++]=pathStart;
07305 if (logSQL!=0) rodsLog(LOG_SQL, "_modInheritance SQL 2");
07306 status = cmlExecuteNoAnswerSql(
07307 "update R_COLL_MAIN set coll_inheritance=?, modify_ts=? where coll_name = ? or coll_name like ?",
07308 &icss);
07309 }
07310 if (status != 0) {
07311 _rollback("_modInheritance");
07312 return(status);
07313 }
07314
07315
07316 status = cmlAudit5(AU_MOD_ACCESS_CONTROL_COLL,
07317 collIdStr,
07318 "0",
07319 auditStr,
07320 &icss);
07321 if (status != 0) {
07322 rodsLog(LOG_NOTICE,
07323 "_modInheritance cmlAudit5 failure %d",
07324 status);
07325 _rollback("_modInheritance");
07326 return(status);
07327 }
07328
07329 status = cmlExecuteNoAnswerSql("commit", &icss);
07330 return(status);
07331 }
07332
07333 int chlModAccessControlResc(rsComm_t *rsComm, int recursiveFlag,
07334 char* accessLevel, char *userName, char *zone,
07335 char* rescName) {
07336 char myAccessStr[LONG_NAME_LEN];
07337 char rescIdStr[MAX_NAME_LEN];
07338 char *myAccessLev=NULL;
07339 int rmFlag=0;
07340 rodsLong_t status;
07341 char *myZone;
07342 rodsLong_t userId;
07343 char userIdStr[MAX_NAME_LEN];
07344 char myTime[50];
07345 rodsLong_t iVal;
07346 int debug=0;
07347
07348 strncpy(myAccessStr,accessLevel+strlen(MOD_RESC_PREFIX),LONG_NAME_LEN);
07349 myAccessStr[ LONG_NAME_LEN-1 ]='\0';
07350 if (debug>0) {
07351 printf("accessLevel: %s\n", accessLevel);
07352 printf("rescName: %s\n", rescName);
07353 }
07354
07355 if (strcmp(myAccessStr, AP_NULL)==0) {myAccessLev=ACCESS_NULL; rmFlag=1;}
07356 else if (strcmp(myAccessStr,AP_READ)==0) {myAccessLev=ACCESS_READ_OBJECT;}
07357 else if (strcmp(myAccessStr,AP_WRITE)==0){myAccessLev=ACCESS_MODIFY_OBJECT;}
07358 else if (strcmp(myAccessStr,AP_OWN)==0) {myAccessLev=ACCESS_OWN;}
07359 else {
07360 char errMsg[105];
07361 snprintf(errMsg, 100, "access level '%s' is invalid for a resource",
07362 myAccessStr);
07363 addRErrorMsg (&rsComm->rError, 0, errMsg);
07364 return(CAT_INVALID_ARGUMENT);
07365 }
07366
07367 if (rsComm->clientUser.authInfo.authFlag >= LOCAL_PRIV_USER_AUTH) {
07368
07369 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControlResc SQL 1");
07370 status = cmlGetIntegerValueFromSql(
07371 "select resc_id from R_RESC_MAIN where resc_name=?",
07372 &iVal, rescName, 0, 0, 0, 0, &icss);
07373 if (status==CAT_NO_ROWS_FOUND) return(CAT_UNKNOWN_RESOURCE);
07374 if (status<0) return(status);
07375 status = iVal;
07376 }
07377 else {
07378 status = cmlCheckResc(rescName,
07379 rsComm->clientUser.userName,
07380 rsComm->clientUser.rodsZone,
07381 ACCESS_OWN,
07382 &icss);
07383 if (status<0) return(status);
07384 }
07385 snprintf(rescIdStr, MAX_NAME_LEN, "%lld", status);
07386
07387
07388 status = getLocalZone();
07389 if (status != 0) return(status);
07390
07391 myZone=zone;
07392 if (zone == NULL || strlen(zone)==0) {
07393 myZone=localZone;
07394 }
07395
07396 userId=0;
07397 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControlResc SQL 2");
07398 status = cmlGetIntegerValueFromSql(
07399 "select user_id from R_USER_MAIN where user_name=? and R_USER_MAIN.zone_name=?",
07400 &userId, userName, myZone, 0, 0, 0, &icss);
07401 if (status != 0) {
07402 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_USER);
07403 return(status);
07404 }
07405
07406 snprintf(userIdStr, MAX_NAME_LEN, "%lld", userId);
07407
07408
07409 cllBindVars[cllBindVarCount++]=userIdStr;
07410 cllBindVars[cllBindVarCount++]=rescIdStr;
07411 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControlResc SQL 3");
07412 status = cmlExecuteNoAnswerSql(
07413 "delete from R_OBJT_ACCESS where user_id=? and object_id=?",
07414 &icss);
07415 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
07416 return(status);
07417 }
07418
07419
07420 if (rmFlag==0) {
07421 getNowStr(myTime);
07422 cllBindVars[cllBindVarCount++]=rescIdStr;
07423 cllBindVars[cllBindVarCount++]=userIdStr;
07424 cllBindVars[cllBindVarCount++]=myAccessLev;
07425 cllBindVars[cllBindVarCount++]=myTime;
07426 cllBindVars[cllBindVarCount++]=myTime;
07427 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControlResc SQL 4");
07428 status = cmlExecuteNoAnswerSql(
07429 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) values (?, ?, (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ?)",
07430 &icss);
07431 if (status != 0) {
07432 _rollback("chlModAccessControlResc");
07433 return(status);
07434 }
07435 }
07436
07437
07438 status = cmlAudit5(AU_MOD_ACCESS_CONTROL_RESOURCE,
07439 rescIdStr,
07440 userIdStr,
07441 myAccessLev,
07442 &icss);
07443 if (status != 0) {
07444 rodsLog(LOG_NOTICE,
07445 "chlModAccessControlResc cmlAudit5 failure %d",
07446 status);
07447 _rollback("chlModAccessControlResc");
07448 return(status);
07449 }
07450
07451 status = cmlExecuteNoAnswerSql("commit", &icss);
07452 return(status);
07453 }
07454
07455
07456
07457
07458
07459
07460 int chlModAccessControl(rsComm_t *rsComm, int recursiveFlag,
07461 char* accessLevel, char *userName, char *zone,
07462 char* pathName) {
07463 char *myAccessLev=NULL;
07464 char logicalEndName[MAX_NAME_LEN];
07465 char logicalParentDirName[MAX_NAME_LEN];
07466 char collIdStr[MAX_NAME_LEN];
07467 rodsLong_t objId=0;
07468 rodsLong_t status, status1, status2, status3;
07469 int rmFlag=0;
07470 rodsLong_t userId;
07471 char myTime[50];
07472 char *myZone;
07473 char userIdStr[MAX_NAME_LEN];
07474 char objIdStr[MAX_NAME_LEN];
07475 char pathStart[MAX_NAME_LEN*2];
07476 int inheritFlag=0;
07477 char myAccessStr[LONG_NAME_LEN];
07478 int adminMode=0;
07479 rodsLong_t iVal;
07480
07481 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl");
07482
07483 if (strncmp(accessLevel, MOD_RESC_PREFIX, strlen(MOD_RESC_PREFIX))==0) {
07484 return(chlModAccessControlResc(rsComm, recursiveFlag,
07485 accessLevel, userName, zone, pathName));
07486 }
07487
07488 adminMode=0;
07489 if (strncmp(accessLevel, MOD_ADMIN_MODE_PREFIX,
07490 strlen(MOD_ADMIN_MODE_PREFIX))==0) {
07491 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
07492 addRErrorMsg (&rsComm->rError, 0,
07493 "You must be the admin to use the -M admin mode");
07494 return(CAT_NO_ACCESS_PERMISSION);
07495 }
07496 strncpy(myAccessStr,accessLevel+strlen(MOD_ADMIN_MODE_PREFIX),
07497 LONG_NAME_LEN);
07498 accessLevel = myAccessStr;
07499 adminMode=1;
07500 }
07501
07502 if (strcmp(accessLevel, AP_NULL)==0) {myAccessLev=ACCESS_NULL; rmFlag=1;}
07503 else if (strcmp(accessLevel,AP_READ)==0) {myAccessLev=ACCESS_READ_OBJECT;}
07504 else if (strcmp(accessLevel,AP_WRITE)==0){myAccessLev=ACCESS_MODIFY_OBJECT;}
07505 else if (strcmp(accessLevel,AP_OWN)==0) {myAccessLev=ACCESS_OWN;}
07506 else if (strcmp(accessLevel,ACCESS_INHERIT)==0) {
07507 inheritFlag=1;
07508 }
07509 else if (strcmp(accessLevel,ACCESS_NO_INHERIT)==0) {
07510 inheritFlag=2;
07511 }
07512 else {
07513 char errMsg[105];
07514 snprintf(errMsg, 100, "access level '%s' is invalid",
07515 accessLevel);
07516 addRErrorMsg (&rsComm->rError, 0, errMsg);
07517 return(CAT_INVALID_ARGUMENT);
07518 }
07519
07520 if (!icss.status) {
07521 return(CATALOG_NOT_CONNECTED);
07522 }
07523
07524 if (adminMode) {
07525
07526
07527 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 14");
07528 status1 = cmlGetIntegerValueFromSql(
07529 "select coll_id from R_COLL_MAIN where coll_name=?",
07530 &iVal, pathName, 0, 0, 0, 0, &icss);
07531 if (status1==CAT_NO_ROWS_FOUND) {
07532 status1=CAT_UNKNOWN_COLLECTION;
07533 }
07534 if (status1==0) status1=iVal;
07535 }
07536 else {
07537
07538
07539 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 1 ");
07540 status1 = cmlCheckDir(pathName,
07541 rsComm->clientUser.userName,
07542 rsComm->clientUser.rodsZone,
07543 ACCESS_OWN,
07544 &icss);
07545 }
07546 if (status1 >= 0) {
07547 snprintf(collIdStr, MAX_NAME_LEN, "%lld", status1);
07548 }
07549
07550 if (status1 < 0 && inheritFlag!=0) {
07551 char errMsg[105];
07552 snprintf(errMsg, 100, "access level '%s' is valid only for collections",
07553 accessLevel);
07554 addRErrorMsg (&rsComm->rError, 0, errMsg);
07555 return(CAT_INVALID_ARGUMENT);
07556 }
07557
07558
07559 if (status1 < 0) {
07560 status2 = splitPathByKey(pathName,
07561 logicalParentDirName, logicalEndName, '/');
07562 if (strlen(logicalParentDirName)==0) {
07563 strcpy(logicalParentDirName, "/");
07564 strcpy(logicalEndName, pathName+1);
07565 }
07566 if (adminMode) {
07567 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 15");
07568 status2 = cmlGetIntegerValueFromSql(
07569 "select data_id from R_DATA_MAIN DM, R_COLL_MAIN CM where DM.data_name=? and DM.coll_id=CM.coll_id and CM.coll_name=?",
07570 &iVal, logicalEndName, logicalParentDirName, 0, 0, 0, &icss);
07571 if (status2==CAT_NO_ROWS_FOUND) status2=CAT_UNKNOWN_FILE;
07572 if (status2==0) status2=iVal;
07573 }
07574 else {
07575
07576
07577 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 2");
07578 status2 = cmlCheckDataObjOnly(logicalParentDirName, logicalEndName,
07579 rsComm->clientUser.userName,
07580 rsComm->clientUser.rodsZone,
07581 ACCESS_OWN, &icss);
07582 }
07583 if (status2 > 0) objId=status2;
07584 }
07585
07586
07587 if (status1 < 0 && status2 < 0) {
07588 char errMsg[205];
07589
07590 if (status1 == CAT_UNKNOWN_COLLECTION && status2 == CAT_UNKNOWN_FILE) {
07591 snprintf(errMsg, 200,
07592 "Input path is not a collection and not a dataObj: %s",
07593 pathName);
07594 addRErrorMsg (&rsComm->rError, 0, errMsg);
07595 return(CAT_INVALID_ARGUMENT);
07596 }
07597 if (status1 != CAT_UNKNOWN_COLLECTION) {
07598 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 12");
07599 status3 = cmlCheckDirOwn(pathName,
07600 rsComm->clientUser.userName,
07601 rsComm->clientUser.rodsZone,
07602 &icss);
07603 if (status3 < 0) return(status1);
07604 snprintf(collIdStr, MAX_NAME_LEN, "%lld", status3);
07605 }
07606 else {
07607 if (status2 == CAT_NO_ACCESS_PERMISSION) {
07608
07609
07610 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 13");
07611 status3 = cmlCheckDataObjOwn(logicalParentDirName, logicalEndName,
07612 rsComm->clientUser.userName,
07613 rsComm->clientUser.rodsZone,
07614 &icss);
07615 if (status3 < 0) {
07616 _rollback("chlModAccessControl");
07617 return(status2);
07618 }
07619 objId = status3;
07620 } else {
07621 return(status2);
07622 }
07623 }
07624 }
07625
07626
07627 if (inheritFlag!=0) {
07628 status = _modInheritance(inheritFlag, recursiveFlag, collIdStr, pathName);
07629 return(status);
07630 }
07631
07632
07633 status = getLocalZone();
07634 if (status != 0) return(status);
07635
07636 myZone=zone;
07637 if (zone == NULL || strlen(zone)==0) {
07638 myZone=localZone;
07639 }
07640
07641 userId=0;
07642 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 3");
07643 status = cmlGetIntegerValueFromSql(
07644 "select user_id from R_USER_MAIN where user_name=? and R_USER_MAIN.zone_name=?",
07645 &userId, userName, myZone, 0, 0, 0, &icss);
07646 if (status != 0) {
07647 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_USER);
07648 return(status);
07649 }
07650
07651 snprintf(userIdStr, MAX_NAME_LEN, "%lld", userId);
07652 snprintf(objIdStr, MAX_NAME_LEN, "%lld", objId);
07653
07654 rodsLog(LOG_NOTICE, "recursiveFlag %d",recursiveFlag);
07655
07656
07657 if (recursiveFlag==0) {
07658
07659
07660 if (objId) {
07661 cllBindVars[cllBindVarCount++]=userIdStr;
07662 cllBindVars[cllBindVarCount++]=objIdStr;
07663 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 4");
07664 status = cmlExecuteNoAnswerSql(
07665 "delete from R_OBJT_ACCESS where user_id=? and object_id=?",
07666 &icss);
07667 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
07668 return(status);
07669 }
07670 if (rmFlag==0) {
07671 getNowStr(myTime);
07672 cllBindVars[cllBindVarCount++]=objIdStr;
07673 cllBindVars[cllBindVarCount++]=userIdStr;
07674 cllBindVars[cllBindVarCount++]=myAccessLev;
07675 cllBindVars[cllBindVarCount++]=myTime;
07676 cllBindVars[cllBindVarCount++]=myTime;
07677 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 5");
07678 status = cmlExecuteNoAnswerSql(
07679 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) values (?, ?, (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ?)",
07680 &icss);
07681 if (status != 0) {
07682 _rollback("chlModAccessControl");
07683 return(status);
07684 }
07685 }
07686
07687
07688 status = cmlAudit5(AU_MOD_ACCESS_CONTROL_OBJ,
07689 objIdStr,
07690 userIdStr,
07691 myAccessLev,
07692 &icss);
07693 if (status != 0) {
07694 rodsLog(LOG_NOTICE,
07695 "chlModAccessControl cmlAudit5 failure %d",
07696 status);
07697 _rollback("chlModAccessControl");
07698 return(status);
07699 }
07700
07701 status = cmlExecuteNoAnswerSql("commit", &icss);
07702 return(status);
07703 }
07704
07705
07706 cllBindVars[cllBindVarCount++]=userIdStr;
07707 cllBindVars[cllBindVarCount++]=collIdStr;
07708 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 6");
07709 status = cmlExecuteNoAnswerSql(
07710 "delete from R_OBJT_ACCESS where user_id=? and object_id=?",
07711 &icss);
07712 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
07713 _rollback("chlModAccessControl");
07714 return(status);
07715 }
07716 if (rmFlag) {
07717
07718 status = cmlAudit5(AU_MOD_ACCESS_CONTROL_COLL,
07719 collIdStr,
07720 userIdStr,
07721 myAccessLev,
07722 &icss);
07723 if (status != 0) {
07724 rodsLog(LOG_NOTICE,
07725 "chlModAccessControl cmlAudit5 failure %d",
07726 status);
07727 _rollback("chlModAccessControl");
07728 return(status);
07729 }
07730 status = cmlExecuteNoAnswerSql("commit", &icss);
07731 return(status);
07732 }
07733
07734 getNowStr(myTime);
07735 cllBindVars[cllBindVarCount++]=collIdStr;
07736 cllBindVars[cllBindVarCount++]=userIdStr;
07737 cllBindVars[cllBindVarCount++]=myAccessLev;
07738 cllBindVars[cllBindVarCount++]=myTime;
07739 cllBindVars[cllBindVarCount++]=myTime;
07740 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 7");
07741 status = cmlExecuteNoAnswerSql(
07742 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) values (?, ?, (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ?)",
07743 &icss);
07744
07745 if (status != 0) {
07746 _rollback("chlModAccessControl");
07747 return(status);
07748 }
07749
07750 status = cmlAudit5(AU_MOD_ACCESS_CONTROL_COLL,
07751 collIdStr,
07752 userIdStr,
07753 myAccessLev,
07754 &icss);
07755 if (status != 0) {
07756 rodsLog(LOG_NOTICE,
07757 "chlModAccessControl cmlAudit5 failure %d",
07758 status);
07759 _rollback("chlModAccessControl");
07760 return(status);
07761 }
07762
07763 status = cmlExecuteNoAnswerSql("commit", &icss);
07764 return(status);
07765 }
07766
07767
07768
07769 if (objId) {
07770 char errMsg[205];
07771
07772 snprintf(errMsg, 200,
07773 "Input path is not a collection and recursion was requested: %s",
07774 pathName);
07775 addRErrorMsg (&rsComm->rError, 0, errMsg);
07776 return(CAT_INVALID_ARGUMENT);
07777 }
07778
07779
07780 makeEscapedPath(pathName, pathStart, sizeof(pathStart));
07781 strncat(pathStart, "/%", sizeof(pathStart));
07782
07783 cllBindVars[cllBindVarCount++]=userIdStr;
07784 cllBindVars[cllBindVarCount++]=pathName;
07785 cllBindVars[cllBindVarCount++]=pathStart;
07786
07787 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 8");
07788 status = cmlExecuteNoAnswerSql(
07789 "delete from R_OBJT_ACCESS where user_id=? and object_id in (select data_id from R_DATA_MAIN where coll_id in (select coll_id from R_COLL_MAIN where coll_name = ? or coll_name like ?))",
07790 &icss);
07791
07792 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
07793 _rollback("chlModAccessControl");
07794 return(status);
07795 }
07796
07797 cllBindVars[cllBindVarCount++]=userIdStr;
07798 cllBindVars[cllBindVarCount++]=pathName;
07799 cllBindVars[cllBindVarCount++]=pathStart;
07800
07801 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 9");
07802 status = cmlExecuteNoAnswerSql(
07803 "delete from R_OBJT_ACCESS where user_id=? and object_id in (select coll_id from R_COLL_MAIN where coll_name = ? or coll_name like ?)",
07804 &icss);
07805 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
07806 _rollback("chlModAccessControl");
07807 return(status);
07808 }
07809 if (rmFlag) {
07810
07811
07812 status = cmlAudit5(AU_MOD_ACCESS_CONTROL_COLL_RECURSIVE,
07813 collIdStr,
07814 userIdStr,
07815 myAccessLev,
07816 &icss);
07817 if (status != 0) {
07818 rodsLog(LOG_NOTICE,
07819 "chlModAccessControl cmlAudit5 failure %d",
07820 status);
07821 _rollback("chlModAccessControl");
07822 return(status);
07823 }
07824
07825 status = cmlExecuteNoAnswerSql("commit", &icss);
07826 return(status);
07827 }
07828
07829 getNowStr(myTime);
07830 makeEscapedPath(pathName, pathStart, sizeof(pathStart));
07831 strncat(pathStart, "/%", sizeof(pathStart));
07832 cllBindVars[cllBindVarCount++]=userIdStr;
07833 cllBindVars[cllBindVarCount++]=myAccessLev;
07834 cllBindVars[cllBindVarCount++]=myTime;
07835 cllBindVars[cllBindVarCount++]=myTime;
07836 cllBindVars[cllBindVarCount++]=pathName;
07837 cllBindVars[cllBindVarCount++]=pathStart;
07838 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 10");
07839 #if ORA_ICAT
07840
07841 status = cmlExecuteNoAnswerSql(
07842 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) (select distinct data_id, cast(? as integer), (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ? from R_DATA_MAIN where coll_id in (select coll_id from R_COLL_MAIN where coll_name = ? or coll_name like ?))",
07843 &icss);
07844 #elif MY_ICAT
07845 status = cmlExecuteNoAnswerSql(
07846 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) (select distinct data_id, ?, (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ? from R_DATA_MAIN where coll_id in (select coll_id from R_COLL_MAIN where coll_name = ? or coll_name like ?))",
07847 &icss);
07848 #else
07849 status = cmlExecuteNoAnswerSql(
07850 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) (select distinct data_id, cast(? as bigint), (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ? from R_DATA_MAIN where coll_id in (select coll_id from R_COLL_MAIN where coll_name = ? or coll_name like ?))",
07851 &icss);
07852 #endif
07853 if (status == CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
07854 if (status != 0) {
07855 _rollback("chlModAccessControl");
07856 return(status);
07857 }
07858
07859
07860
07861 cllBindVars[cllBindVarCount++]=userIdStr;
07862 cllBindVars[cllBindVarCount++]=myAccessLev;
07863 cllBindVars[cllBindVarCount++]=myTime;
07864 cllBindVars[cllBindVarCount++]=myTime;
07865 cllBindVars[cllBindVarCount++]=pathName;
07866 cllBindVars[cllBindVarCount++]=pathStart;
07867 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 11");
07868 #if ORA_ICAT
07869
07870 status = cmlExecuteNoAnswerSql(
07871 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) (select distinct coll_id, cast(? as integer), (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ? from R_COLL_MAIN where coll_name = ? or coll_name like ?)",
07872 &icss);
07873 #elif MY_ICAT
07874 status = cmlExecuteNoAnswerSql(
07875 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) (select distinct coll_id, ?, (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ? from R_COLL_MAIN where coll_name = ? or coll_name like ?)",
07876 &icss);
07877 #else
07878 status = cmlExecuteNoAnswerSql(
07879 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) (select distinct coll_id, cast(? as bigint), (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ? from R_COLL_MAIN where coll_name = ? or coll_name like ?)",
07880 &icss);
07881 #endif
07882 if (status != 0) {
07883 _rollback("chlModAccessControl");
07884 return(status);
07885 }
07886
07887
07888 status = cmlAudit5(AU_MOD_ACCESS_CONTROL_COLL_RECURSIVE,
07889 collIdStr,
07890 userIdStr,
07891 myAccessLev,
07892 &icss);
07893 if (status != 0) {
07894 rodsLog(LOG_NOTICE,
07895 "chlModAccessControl cmlAudit5 failure %d",
07896 status);
07897 _rollback("chlModAccessControl");
07898 return(status);
07899 }
07900
07901 status = cmlExecuteNoAnswerSql("commit", &icss);
07902 return(status);
07903 }
07904
07905
07906
07907
07908 int chlRenameObject(rsComm_t *rsComm, rodsLong_t objId,
07909 char* newName) {
07910 int status;
07911 rodsLong_t collId;
07912 rodsLong_t otherDataId;
07913 rodsLong_t otherCollId;
07914 char myTime[50];
07915
07916 char parentCollName[MAX_NAME_LEN]="";
07917 char collName[MAX_NAME_LEN]="";
07918 char *cVal[3];
07919 int iVal[3];
07920 int pLen, cLen, len;
07921 int isRootDir=0;
07922 char objIdString[MAX_NAME_LEN];
07923 char collIdString[MAX_NAME_LEN];
07924 char collNameTmp[MAX_NAME_LEN];
07925
07926 char pLenStr[MAX_NAME_LEN];
07927 char cLenStr[MAX_NAME_LEN];
07928 char collNameSlash[MAX_NAME_LEN];
07929 char collNameSlashLen[20];
07930 char slashNewName[MAX_NAME_LEN];
07931
07932 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject");
07933
07934 if (strstr(newName, "/")) {
07935 return(CAT_INVALID_ARGUMENT);
07936 }
07937
07938
07939
07940 collId=0;
07941
07942 snprintf(objIdString, MAX_NAME_LEN, "%lld", objId);
07943 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 1 ");
07944
07945 status = cmlGetIntegerValueFromSql(
07946 "select coll_id from R_DATA_MAIN DM, R_OBJT_ACCESS OA, R_USER_GROUP UG, R_USER_MAIN UM, R_TOKN_MAIN TM where DM.data_id=? and UM.user_name=? and UM.zone_name=? and UM.user_type_name!='rodsgroup' and UM.user_id = UG.user_id and OA.object_id = DM.data_id and UG.group_user_id = OA.user_id and OA.access_type_id >= TM.token_id and TM.token_namespace ='access_type' and TM.token_name = 'own'",
07947 &collId, objIdString, rsComm->clientUser.userName, rsComm->clientUser.rodsZone,
07948 0, 0, &icss);
07949
07950 if (status == 0) {
07951
07952
07953 snprintf(collIdString, MAX_NAME_LEN, "%lld", collId);
07954 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 2");
07955 status = cmlGetIntegerValueFromSql(
07956 "select data_id from R_DATA_MAIN where data_name=? and coll_id=?",
07957 &otherDataId,
07958 newName, collIdString, 0, 0, 0, &icss);
07959 if (status!=CAT_NO_ROWS_FOUND) {
07960 return( CAT_NAME_EXISTS_AS_DATAOBJ);
07961 }
07962
07963
07964
07965 snprintf(collNameTmp, MAX_NAME_LEN, "/%s", newName);
07966 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 3");
07967 status = cmlGetIntegerValueFromSql(
07968 "select coll_id from R_COLL_MAIN where coll_name = ( select coll_name from R_COLL_MAIN where coll_id=? ) || ?",
07969 &otherCollId, collIdString, collNameTmp, 0, 0, 0, &icss);
07970 if (status!=CAT_NO_ROWS_FOUND) {
07971 return( CAT_NAME_EXISTS_AS_COLLECTION);
07972 }
07973
07974
07975 getNowStr(myTime);
07976 cllBindVars[cllBindVarCount++]=newName;
07977 cllBindVars[cllBindVarCount++]=objIdString;
07978 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 4");
07979 status = cmlExecuteNoAnswerSql(
07980 "update R_DATA_MAIN set data_name = ? where data_id=?",
07981 &icss);
07982 if (status != 0) {
07983 rodsLog(LOG_NOTICE,
07984 "chlRenameObject cmlExecuteNoAnswerSql update1 failure %d",
07985 status);
07986 _rollback("chlRenameObject");
07987 return(status);
07988 }
07989
07990 cllBindVars[cllBindVarCount++]=myTime;
07991 cllBindVars[cllBindVarCount++]=collIdString;
07992 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 5");
07993 status = cmlExecuteNoAnswerSql(
07994 "update R_COLL_MAIN set modify_ts=? where coll_id=?",
07995 &icss);
07996 if (status != 0) {
07997 rodsLog(LOG_NOTICE,
07998 "chlRenameObject cmlExecuteNoAnswerSql update2 failure %d",
07999 status);
08000 _rollback("chlRenameObject");
08001 return(status);
08002 }
08003
08004
08005 status = cmlAudit3(AU_RENAME_DATA_OBJ,
08006 objIdString,
08007 rsComm->clientUser.userName,
08008 rsComm->clientUser.rodsZone,
08009 newName,
08010 &icss);
08011 if (status != 0) {
08012 rodsLog(LOG_NOTICE,
08013 "chlRenameObject cmlAudit3 failure %d",
08014 status);
08015 _rollback("chlRenameObject");
08016 return(status);
08017 }
08018
08019 return(status);
08020 }
08021
08022
08023
08024
08025 cVal[0]=parentCollName;
08026 iVal[0]=MAX_NAME_LEN;
08027 cVal[1]=collName;
08028 iVal[1]=MAX_NAME_LEN;
08029
08030 snprintf(objIdString, MAX_NAME_LEN, "%lld", objId);
08031 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 6");
08032
08033 status = cmlGetStringValuesFromSql(
08034 "select parent_coll_name, coll_name from R_COLL_MAIN CM, R_OBJT_ACCESS OA, R_USER_GROUP UG, R_USER_MAIN UM, R_TOKN_MAIN TM where CM.coll_id=? and UM.user_name=? and UM.zone_name=? and UM.user_type_name!='rodsgroup' and UM.user_id = UG.user_id and OA.object_id = CM.coll_id and UG.group_user_id = OA.user_id and OA.access_type_id >= TM.token_id and TM.token_namespace ='access_type' and TM.token_name = 'own'",
08035 cVal, iVal, 2, objIdString,
08036 rsComm->clientUser.userName, rsComm->clientUser.rodsZone, &icss);
08037 if (status == 0) {
08038
08039
08040
08041 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 7");
08042 status = cmlGetIntegerValueFromSql(
08043 "select data_id from R_DATA_MAIN where data_name=? and coll_id= (select coll_id from R_COLL_MAIN where coll_name = ?)",
08044 &otherDataId, newName, parentCollName, 0, 0, 0, &icss);
08045 if (status!=CAT_NO_ROWS_FOUND) {
08046 return( CAT_NAME_EXISTS_AS_DATAOBJ);
08047 }
08048
08049
08050
08051 snprintf(collNameTmp, MAX_NAME_LEN, "%s/%s", parentCollName, newName);
08052 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 8");
08053 status = cmlGetIntegerValueFromSql(
08054 "select coll_id from R_COLL_MAIN where coll_name = ?",
08055 &otherCollId, collNameTmp, 0, 0, 0, 0, &icss);
08056 if (status!=CAT_NO_ROWS_FOUND) {
08057 return( CAT_NAME_EXISTS_AS_COLLECTION);
08058 }
08059
08060
08061 pLen = strlen(parentCollName);
08062 cLen=strlen(collName);
08063 if (pLen<=0 || cLen <=0) return(CAT_INVALID_ARGUMENT);
08064
08065
08066 if (pLen==1) {
08067 if (strncmp(parentCollName, "/", 20) == 0) {
08068 isRootDir=1;
08069 }
08070 }
08071
08072
08073
08074
08075
08076
08077 snprintf(pLenStr,MAX_NAME_LEN, "%d", pLen);
08078
08079
08080 snprintf(cLenStr,MAX_NAME_LEN, "%d", cLen+1);
08081 snprintf(collNameSlash, MAX_NAME_LEN, "%s/", collName);
08082 len = strlen(collNameSlash);
08083 snprintf(collNameSlashLen, 10, "%d", len);
08084 snprintf(slashNewName, MAX_NAME_LEN, "/%s", newName);
08085 if (isRootDir) {
08086 snprintf(slashNewName, MAX_NAME_LEN, "%s", newName);
08087 }
08088 cllBindVars[cllBindVarCount++]=pLenStr;
08089 cllBindVars[cllBindVarCount++]=slashNewName;
08090 cllBindVars[cllBindVarCount++]=cLenStr;
08091 cllBindVars[cllBindVarCount++]=collNameSlashLen;
08092 cllBindVars[cllBindVarCount++]=collNameSlash;
08093 cllBindVars[cllBindVarCount++]=collName;
08094 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 9");
08095 status = cmlExecuteNoAnswerSql(
08096 "update R_COLL_MAIN set coll_name = substr(coll_name,1,?) || ? || substr(coll_name, ?) where substr(parent_coll_name,1,?) = ? or parent_coll_name = ?",
08097 &icss);
08098 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
08099 rodsLog(LOG_NOTICE,
08100 "chlRenameObject cmlExecuteNoAnswerSql update failure %d",
08101 status);
08102 _rollback("chlRenameObject");
08103 return(status);
08104 }
08105
08106
08107 cllBindVars[cllBindVarCount++]=pLenStr;
08108 cllBindVars[cllBindVarCount++]=slashNewName;
08109 cllBindVars[cllBindVarCount++]=cLenStr;
08110 cllBindVars[cllBindVarCount++]=collNameSlashLen;
08111 cllBindVars[cllBindVarCount++]=collNameSlash;
08112 cllBindVars[cllBindVarCount++]=collName;
08113 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 10");
08114 status = cmlExecuteNoAnswerSql(
08115 "update R_COLL_MAIN set parent_coll_name = substr(parent_coll_name,1,?) || ? || substr(parent_coll_name, ?) where substr(parent_coll_name,1,?) = ? or parent_coll_name = ?",
08116 &icss);
08117 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
08118 rodsLog(LOG_NOTICE,
08119 "chlRenameObject cmlExecuteNoAnswerSql update failure %d",
08120 status);
08121 _rollback("chlRenameObject");
08122 return(status);
08123 }
08124
08125
08126 getNowStr(myTime);
08127 snprintf(collNameTmp, MAX_NAME_LEN, "%s/%s", parentCollName, newName);
08128 if (isRootDir) {
08129 snprintf(collNameTmp, MAX_NAME_LEN, "%s%s", parentCollName, newName);
08130 }
08131 cllBindVars[cllBindVarCount++]=collNameTmp;
08132 cllBindVars[cllBindVarCount++]=myTime;
08133 cllBindVars[cllBindVarCount++]=objIdString;
08134 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 11");
08135 status = cmlExecuteNoAnswerSql(
08136 "update R_COLL_MAIN set coll_name=?, modify_ts=? where coll_id=?",
08137 &icss);
08138 if (status != 0) {
08139 rodsLog(LOG_NOTICE,
08140 "chlRenameObject cmlExecuteNoAnswerSql update failure %d",
08141 status);
08142 _rollback("chlRenameObject");
08143 return(status);
08144 }
08145
08146
08147 status = cmlAudit3(AU_RENAME_COLLECTION,
08148 objIdString,
08149 rsComm->clientUser.userName,
08150 rsComm->clientUser.rodsZone,
08151 newName,
08152 &icss);
08153 if (status != 0) {
08154 rodsLog(LOG_NOTICE,
08155 "chlRenameObject cmlAudit3 failure %d",
08156 status);
08157 _rollback("chlRenameObject");
08158 return(status);
08159 }
08160
08161 return(status);
08162
08163 }
08164
08165
08166
08167
08168
08169 snprintf(objIdString, MAX_NAME_LEN, "%lld", objId);
08170 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 12");
08171 status = cmlGetIntegerValueFromSql(
08172 "select coll_id from R_DATA_MAIN where data_id=?",
08173 &otherDataId, objIdString, 0, 0, 0, 0, &icss);
08174 if (status == 0) {
08175
08176 return (CAT_NO_ACCESS_PERMISSION);
08177 }
08178
08179 snprintf(collIdString, MAX_NAME_LEN, "%lld", objId);
08180 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 12");
08181 status = cmlGetIntegerValueFromSql(
08182 "select coll_id from R_COLL_MAIN where coll_id=?",
08183 &otherDataId, collIdString, 0, 0, 0, 0, &icss);
08184 if (status == 0) {
08185
08186 return (CAT_NO_ACCESS_PERMISSION);
08187 }
08188
08189 return(CAT_NOT_A_DATAOBJ_AND_NOT_A_COLLECTION);
08190 }
08191
08192
08193
08194
08195
08196 int chlMoveObject(rsComm_t *rsComm, rodsLong_t objId,
08197 rodsLong_t targetCollId) {
08198 int status;
08199 rodsLong_t collId;
08200 rodsLong_t otherDataId;
08201 rodsLong_t otherCollId;
08202 char myTime[50];
08203
08204 char dataObjName[MAX_NAME_LEN]="";
08205 char *cVal[3];
08206 int iVal[3];
08207
08208 char parentCollName[MAX_NAME_LEN]="";
08209 char oldCollName[MAX_NAME_LEN]="";
08210 char endCollName[MAX_NAME_LEN]="";
08211
08212
08213 char targetCollName[MAX_NAME_LEN]="";
08214 char parentTargetCollName[MAX_NAME_LEN]="";
08215 char newCollName[MAX_NAME_LEN]="";
08216 int pLen, ocLen;
08217 int i, OK, len;
08218 char *cp;
08219 char objIdString[MAX_NAME_LEN];
08220 char collIdString[MAX_NAME_LEN];
08221 char nameTmp[MAX_NAME_LEN];
08222 char ocLenStr[MAX_NAME_LEN];
08223 char collNameSlash[MAX_NAME_LEN];
08224 char collNameSlashLen[20];
08225
08226 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject");
08227
08228
08229
08230 cVal[0]=parentTargetCollName;
08231 iVal[0]=MAX_NAME_LEN;
08232 cVal[1]=targetCollName;
08233 iVal[1]=MAX_NAME_LEN;
08234 snprintf(objIdString, MAX_NAME_LEN, "%lld", targetCollId);
08235 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 1 ");
08236 status = cmlGetStringValuesFromSql(
08237 "select parent_coll_name, coll_name from R_COLL_MAIN CM, R_OBJT_ACCESS OA, R_USER_GROUP UG, R_USER_MAIN UM, R_TOKN_MAIN TM where CM.coll_id=? and UM.user_name=? and UM.zone_name=? and UM.user_type_name!='rodsgroup' and UM.user_id = UG.user_id and OA.object_id = CM.coll_id and UG.group_user_id = OA.user_id and OA.access_type_id >= TM.token_id and TM.token_namespace ='access_type' and TM.token_name = 'own'",
08238 cVal, iVal, 2, objIdString,
08239 rsComm->clientUser.userName,
08240 rsComm->clientUser.rodsZone, &icss);
08241
08242 snprintf(collIdString, MAX_NAME_LEN, "%lld", targetCollId);
08243 if (status != 0) {
08244 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 2");
08245 status = cmlGetIntegerValueFromSql(
08246 "select coll_id from R_COLL_MAIN where coll_id=?",
08247 &collId, collIdString, 0, 0, 0, 0, &icss);
08248 if (status==0) {
08249 return (CAT_NO_ACCESS_PERMISSION);
08250
08251 }
08252 return(CAT_UNKNOWN_COLLECTION);
08253 }
08254
08255
08256
08257
08258 snprintf(objIdString, MAX_NAME_LEN, "%lld", objId);
08259 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 3");
08260 status = cmlGetStringValueFromSql(
08261 "select data_name from R_DATA_MAIN DM, R_OBJT_ACCESS OA, R_USER_GROUP UG, R_USER_MAIN UM, R_TOKN_MAIN TM where DM.data_id=? and UM.user_name=? and UM.zone_name=? and UM.user_type_name!='rodsgroup' and UM.user_id = UG.user_id and OA.object_id = DM.data_id and UG.group_user_id = OA.user_id and OA.access_type_id >= TM.token_id and TM.token_namespace ='access_type' and TM.token_name = 'own'",
08262 dataObjName, MAX_NAME_LEN, objIdString,
08263 rsComm->clientUser.userName,
08264 rsComm->clientUser.rodsZone, &icss);
08265 snprintf(collIdString, MAX_NAME_LEN, "%lld", targetCollId);
08266 if (status == 0) {
08267
08268
08269
08270 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 4");
08271 status = cmlGetIntegerValueFromSql(
08272 "select data_id from R_DATA_MAIN where data_name=? and coll_id=?",
08273 &otherDataId, dataObjName, collIdString, 0, 0, 0, &icss);
08274 if (status!=CAT_NO_ROWS_FOUND) {
08275 return( CAT_NAME_EXISTS_AS_DATAOBJ);
08276 }
08277
08278
08279
08280
08281 snprintf(nameTmp, MAX_NAME_LEN, "/%s", dataObjName);
08282 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 5");
08283 status = cmlGetIntegerValueFromSql(
08284 "select coll_id from R_COLL_MAIN where coll_name = ( select coll_name from R_COLL_MAIN where coll_id=? ) || ?",
08285 &otherCollId, collIdString, nameTmp, 0, 0, 0, &icss);
08286 if (status!=CAT_NO_ROWS_FOUND) {
08287 return( CAT_NAME_EXISTS_AS_COLLECTION);
08288 }
08289
08290
08291 getNowStr(myTime);
08292 cllBindVars[cllBindVarCount++]=collIdString;
08293 cllBindVars[cllBindVarCount++]=myTime;
08294 cllBindVars[cllBindVarCount++]=objIdString;
08295 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 6");
08296 status = cmlExecuteNoAnswerSql(
08297 "update R_DATA_MAIN set coll_id=?, modify_ts=? where data_id=?",
08298 &icss);
08299 if (status != 0) {
08300 rodsLog(LOG_NOTICE,
08301 "chlMoveObject cmlExecuteNoAnswerSql update1 failure %d",
08302 status);
08303 _rollback("chlMoveObject");
08304 return(status);
08305 }
08306
08307
08308 cllBindVars[cllBindVarCount++]=myTime;
08309 cllBindVars[cllBindVarCount++]=collIdString;
08310 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 7");
08311 status = cmlExecuteNoAnswerSql(
08312 "update R_COLL_MAIN set modify_ts=? where coll_id=?",
08313 &icss);
08314 if (status != 0) {
08315 rodsLog(LOG_NOTICE,
08316 "chlMoveObject cmlExecuteNoAnswerSql update2 failure %d",
08317 status);
08318 _rollback("chlMoveObject");
08319 return(status);
08320 }
08321
08322
08323 status = cmlAudit3(AU_MOVE_DATA_OBJ,
08324 objIdString,
08325 rsComm->clientUser.userName,
08326 rsComm->clientUser.rodsZone,
08327 collIdString,
08328 &icss);
08329 if (status != 0) {
08330 rodsLog(LOG_NOTICE,
08331 "chlMoveObject cmlAudit3 failure %d",
08332 status);
08333 _rollback("chlMoveObject");
08334 return(status);
08335 }
08336
08337 return(status);
08338 }
08339
08340
08341
08342 cVal[0]=parentCollName;
08343 iVal[0]=MAX_NAME_LEN;
08344 cVal[1]=oldCollName;
08345 iVal[1]=MAX_NAME_LEN;
08346
08347 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 8");
08348 status = cmlGetStringValuesFromSql(
08349 "select parent_coll_name, coll_name from R_COLL_MAIN CM, R_OBJT_ACCESS OA, R_USER_GROUP UG, R_USER_MAIN UM, R_TOKN_MAIN TM where CM.coll_id=? and UM.user_name=? and UM.zone_name=? and UM.user_type_name!='rodsgroup' and UM.user_id = UG.user_id and OA.object_id = CM.coll_id and UG.group_user_id = OA.user_id and OA.access_type_id >= TM.token_id and TM.token_namespace ='access_type' and TM.token_name = 'own'",
08350 cVal, iVal, 2, objIdString, rsComm->clientUser.userName,
08351 rsComm->clientUser.rodsZone, &icss);
08352 if (status == 0) {
08353
08354
08355 pLen = strlen(parentCollName);
08356
08357 ocLen=strlen(oldCollName);
08358 if (pLen<=0 || ocLen <=0) return(CAT_INVALID_ARGUMENT);
08359
08360
08361 OK=0;
08362 for (i=ocLen;i>0;i--) {
08363 if (oldCollName[i]=='/') {
08364 OK=1;
08365 strncpy(endCollName, (char*)&oldCollName[i+1], MAX_NAME_LEN);
08366 break;
08367 }
08368 }
08369 if (OK==0) return (CAT_INVALID_ARGUMENT);
08370
08371
08372
08373 snprintf(collIdString, MAX_NAME_LEN, "%lld", targetCollId);
08374 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 9");
08375 status = cmlGetIntegerValueFromSql(
08376 "select data_id from R_DATA_MAIN where data_name=? and coll_id=?",
08377 &otherDataId, endCollName, collIdString, 0, 0, 0, &icss);
08378 if (status!=CAT_NO_ROWS_FOUND) {
08379 return( CAT_NAME_EXISTS_AS_DATAOBJ);
08380 }
08381
08382
08383
08384 strncpy(newCollName, targetCollName, MAX_NAME_LEN);
08385 strncat(newCollName, "/", MAX_NAME_LEN);
08386 strncat(newCollName, endCollName, MAX_NAME_LEN);
08387
08388 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 10");
08389 status = cmlGetIntegerValueFromSql(
08390 "select coll_id from R_COLL_MAIN where coll_name = ?",
08391 &otherCollId, newCollName, 0, 0, 0, 0, &icss);
08392 if (status!=CAT_NO_ROWS_FOUND) {
08393 return( CAT_NAME_EXISTS_AS_COLLECTION);
08394 }
08395
08396
08397
08398
08399 cp = strstr(targetCollName, oldCollName);
08400 if (cp == targetCollName &&
08401 (targetCollName[strlen(oldCollName)] == '/' ||
08402 targetCollName[strlen(oldCollName)] == '\0')) {
08403 return(CAT_RECURSIVE_MOVE);
08404 }
08405
08406
08407
08408
08409
08410
08411 getNowStr(myTime);
08412 cllBindVars[cllBindVarCount++]=newCollName;
08413 cllBindVars[cllBindVarCount++]=targetCollName;
08414 cllBindVars[cllBindVarCount++]=myTime;
08415 cllBindVars[cllBindVarCount++]=objIdString;
08416 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 11");
08417 status = cmlExecuteNoAnswerSql(
08418 "update R_COLL_MAIN set coll_name = ?, parent_coll_name=?, modify_ts=? where coll_id = ?",
08419 &icss);
08420 if (status != 0) {
08421 rodsLog(LOG_NOTICE,
08422 "chlMoveObject cmlExecuteNoAnswerSql update failure %d",
08423 status);
08424 _rollback("chlMoveObject");
08425 return(status);
08426 }
08427
08428
08429
08430
08431
08432
08433 snprintf(ocLenStr, MAX_NAME_LEN, "%d", ocLen+1);
08434 snprintf(collNameSlash, MAX_NAME_LEN, "%s/", oldCollName);
08435 len = strlen(collNameSlash);
08436 snprintf(collNameSlashLen, 10, "%d", len);
08437 cllBindVars[cllBindVarCount++]=newCollName;
08438 cllBindVars[cllBindVarCount++]=ocLenStr;
08439 cllBindVars[cllBindVarCount++]=newCollName;
08440 cllBindVars[cllBindVarCount++]=ocLenStr;
08441 cllBindVars[cllBindVarCount++]=collNameSlashLen;
08442 cllBindVars[cllBindVarCount++]=collNameSlash;
08443 cllBindVars[cllBindVarCount++]=oldCollName;
08444 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 12");
08445 status = cmlExecuteNoAnswerSql(
08446 "update R_COLL_MAIN set parent_coll_name = ? || substr(parent_coll_name, ?), coll_name = ? || substr(coll_name, ?) where substr(parent_coll_name,1,?) = ? or parent_coll_name = ?",
08447 &icss);
08448 if (status == CAT_SUCCESS_BUT_WITH_NO_INFO) status = 0;
08449 if (status != 0) {
08450 rodsLog(LOG_NOTICE,
08451 "chlMoveObject cmlExecuteNoAnswerSql update failure %d",
08452 status);
08453 _rollback("chlMoveObject");
08454 return(status);
08455 }
08456
08457
08458 status = cmlAudit3(AU_MOVE_COLL,
08459 objIdString,
08460 rsComm->clientUser.userName,
08461 rsComm->clientUser.rodsZone,
08462 targetCollName,
08463 &icss);
08464 if (status != 0) {
08465 rodsLog(LOG_NOTICE,
08466 "chlMoveObject cmlAudit3 failure %d",
08467 status);
08468 _rollback("chlMoveObject");
08469 return(status);
08470 }
08471
08472 return(status);
08473 }
08474
08475
08476
08477
08478 snprintf(objIdString, MAX_NAME_LEN, "%lld", objId);
08479 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 13");
08480 status = cmlGetIntegerValueFromSql(
08481 "select coll_id from R_DATA_MAIN where data_id=?",
08482 &otherDataId, objIdString, 0, 0, 0, 0, &icss);
08483 if (status == 0) {
08484
08485 return (CAT_NO_ACCESS_PERMISSION);
08486 }
08487
08488 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 14");
08489 status = cmlGetIntegerValueFromSql(
08490 "select coll_id from R_COLL_MAIN where coll_id=?",
08491 &otherDataId, objIdString, 0, 0, 0, 0, &icss);
08492 if (status == 0) {
08493
08494 return (CAT_NO_ACCESS_PERMISSION);
08495 }
08496
08497 return(CAT_NOT_A_DATAOBJ_AND_NOT_A_COLLECTION);
08498 }
08499
08500
08501
08502
08503 int chlRegToken(rsComm_t *rsComm, char *nameSpace, char *name, char *value,
08504 char *value2, char *value3, char *comment)
08505 {
08506 int status;
08507 rodsLong_t objId;
08508 char *myValue1, *myValue2, *myValue3, *myComment;
08509 char myTime[50];
08510 rodsLong_t seqNum;
08511 char errMsg[205];
08512 char seqNumStr[MAX_NAME_LEN];
08513
08514 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegToken");
08515
08516 if (nameSpace==NULL || strlen(nameSpace)==0) return (CAT_INVALID_ARGUMENT);
08517 if (name==NULL || strlen(name)==0) return (CAT_INVALID_ARGUMENT);
08518
08519 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegToken SQL 1 ");
08520 status = cmlGetIntegerValueFromSql(
08521 "select token_id from R_TOKN_MAIN where token_namespace=? and token_name=?",
08522 &objId, "token_namespace", nameSpace, 0, 0, 0, &icss);
08523 if (status != 0) {
08524 snprintf(errMsg, 200,
08525 "Token namespace '%s' does not exist",
08526 nameSpace);
08527 addRErrorMsg (&rsComm->rError, 0, errMsg);
08528 return (CAT_INVALID_ARGUMENT);
08529 }
08530
08531 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegToken SQL 2");
08532 status = cmlGetIntegerValueFromSql(
08533 "select token_id from R_TOKN_MAIN where token_namespace=? and token_name=?",
08534 &objId, nameSpace, name, 0, 0, 0, &icss);
08535 if (status == 0) {
08536 snprintf(errMsg, 200,
08537 "Token '%s' already exists in namespace '%s'",
08538 name, nameSpace);
08539 addRErrorMsg (&rsComm->rError, 0, errMsg);
08540 return (CAT_INVALID_ARGUMENT);
08541 }
08542
08543 myValue1=value;
08544 if (myValue1==NULL) myValue1="";
08545 myValue2=value2;
08546 if (myValue2==NULL) myValue2="";
08547 myValue3=value3;
08548 if (myValue3==NULL) myValue3="";
08549 myComment=comment;
08550 if (myComment==NULL) myComment="";
08551
08552 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegToken SQL 3");
08553 seqNum = cmlGetNextSeqVal(&icss);
08554 if (seqNum < 0) {
08555 rodsLog(LOG_NOTICE, "chlRegToken cmlGetNextSeqVal failure %d",
08556 seqNum);
08557 return(seqNum);
08558 }
08559
08560 getNowStr(myTime);
08561 snprintf(seqNumStr, sizeof seqNumStr, "%lld", seqNum);
08562 cllBindVars[cllBindVarCount++]=nameSpace;
08563 cllBindVars[cllBindVarCount++]=seqNumStr;
08564 cllBindVars[cllBindVarCount++]=name;
08565 cllBindVars[cllBindVarCount++]=myValue1;
08566 cllBindVars[cllBindVarCount++]=myValue2;
08567 cllBindVars[cllBindVarCount++]=myValue3;
08568 cllBindVars[cllBindVarCount++]=myComment;
08569 cllBindVars[cllBindVarCount++]=myTime;
08570 cllBindVars[cllBindVarCount++]=myTime;
08571 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegToken SQL 4");
08572 status = cmlExecuteNoAnswerSql(
08573 "insert into R_TOKN_MAIN values (?, ?, ?, ?, ?, ?, ?, ?, ?)",
08574 &icss);
08575 if (status != 0) {
08576 _rollback("chlRegToken");
08577 return(status);
08578 }
08579
08580
08581 status = cmlAudit3(AU_REG_TOKEN,
08582 seqNumStr,
08583 rsComm->clientUser.userName,
08584 rsComm->clientUser.rodsZone,
08585 name,
08586 &icss);
08587 if (status != 0) {
08588 rodsLog(LOG_NOTICE,
08589 "chlRegToken cmlAudit3 failure %d",
08590 status);
08591 _rollback("chlRegToken");
08592 return(status);
08593 }
08594
08595 status = cmlExecuteNoAnswerSql("commit", &icss);
08596 return(status);
08597 }
08598
08599
08600
08601
08602
08603 int chlDelToken(rsComm_t *rsComm, char *nameSpace, char *name)
08604 {
08605 int status;
08606 rodsLong_t objId;
08607 char errMsg[205];
08608 char objIdStr[60];
08609
08610 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelToken");
08611
08612 if (nameSpace==NULL || strlen(nameSpace)==0) return (CAT_INVALID_ARGUMENT);
08613 if (name==NULL || strlen(name)==0) return (CAT_INVALID_ARGUMENT);
08614
08615 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelToken SQL 1 ");
08616 status = cmlGetIntegerValueFromSql(
08617 "select token_id from R_TOKN_MAIN where token_namespace=? and token_name=?",
08618 &objId, nameSpace, name, 0, 0, 0, &icss);
08619 if (status != 0) {
08620 snprintf(errMsg, 200,
08621 "Token '%s' does not exist in namespace '%s'",
08622 name, nameSpace);
08623 addRErrorMsg (&rsComm->rError, 0, errMsg);
08624 return (CAT_INVALID_ARGUMENT);
08625 }
08626
08627 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelToken SQL 2");
08628 cllBindVars[cllBindVarCount++]=nameSpace;
08629 cllBindVars[cllBindVarCount++]=name;
08630 status = cmlExecuteNoAnswerSql(
08631 "delete from R_TOKN_MAIN where token_namespace=? and token_name=?",
08632 &icss);
08633 if (status != 0) {
08634 _rollback("chlDelToken");
08635 return(status);
08636 }
08637
08638
08639 snprintf(objIdStr, sizeof objIdStr, "%lld", objId);
08640 status = cmlAudit3(AU_DEL_TOKEN,
08641 objIdStr,
08642 rsComm->clientUser.userName,
08643 rsComm->clientUser.rodsZone,
08644 name,
08645 &icss);
08646 if (status != 0) {
08647 rodsLog(LOG_NOTICE,
08648 "chlDelToken cmlAudit3 failure %d",
08649 status);
08650 _rollback("chlDelToken");
08651 return(status);
08652 }
08653
08654 status = cmlExecuteNoAnswerSql("commit", &icss);
08655 return(status);
08656 }
08657
08658
08659
08660
08661
08662
08663
08664 int chlRegServerLoad(rsComm_t *rsComm,
08665 char *hostName, char *rescName,
08666 char *cpuUsed, char *memUsed, char *swapUsed,
08667 char *runqLoad, char *diskSpace, char *netInput,
08668 char *netOutput) {
08669 char myTime[50];
08670 int status;
08671 int i;
08672
08673 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegServerLoad");
08674
08675 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
08676 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
08677 }
08678
08679 if (!icss.status) {
08680 return(CATALOG_NOT_CONNECTED);
08681 }
08682
08683 getNowStr(myTime);
08684
08685 i=0;
08686 cllBindVars[i++]=hostName;
08687 cllBindVars[i++]=rescName;
08688 cllBindVars[i++]=cpuUsed;
08689 cllBindVars[i++]=memUsed;
08690 cllBindVars[i++]=swapUsed;
08691 cllBindVars[i++]=runqLoad;
08692 cllBindVars[i++]=diskSpace;
08693 cllBindVars[i++]=netInput;
08694 cllBindVars[i++]=netOutput;
08695 cllBindVars[i++]=myTime;
08696 cllBindVarCount=i;
08697 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegServerLoad SQL 1");
08698 status = cmlExecuteNoAnswerSql(
08699 "insert into R_SERVER_LOAD (host_name, resc_name, cpu_used, mem_used, swap_used, runq_load, disk_space, net_input, net_output, create_ts) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
08700 &icss);
08701 if (status != 0) {
08702 rodsLog(LOG_NOTICE,
08703 "chlRegServerLoad cmlExecuteNoAnswerSql failure %d",status);
08704 _rollback("chlRegServerLoad");
08705 return(status);
08706 }
08707
08708 status = cmlExecuteNoAnswerSql("commit", &icss);
08709 if (status != 0) {
08710 rodsLog(LOG_NOTICE,
08711 "chlRegServerLoad cmlExecuteNoAnswerSql commit failure %d",
08712 status);
08713 return(status);
08714 }
08715
08716 return(0);
08717 }
08718
08719
08720
08721
08722
08723
08724
08725 int chlPurgeServerLoad(rsComm_t *rsComm, char *secondsAgo) {
08726
08727
08728 int status;
08729 char nowStr[50];
08730 static char thenStr[50];
08731 time_t nowTime;
08732 time_t thenTime;
08733 time_t secondsAgoTime;
08734
08735 if (logSQL!=0) rodsLog(LOG_SQL, "chlPurgeServerLoad");
08736
08737 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
08738 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
08739 }
08740
08741 getNowStr(nowStr);
08742 nowTime=atoll(nowStr);
08743 secondsAgoTime=atoll(secondsAgo);
08744 thenTime = nowTime - secondsAgoTime;
08745 snprintf(thenStr, sizeof thenStr, "%011d", (uint) thenTime);
08746
08747 if (logSQL!=0) rodsLog(LOG_SQL, "chlPurgeServerLoad SQL 1");
08748
08749 cllBindVars[cllBindVarCount++]=thenStr;
08750 status = cmlExecuteNoAnswerSql(
08751 "delete from R_SERVER_LOAD where create_ts <?",
08752 &icss);
08753 if (status != 0) {
08754 _rollback("chlPurgeServerLoad");
08755 return(status);
08756 }
08757
08758 status = cmlExecuteNoAnswerSql("commit", &icss);
08759 return(status);
08760 }
08761
08762
08763
08764
08765
08766
08767 int chlRegServerLoadDigest(rsComm_t *rsComm,
08768 char *rescName, char *loadFactor) {
08769 char myTime[50];
08770 int status;
08771 int i;
08772
08773 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegServerLoadDigest");
08774
08775 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
08776 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
08777 }
08778
08779 if (!icss.status) {
08780 return(CATALOG_NOT_CONNECTED);
08781 }
08782
08783 getNowStr(myTime);
08784
08785 i=0;
08786 cllBindVars[i++]=rescName;
08787 cllBindVars[i++]=loadFactor;
08788 cllBindVars[i++]=myTime;
08789 cllBindVarCount=i;
08790
08791 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegServerLoadDigest SQL 1");
08792 status = cmlExecuteNoAnswerSql(
08793 "insert into R_SERVER_LOAD_DIGEST (resc_name, load_factor, create_ts) values (?, ?, ?)",
08794 &icss);
08795 if (status != 0) {
08796 rodsLog(LOG_NOTICE,
08797 "chlRegServerLoadDigest cmlExecuteNoAnswerSql failure %d", status);
08798 _rollback("chlRegServerLoadDigest");
08799 return(status);
08800 }
08801
08802 status = cmlExecuteNoAnswerSql("commit", &icss);
08803 if (status != 0) {
08804 rodsLog(LOG_NOTICE,
08805 "chlRegServerLoadDigest cmlExecuteNoAnswerSql commit failure %d",
08806 status);
08807 return(status);
08808 }
08809
08810 return(0);
08811 }
08812
08813
08814
08815
08816
08817
08818
08819 int chlPurgeServerLoadDigest(rsComm_t *rsComm, char *secondsAgo) {
08820
08821 int status;
08822 char nowStr[50];
08823 static char thenStr[50];
08824 time_t nowTime;
08825 time_t thenTime;
08826 time_t secondsAgoTime;
08827
08828 if (logSQL!=0) rodsLog(LOG_SQL, "chlPurgeServerLoadDigest");
08829
08830 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
08831 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
08832 }
08833
08834 getNowStr(nowStr);
08835 nowTime=atoll(nowStr);
08836 secondsAgoTime=atoll(secondsAgo);
08837 thenTime = nowTime - secondsAgoTime;
08838 snprintf(thenStr, sizeof thenStr, "%011d", (uint) thenTime);
08839
08840 if (logSQL!=0) rodsLog(LOG_SQL, "chlPurgeServerLoadDigest SQL 1");
08841
08842 cllBindVars[cllBindVarCount++]=thenStr;
08843 status = cmlExecuteNoAnswerSql(
08844 "delete from R_SERVER_LOAD_DIGEST where create_ts <?",
08845 &icss);
08846 if (status != 0) {
08847 _rollback("chlPurgeServerLoadDigest");
08848 return(status);
08849 }
08850
08851 status = cmlExecuteNoAnswerSql("commit", &icss);
08852 return(status);
08853 }
08854
08855
08856
08857
08858
08859
08860
08861
08862
08863 int setOverQuota(rsComm_t *rsComm) {
08864 int status;
08865 int rowsFound;
08866 int statementNum;
08867 char myTime[50];
08868
08869
08870
08871 char mySQL1[]="select sum(quota_usage), UM1.user_id, R_QUOTA_USAGE.resc_id from R_QUOTA_USAGE, R_QUOTA_MAIN, R_USER_MAIN UM1, R_USER_GROUP, R_USER_MAIN UM2 where R_QUOTA_MAIN.user_id = UM1.user_id and UM1.user_type_name = 'rodsgroup' and R_USER_GROUP.group_user_id = UM1.user_id and UM2.user_id = R_USER_GROUP.user_id and R_QUOTA_USAGE.user_id = UM2.user_id and R_QUOTA_MAIN.resc_id = R_QUOTA_USAGE.resc_id group by UM1.user_id, R_QUOTA_USAGE.resc_id";
08872
08873
08874
08875 char mySQL2a[]="select sum(quota_usage), R_QUOTA_MAIN.quota_limit, UM1.user_id from R_QUOTA_USAGE, R_QUOTA_MAIN, R_USER_MAIN UM1, R_USER_GROUP, R_USER_MAIN UM2 where R_QUOTA_MAIN.user_id = UM1.user_id and UM1.user_type_name = 'rodsgroup' and R_USER_GROUP.group_user_id = UM1.user_id and UM2.user_id = R_USER_GROUP.user_id and R_QUOTA_USAGE.user_id = UM2.user_id and R_QUOTA_USAGE.resc_id != %s and R_QUOTA_MAIN.resc_id = %s group by UM1.user_id, R_QUOTA_MAIN.quota_limit";
08876 char mySQL2b[MAX_SQL_SIZE];
08877
08878 char mySQL3a[]="update R_QUOTA_MAIN set quota_over= %s - ?, modify_ts=? where user_id=? and %s - ? > quota_over";
08879 char mySQL3b[MAX_SQL_SIZE];
08880
08881
08882
08883
08884 if (logSQL!=0) rodsLog(LOG_SQL, "setOverQuota SQL 1");
08885 status = cmlExecuteNoAnswerSql(
08886 "update R_QUOTA_MAIN set quota_over = -quota_limit", &icss);
08887 if (status == CAT_SUCCESS_BUT_WITH_NO_INFO) return(0);
08888 if (status != 0) return(status);
08889
08890
08891 if (logSQL!=0) rodsLog(LOG_SQL, "setOverQuota SQL 2");
08892 status = cmlExecuteNoAnswerSql(
08893 #if ORA_ICAT
08894 "update R_QUOTA_MAIN set quota_over = (select R_QUOTA_USAGE.quota_usage - R_QUOTA_MAIN.quota_limit from R_QUOTA_USAGE, R_QUOTA_MAIN where R_QUOTA_MAIN.user_id = R_QUOTA_USAGE.user_id and R_QUOTA_MAIN.resc_id = R_QUOTA_USAGE.resc_id) where exists (select 1 from R_QUOTA_USAGE, R_QUOTA_MAIN where R_QUOTA_MAIN.user_id = R_QUOTA_USAGE.user_id and R_QUOTA_MAIN.resc_id = R_QUOTA_USAGE.resc_id)",
08895 #elif MY_ICAT
08896 "update R_QUOTA_MAIN, R_QUOTA_USAGE set R_QUOTA_MAIN.quota_over = R_QUOTA_USAGE.quota_usage - R_QUOTA_MAIN.quota_limit where R_QUOTA_MAIN.user_id = R_QUOTA_USAGE.user_id and R_QUOTA_MAIN.resc_id = R_QUOTA_USAGE.resc_id",
08897 #else
08898 "update R_QUOTA_MAIN set quota_over = quota_usage - quota_limit from R_QUOTA_USAGE where R_QUOTA_MAIN.user_id = R_QUOTA_USAGE.user_id and R_QUOTA_MAIN.resc_id = R_QUOTA_USAGE.resc_id",
08899 #endif
08900 &icss);
08901 if (status == CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
08902 if (status != 0) return(status);
08903
08904
08905
08906
08907
08908 if (logSQL!=0) rodsLog(LOG_SQL, "setOverQuota SQL 3");
08909 getNowStr(myTime);
08910 for (rowsFound=0;;rowsFound++) {
08911 int status2;
08912 if (rowsFound==0) {
08913 status = cmlGetFirstRowFromSql("select sum(quota_usage), R_QUOTA_MAIN.user_id from R_QUOTA_USAGE, R_QUOTA_MAIN where R_QUOTA_MAIN.user_id = R_QUOTA_USAGE.user_id and R_QUOTA_MAIN.resc_id = '0' group by R_QUOTA_MAIN.user_id",
08914 &statementNum, 0, &icss);
08915 }
08916 else {
08917 status = cmlGetNextRowFromStatement(statementNum, &icss);
08918 }
08919 if (status != 0) break;
08920 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[0];
08921 cllBindVars[cllBindVarCount++]=myTime;
08922 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[1];
08923 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[0];
08924 if (logSQL!=0) rodsLog(LOG_SQL, "setOverQuota SQL 4");
08925 status2 = cmlExecuteNoAnswerSql("update R_QUOTA_MAIN set quota_over=?-quota_limit, modify_ts=? where user_id=? and ?-quota_limit > quota_over and resc_id='0'",
08926 &icss);
08927 if (status2 == CAT_SUCCESS_BUT_WITH_NO_INFO) status2=0;
08928 if (status2 != 0) return(status2);
08929 }
08930
08931
08932 if (logSQL!=0) rodsLog(LOG_SQL, "setOverQuota SQL 5");
08933 for (rowsFound=0;;rowsFound++) {
08934 int status2;
08935 if (rowsFound==0) {
08936 status = cmlGetFirstRowFromSql(mySQL1, &statementNum,
08937 0, &icss);
08938 }
08939 else {
08940 status = cmlGetNextRowFromStatement(statementNum, &icss);
08941 }
08942 if (status != 0) break;
08943 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[0];
08944 cllBindVars[cllBindVarCount++]=myTime;
08945 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[1];
08946 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[0];
08947 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[2];
08948 if (logSQL!=0) rodsLog(LOG_SQL, "setOverQuota SQL 6");
08949 status2 = cmlExecuteNoAnswerSql("update R_QUOTA_MAIN set quota_over=?-quota_limit, modify_ts=? where user_id=? and ?-quota_limit > quota_over and R_QUOTA_MAIN.resc_id=?",
08950 &icss);
08951 if (status2 == CAT_SUCCESS_BUT_WITH_NO_INFO) status2=0;
08952 if (status2 != 0) return(status2);
08953 }
08954 if (status==CAT_NO_ROWS_FOUND) status=0;
08955 if (status != 0) return(status);
08956
08957
08958 #if ORA_ICAT
08959
08960 snprintf(mySQL2b, sizeof mySQL2b, mySQL2a,
08961 "cast('0' as integer)", "cast('0' as integer)");
08962 snprintf(mySQL3b, sizeof mySQL3b, mySQL3a,
08963 "cast(? as integer)", "cast(? as integer)");
08964 #elif MY_ICAT
08965 snprintf(mySQL2b, sizeof mySQL2b, mySQL2a, "'0'", "'0'");
08966 snprintf(mySQL3b, sizeof mySQL3b, mySQL3a, "?", "?");
08967 #else
08968 snprintf(mySQL2b, sizeof mySQL2b, mySQL2a,
08969 "cast('0' as bigint)", "cast('0' as bigint)");
08970 snprintf(mySQL3b, sizeof mySQL3b, mySQL3a,
08971 "cast(? as bigint)", "cast(? as bigint)");
08972 #endif
08973 if (logSQL!=0) rodsLog(LOG_SQL, "setOverQuota SQL 7");
08974 getNowStr(myTime);
08975 for (rowsFound=0;;rowsFound++) {
08976 int status2;
08977 if (rowsFound==0) {
08978 status = cmlGetFirstRowFromSql(mySQL2b, &statementNum,
08979 0, &icss);
08980 }
08981 else {
08982 status = cmlGetNextRowFromStatement(statementNum, &icss);
08983 }
08984 if (status != 0) break;
08985 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[0];
08986 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[1];
08987 cllBindVars[cllBindVarCount++]=myTime;
08988 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[2];
08989 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[0];
08990 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[1];
08991 if (logSQL!=0) rodsLog(LOG_SQL, "setOverQuota SQL 8");
08992 status2 = cmlExecuteNoAnswerSql(mySQL3b,
08993 &icss);
08994 if (status2 == CAT_SUCCESS_BUT_WITH_NO_INFO) status2=0;
08995 if (status2 != 0) return(status2);
08996 }
08997 if (status==CAT_NO_ROWS_FOUND) status=0;
08998 if (status != 0) return(status);
08999
09000
09001
09002
09003
09004
09005 return(status);
09006 }
09007
09008
09009 int chlCalcUsageAndQuota(rsComm_t *rsComm) {
09010 int status;
09011 char myTime[50];
09012
09013 status = 0;
09014 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
09015 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
09016 }
09017
09018 rodsLog(LOG_NOTICE,
09019 "chlCalcUsageAndQuota called");
09020
09021
09022 getNowStr(myTime);
09023
09024
09025 if (logSQL!=0) rodsLog(LOG_SQL, "chlCalcUsageAndQuota SQL 1");
09026 cllBindVars[cllBindVarCount++]=myTime;
09027 status = cmlExecuteNoAnswerSql(
09028 "delete from R_QUOTA_USAGE where modify_ts < ?", &icss);
09029 if (status !=0 && status !=CAT_SUCCESS_BUT_WITH_NO_INFO) {
09030 _rollback("chlCalcUsageAndQuota");
09031 return(status);
09032 }
09033
09034
09035 if (logSQL!=0) rodsLog(LOG_SQL, "chlCalcUsageAndQuota SQL 2");
09036 cllBindVars[cllBindVarCount++]=myTime;
09037 status = cmlExecuteNoAnswerSql(
09038 "insert into R_QUOTA_USAGE (quota_usage, resc_id, user_id, modify_ts) (select sum(R_DATA_MAIN.data_size), R_RESC_MAIN.resc_id, R_USER_MAIN.user_id, ? from R_DATA_MAIN, R_USER_MAIN, R_RESC_MAIN where R_USER_MAIN.user_name = R_DATA_MAIN.data_owner_name and R_USER_MAIN.zone_name = R_DATA_MAIN.data_owner_zone and R_RESC_MAIN.resc_name = R_DATA_MAIN.resc_name group by R_RESC_MAIN.resc_id, user_id)",
09039 &icss);
09040 if (status == CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
09041 if (status != 0) {
09042 _rollback("chlCalcUsageAndQuota");
09043 return(status);
09044 }
09045
09046
09047 status = setOverQuota(rsComm);
09048 if (status != 0) {
09049 _rollback("chlCalcUsageAndQuota");
09050 return(status);
09051 }
09052
09053 status = cmlExecuteNoAnswerSql("commit", &icss);
09054 return(status);
09055 }
09056
09057 int chlSetQuota(rsComm_t *rsComm, char *type, char *name,
09058 char *rescName, char* limit) {
09059 int status;
09060 rodsLong_t rescId;
09061 rodsLong_t userId;
09062 char userZone[NAME_LEN];
09063 char userName[NAME_LEN];
09064 char rescIdStr[60];
09065 char userIdStr[60];
09066 char myTime[50];
09067 int itype=0;
09068
09069 if (strncmp(type, "user",4)==0) itype=1;
09070 if (strncmp(type, "group",5)==0) itype=2;
09071 if (itype==0) return (CAT_INVALID_ARGUMENT);
09072
09073 status = getLocalZone();
09074 if (status != 0) return(status);
09075
09076
09077 rescId=0;
09078 if (strncmp(rescName,"total",5)!=0) {
09079 if (logSQL!=0) rodsLog(LOG_SQL, "chlSetQuota SQL 1");
09080 status = cmlGetIntegerValueFromSql(
09081 "select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
09082 &rescId, rescName, localZone, 0, 0, 0, &icss);
09083 if (status != 0) {
09084 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
09085 _rollback("chlSetQuota");
09086 return(status);
09087 }
09088 }
09089
09090
09091 status = parseUserName(name, userName, userZone);
09092 if (userZone[0]=='\0') {
09093 strncpy(userZone, localZone, NAME_LEN);
09094 }
09095
09096 if (itype==1) {
09097 userId=0;
09098 if (logSQL!=0) rodsLog(LOG_SQL, "chlSetQuota SQL 2");
09099 status = cmlGetIntegerValueFromSql(
09100 "select user_id from R_USER_MAIN where user_name=? and zone_name=?",
09101 &userId, userName, userZone, 0, 0, 0, &icss);
09102 if (status != 0) {
09103 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_USER);
09104 _rollback("chlSetQuota");
09105 return(status);
09106 }
09107 }
09108 else {
09109 userId=0;
09110 if (logSQL!=0) rodsLog(LOG_SQL, "chlSetQuota SQL 3");
09111 status = cmlGetIntegerValueFromSql(
09112 "select user_id from R_USER_MAIN where user_name=? and zone_name=? and user_type_name='rodsgroup'",
09113 &userId, userName, userZone, 0, 0, 0, &icss);
09114 if (status != 0) {
09115 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_GROUP);
09116 _rollback("chlSetQuota");
09117 return(status);
09118 }
09119 }
09120
09121 snprintf(userIdStr, sizeof userIdStr, "%lld", userId);
09122 snprintf(rescIdStr, sizeof rescIdStr, "%lld", rescId);
09123
09124
09125 cllBindVars[cllBindVarCount++]=userIdStr;
09126 cllBindVars[cllBindVarCount++]=rescIdStr;
09127 if (logSQL!=0) rodsLog(LOG_SQL, "chlSetQuota SQL 4");
09128 status = cmlExecuteNoAnswerSql(
09129 "delete from R_QUOTA_MAIN where user_id=? and resc_id=?",
09130 &icss);
09131 if (status != 0) {
09132 rodsLog(LOG_DEBUG,
09133 "chlSetQuota cmlExecuteNoAnswerSql delete failure %d",
09134 status);
09135 }
09136 if (atol(limit)>0) {
09137 getNowStr(myTime);
09138 cllBindVars[cllBindVarCount++]=userIdStr;
09139 cllBindVars[cllBindVarCount++]=rescIdStr;
09140 cllBindVars[cllBindVarCount++]=limit;
09141 cllBindVars[cllBindVarCount++]=myTime;
09142 if (logSQL!=0) rodsLog(LOG_SQL, "chlSetQuota SQL 5");
09143 status = cmlExecuteNoAnswerSql(
09144 "insert into R_QUOTA_MAIN (user_id, resc_id, quota_limit, modify_ts) values (?, ?, ?, ?)",
09145 &icss);
09146 if (status != 0) {
09147 rodsLog(LOG_NOTICE,
09148 "chlSetQuota cmlExecuteNoAnswerSql insert failure %d",
09149 status);
09150 _rollback("chlSetQuota");
09151 return(status);
09152 }
09153 }
09154
09155
09156
09157
09158 status = setOverQuota(rsComm);
09159 if (status != 0) {
09160 _rollback("chlSetQuota");
09161 return(status);
09162 }
09163
09164 status = cmlExecuteNoAnswerSql("commit", &icss);
09165 return(status);
09166 }
09167
09168
09169 int
09170 chlCheckQuota(rsComm_t *rsComm, char *userName, char *rescName,
09171 rodsLong_t *userQuota, int *quotaStatus) {
09172
09173
09174
09175
09176
09177
09178
09179
09180
09181 int status;
09182 int statementNum;
09183
09184 char mySQL[]="select distinct QM.user_id, QM.resc_id, QM.quota_limit, QM.quota_over from R_QUOTA_MAIN QM, R_USER_MAIN UM, R_RESC_MAIN RM, R_USER_GROUP UG, R_USER_MAIN UM2 where ( (QM.user_id = UM.user_id and UM.user_name = ?) or (QM.user_id = UG.group_user_id and UM2.user_name = ? and UG.user_id = UM2.user_id) ) and ((QM.resc_id = RM.resc_id and RM.resc_name = ?) or QM.resc_id = '0') order by quota_over desc";
09185
09186 *userQuota = 0;
09187 if (logSQL!=0) rodsLog(LOG_SQL, "chlCheckQuota SQL 1");
09188 cllBindVars[cllBindVarCount++]=userName;
09189 cllBindVars[cllBindVarCount++]=userName;
09190 cllBindVars[cllBindVarCount++]=rescName;
09191
09192 status = cmlGetFirstRowFromSql(mySQL, &statementNum,
09193 0, &icss);
09194
09195 if (status == CAT_SUCCESS_BUT_WITH_NO_INFO) {
09196 rodsLog(LOG_NOTICE,
09197 "chlCheckQuota - CAT_SUCCESS_BUT_WITH_NO_INFO");
09198 *quotaStatus = QUOTA_UNRESTRICTED;
09199 return(0);
09200 }
09201
09202 if (status == CAT_NO_ROWS_FOUND) {
09203 rodsLog(LOG_NOTICE,
09204 "chlCheckQuota - CAT_NO_ROWS_FOUND");
09205 *quotaStatus = QUOTA_UNRESTRICTED;
09206 return(0);
09207 }
09208
09209 if (status != 0) return(status);
09210
09211 #if 0
09212 for (i=0;i<4;i++) {
09213 rodsLog(LOG_NOTICE, "checkvalue: %s",
09214 icss.stmtPtr[statementNum]->resultValue[i]);
09215 }
09216 #endif
09217
09218
09219 rodsLog(LOG_NOTICE, "checkQuota: inUser:%s inResc:%s RescId:%s Quota:%s",
09220 userName, rescName,
09221 icss.stmtPtr[statementNum]->resultValue[1],
09222 icss.stmtPtr[statementNum]->resultValue[3]);
09223
09224 *userQuota = atoll(icss.stmtPtr[statementNum]->resultValue[3]);
09225 if (atoi(icss.stmtPtr[statementNum]->resultValue[1])==0) {
09226 *quotaStatus=QUOTA_GLOBAL;
09227 }
09228 else {
09229 *quotaStatus=QUOTA_RESOURCE;
09230 }
09231 cmlFreeStatement(statementNum, &icss);
09232
09233 return(status);
09234 }
09235
09236 int
09237 chlDelUnusedAVUs(rsComm_t *rsComm) {
09238
09239
09240
09241
09242
09243 int status;
09244 status = removeAVUs();
09245
09246 if (status == 0) {
09247 status = cmlExecuteNoAnswerSql("commit", &icss);
09248 }
09249 return(status);
09250
09251 }
09252
09253
09254
09255
09256
09257
09258
09259 int
09260 chlInsRuleTable(rsComm_t *rsComm,
09261 char *baseName, char *mapPriorityStr, char *ruleName,
09262 char *ruleHead, char *ruleCondition, char *ruleAction,
09263 char *ruleRecovery, char *ruleIdStr, char *myTime) {
09264 int status;
09265 int i;
09266 rodsLong_t seqNum = -1;
09267
09268 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsRuleTable");
09269
09270 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
09271 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
09272 }
09273
09274 if (!icss.status) {
09275 return(CATALOG_NOT_CONNECTED);
09276 }
09277
09278
09279 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsRuleTable SQL 1");
09280 i=0;
09281 cllBindVars[i++]=baseName;
09282 cllBindVars[i++]=ruleName;
09283 cllBindVars[i++]=ruleHead;
09284 cllBindVars[i++]=ruleCondition;
09285 cllBindVars[i++]=ruleAction;
09286 cllBindVars[i++]=ruleRecovery;
09287 cllBindVarCount=i;
09288 status = cmlGetIntegerValueFromSqlV3(
09289 "select rule_id from R_RULE_MAIN where rule_base_name = ? and rule_name = ? and rule_event = ? and rule_condition = ? and rule_body = ? and rule_recovery = ?",
09290 &seqNum,
09291 &icss);
09292 if (status != 0 && status != CAT_NO_ROWS_FOUND) {
09293 rodsLog(LOG_NOTICE,
09294 "chlInsRuleTable cmlGetIntegerValueFromSqlV3 find rule if any failure %d",status);
09295 return(status);
09296 }
09297 if (seqNum < 0) {
09298 seqNum = cmlGetNextSeqVal(&icss);
09299 if (seqNum < 0) {
09300 rodsLog(LOG_NOTICE, "chlInsRuleTable cmlGetNextSeqVal failure %d",
09301 seqNum);
09302 _rollback("chlInsRuleTable");
09303 return(seqNum);
09304 }
09305 snprintf(ruleIdStr, MAX_NAME_LEN, "%lld", seqNum);
09306
09307 i=0;
09308 cllBindVars[i++]=ruleIdStr;
09309 cllBindVars[i++]=baseName;
09310 cllBindVars[i++]=ruleName;
09311 cllBindVars[i++]=ruleHead;
09312 cllBindVars[i++]=ruleCondition;
09313 cllBindVars[i++]=ruleAction;
09314 cllBindVars[i++]=ruleRecovery;
09315 cllBindVars[i++]=rsComm->clientUser.userName;
09316 cllBindVars[i++]=rsComm->clientUser.rodsZone;
09317 cllBindVars[i++]=myTime;
09318 cllBindVars[i++]=myTime;
09319 cllBindVarCount=i;
09320 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsRuleTable SQL 2");
09321 status = cmlExecuteNoAnswerSql(
09322 "insert into R_RULE_MAIN(rule_id, rule_base_name, rule_name, rule_event, rule_condition, rule_body, rule_recovery, rule_owner_name, rule_owner_zone, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
09323 &icss);
09324 if (status != 0) {
09325 rodsLog(LOG_NOTICE,
09326 "chlInsRuleTable cmlExecuteNoAnswerSql Rule Main Insert failure %d",status);
09327 return(status);
09328 }
09329 }
09330 else {
09331 snprintf(ruleIdStr, MAX_NAME_LEN, "%lld", seqNum);
09332 }
09333 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsRuleTable SQL 3");
09334 i = 0;
09335 cllBindVars[i++]=baseName;
09336 cllBindVars[i++]=mapPriorityStr;
09337 cllBindVars[i++]=ruleIdStr;
09338 cllBindVars[i++]=rsComm->clientUser.userName;
09339 cllBindVars[i++]=rsComm->clientUser.rodsZone;
09340 cllBindVars[i++]=myTime;
09341 cllBindVars[i++]=myTime;
09342 cllBindVarCount=i;
09343 status = cmlExecuteNoAnswerSql(
09344 "insert into R_RULE_BASE_MAP (map_base_name, map_priority, rule_id, map_owner_name,map_owner_zone, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?, ?)",
09345 &icss);
09346 if (status != 0) {
09347 rodsLog(LOG_NOTICE,
09348 "chlInsRuleTable cmlExecuteNoAnswerSql Rule Map insert failure %d" , status);
09349
09350 return(status);
09351 }
09352
09353 return(0);
09354 }
09355
09356
09357
09358
09359
09360
09361 int
09362 chlInsDvmTable(rsComm_t *rsComm,
09363 char *baseName, char *varName, char *action,
09364 char *var2CMap, char *myTime) {
09365 int status;
09366 int i;
09367 rodsLong_t seqNum = -1;
09368 char dvmIdStr[MAX_NAME_LEN];
09369 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsDvmTable");
09370
09371 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
09372 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
09373 }
09374
09375 if (!icss.status) {
09376 return(CATALOG_NOT_CONNECTED);
09377 }
09378
09379
09380 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsDvmTable SQL 1");
09381 i=0;
09382 cllBindVars[i++]=baseName;
09383 cllBindVars[i++]=varName;
09384 cllBindVars[i++]=action;
09385 cllBindVars[i++]=var2CMap;
09386 cllBindVarCount=i;
09387 status = cmlGetIntegerValueFromSqlV3(
09388 "select dvm_id from R_RULE_DVM where dvm_base_name = ? and dvm_ext_var_name = ? and dvm_condition = ? and dvm_int_map_path = ? ",
09389 &seqNum,
09390 &icss);
09391 if (status != 0 && status != CAT_NO_ROWS_FOUND) {
09392 rodsLog(LOG_NOTICE,
09393 "chlInsDvmTable cmlGetIntegerValueFromSqlV3 find DVM if any failure %d",status);
09394 return(status);
09395 }
09396 if (seqNum < 0) {
09397 seqNum = cmlGetNextSeqVal(&icss);
09398 if (seqNum < 0) {
09399 rodsLog(LOG_NOTICE, "chlInsDvmTable cmlGetNextSeqVal failure %d",
09400 seqNum);
09401 _rollback("chlInsDvmTable");
09402 return(seqNum);
09403 }
09404 snprintf(dvmIdStr, MAX_NAME_LEN, "%lld", seqNum);
09405
09406 i=0;
09407 cllBindVars[i++]=dvmIdStr;
09408 cllBindVars[i++]=baseName;
09409 cllBindVars[i++]=varName;
09410 cllBindVars[i++]=action;
09411 cllBindVars[i++]=var2CMap;
09412 cllBindVars[i++]=rsComm->clientUser.userName;
09413 cllBindVars[i++]=rsComm->clientUser.rodsZone;
09414 cllBindVars[i++]=myTime;
09415 cllBindVars[i++]=myTime;
09416 cllBindVarCount=i;
09417 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsDvmTable SQL 2");
09418 status = cmlExecuteNoAnswerSql(
09419 "insert into R_RULE_DVM(dvm_id, dvm_base_name, dvm_ext_var_name, dvm_condition, dvm_int_map_path, dvm_owner_name, dvm_owner_zone, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?, ?, ?, ?)",
09420 &icss);
09421 if (status != 0) {
09422 rodsLog(LOG_NOTICE,
09423 "chlInsDvmTable cmlExecuteNoAnswerSql DVM Main Insert failure %d",status);
09424 return(status);
09425 }
09426 }
09427 else {
09428 snprintf(dvmIdStr, MAX_NAME_LEN, "%lld", seqNum);
09429 }
09430 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsDvmTable SQL 3");
09431 i = 0;
09432 cllBindVars[i++]=baseName;
09433 cllBindVars[i++]=dvmIdStr;
09434 cllBindVars[i++]=rsComm->clientUser.userName;
09435 cllBindVars[i++]=rsComm->clientUser.rodsZone;
09436 cllBindVars[i++]=myTime;
09437 cllBindVars[i++]=myTime;
09438 cllBindVarCount=i;
09439 status = cmlExecuteNoAnswerSql(
09440 "insert into R_RULE_DVM_MAP (map_dvm_base_name, dvm_id, map_owner_name,map_owner_zone, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?)",
09441 &icss);
09442 if (status != 0) {
09443 rodsLog(LOG_NOTICE,
09444 "chlInsDvmTable cmlExecuteNoAnswerSql DVM Map insert failure %d" , status);
09445
09446 return(status);
09447 }
09448
09449 return(0);
09450 }
09451
09452
09453
09454
09455
09456
09457
09458
09459 int
09460 chlInsFnmTable(rsComm_t *rsComm,
09461 char *baseName, char *funcName,
09462 char *func2CMap, char *myTime) {
09463 int status;
09464 int i;
09465 rodsLong_t seqNum = -1;
09466 char fnmIdStr[MAX_NAME_LEN];
09467 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsFnmTable");
09468
09469 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
09470 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
09471 }
09472
09473 if (!icss.status) {
09474 return(CATALOG_NOT_CONNECTED);
09475 }
09476
09477
09478 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsFnmTable SQL 1");
09479 i=0;
09480 cllBindVars[i++]=baseName;
09481 cllBindVars[i++]=funcName;
09482 cllBindVars[i++]=func2CMap;
09483 cllBindVarCount=i;
09484 status = cmlGetIntegerValueFromSqlV3(
09485 "select fnm_id from R_RULE_FNM where fnm_base_name = ? and fnm_ext_func_name = ? and fnm_int_func_name = ? ",
09486 &seqNum,
09487 &icss);
09488 if (status != 0 && status != CAT_NO_ROWS_FOUND) {
09489 rodsLog(LOG_NOTICE,
09490 "chlInsFnmTable cmlGetIntegerValueFromSqlV3 find FNM if any failure %d",status);
09491 return(status);
09492 }
09493 if (seqNum < 0) {
09494 seqNum = cmlGetNextSeqVal(&icss);
09495 if (seqNum < 0) {
09496 rodsLog(LOG_NOTICE, "chlInsFnmTable cmlGetNextSeqVal failure %d",
09497 seqNum);
09498 _rollback("chlInsFnmTable");
09499 return(seqNum);
09500 }
09501 snprintf(fnmIdStr, MAX_NAME_LEN, "%lld", seqNum);
09502
09503 i=0;
09504 cllBindVars[i++]=fnmIdStr;
09505 cllBindVars[i++]=baseName;
09506 cllBindVars[i++]=funcName;
09507 cllBindVars[i++]=func2CMap;
09508 cllBindVars[i++]=rsComm->clientUser.userName;
09509 cllBindVars[i++]=rsComm->clientUser.rodsZone;
09510 cllBindVars[i++]=myTime;
09511 cllBindVars[i++]=myTime;
09512 cllBindVarCount=i;
09513 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsFnmTable SQL 2");
09514 status = cmlExecuteNoAnswerSql(
09515 "insert into R_RULE_FNM(fnm_id, fnm_base_name, fnm_ext_func_name, fnm_int_func_name, fnm_owner_name, fnm_owner_zone, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?, ?, ?)",
09516 &icss);
09517 if (status != 0) {
09518 rodsLog(LOG_NOTICE,
09519 "chlInsFnmTable cmlExecuteNoAnswerSql FNM Main Insert failure %d",status);
09520 return(status);
09521 }
09522 }
09523 else {
09524 snprintf(fnmIdStr, MAX_NAME_LEN, "%lld", seqNum);
09525 }
09526 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsFnmTable SQL 3");
09527 i = 0;
09528 cllBindVars[i++]=baseName;
09529 cllBindVars[i++]=fnmIdStr;
09530 cllBindVars[i++]=rsComm->clientUser.userName;
09531 cllBindVars[i++]=rsComm->clientUser.rodsZone;
09532 cllBindVars[i++]=myTime;
09533 cllBindVars[i++]=myTime;
09534 cllBindVarCount=i;
09535 status = cmlExecuteNoAnswerSql(
09536 "insert into R_RULE_FNM_MAP (map_fnm_base_name, fnm_id, map_owner_name,map_owner_zone, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?)",
09537 &icss);
09538 if (status != 0) {
09539 rodsLog(LOG_NOTICE,
09540 "chlInsFnmTable cmlExecuteNoAnswerSql FNM Map insert failure %d" , status);
09541
09542 return(status);
09543 }
09544
09545 return(0);
09546 }
09547
09548
09549
09550
09551
09552
09553
09554
09555
09556
09557 int chlInsMsrvcTable(rsComm_t *rsComm,
09558 char *moduleName, char *msrvcName,
09559 char *msrvcSignature, char *msrvcVersion,
09560 char *msrvcHost, char *msrvcLocation,
09561 char *msrvcLanguage, char *msrvcTypeName, char *msrvcStatus,
09562 char *myTime)
09563 {
09564 int status;
09565 int i;
09566 rodsLong_t seqNum = -1;
09567 char msrvcIdStr[MAX_NAME_LEN];
09568 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsMsrvcTable");
09569
09570 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
09571 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
09572 }
09573
09574 if (!icss.status) {
09575 return(CATALOG_NOT_CONNECTED);
09576 }
09577
09578
09579 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsMsrvcTable SQL 1");
09580 i=0;
09581 cllBindVars[i++]=moduleName;
09582 cllBindVars[i++]=msrvcName;
09583 cllBindVarCount=i;
09584 status = cmlGetIntegerValueFromSqlV3(
09585 "select msrvc_id from R_MICROSRVC_MAIN where msrvc_module_name = ? and msrvc_name = ? ",
09586 &seqNum,
09587 &icss);
09588 if (status != 0 && status != CAT_NO_ROWS_FOUND) {
09589 rodsLog(LOG_NOTICE,
09590 "chlInsMsrvcTable cmlGetIntegerValueFromSqlV3 find MSRVC if any failure %d",status);
09591 return(status);
09592 }
09593 if (seqNum < 0) {
09594 seqNum = cmlGetNextSeqVal(&icss);
09595 if (seqNum < 0) {
09596 rodsLog(LOG_NOTICE, "chlInsMsrvcTable cmlGetNextSeqVal failure %d",
09597 seqNum);
09598 _rollback("chlInsMsrvcTable");
09599 return(seqNum);
09600 }
09601 snprintf(msrvcIdStr, MAX_NAME_LEN, "%lld", seqNum);
09602
09603 i=0;
09604 cllBindVars[i++]=msrvcIdStr;
09605 cllBindVars[i++]=msrvcName;
09606 cllBindVars[i++]=moduleName;
09607 cllBindVars[i++]=msrvcSignature;
09608 cllBindVars[i++]=rsComm->clientUser.userName;
09609 cllBindVars[i++]=rsComm->clientUser.rodsZone;
09610 cllBindVars[i++]=myTime;
09611 cllBindVars[i++]=myTime;
09612 cllBindVarCount=i;
09613 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsMsrvcTable SQL 2");
09614 status = cmlExecuteNoAnswerSql(
09615 "insert into R_MICROSRVC_MAIN(msrvc_id, msrvc_name, msrvc_module_name, msrvc_signature, msrvc_doxygen, msrvc_variations, msrvc_owner_name, msrvc_owner_zone, create_ts, modify_ts) values (?, ?, ?, ?, 'NONE', 'NONE', ?, ?, ?, ?)",
09616 &icss);
09617 if (status != 0) {
09618 rodsLog(LOG_NOTICE,
09619 "chlInsMsrvcTable cmlExecuteNoAnswerSql R_MICROSRVC_MAIN Insert failure %d",status);
09620 return(status);
09621 }
09622
09623 i=0;
09624 cllBindVars[i++]=msrvcIdStr;
09625 cllBindVars[i++]=msrvcVersion;
09626 cllBindVars[i++]=msrvcHost;
09627 cllBindVars[i++]=msrvcLocation;
09628 cllBindVars[i++]=msrvcLanguage;
09629 cllBindVars[i++]=msrvcTypeName;
09630 cllBindVars[i++]=msrvcStatus;
09631 cllBindVars[i++]=rsComm->clientUser.userName;
09632 cllBindVars[i++]=rsComm->clientUser.rodsZone;
09633 cllBindVars[i++]=myTime;
09634 cllBindVars[i++]=myTime;
09635 cllBindVarCount=i;
09636 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsMsrvcTable SQL 3");
09637 status = cmlExecuteNoAnswerSql(
09638 "insert into R_MICROSRVC_VER(msrvc_id, msrvc_version, msrvc_host, msrvc_location, msrvc_language, msrvc_type_name, msrvc_status, msrvc_owner_name, msrvc_owner_zone, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
09639 &icss);
09640 if (status != 0) {
09641 rodsLog(LOG_NOTICE,
09642 "chlInsMsrvcTable cmlExecuteNoAnswerSql R_MICROSRVC_VER Insert failure %d",status);
09643 return(status);
09644 }
09645 }
09646 else {
09647 snprintf(msrvcIdStr, MAX_NAME_LEN, "%lld", seqNum);
09648
09649 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsMsrvcTable SQL 4");
09650 i=0;
09651 cllBindVars[i++]=msrvcIdStr;
09652 cllBindVars[i++]=msrvcHost;
09653 cllBindVars[i++]=msrvcLocation;
09654 cllBindVarCount=i;
09655 status = cmlGetIntegerValueFromSqlV3(
09656 "select msrvc_id from R_MICROSRVC_VER where msrvc_id = ? and msrvc_host = ? and msrvc_location = ? ",
09657 &seqNum, &icss);
09658 if (status != 0 && status != CAT_NO_ROWS_FOUND) {
09659 rodsLog(LOG_NOTICE,
09660 "chlInsMsrvcTable cmlGetIntegerValueFromSqlV4 find MSRVC_HOST if any failure %d",status);
09661 return(status);
09662 }
09663
09664 i=0;
09665 cllBindVars[i++]=msrvcIdStr;
09666 cllBindVars[i++]=msrvcVersion;
09667 cllBindVars[i++]=msrvcHost;
09668 cllBindVars[i++]=msrvcLocation;
09669 cllBindVars[i++]=msrvcLanguage;
09670 cllBindVars[i++]=msrvcTypeName;
09671 cllBindVars[i++]=rsComm->clientUser.userName;
09672 cllBindVars[i++]=rsComm->clientUser.rodsZone;
09673 cllBindVars[i++]=myTime;
09674 cllBindVars[i++]=myTime;
09675 cllBindVarCount=i;
09676 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsMsrvcTable SQL 3");
09677 status = cmlExecuteNoAnswerSql(
09678 "insert into R_MICROSRVC_VER(msrvc_id, msrvc_version, msrvc_host, msrvc_location, msrvc_language, msrvc_type_name, msrvc_owner_name, msrvc_owner_zone, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
09679 &icss);
09680 if (status != 0) {
09681 rodsLog(LOG_NOTICE,
09682 "chlInsMsrvcTable cmlExecuteNoAnswerSql R_MICROSRVC_VER Insert failure %d",status);
09683 return(status);
09684 }
09685 }
09686
09687 return(0);
09688 }
09689
09690
09691
09692
09693
09694
09695
09696 int
09697 chlVersionRuleBase(rsComm_t *rsComm,
09698 char *baseName, char *myTime) {
09699
09700 int i, status;
09701
09702 if (logSQL!=0) rodsLog(LOG_SQL, "chlVersionRuleBase");
09703
09704 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
09705 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
09706 }
09707
09708 if (!icss.status) {
09709 return(CATALOG_NOT_CONNECTED);
09710 }
09711
09712 i=0;
09713 cllBindVars[i++]=myTime;
09714 cllBindVars[i++]=myTime;
09715 cllBindVars[i++]=baseName;
09716 cllBindVarCount=i;
09717 if (logSQL!=0) rodsLog(LOG_SQL, "chlVersionRuleBase SQL 1");
09718
09719 status = cmlExecuteNoAnswerSql(
09720 "update R_RULE_BASE_MAP set map_version = ?, modify_ts = ? where map_base_name = ? and map_version = '0'",&icss);
09721 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
09722 rodsLog(LOG_NOTICE,
09723 "chlVersionRuleBase cmlExecuteNoAnswerSql Rule Map version update failure %d" , status);
09724 return(status);
09725
09726 }
09727
09728 return(0);
09729 }
09730
09731
09732
09733
09734
09735
09736
09737 int
09738 chlVersionDvmBase(rsComm_t *rsComm,
09739 char *baseName, char *myTime) {
09740 int i, status;
09741
09742 if (logSQL!=0) rodsLog(LOG_SQL, "chlVersionDvmBase");
09743
09744 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
09745 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
09746 }
09747
09748 if (!icss.status) {
09749 return(CATALOG_NOT_CONNECTED);
09750 }
09751
09752 i=0;
09753 cllBindVars[i++]=myTime;
09754 cllBindVars[i++]=myTime;
09755 cllBindVars[i++]=baseName;
09756 cllBindVarCount=i;
09757 if (logSQL!=0) rodsLog(LOG_SQL, "chlVersionDvmBase SQL 1");
09758
09759 status = cmlExecuteNoAnswerSql(
09760 "update R_RULE_DVM_MAP set map_dvm_version = ?, modify_ts = ? where map_dvm_base_name = ? and map_dvm_version = '0'",&icss);
09761 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
09762 rodsLog(LOG_NOTICE,
09763 "chlVersionDvmBase cmlExecuteNoAnswerSql DVM Map version update failure %d" , status);
09764 return(status);
09765
09766 }
09767
09768 return(0);
09769 }
09770
09771
09772
09773
09774
09775
09776
09777 int
09778 chlVersionFnmBase(rsComm_t *rsComm,
09779 char *baseName, char *myTime) {
09780
09781 int i, status;
09782
09783 if (logSQL!=0) rodsLog(LOG_SQL, "chlVersionFnmBase");
09784
09785 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
09786 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
09787 }
09788
09789 if (!icss.status) {
09790 return(CATALOG_NOT_CONNECTED);
09791 }
09792
09793 i=0;
09794 cllBindVars[i++]=myTime;
09795 cllBindVars[i++]=myTime;
09796 cllBindVars[i++]=baseName;
09797 cllBindVarCount=i;
09798 if (logSQL!=0) rodsLog(LOG_SQL, "chlVersionFnmBase SQL 1");
09799
09800 status = cmlExecuteNoAnswerSql(
09801 "update R_RULE_FNM_MAP set map_fnm_version = ?, modify_ts = ? where map_fnm_base_name = ? and map_fnm_version = '0'",&icss);
09802 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
09803 rodsLog(LOG_NOTICE,
09804 "chlVersionFnmBase cmlExecuteNoAnswerSql FNM Map version update failure %d" , status);
09805 return(status);
09806
09807 }
09808
09809 return(0);
09810 }
09811
09812
09813
09814
09815
09816
09817
09818 int
09819 icatCheckResc(char *rescName) {
09820 int status;
09821 rodsLong_t rescId;
09822 status = getLocalZone();
09823 if (status != 0) return(status);
09824
09825 rescId=0;
09826 if (logSQL!=0) rodsLog(LOG_SQL, "icatCheckResc SQxL 1");
09827 status = cmlGetIntegerValueFromSql(
09828 "select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
09829 &rescId, rescName, localZone, 0, 0, 0, &icss);
09830 if (status != 0) {
09831 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
09832 _rollback("icatCheckResc");
09833 }
09834 return(status);
09835 }
09836
09837 int
09838 chlAddSpecificQuery(rsComm_t *rsComm, char *sql, char *alias) {
09839 int status, i;
09840 char myTime[50];
09841 char tsCreateTime[50];
09842 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddSpecificQuery");
09843
09844 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
09845 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
09846 }
09847
09848 if (strlen(sql) < 5) {
09849 return(CAT_INVALID_ARGUMENT);
09850 }
09851
09852 if (!icss.status) {
09853 return(CATALOG_NOT_CONNECTED);
09854 }
09855
09856 getNowStr(myTime);
09857
09858 if (alias != NULL && strlen(alias)>0) {
09859 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddSpecificQuery SQL 1");
09860 status = cmlGetStringValueFromSql(
09861 "select create_ts from R_SPECIFIC_QUERY where alias=?",
09862 tsCreateTime, 50,
09863 alias, "" , "", &icss);
09864 if (status==0) {
09865 i = addRErrorMsg (&rsComm->rError, 0, "Alias is not unique");
09866 return(CAT_INVALID_ARGUMENT);
09867 }
09868 i=0;
09869 cllBindVars[i++]=sql;
09870 cllBindVars[i++]=alias;
09871 cllBindVars[i++]=myTime;
09872 cllBindVarCount=i;
09873 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddSpecificQuery SQL 2");
09874 status = cmlExecuteNoAnswerSql(
09875 "insert into R_SPECIFIC_QUERY (sqlStr, alias, create_ts) values (?, ?, ?)",
09876 &icss);
09877 }
09878 else {
09879 i=0;
09880 cllBindVars[i++]=sql;
09881 cllBindVars[i++]=myTime;
09882 cllBindVarCount=i;
09883 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddSpecificQuery SQL 3");
09884 status = cmlExecuteNoAnswerSql(
09885 "insert into R_SPECIFIC_QUERY (sqlStr, create_ts) values (?, ?)",
09886 &icss);
09887 }
09888
09889 if (status != 0) {
09890 rodsLog(LOG_NOTICE,
09891 "chlAddSpecificQuery cmlExecuteNoAnswerSql insert failure %d",
09892 status);
09893 return(status);
09894 }
09895
09896 status = cmlExecuteNoAnswerSql("commit", &icss);
09897 return(status);
09898 }
09899
09900 int
09901 chlDelSpecificQuery(rsComm_t *rsComm, char *sqlOrAlias) {
09902 int status, i;
09903 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelSpecificQuery");
09904
09905 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
09906 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
09907 }
09908
09909 if (!icss.status) {
09910 return(CATALOG_NOT_CONNECTED);
09911 }
09912
09913 i=0;
09914 cllBindVars[i++]=sqlOrAlias;
09915 cllBindVarCount=i;
09916 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelSpecificQuery SQL 1");
09917 status = cmlExecuteNoAnswerSql(
09918 "delete from R_SPECIFIC_QUERY where sqlStr = ?",
09919 &icss);
09920
09921 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) {
09922 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelSpecificQuery SQL 2");
09923 i=0;
09924 cllBindVars[i++]=sqlOrAlias;
09925 cllBindVarCount=i;
09926 status = cmlExecuteNoAnswerSql(
09927 "delete from R_SPECIFIC_QUERY where alias = ?",
09928 &icss);
09929 }
09930
09931 if (status != 0) {
09932 rodsLog(LOG_NOTICE,
09933 "chlDelSpecificQuery cmlExecuteNoAnswerSql delete failure %d",
09934 status);
09935 return(status);
09936 }
09937
09938 status = cmlExecuteNoAnswerSql("commit", &icss);
09939 return(status);
09940 }
09941
09942
09943
09944
09945
09946
09947
09948
09949
09950 #define MINIMUM_COL_SIZE 50
09951
09952 int
09953 chlSpecificQuery(specificQueryInp_t specificQueryInp, genQueryOut_t *result) {
09954 int i, j, k;
09955 int needToGetNextRow;
09956
09957 char combinedSQL[MAX_SQL_SIZE];
09958
09959 int status, statementNum;
09960 int numOfCols;
09961 int attriTextLen;
09962 int totalLen;
09963 int maxColSize;
09964 int currentMaxColSize;
09965 char *tResult, *tResult2;
09966 char tsCreateTime[50];
09967
09968 int debug=0;
09969
09970 icatSessionStruct *icss;
09971
09972 if (logSQL!=0) rodsLog(LOG_SQL, "chlSpecificQuery");
09973
09974 result->attriCnt=0;
09975 result->rowCnt=0;
09976 result->totalRowCount = 0;
09977
09978 currentMaxColSize=0;
09979
09980 icss = chlGetRcs();
09981 if (icss==NULL) return(CAT_NOT_OPEN);
09982 #ifdef ADDR_64BITS
09983 if (debug) printf("icss=%ld\n",(long int)icss);
09984 #else
09985 if (debug) printf("icss=%d\n",(int)icss);
09986 #endif
09987
09988 if (specificQueryInp.continueInx == 0) {
09989 if (specificQueryInp.sql == NULL) {
09990 return(CAT_INVALID_ARGUMENT);
09991 }
09992
09993
09994
09995 if (logSQL!=0) rodsLog(LOG_SQL, "chlSpecificQuery SQL 1");
09996 status = cmlGetStringValueFromSql(
09997 "select create_ts from R_SPECIFIC_QUERY where sqlStr=?",
09998 tsCreateTime, 50,
09999 specificQueryInp.sql, "" , "", icss);
10000 if (status == CAT_NO_ROWS_FOUND) {
10001 int status2;
10002 if (logSQL!=0) rodsLog(LOG_SQL, "chlSpecificQuery SQL 2");
10003 status2 = cmlGetStringValueFromSql(
10004 "select sqlStr from R_SPECIFIC_QUERY where alias=?",
10005 combinedSQL, sizeof(combinedSQL),
10006 specificQueryInp.sql, "" , "", icss);
10007 if (status2 == CAT_NO_ROWS_FOUND) return(CAT_UNKNOWN_SPECIFIC_QUERY);
10008 if (status2 != 0) return(status2);
10009 }
10010 else {
10011 if (status != 0) return(status);
10012 strncpy(combinedSQL, specificQueryInp.sql, sizeof(combinedSQL));
10013 }
10014
10015 i=0;
10016 while (specificQueryInp.args[i]!=NULL && strlen(specificQueryInp.args[i])>0) {
10017 cllBindVars[cllBindVarCount++]=specificQueryInp.args[i++];
10018 }
10019
10020 if (logSQL!=0) rodsLog(LOG_SQL, "chlSpecificQuery SQL 3");
10021 status = cmlGetFirstRowFromSql(combinedSQL, &statementNum,
10022 specificQueryInp.rowOffset, icss);
10023 if (status < 0) {
10024 if (status != CAT_NO_ROWS_FOUND) {
10025 rodsLog(LOG_NOTICE,
10026 "chlSpecificQuery cmlGetFirstRowFromSql failure %d",
10027 status);
10028 }
10029 return(status);
10030 }
10031
10032 result->continueInx = statementNum+1;
10033 if (debug) printf("statement number =%d\n", statementNum);
10034 needToGetNextRow = 0;
10035 }
10036 else {
10037 statementNum = specificQueryInp.continueInx-1;
10038 needToGetNextRow = 1;
10039 if (specificQueryInp.maxRows<=0) {
10040 status = cmlFreeStatement(statementNum, icss);
10041 return(status);
10042 }
10043 }
10044 for (i=0;i<specificQueryInp.maxRows;i++) {
10045 if (needToGetNextRow) {
10046 status = cmlGetNextRowFromStatement(statementNum, icss);
10047 if (status == CAT_NO_ROWS_FOUND) {
10048 cmlFreeStatement(statementNum, icss);
10049 result->continueInx=0;
10050 if (result->rowCnt==0) return(status);
10051
10052 return(0);
10053 }
10054 if (status < 0) return(status);
10055 }
10056 needToGetNextRow = 1;
10057
10058 result->rowCnt++;
10059 if (debug) printf("result->rowCnt=%d\n", result->rowCnt);
10060 numOfCols = icss->stmtPtr[statementNum]->numOfCols;
10061 if (debug) printf("numOfCols=%d\n",numOfCols);
10062 result->attriCnt=numOfCols;
10063 result->continueInx = statementNum+1;
10064
10065 maxColSize=0;
10066
10067 for (k=0;k<numOfCols;k++) {
10068 j = strlen(icss->stmtPtr[statementNum]->resultValue[k]);
10069 if (maxColSize <= j) maxColSize=j;
10070 }
10071 maxColSize++;
10072 if (maxColSize < MINIMUM_COL_SIZE) {
10073 maxColSize=MINIMUM_COL_SIZE;
10074 }
10075 if (debug) printf("maxColSize=%d\n",maxColSize);
10076
10077 if (i==0) {
10078 attriTextLen= numOfCols * maxColSize;
10079 if (debug) printf("attriTextLen=%d\n",attriTextLen);
10080 totalLen = attriTextLen * specificQueryInp.maxRows;
10081 for (j=0;j<numOfCols;j++) {
10082 tResult = (char *) malloc(totalLen);
10083 if (tResult==NULL) return(SYS_MALLOC_ERR);
10084 memset(tResult, 0, totalLen);
10085 result->sqlResult[j].attriInx = 0;
10086
10087
10088 result->sqlResult[j].len = maxColSize;
10089 result->sqlResult[j].value = tResult;
10090 }
10091 currentMaxColSize = maxColSize;
10092 }
10093
10094
10095
10096
10097
10098
10099 if (maxColSize > currentMaxColSize) {
10100 maxColSize += MINIMUM_COL_SIZE;
10101
10102 if (debug) printf("Bumping %d to %d\n",
10103 currentMaxColSize, maxColSize);
10104 attriTextLen= numOfCols * maxColSize;
10105 if (debug) printf("attriTextLen=%d\n",attriTextLen);
10106 totalLen = attriTextLen * specificQueryInp.maxRows;
10107 for (j=0;j<numOfCols;j++) {
10108 char *cp1, *cp2;
10109 int k;
10110 tResult = (char *) malloc(totalLen);
10111 if (tResult==NULL) return(SYS_MALLOC_ERR);
10112 memset(tResult, 0, totalLen);
10113 cp1 = result->sqlResult[j].value;
10114 cp2 = tResult;
10115 for (k=0;k<result->rowCnt;k++) {
10116 strncpy(cp2, cp1, result->sqlResult[j].len);
10117 cp1 += result->sqlResult[j].len;
10118 cp2 += maxColSize;
10119 }
10120 free(result->sqlResult[j].value);
10121 result->sqlResult[j].len = maxColSize;
10122 result->sqlResult[j].value = tResult;
10123 }
10124 currentMaxColSize = maxColSize;
10125 }
10126
10127
10128
10129 for (j=0;j<numOfCols;j++) {
10130 tResult2 = result->sqlResult[j].value;
10131 tResult2 += currentMaxColSize*(result->rowCnt-1);
10132
10133 strncpy(tResult2, icss->stmtPtr[statementNum]->resultValue[j],
10134 currentMaxColSize);
10135 }
10136
10137 }
10138
10139 result->continueInx=statementNum+1;
10140
10141 return(0);
10142
10143 }