00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "icatMidLevelRoutines.h"
00018 #include "icatLowLevel.h"
00019 #include "icatMidLevelHelpers.h"
00020
00021 #include "rcMisc.h"
00022
00023
00024 #define AUDIT_COMMENT_MAX_SIZE 1000
00025
00026 int logSQL_CML=0;
00027 int auditEnabled=0;
00028
00029
00030
00031
00032
00033 int cmlDebug(int mode) {
00034 logSQL_CML = mode;
00035 if (mode > 1) {
00036 if (auditEnabled==0) auditEnabled=1;
00037
00038
00039 }
00040 else {
00041 if (auditEnabled==1) auditEnabled=0;
00042 }
00043 return(0);
00044 }
00045
00046 int cmlOpen( icatSessionStruct *icss) {
00047 int i;
00048
00049
00050 for (i=0; i<MAX_NUM_OF_CONCURRENT_STMTS; i++) {
00051 icss->stmtPtr[i]=0;
00052 }
00053
00054
00055
00056
00057
00058
00059 icss->databaseType = DB_TYPE_POSTGRES;
00060 #ifdef ORA_ICAT
00061 icss->databaseType = DB_TYPE_ORACLE;
00062 #endif
00063 #ifdef MY_ICAT
00064 icss->databaseType = DB_TYPE_MYSQL;
00065 #endif
00066
00067
00068
00069 i = cllOpenEnv(icss);
00070 if (i != 0) return(CAT_ENV_ERR);
00071
00072
00073 i = cllConnect(icss);
00074 if (i != 0) return(CAT_CONNECT_ERR);
00075
00076 return(0);
00077 }
00078
00079 int cmlClose( icatSessionStruct *icss) {
00080 int status, stat2;
00081 static int pending=0;
00082
00083 if (pending==1) return(0);
00084 pending=1;
00085
00086 status = cllDisconnect(icss);
00087
00088 stat2 = cllCloseEnv(icss);
00089
00090 pending=0;
00091 if (status) {
00092 return(CAT_DISCONNECT_ERR);
00093 }
00094 if (stat2) {
00095 return(CAT_CLOSE_ENV_ERR);
00096 }
00097 return(0);
00098 }
00099
00100
00101 int cmlExecuteNoAnswerSql( char *sql,
00102 icatSessionStruct *icss)
00103 {
00104 int i;
00105
00106 i = cllExecSqlNoResult(icss, sql);
00107 if (i) {
00108 if (i <= CAT_ENV_ERR) return(i);
00109 return(CAT_SQL_ERR);
00110 }
00111 return(0);
00112
00113 }
00114
00115 int cmlGetOneRowFromSqlBV (char *sql,
00116 char *cVal[],
00117 int cValSize[],
00118 int numOfCols,
00119 char *bindVar1,
00120 char *bindVar2,
00121 char *bindVar3,
00122 char *bindVar4,
00123 char *bindVar5,
00124 icatSessionStruct *icss)
00125 {
00126 int i,j, stmtNum, ii;
00127
00128 i = cllExecSqlWithResultBV(icss, &stmtNum, sql,
00129 bindVar1,bindVar2,bindVar3,bindVar4,
00130 bindVar5,0);
00131 if (i != 0) {
00132 if (i <= CAT_ENV_ERR) return(i);
00133 return (CAT_SQL_ERR);
00134 }
00135 i = cllGetRow(icss,stmtNum);
00136 if (i != 0) {
00137 ii = cllFreeStatement(icss,stmtNum);
00138 return(CAT_GET_ROW_ERR);
00139 }
00140 if (icss->stmtPtr[stmtNum]->numOfCols == 0) {
00141 ii = cllFreeStatement(icss,stmtNum);
00142 return(CAT_NO_ROWS_FOUND);
00143 }
00144 for (j = 0; j < numOfCols && j < icss->stmtPtr[stmtNum]->numOfCols ; j++ )
00145 rstrcpy(cVal[j],icss->stmtPtr[stmtNum]->resultValue[j],cValSize[j]);
00146
00147 i = cllFreeStatement(icss,stmtNum);
00148 return(j);
00149
00150 }
00151
00152 int cmlGetOneRowFromSql (char *sql,
00153 char *cVal[],
00154 int cValSize[],
00155 int numOfCols,
00156 icatSessionStruct *icss)
00157 {
00158 int i,j, stmtNum, ii;
00159
00160 i = cllExecSqlWithResultBV(icss, &stmtNum, sql,
00161 0,0,0,0,0,0);
00162 if (i != 0) {
00163 if (i <= CAT_ENV_ERR) return(i);
00164 return (CAT_SQL_ERR);
00165 }
00166 i = cllGetRow(icss,stmtNum);
00167 if (i != 0) {
00168 ii = cllFreeStatement(icss,stmtNum);
00169 return(CAT_GET_ROW_ERR);
00170 }
00171 if (icss->stmtPtr[stmtNum]->numOfCols == 0) {
00172 ii = cllFreeStatement(icss,stmtNum);
00173 return(CAT_NO_ROWS_FOUND);
00174 }
00175 for (j = 0; j < numOfCols && j < icss->stmtPtr[stmtNum]->numOfCols ; j++ )
00176 rstrcpy(cVal[j],icss->stmtPtr[stmtNum]->resultValue[j],cValSize[j]);
00177
00178 i = cllFreeStatement(icss,stmtNum);
00179 return(j);
00180
00181 }
00182
00183
00184
00185
00186 int cmlGetOneRowFromSqlV2 (char *sql,
00187 char *cVal[],
00188 int maxCols,
00189 char *bindVar1,
00190 char *bindVar2,
00191 icatSessionStruct *icss)
00192 {
00193 int i,j, stmtNum, ii;
00194
00195 i = cllExecSqlWithResultBV(icss, &stmtNum, sql,
00196 bindVar1, bindVar2,0,0,0,0);
00197
00198 if (i != 0) {
00199 if (i <= CAT_ENV_ERR) return(i);
00200 return (CAT_SQL_ERR);
00201 }
00202 i = cllGetRow(icss,stmtNum);
00203 if (i != 0) {
00204 ii = cllFreeStatement(icss,stmtNum);
00205 return(CAT_GET_ROW_ERR);
00206 }
00207 if (icss->stmtPtr[stmtNum]->numOfCols == 0)
00208 return(CAT_NO_ROWS_FOUND);
00209 for (j = 0; j < maxCols && j < icss->stmtPtr[stmtNum]->numOfCols ; j++ )
00210 cVal[j] = icss->stmtPtr[stmtNum]->resultValue[j];
00211
00212 return(stmtNum);
00213 }
00214
00215
00216
00217
00218
00219 static
00220 int cmlGetOneRowFromSqlV3 (char *sql,
00221 char *cVal[],
00222 int cValSize[],
00223 int numOfCols,
00224 icatSessionStruct *icss)
00225 {
00226 int i,j, stmtNum, ii;
00227
00228 i = cllExecSqlWithResult(icss, &stmtNum, sql);
00229
00230 if (i != 0) {
00231 if (i <= CAT_ENV_ERR) return(i);
00232 return (CAT_SQL_ERR);
00233 }
00234 i = cllGetRow(icss,stmtNum);
00235 if (i != 0) {
00236 ii = cllFreeStatement(icss,stmtNum);
00237 return(CAT_GET_ROW_ERR);
00238 }
00239 if (icss->stmtPtr[stmtNum]->numOfCols == 0) {
00240 ii = cllFreeStatement(icss,stmtNum);
00241 return(CAT_NO_ROWS_FOUND);
00242 }
00243 for (j = 0; j < numOfCols && j < icss->stmtPtr[stmtNum]->numOfCols ; j++ )
00244 rstrcpy(cVal[j],icss->stmtPtr[stmtNum]->resultValue[j],cValSize[j]);
00245
00246 i = cllFreeStatement(icss,stmtNum);
00247 return(j);
00248
00249 }
00250
00251
00252 int cmlFreeStatement(int statementNumber, icatSessionStruct *icss)
00253 {
00254 int i;
00255 i = cllFreeStatement(icss,statementNumber);
00256 return(i);
00257 }
00258
00259
00260 int cmlGetFirstRowFromSql (char *sql,
00261 int *statement,
00262 int skipCount,
00263 icatSessionStruct *icss)
00264 {
00265 int i, stmtNum, ii;
00266 #ifdef ORA_ICAT
00267 int j;
00268 #endif
00269 *statement=0;
00270
00271 i = cllExecSqlWithResult(icss, &stmtNum, sql);
00272
00273 if (i != 0) {
00274 if (i <= CAT_ENV_ERR) return(i);
00275 return (CAT_SQL_ERR);
00276 }
00277
00278 #ifdef ORA_ICAT
00279 if (skipCount > 0) {
00280 for (j=0;j<skipCount;j++) {
00281 i = cllGetRow(icss,stmtNum);
00282 if (i != 0) {
00283 ii = cllFreeStatement(icss,stmtNum);
00284 return(CAT_GET_ROW_ERR);
00285 }
00286 if (icss->stmtPtr[stmtNum]->numOfCols == 0) {
00287 i = cllFreeStatement(icss,stmtNum);
00288 return(CAT_NO_ROWS_FOUND);
00289 }
00290 }
00291 }
00292 #endif
00293
00294 i = cllGetRow(icss,stmtNum);
00295 if (i != 0) {
00296 ii = cllFreeStatement(icss,stmtNum);
00297 return(CAT_GET_ROW_ERR);
00298 }
00299 if (icss->stmtPtr[stmtNum]->numOfCols == 0) {
00300 i = cllFreeStatement(icss,stmtNum);
00301 return(CAT_NO_ROWS_FOUND);
00302 }
00303
00304 *statement = stmtNum;
00305 return(0);
00306 }
00307
00308
00309 int cmlGetFirstRowFromSqlBV (char *sql,
00310 char *arg1, char *arg2, char *arg3, char *arg4,
00311 int *statement,
00312 icatSessionStruct *icss)
00313 {
00314 int i, stmtNum, ii;
00315
00316 *statement=0;
00317
00318 i = cllExecSqlWithResultBV(icss, &stmtNum, sql,
00319 arg1,arg2,arg3,arg4,0,0);
00320
00321 if (i != 0) {
00322 if (i <= CAT_ENV_ERR) return(i);
00323 return (CAT_SQL_ERR);
00324 }
00325 i = cllGetRow(icss,stmtNum);
00326 if (i != 0) {
00327 ii = cllFreeStatement(icss,stmtNum);
00328 return(CAT_GET_ROW_ERR);
00329 }
00330 if (icss->stmtPtr[stmtNum]->numOfCols == 0) {
00331 i = cllFreeStatement(icss,stmtNum);
00332 return(CAT_NO_ROWS_FOUND);
00333 }
00334
00335 *statement = stmtNum;
00336 return(0);
00337 }
00338
00339 int cmlGetNextRowFromStatement (int stmtNum,
00340 icatSessionStruct *icss)
00341 {
00342 int i, ii;
00343
00344 i = cllGetRow(icss,stmtNum);
00345 if (i != 0) {
00346 ii = cllFreeStatement(icss,stmtNum);
00347 return(CAT_GET_ROW_ERR);
00348 }
00349 if (icss->stmtPtr[stmtNum]->numOfCols == 0) {
00350 i = cllFreeStatement(icss,stmtNum);
00351 return(CAT_NO_ROWS_FOUND);
00352 }
00353 return(0);
00354 }
00355
00356 int cmlGetStringValueFromSql (char *sql,
00357 char *cVal,
00358 int cValSize,
00359 char *bindVar1,
00360 char *bindVar2,
00361 char *bindVar3,
00362 icatSessionStruct *icss)
00363 {
00364 int i;
00365 char *cVals[2];
00366 int iVals[2];
00367
00368 cVals[0]=cVal;
00369 iVals[0]=cValSize;
00370
00371 i = cmlGetOneRowFromSqlBV (sql, cVals, iVals, 1,
00372 bindVar1, bindVar2, bindVar3, 0, 0, icss);
00373 if (i == 1)
00374 return(0);
00375 else
00376 return(i);
00377
00378 }
00379
00380 int cmlGetStringValuesFromSql (char *sql,
00381 char *cVal[],
00382 int cValSize[],
00383 int numberOfStringsToGet,
00384 char *bindVar1,
00385 char *bindVar2,
00386 char *bindVar3,
00387 icatSessionStruct *icss)
00388 {
00389 int i;
00390
00391 i = cmlGetOneRowFromSqlBV (sql, cVal, cValSize, numberOfStringsToGet,
00392 bindVar1, bindVar2, bindVar3, 0, 0, icss);
00393 if (i == numberOfStringsToGet)
00394 return(0);
00395 else
00396 return(i);
00397
00398 }
00399
00400 int cmlGetMultiRowStringValuesFromSql (char *sql,
00401 char *returnedStrings,
00402 int maxStringLen,
00403 int maxNumberOfStringsToGet,
00404 char *bindVar1,
00405 char *bindVar2,
00406 icatSessionStruct *icss) {
00407
00408 int i,j, stmtNum, ii;
00409 int tsg;
00410 char *pString;
00411
00412 if (maxNumberOfStringsToGet <= 0) return(CAT_INVALID_ARGUMENT);
00413
00414 i = cllExecSqlWithResultBV(icss, &stmtNum, sql,
00415 bindVar1,bindVar2,0,0,0,0);
00416 if (i != 0) {
00417 if (i <= CAT_ENV_ERR) return(i);
00418 return (CAT_SQL_ERR);
00419 }
00420 tsg = 0;
00421 pString = returnedStrings;
00422 for (;;) {
00423 i = cllGetRow(icss,stmtNum);
00424 if (i != 0) {
00425 ii = cllFreeStatement(icss,stmtNum);
00426 if (tsg > 0) return(tsg);
00427 return(CAT_GET_ROW_ERR);
00428 }
00429 if (icss->stmtPtr[stmtNum]->numOfCols == 0) {
00430 ii = cllFreeStatement(icss,stmtNum);
00431 if (tsg > 0) return(tsg);
00432 return(CAT_NO_ROWS_FOUND);
00433 }
00434 for (j = 0; j < icss->stmtPtr[stmtNum]->numOfCols;j++) {
00435 rstrcpy(pString, icss->stmtPtr[stmtNum]->resultValue[j],
00436 maxStringLen);
00437 tsg++;
00438 pString+=maxStringLen;
00439 if (tsg >= maxNumberOfStringsToGet) {
00440 i = cllFreeStatement(icss,stmtNum);
00441 return(tsg);
00442 }
00443 }
00444 }
00445 }
00446
00447
00448 int cmlGetIntegerValueFromSql (char *sql,
00449 rodsLong_t *iVal,
00450 char *bindVar1,
00451 char *bindVar2,
00452 char *bindVar3,
00453 char *bindVar4,
00454 char *bindVar5,
00455 icatSessionStruct *icss)
00456 {
00457 int i, cValSize;
00458 char *cVal[2];
00459 char cValStr[MAX_INTEGER_SIZE+10];
00460
00461 cVal[0]=cValStr;
00462 cValSize = MAX_INTEGER_SIZE;
00463
00464 i = cmlGetOneRowFromSqlBV (sql, cVal, &cValSize, 1,
00465 bindVar1, bindVar2, bindVar3, bindVar4,
00466 bindVar5, icss);
00467 if (i == 1) {
00468 if (*cVal[0]=='\0') {
00469 return(CAT_NO_ROWS_FOUND);
00470 }
00471 *iVal = strtoll(*cVal, NULL, 0);
00472 return(0);
00473 }
00474 return(i);
00475 }
00476
00477
00478 int cmlGetIntegerValueFromSqlV3 (char *sql,
00479 rodsLong_t *iVal,
00480 icatSessionStruct *icss)
00481 {
00482 int i, cValSize;
00483 char *cVal[2];
00484 char cValStr[MAX_INTEGER_SIZE+10];
00485
00486 cVal[0]=cValStr;
00487 cValSize = MAX_INTEGER_SIZE;
00488
00489 i = cmlGetOneRowFromSqlV3 (sql, cVal, &cValSize, 1, icss);
00490 if (i == 1) {
00491 if (*cVal[0]=='\0') {
00492 return(CAT_NO_ROWS_FOUND);
00493 }
00494 *iVal = strtoll(*cVal, NULL, 0);
00495 return(0);
00496 }
00497 return(i);
00498 }
00499
00500 int cmlCheckNameToken(char *nameSpace, char *tokenName, icatSessionStruct *icss)
00501 {
00502
00503 rodsLong_t iVal;
00504 int status;
00505
00506 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckNameToken SQL 1 ");
00507 status = cmlGetIntegerValueFromSql (
00508 "select token_id from R_TOKN_MAIN where token_namespace=? and token_name=?",
00509 &iVal, nameSpace, tokenName, 0, 0, 0, icss);
00510 return(status);
00511
00512 }
00513
00514 int cmlModifySingleTable (char *tableName,
00515 char *updateCols[],
00516 char *updateValues[],
00517 char *whereColsAndConds[],
00518 char *whereValues[],
00519 int numOfUpdates,
00520 int numOfConds,
00521 icatSessionStruct *icss)
00522 {
00523 char tsql[MAX_SQL_SIZE];
00524 int i, l;
00525 char *rsql;
00526
00527 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlModifySingleTable SQL 1 ");
00528
00529 snprintf(tsql, MAX_SQL_SIZE, "update %s set ", tableName);
00530 l = strlen(tsql);
00531 rsql = tsql + l;
00532
00533 cmlArraysToStrWithBind ( rsql, "", updateCols,updateValues, numOfUpdates, " = ", ", ",MAX_SQL_SIZE - l);
00534 l = strlen(tsql);
00535 rsql = tsql + l;
00536
00537 cmlArraysToStrWithBind(rsql, " where ", whereColsAndConds, whereValues, numOfConds, "", " and ", MAX_SQL_SIZE - l);
00538
00539 i = cmlExecuteNoAnswerSql( tsql, icss);
00540 return(i);
00541
00542 }
00543
00544 #define STR_LEN 100
00545 rodsLong_t
00546 cmlGetNextSeqVal(icatSessionStruct *icss) {
00547 char nextStr[STR_LEN];
00548 char sql[STR_LEN];
00549 int status;
00550 rodsLong_t iVal;
00551
00552 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlGetNextSeqVal SQL 1 ");
00553
00554 nextStr[0]='\0';
00555
00556 cllNextValueString("R_ObjectID", nextStr, STR_LEN);
00557
00558
00559
00560 #ifdef ORA_ICAT
00561
00562 snprintf(sql, STR_LEN, "select %s from DUAL", nextStr);
00563 #else
00564
00565 snprintf(sql, STR_LEN, "select %s", nextStr);
00566 #endif
00567
00568 status = cmlGetIntegerValueFromSql (sql, &iVal, 0, 0, 0, 0, 0, icss);
00569 if (status < 0) {
00570 rodsLog(LOG_NOTICE,
00571 "cmlGetNextSeqVal cmlGetIntegerValueFromSql failure %d", status);
00572 return(status);
00573 }
00574 return(iVal);
00575 }
00576
00577 rodsLong_t
00578 cmlGetCurrentSeqVal(icatSessionStruct *icss) {
00579 char nextStr[STR_LEN];
00580 char sql[STR_LEN];
00581 int status;
00582 rodsLong_t iVal;
00583
00584 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlGetCurrentSeqVal SQL 1 ");
00585
00586 nextStr[0]='\0';
00587
00588 cllCurrentValueString("R_ObjectID", nextStr, STR_LEN);
00589
00590
00591
00592 #ifdef ORA_ICAT
00593
00594 snprintf(sql, STR_LEN, "select %s from DUAL", nextStr);
00595 #else
00596
00597 snprintf(sql, STR_LEN, "select %s", nextStr);
00598 #endif
00599
00600 status = cmlGetIntegerValueFromSql (sql, &iVal, 0, 0, 0, 0, 0, icss);
00601 if (status < 0) {
00602 rodsLog(LOG_NOTICE,
00603 "cmlGetCurrentSeqVal cmlGetIntegerValueFromSql failure %d",
00604 status);
00605 return(status);
00606 }
00607 return(iVal);
00608 }
00609
00610 int
00611 cmlGetNextSeqStr(char *seqStr, int maxSeqStrLen, icatSessionStruct *icss) {
00612 char nextStr[STR_LEN];
00613 char sql[STR_LEN];
00614 int status;
00615
00616 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlGetNextSeqStr SQL 1 ");
00617
00618 nextStr[0]='\0';
00619 cllNextValueString("R_ObjectID", nextStr, STR_LEN);
00620
00621
00622
00623 #ifdef ORA_ICAT
00624 snprintf(sql, STR_LEN, "select %s from DUAL", nextStr);
00625 #else
00626 snprintf(sql, STR_LEN, "select %s", nextStr);
00627 #endif
00628
00629 status = cmlGetStringValueFromSql (sql, seqStr, maxSeqStrLen, 0, 0, 0, icss);
00630 if (status < 0) {
00631 rodsLog(LOG_NOTICE,
00632 "cmlGetNextSeqStr cmlGetStringValueFromSql failure %d", status);
00633 }
00634 return(status);
00635 }
00636
00637
00638 int cmlTest( icatSessionStruct *icss) {
00639 int i, cValSize;
00640 char *cVal[2];
00641 char cValStr[MAX_INTEGER_SIZE+10];
00642 char sql[100];
00643 rodsLong_t iVal;
00644
00645 strncpy(icss->databaseUsername,"schroede", DB_USERNAME_LEN);
00646 strncpy(icss->databasePassword,"", DB_PASSWORD_LEN);
00647 i = cmlOpen(icss);
00648 if (i != 0) return(i);
00649
00650 cVal[0]=cValStr;
00651 cValSize = MAX_INTEGER_SIZE;
00652 snprintf(sql,sizeof sql,
00653 "select coll_id from R_COLL_MAIN where coll_name='a'");
00654
00655 i = cmlGetOneRowFromSql (sql, cVal, &cValSize, 1, icss);
00656 if (i == 1) {
00657 printf("result = %s\n",cValStr);
00658 i = 0;
00659 }
00660 else {
00661 return(i);
00662 }
00663
00664 snprintf(sql, sizeof sql,
00665 "select data_id from R_DATA_MAIN where coll_id='1' and data_name='a'");
00666 i = cmlGetOneRowFromSql (sql, cVal, &cValSize, 1, icss);
00667 if (i == 1) {
00668 printf("result = %s\n",cValStr);
00669 i = 0;
00670 }
00671
00672 iVal = cmlGetCurrentSeqVal(icss);
00673
00674 return(i);
00675
00676 }
00677
00678
00679
00680
00681
00682 rodsLong_t
00683 cmlCheckResc( char *rescName, char *userName, char *userZone, char *accessLevel,
00684 icatSessionStruct *icss)
00685 {
00686 int status;
00687 rodsLong_t iVal;
00688
00689 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckResc SQL 1 ");
00690
00691 status = cmlGetIntegerValueFromSql(
00692 "select resc_id from R_RESC_MAIN RM, R_OBJT_ACCESS OA, R_USER_GROUP UG, R_USER_MAIN UM, R_TOKN_MAIN TM where RM.resc_name=? 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 = RM.resc_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 = ?",
00693 &iVal, rescName, userName, userZone, accessLevel, 0, icss);
00694 if (status) {
00695
00696
00697
00698 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckResc SQL 2 ");
00699
00700 status = cmlGetIntegerValueFromSql(
00701 "select resc_id from R_RESC_MAIN where resc_name=?",
00702 &iVal, rescName, 0, 0, 0, 0, icss);
00703 if (status) {
00704 return(CAT_UNKNOWN_RESOURCE);
00705 }
00706 return (CAT_NO_ACCESS_PERMISSION);
00707 }
00708
00709 return(iVal);
00710
00711 }
00712
00713
00714
00715
00716
00717
00718 rodsLong_t
00719 cmlCheckDir( char *dirName, char *userName, char *userZone, char *accessLevel,
00720 icatSessionStruct *icss)
00721 {
00722 int status;
00723 rodsLong_t iVal;
00724
00725 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDir SQL 1 ");
00726
00727 status = cmlGetIntegerValueFromSql(
00728 "select coll_id from R_COLL_MAIN CM, R_OBJT_ACCESS OA, R_USER_GROUP UG, R_USER_MAIN UM, R_TOKN_MAIN TM where CM.coll_name=? 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 = ?",
00729 &iVal, dirName, userName, userZone, accessLevel, 0, icss);
00730 if (status) {
00731
00732
00733
00734 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDir SQL 2 ");
00735
00736 status = cmlGetIntegerValueFromSql(
00737 "select coll_id from R_COLL_MAIN where coll_name=?",
00738 &iVal, dirName, 0, 0, 0, 0, icss);
00739 if (status) {
00740 return(CAT_UNKNOWN_COLLECTION);
00741 }
00742 return (CAT_NO_ACCESS_PERMISSION);
00743 }
00744
00745 return(iVal);
00746
00747 }
00748
00749
00750
00751
00752
00753
00754
00755 rodsLong_t
00756 cmlCheckDirAndGetInheritFlag( char *dirName, char *userName, char *userZone,
00757 char *accessLevel, int *inheritFlag,
00758 icatSessionStruct *icss)
00759 {
00760 int status;
00761 rodsLong_t iVal;
00762
00763 int cValSize[2];
00764 char *cVal[3];
00765 char cValStr1[MAX_INTEGER_SIZE+10];
00766 char cValStr2[MAX_INTEGER_SIZE+10];
00767
00768 cVal[0]=cValStr1;
00769 cVal[1]=cValStr2;
00770 cValSize[0] = MAX_INTEGER_SIZE;
00771 cValSize[1] = MAX_INTEGER_SIZE;
00772
00773 *inheritFlag = 0;
00774 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDirAndGetInheritFlag SQL 1 ");
00775
00776 status = cmlGetOneRowFromSqlBV ("select coll_id, coll_inheritance from R_COLL_MAIN CM, R_OBJT_ACCESS OA, R_USER_GROUP UG, R_USER_MAIN UM, R_TOKN_MAIN TM where CM.coll_name=? 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 = ?", cVal, cValSize, 2, dirName, userName, userZone, accessLevel, 0, icss);
00777 if (status == 2) {
00778 if (*cVal[0]=='\0') {
00779 return(CAT_NO_ROWS_FOUND);
00780 }
00781 iVal = strtoll(*cVal, NULL, 0);
00782 if (cValStr2[0]=='1') *inheritFlag = 1;
00783 status = 0;
00784 }
00785
00786 if (status) {
00787
00788
00789
00790 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDirAndGetInheritFlag SQL 2 ");
00791
00792 status = cmlGetIntegerValueFromSql(
00793 "select coll_id from R_COLL_MAIN where coll_name=?",
00794 &iVal, dirName, 0, 0, 0, 0, icss);
00795 if (status) {
00796 return(CAT_UNKNOWN_COLLECTION);
00797 }
00798 return (CAT_NO_ACCESS_PERMISSION);
00799 }
00800
00801 return(iVal);
00802
00803 }
00804
00805
00806
00807
00808
00809
00810 rodsLong_t
00811 cmlCheckDirId( char *dirId, char *userName, char *userZone,
00812 char *accessLevel, icatSessionStruct *icss)
00813 {
00814 int status;
00815 rodsLong_t iVal;
00816
00817 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDirId SQL 1 ");
00818
00819 status = cmlGetIntegerValueFromSql(
00820 "select object_id from R_OBJT_ACCESS OA, R_USER_GROUP UG, R_USER_MAIN UM, R_TOKN_MAIN TM where UM.user_name=? and UM.zone_name=? and UM.user_type_name!='rodsgroup' and UM.user_id = UG.user_id and OA.object_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 = ?",
00821 &iVal, userName, userZone, dirId, accessLevel, 0, icss);
00822 if (status) {
00823
00824
00825
00826 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDirId SQL 2 ");
00827
00828 status = cmlGetIntegerValueFromSql(
00829 "select coll_id from R_COLL_MAIN where coll_id=?",
00830 &iVal, dirId, 0, 0, 0, 0, icss);
00831 if (status) {
00832 return(CAT_UNKNOWN_COLLECTION);
00833 }
00834 return (CAT_NO_ACCESS_PERMISSION);
00835 }
00836
00837 return(0);
00838 }
00839
00840
00841
00842
00843 rodsLong_t
00844 cmlCheckDirOwn( char *dirName, char *userName, char *userZone,
00845 icatSessionStruct *icss)
00846 {
00847 int status;
00848 rodsLong_t iVal;
00849
00850 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDirOwn SQL 1 ");
00851
00852 status = cmlGetIntegerValueFromSql(
00853 "select coll_id from R_COLL_MAIN where coll_name=? and coll_owner_name=? and coll_owner_zone=?",
00854 &iVal, dirName, userName, userZone, 0, 0, icss);
00855 if (status < 0) return(status);
00856 return(iVal);
00857 }
00858
00859
00860
00861
00862
00863
00864
00865 rodsLong_t
00866 cmlCheckDataObjOnly( char *dirName, char *dataName,
00867 char *userName, char *userZone,
00868 char *accessLevel, icatSessionStruct *icss)
00869 {
00870 int status;
00871 rodsLong_t iVal;
00872
00873 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDataObjOnly SQL 1 ");
00874
00875 status = cmlGetIntegerValueFromSql(
00876 "select data_id from R_DATA_MAIN DM, R_OBJT_ACCESS OA, R_USER_GROUP UG, R_USER_MAIN UM, R_TOKN_MAIN TM, R_COLL_MAIN CM where DM.data_name=? and DM.coll_id=CM.coll_id and CM.coll_name=? 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 = ?",
00877 &iVal, dataName, dirName, userName, userZone,
00878 accessLevel, icss);
00879
00880 if (status) {
00881
00882
00883 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDataObjOnly SQL 2 ");
00884
00885 status = cmlGetIntegerValueFromSql(
00886 "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=?",
00887 &iVal, dataName, dirName, 0, 0, 0, icss);
00888 if (status) {
00889 return(CAT_UNKNOWN_FILE);
00890 }
00891 return (CAT_NO_ACCESS_PERMISSION);
00892 }
00893
00894 return(iVal);
00895
00896 }
00897
00898
00899
00900
00901 rodsLong_t
00902 cmlCheckDataObjOwn( char *dirName, char *dataName, char *userName,
00903 char *userZone, icatSessionStruct *icss)
00904 {
00905 int status;
00906 rodsLong_t iVal, collId;
00907 char collIdStr[MAX_NAME_LEN];
00908
00909 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDataObjOwn SQL 1 ");
00910 status = cmlGetIntegerValueFromSql(
00911 "select coll_id from R_COLL_MAIN where coll_name=?",
00912 &iVal, dirName, 0, 0, 0, 0, icss);
00913 if (status < 0) return(status);
00914 collId = iVal;
00915 snprintf(collIdStr, MAX_NAME_LEN, "%lld", collId);
00916
00917 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDataObjOwn SQL 2 ");
00918 status = cmlGetIntegerValueFromSql(
00919 "select data_id from R_DATA_MAIN where data_name=? and coll_id=? and data_owner_name=? and data_owner_zone=?",
00920 &iVal, dataName, collIdStr, userName, userZone, 0, icss);
00921
00922 if (status) {
00923 return (status);
00924 }
00925 return(iVal);
00926 }
00927
00928
00929
00930
00931
00932 int cmlCheckDataObjId( char *dataId, char *userName, char *zoneName,
00933 char *accessLevel, icatSessionStruct *icss)
00934 {
00935 int status;
00936 rodsLong_t iVal;
00937
00938 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDataObjId SQL 1 ");
00939
00940 iVal=0;
00941 status = cmlGetIntegerValueFromSql(
00942 "select object_id from R_OBJT_ACCESS OA, R_DATA_MAIN DM, R_USER_GROUP UG, R_USER_MAIN UM, R_TOKN_MAIN TM where OA.object_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 = ?",
00943 &iVal,
00944 dataId,
00945 userName,
00946 zoneName,
00947 accessLevel,
00948 0,
00949 icss);
00950 if (status != 0) return (CAT_NO_ACCESS_PERMISSION);
00951 if (iVal==0) return (CAT_NO_ACCESS_PERMISSION);
00952 cmlAudit2(AU_ACCESS_GRANTED, dataId, userName, zoneName, accessLevel, icss);
00953 return(status);
00954 }
00955
00956
00957
00958
00959
00960 int cmlCheckGroupAdminAccess(char *userName, char *userZone,
00961 char *groupName, icatSessionStruct *icss) {
00962 int status;
00963 char sVal[MAX_NAME_LEN];
00964 rodsLong_t iVal;
00965
00966 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckGroupAdminAccess SQL 1 ");
00967
00968 status = cmlGetStringValueFromSql(
00969 "select user_id from R_USER_MAIN where user_name=? and zone_name=? and user_type_name='groupadmin'",
00970 sVal, MAX_NAME_LEN, userName, userZone, 0, icss);
00971 if (status==CAT_NO_ROWS_FOUND) return (CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
00972 if (status) return(status);
00973
00974
00975
00976 if (groupName == NULL) {
00977 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
00978 }
00979 if (*groupName == '\0') {
00980 return(0);
00981
00982 }
00983
00984
00985 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckGroupAdminAccess SQL 2 ");
00986
00987 status = cmlGetIntegerValueFromSql(
00988 "select group_user_id from R_USER_GROUP where user_id=? and group_user_id = (select user_id from R_USER_MAIN where user_type_name='rodsgroup' and user_name=?)",
00989 &iVal, sVal, groupName, 0, 0, 0, icss);
00990 if (status==CAT_NO_ROWS_FOUND) return (CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
00991 if (status) return(status);
00992 return(0);
00993 }
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004 int
01005 cmlAudit1(int actionId, char *clientUser, char *zone, char *targetUser,
01006 char *comment, icatSessionStruct *icss)
01007 {
01008 char myTime[50];
01009 char actionIdStr[50];
01010 int status;
01011
01012 if (auditEnabled==0) return(0);
01013
01014 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlAudit1 SQL 1 ");
01015
01016 getNowStr(myTime);
01017
01018 snprintf(actionIdStr, sizeof actionIdStr, "%d", actionId);
01019
01020 cllBindVars[0]=targetUser;
01021 cllBindVars[1]=zone;
01022 cllBindVars[2]=clientUser;
01023 cllBindVars[3]=zone;
01024 cllBindVars[4]=actionIdStr;
01025 cllBindVars[5]=comment;
01026 cllBindVars[6]=myTime;
01027 cllBindVars[7]=myTime;
01028 cllBindVarCount=8;
01029
01030 status = cmlExecuteNoAnswerSql(
01031 "insert into R_OBJT_AUDIT (object_id, user_id, action_id, r_comment, create_ts, modify_ts) values ((select user_id from R_USER_MAIN where user_name=? and zone_name=?), (select user_id from R_USER_MAIN where user_name=? and zone_name=?), ?, ?, ?, ?)", icss);
01032 if (status != 0) {
01033 rodsLog(LOG_NOTICE, "cmlAudit1 insert failure %d", status);
01034 }
01035 #ifdef ORA_ICAT
01036 #else
01037 else {
01038 cllCheckPending("",2, icss->databaseType);
01039
01040
01041 }
01042 #endif
01043 return(status);
01044 }
01045
01046 int
01047 cmlAudit2(int actionId, char *dataId, char *userName, char *zoneName,
01048 char *accessLevel, icatSessionStruct *icss)
01049 {
01050 char myTime[50];
01051 char actionIdStr[50];
01052 int status;
01053
01054 if (auditEnabled==0) return(0);
01055
01056 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlAudit2 SQL 1 ");
01057
01058 getNowStr(myTime);
01059
01060 snprintf(actionIdStr, sizeof actionIdStr, "%d", actionId);
01061
01062 cllBindVars[0]=dataId;
01063 cllBindVars[1]=userName;
01064 cllBindVars[2]=zoneName;
01065 cllBindVars[3]=actionIdStr;
01066 cllBindVars[4]=accessLevel;
01067 cllBindVars[5]=myTime;
01068 cllBindVars[6]=myTime;
01069 cllBindVarCount=7;
01070
01071 status = cmlExecuteNoAnswerSql(
01072 "insert into R_OBJT_AUDIT (object_id, user_id, action_id, r_comment, create_ts, modify_ts) values (?, (select user_id from R_USER_MAIN where user_name=? and zone_name=?), ?, ?, ?, ?)", icss);
01073 if (status != 0) {
01074 rodsLog(LOG_NOTICE, "cmlAudit2 insert failure %d", status);
01075 }
01076 #ifdef ORA_ICAT
01077 #else
01078 else {
01079 cllCheckPending("",2, icss->databaseType);
01080
01081
01082 }
01083 #endif
01084
01085 return(status);
01086 }
01087
01088
01089 int
01090 cmlAudit3(int actionId, char *dataId, char *userName, char *zoneName,
01091 char *comment, icatSessionStruct *icss)
01092 {
01093 char myTime[50];
01094 char actionIdStr[50];
01095 int status;
01096 char myComment[AUDIT_COMMENT_MAX_SIZE+10];
01097
01098 if (auditEnabled==0) return(0);
01099
01100 getNowStr(myTime);
01101
01102 snprintf(actionIdStr, sizeof actionIdStr, "%d", actionId);
01103
01104
01105 myComment[AUDIT_COMMENT_MAX_SIZE-1]='\0';
01106 strncpy(myComment, comment, AUDIT_COMMENT_MAX_SIZE-1);
01107
01108 if (zoneName[0]=='\0') {
01109
01110
01111
01112
01113
01114 cllBindVars[0]=dataId;
01115 cllBindVars[1]=userName;
01116 cllBindVars[2]=actionIdStr;
01117 cllBindVars[3]=myComment;
01118 cllBindVars[4]=myTime;
01119 cllBindVars[5]=myTime;
01120 cllBindVarCount=6;
01121 status = cmlExecuteNoAnswerSql(
01122 "insert into R_OBJT_AUDIT (object_id, user_id, action_id, r_comment, create_ts, modify_ts) values (?, (select user_id from R_USER_MAIN where user_name=? and zone_name=(select zone_name from R_ZONE_MAIN where zone_type_name='local')), ?, ?, ?, ?)", icss);
01123 }
01124 else {
01125 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlAudit3 SQL 2 ");
01126 cllBindVars[0]=dataId;
01127 cllBindVars[1]=userName;
01128 cllBindVars[2]=zoneName;
01129 cllBindVars[3]=actionIdStr;
01130 cllBindVars[4]=myComment;
01131 cllBindVars[5]=myTime;
01132 cllBindVars[6]=myTime;
01133 cllBindVarCount=7;
01134 status = cmlExecuteNoAnswerSql(
01135 "insert into R_OBJT_AUDIT (object_id, user_id, action_id, r_comment, create_ts, modify_ts) values (?, (select user_id from R_USER_MAIN where user_name=? and zone_name=?), ?, ?, ?, ?)", icss);
01136 }
01137
01138 if (status != 0) {
01139 rodsLog(LOG_NOTICE, "cmlAudit3 insert failure %d", status);
01140 }
01141 #ifdef ORA_ICAT
01142 #else
01143 else {
01144 cllCheckPending("",2, icss->databaseType);
01145
01146
01147 }
01148 #endif
01149
01150 return(status);
01151 }
01152
01153
01154 int
01155 cmlAudit4(int actionId, char *sql, char *sqlParm, char *userName,
01156 char *zoneName, char *comment, icatSessionStruct *icss)
01157 {
01158 char myTime[50];
01159 char actionIdStr[50];
01160 char myComment[AUDIT_COMMENT_MAX_SIZE+10];
01161 char mySQL[MAX_SQL_SIZE];
01162 int status;
01163 int i;
01164
01165 if (auditEnabled==0) return(0);
01166
01167 getNowStr(myTime);
01168
01169 snprintf(actionIdStr, sizeof actionIdStr, "%d", actionId);
01170
01171
01172 myComment[AUDIT_COMMENT_MAX_SIZE-1]='\0';
01173 strncpy(myComment, comment, AUDIT_COMMENT_MAX_SIZE-1);
01174
01175 if (zoneName[0]=='\0') {
01176
01177
01178
01179
01180
01181
01182
01183 snprintf(mySQL, MAX_SQL_SIZE,
01184 "insert into R_OBJT_AUDIT (object_id, user_id, action_id, r_comment, create_ts, modify_ts) values ((%s), (select user_id from R_USER_MAIN where user_name=? and zone_name=(select zone_name from R_ZONE_MAIN where zone_type_name='local')), ?, ?, ?, ?)",
01185 sql);
01186 i=0;
01187 if (sqlParm[0]!='\0') {
01188 cllBindVars[i++]=sqlParm;
01189 }
01190 cllBindVars[i++]=userName;
01191 cllBindVars[i++]=actionIdStr;
01192 cllBindVars[i++]=myComment;
01193 cllBindVars[i++]=myTime;
01194 cllBindVars[i++]=myTime;
01195 cllBindVarCount=i;
01196 status = cmlExecuteNoAnswerSql(mySQL,icss);
01197 }
01198 else {
01199 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlAudit4 SQL 2 ");
01200 snprintf(mySQL, MAX_SQL_SIZE,
01201 "insert into R_OBJT_AUDIT (object_id, user_id, action_id, r_comment, create_ts, modify_ts) values ((%s), (select user_id from R_USER_MAIN where user_name=? and zone_name=?), ?, ?, ?, ?)",
01202 sql);
01203 i=0;
01204 if (sqlParm[0]!='\0') {
01205 cllBindVars[i++]=sqlParm;
01206 }
01207 cllBindVars[i++]=userName;
01208 cllBindVars[i++]=zoneName;
01209 cllBindVars[i++]=actionIdStr;
01210 cllBindVars[i++]=myComment;
01211 cllBindVars[i++]=myTime;
01212 cllBindVars[i++]=myTime;
01213 cllBindVarCount=i;
01214 status = cmlExecuteNoAnswerSql(mySQL,icss);
01215 }
01216
01217 if (status != 0) {
01218 rodsLog(LOG_NOTICE, "cmlAudit4 insert failure %d", status);
01219 }
01220 #ifdef ORA_ICAT
01221 #else
01222 else {
01223 cllCheckPending("",2, icss->databaseType);
01224
01225
01226 }
01227 #endif
01228
01229 return(status);
01230 }
01231
01232
01233
01234
01235
01236 int
01237 cmlAudit5(int actionId, char *objId, char *userId, char *comment,
01238 icatSessionStruct *icss)
01239 {
01240 char myTime[50];
01241 char actionIdStr[50];
01242 int status;
01243
01244 if (auditEnabled==0) return(0);
01245
01246 getNowStr(myTime);
01247
01248 snprintf(actionIdStr, sizeof actionIdStr, "%d", actionId);
01249
01250 cllBindVars[0]=objId;
01251 cllBindVars[1]=userId;
01252 cllBindVars[2]=actionIdStr;
01253 cllBindVars[3]=comment;
01254 cllBindVars[4]=myTime;
01255 cllBindVars[5]=myTime;
01256 cllBindVarCount=6;
01257
01258 status = cmlExecuteNoAnswerSql(
01259 "insert into R_OBJT_AUDIT (object_id, user_id, action_id, r_comment, create_ts, modify_ts) values (?,?,?,?,?,?)",
01260 icss);
01261 if (status != 0) {
01262 rodsLog(LOG_NOTICE, "cmlAudit5 insert failure %d", status);
01263 }
01264 #ifdef ORA_ICAT
01265 #else
01266 else {
01267 cllCheckPending("",2, icss->databaseType);
01268
01269
01270 }
01271 #endif
01272 return(status);
01273 }