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