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