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