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 return 0;
00451 }
00452
00453
00454 int cmlGetIntegerValueFromSql (char *sql,
00455 rodsLong_t *iVal,
00456 const char *bindVar1,
00457 const char *bindVar2,
00458 const char *bindVar3,
00459 const char *bindVar4,
00460 const char *bindVar5,
00461 icatSessionStruct *icss)
00462 {
00463 int i, cValSize;
00464 char *cVal[2];
00465 char cValStr[MAX_INTEGER_SIZE+10];
00466
00467 cVal[0]=cValStr;
00468 cValSize = MAX_INTEGER_SIZE;
00469
00470 i = cmlGetOneRowFromSqlBV (sql, cVal, &cValSize, 1,
00471 bindVar1, bindVar2, bindVar3, bindVar4,
00472 bindVar5, icss);
00473 if (i == 1) {
00474 if (*cVal[0]=='\0') {
00475 return(CAT_NO_ROWS_FOUND);
00476 }
00477 *iVal = strtoll(*cVal, NULL, 0);
00478 return(0);
00479 }
00480 return(i);
00481 }
00482
00483
00484 int cmlGetIntegerValueFromSqlV3 (char *sql,
00485 rodsLong_t *iVal,
00486 icatSessionStruct *icss)
00487 {
00488 int i, cValSize;
00489 char *cVal[2];
00490 char cValStr[MAX_INTEGER_SIZE+10];
00491
00492 cVal[0]=cValStr;
00493 cValSize = MAX_INTEGER_SIZE;
00494
00495 i = cmlGetOneRowFromSqlV3 (sql, cVal, &cValSize, 1, icss);
00496 if (i == 1) {
00497 if (*cVal[0]=='\0') {
00498 return(CAT_NO_ROWS_FOUND);
00499 }
00500 *iVal = strtoll(*cVal, NULL, 0);
00501 return(0);
00502 }
00503 return(i);
00504 }
00505
00506 int cmlCheckNameToken(char *nameSpace, char *tokenName, icatSessionStruct *icss)
00507 {
00508
00509 rodsLong_t iVal;
00510 int status;
00511
00512 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckNameToken SQL 1 ");
00513 status = cmlGetIntegerValueFromSql (
00514 "select token_id from R_TOKN_MAIN where token_namespace=? and token_name=?",
00515 &iVal, nameSpace, tokenName, 0, 0, 0, icss);
00516 return(status);
00517
00518 }
00519
00520 int cmlModifySingleTable (char *tableName,
00521 char *updateCols[],
00522 char *updateValues[],
00523 char *whereColsAndConds[],
00524 char *whereValues[],
00525 int numOfUpdates,
00526 int numOfConds,
00527 icatSessionStruct *icss)
00528 {
00529 char tsql[MAX_SQL_SIZE];
00530 int i, l;
00531 char *rsql;
00532
00533 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlModifySingleTable SQL 1 ");
00534
00535 snprintf(tsql, MAX_SQL_SIZE, "update %s set ", tableName);
00536 l = strlen(tsql);
00537 rsql = tsql + l;
00538
00539 cmlArraysToStrWithBind ( rsql, "", updateCols,updateValues, numOfUpdates, " = ", ", ",MAX_SQL_SIZE - l);
00540 l = strlen(tsql);
00541 rsql = tsql + l;
00542
00543 cmlArraysToStrWithBind(rsql, " where ", whereColsAndConds, whereValues, numOfConds, "", " and ", MAX_SQL_SIZE - l);
00544
00545 i = cmlExecuteNoAnswerSql( tsql, icss);
00546 return(i);
00547
00548 }
00549
00550 #define STR_LEN 100
00551 rodsLong_t
00552 cmlGetNextSeqVal(icatSessionStruct *icss) {
00553 char nextStr[STR_LEN];
00554 char sql[STR_LEN];
00555 int status;
00556 rodsLong_t iVal;
00557
00558 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlGetNextSeqVal SQL 1 ");
00559
00560 nextStr[0]='\0';
00561
00562 cllNextValueString("R_ObjectID", nextStr, STR_LEN);
00563
00564
00565
00566 #ifdef ORA_ICAT
00567
00568 snprintf(sql, STR_LEN, "select %s from DUAL", nextStr);
00569 #else
00570
00571 snprintf(sql, STR_LEN, "select %s", nextStr);
00572 #endif
00573
00574 status = cmlGetIntegerValueFromSql (sql, &iVal, 0, 0, 0, 0, 0, icss);
00575 if (status < 0) {
00576 rodsLog(LOG_NOTICE,
00577 "cmlGetNextSeqVal cmlGetIntegerValueFromSql failure %d", status);
00578 return(status);
00579 }
00580 return(iVal);
00581 }
00582
00583 rodsLong_t
00584 cmlGetCurrentSeqVal(icatSessionStruct *icss) {
00585 char nextStr[STR_LEN];
00586 char sql[STR_LEN];
00587 int status;
00588 rodsLong_t iVal;
00589
00590 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlGetCurrentSeqVal SQL 1 ");
00591
00592 nextStr[0]='\0';
00593
00594 cllCurrentValueString("R_ObjectID", nextStr, STR_LEN);
00595
00596
00597
00598 #ifdef ORA_ICAT
00599
00600 snprintf(sql, STR_LEN, "select %s from DUAL", nextStr);
00601 #else
00602
00603 snprintf(sql, STR_LEN, "select %s", nextStr);
00604 #endif
00605
00606 status = cmlGetIntegerValueFromSql (sql, &iVal, 0, 0, 0, 0, 0, icss);
00607 if (status < 0) {
00608 rodsLog(LOG_NOTICE,
00609 "cmlGetCurrentSeqVal cmlGetIntegerValueFromSql failure %d",
00610 status);
00611 return(status);
00612 }
00613 return(iVal);
00614 }
00615
00616 int
00617 cmlGetNextSeqStr(char *seqStr, int maxSeqStrLen, icatSessionStruct *icss) {
00618 char nextStr[STR_LEN];
00619 char sql[STR_LEN];
00620 int status;
00621
00622 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlGetNextSeqStr SQL 1 ");
00623
00624 nextStr[0]='\0';
00625 cllNextValueString("R_ObjectID", nextStr, STR_LEN);
00626
00627
00628
00629 #ifdef ORA_ICAT
00630 snprintf(sql, STR_LEN, "select %s from DUAL", nextStr);
00631 #else
00632 snprintf(sql, STR_LEN, "select %s", nextStr);
00633 #endif
00634
00635 status = cmlGetStringValueFromSql (sql, seqStr, maxSeqStrLen, 0, 0, 0, icss);
00636 if (status < 0) {
00637 rodsLog(LOG_NOTICE,
00638 "cmlGetNextSeqStr cmlGetStringValueFromSql failure %d", status);
00639 }
00640 return(status);
00641 }
00642
00643
00644 int cmlTest( icatSessionStruct *icss) {
00645 int i, cValSize;
00646 char *cVal[2];
00647 char cValStr[MAX_INTEGER_SIZE+10];
00648 char sql[100];
00649
00650 strncpy(icss->databaseUsername,"schroede", DB_USERNAME_LEN);
00651 strncpy(icss->databasePassword,"", DB_PASSWORD_LEN);
00652 i = cmlOpen(icss);
00653 if (i != 0) return(i);
00654
00655 cVal[0]=cValStr;
00656 cValSize = MAX_INTEGER_SIZE;
00657 snprintf(sql,sizeof sql,
00658 "select coll_id from R_COLL_MAIN where coll_name='a'");
00659
00660 i = cmlGetOneRowFromSql (sql, cVal, &cValSize, 1, icss);
00661 if (i == 1) {
00662 printf("result = %s\n",cValStr);
00663 i = 0;
00664 }
00665 else {
00666 return(i);
00667 }
00668
00669 snprintf(sql, sizeof sql,
00670 "select data_id from R_DATA_MAIN where coll_id='1' and data_name='a'");
00671 i = cmlGetOneRowFromSql (sql, cVal, &cValSize, 1, icss);
00672 if (i == 1) {
00673 printf("result = %s\n",cValStr);
00674 i = 0;
00675 }
00676
00677 cmlGetCurrentSeqVal(icss);
00678
00679 return(i);
00680
00681 }
00682
00683
00684
00685
00686
00687 rodsLong_t
00688 cmlCheckResc( char *rescName, char *userName, char *userZone, char *accessLevel,
00689 icatSessionStruct *icss)
00690 {
00691 int status;
00692 rodsLong_t iVal;
00693
00694 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckResc SQL 1 ");
00695
00696 status = cmlGetIntegerValueFromSql(
00697 "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 = ?",
00698 &iVal, rescName, userName, userZone, accessLevel, 0, icss);
00699 if (status) {
00700
00701
00702
00703 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckResc SQL 2 ");
00704
00705 status = cmlGetIntegerValueFromSql(
00706 "select resc_id from R_RESC_MAIN where resc_name=?",
00707 &iVal, rescName, 0, 0, 0, 0, icss);
00708 if (status) {
00709 return(CAT_UNKNOWN_RESOURCE);
00710 }
00711 return (CAT_NO_ACCESS_PERMISSION);
00712 }
00713
00714 return(iVal);
00715
00716 }
00717
00718
00719
00720
00721
00722
00723 rodsLong_t
00724 cmlCheckDir( char *dirName, char *userName, char *userZone, char *accessLevel,
00725 icatSessionStruct *icss)
00726 {
00727 int status;
00728 rodsLong_t iVal;
00729
00730 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDir SQL 1 ");
00731
00732 status = cmlGetIntegerValueFromSql(
00733 "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 = ?",
00734 &iVal, dirName, userName, userZone, accessLevel, 0, icss);
00735 if (status) {
00736
00737
00738
00739 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDir SQL 2 ");
00740
00741 status = cmlGetIntegerValueFromSql(
00742 "select coll_id from R_COLL_MAIN where coll_name=?",
00743 &iVal, dirName, 0, 0, 0, 0, icss);
00744 if (status) {
00745 return(CAT_UNKNOWN_COLLECTION);
00746 }
00747 return (CAT_NO_ACCESS_PERMISSION);
00748 }
00749
00750 return(iVal);
00751
00752 }
00753
00754
00755
00756
00757
00758
00759
00760 rodsLong_t
00761 cmlCheckDirAndGetInheritFlag( char *dirName, char *userName, char *userZone,
00762 char *accessLevel, int *inheritFlag,
00763 icatSessionStruct *icss)
00764 {
00765 int status;
00766 rodsLong_t iVal;
00767
00768 int cValSize[2];
00769 char *cVal[3];
00770 char cValStr1[MAX_INTEGER_SIZE+10];
00771 char cValStr2[MAX_INTEGER_SIZE+10];
00772
00773 cVal[0]=cValStr1;
00774 cVal[1]=cValStr2;
00775 cValSize[0] = MAX_INTEGER_SIZE;
00776 cValSize[1] = MAX_INTEGER_SIZE;
00777
00778 *inheritFlag = 0;
00779 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDirAndGetInheritFlag SQL 1 ");
00780
00781 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);
00782 if (status == 2) {
00783 if (*cVal[0]=='\0') {
00784 return(CAT_NO_ROWS_FOUND);
00785 }
00786 iVal = strtoll(*cVal, NULL, 0);
00787 if (cValStr2[0]=='1') *inheritFlag = 1;
00788 status = 0;
00789 }
00790
00791 if (status) {
00792
00793
00794
00795 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDirAndGetInheritFlag SQL 2 ");
00796
00797 status = cmlGetIntegerValueFromSql(
00798 "select coll_id from R_COLL_MAIN where coll_name=?",
00799 &iVal, dirName, 0, 0, 0, 0, icss);
00800 if (status) {
00801 return(CAT_UNKNOWN_COLLECTION);
00802 }
00803 return (CAT_NO_ACCESS_PERMISSION);
00804 }
00805
00806 return(iVal);
00807
00808 }
00809
00810
00811
00812
00813
00814
00815 rodsLong_t
00816 cmlCheckDirId( char *dirId, char *userName, char *userZone,
00817 char *accessLevel, icatSessionStruct *icss)
00818 {
00819 int status;
00820 rodsLong_t iVal;
00821
00822 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDirId SQL 1 ");
00823
00824 status = cmlGetIntegerValueFromSql(
00825 "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 = ?",
00826 &iVal, userName, userZone, dirId, accessLevel, 0, icss);
00827 if (status) {
00828
00829
00830
00831 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDirId SQL 2 ");
00832
00833 status = cmlGetIntegerValueFromSql(
00834 "select coll_id from R_COLL_MAIN where coll_id=?",
00835 &iVal, dirId, 0, 0, 0, 0, icss);
00836 if (status) {
00837 return(CAT_UNKNOWN_COLLECTION);
00838 }
00839 return (CAT_NO_ACCESS_PERMISSION);
00840 }
00841
00842 return(0);
00843 }
00844
00845
00846
00847
00848 rodsLong_t
00849 cmlCheckDirOwn( char *dirName, char *userName, char *userZone,
00850 icatSessionStruct *icss)
00851 {
00852 int status;
00853 rodsLong_t iVal;
00854
00855 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDirOwn SQL 1 ");
00856
00857 status = cmlGetIntegerValueFromSql(
00858 "select coll_id from R_COLL_MAIN where coll_name=? and coll_owner_name=? and coll_owner_zone=?",
00859 &iVal, dirName, userName, userZone, 0, 0, icss);
00860 if (status < 0) return(status);
00861 return(iVal);
00862 }
00863
00864
00865
00866
00867
00868
00869
00870 rodsLong_t
00871 cmlCheckDataObjOnly( char *dirName, char *dataName,
00872 char *userName, char *userZone,
00873 char *accessLevel, icatSessionStruct *icss)
00874 {
00875 int status;
00876 rodsLong_t iVal;
00877
00878 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDataObjOnly SQL 1 ");
00879
00880 status = cmlGetIntegerValueFromSql(
00881 "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 = ?",
00882 &iVal, dataName, dirName, userName, userZone,
00883 accessLevel, icss);
00884
00885 if (status) {
00886
00887
00888 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDataObjOnly SQL 2 ");
00889
00890 status = cmlGetIntegerValueFromSql(
00891 "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=?",
00892 &iVal, dataName, dirName, 0, 0, 0, icss);
00893 if (status) {
00894 return(CAT_UNKNOWN_FILE);
00895 }
00896 return (CAT_NO_ACCESS_PERMISSION);
00897 }
00898
00899 return(iVal);
00900
00901 }
00902
00903
00904
00905
00906 rodsLong_t
00907 cmlCheckDataObjOwn( char *dirName, char *dataName, char *userName,
00908 char *userZone, icatSessionStruct *icss)
00909 {
00910 int status;
00911 rodsLong_t iVal, collId;
00912 char collIdStr[MAX_NAME_LEN];
00913
00914 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDataObjOwn SQL 1 ");
00915 status = cmlGetIntegerValueFromSql(
00916 "select coll_id from R_COLL_MAIN where coll_name=?",
00917 &iVal, dirName, 0, 0, 0, 0, icss);
00918 if (status < 0) return(status);
00919 collId = iVal;
00920 snprintf(collIdStr, MAX_NAME_LEN, "%lld", collId);
00921
00922 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDataObjOwn SQL 2 ");
00923 status = cmlGetIntegerValueFromSql(
00924 "select data_id from R_DATA_MAIN where data_name=? and coll_id=? and data_owner_name=? and data_owner_zone=?",
00925 &iVal, dataName, collIdStr, userName, userZone, 0, icss);
00926
00927 if (status) {
00928 return (status);
00929 }
00930 return(iVal);
00931 }
00932
00933
00934
00935
00936
00937 int cmlCheckDataObjId( char *dataId, char *userName, char *zoneName,
00938 char *accessLevel, icatSessionStruct *icss)
00939 {
00940 int status;
00941 rodsLong_t iVal;
00942
00943 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckDataObjId SQL 1 ");
00944
00945 iVal=0;
00946 status = cmlGetIntegerValueFromSql(
00947 "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 = ?",
00948 &iVal,
00949 dataId,
00950 userName,
00951 zoneName,
00952 accessLevel,
00953 0,
00954 icss);
00955 if (status != 0) return (CAT_NO_ACCESS_PERMISSION);
00956 if (iVal==0) return (CAT_NO_ACCESS_PERMISSION);
00957 cmlAudit2(AU_ACCESS_GRANTED, dataId, userName, zoneName, accessLevel, icss);
00958 return(status);
00959 }
00960
00961
00962
00963
00964
00965 int cmlCheckGroupAdminAccess(char *userName, char *userZone,
00966 char *groupName, icatSessionStruct *icss) {
00967 int status;
00968 char sVal[MAX_NAME_LEN];
00969 rodsLong_t iVal;
00970
00971 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckGroupAdminAccess SQL 1 ");
00972
00973 status = cmlGetStringValueFromSql(
00974 "select user_id from R_USER_MAIN where user_name=? and zone_name=? and user_type_name='groupadmin'",
00975 sVal, MAX_NAME_LEN, userName, userZone, 0, icss);
00976 if (status==CAT_NO_ROWS_FOUND) return (CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
00977 if (status) return(status);
00978
00979
00980
00981 if (groupName == NULL) {
00982 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
00983 }
00984 if (*groupName == '\0') {
00985 return(0);
00986
00987 }
00988
00989
00990 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlCheckGroupAdminAccess SQL 2 ");
00991
00992 status = cmlGetIntegerValueFromSql(
00993 "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=?)",
00994 &iVal, sVal, groupName, 0, 0, 0, icss);
00995 if (status==CAT_NO_ROWS_FOUND) return (CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
00996 if (status) return(status);
00997 return(0);
00998 }
00999
01000
01001
01002
01003
01004
01005
01006
01007
01008
01009 int
01010 cmlAudit1(int actionId, char *clientUser, char *zone, char *targetUser,
01011 char *comment, icatSessionStruct *icss)
01012 {
01013 char myTime[50];
01014 char actionIdStr[50];
01015 int status;
01016
01017 if (auditEnabled==0) return(0);
01018
01019 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlAudit1 SQL 1 ");
01020
01021 getNowStr(myTime);
01022
01023 snprintf(actionIdStr, sizeof actionIdStr, "%d", actionId);
01024
01025 cllBindVars[0]=targetUser;
01026 cllBindVars[1]=zone;
01027 cllBindVars[2]=clientUser;
01028 cllBindVars[3]=zone;
01029 cllBindVars[4]=actionIdStr;
01030 cllBindVars[5]=comment;
01031 cllBindVars[6]=myTime;
01032 cllBindVars[7]=myTime;
01033 cllBindVarCount=8;
01034
01035 status = cmlExecuteNoAnswerSql(
01036 "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);
01037 if (status != 0) {
01038 rodsLog(LOG_NOTICE, "cmlAudit1 insert failure %d", status);
01039 }
01040 #ifdef ORA_ICAT
01041 #else
01042 else {
01043 cllCheckPending("",2, icss->databaseType);
01044
01045
01046 }
01047 #endif
01048 return(status);
01049 }
01050
01051 int
01052 cmlAudit2(int actionId, char *dataId, char *userName, char *zoneName,
01053 char *accessLevel, icatSessionStruct *icss)
01054 {
01055 char myTime[50];
01056 char actionIdStr[50];
01057 int status;
01058
01059 if (auditEnabled==0) return(0);
01060
01061 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlAudit2 SQL 1 ");
01062
01063 getNowStr(myTime);
01064
01065 snprintf(actionIdStr, sizeof actionIdStr, "%d", actionId);
01066
01067 cllBindVars[0]=dataId;
01068 cllBindVars[1]=userName;
01069 cllBindVars[2]=zoneName;
01070 cllBindVars[3]=actionIdStr;
01071 cllBindVars[4]=accessLevel;
01072 cllBindVars[5]=myTime;
01073 cllBindVars[6]=myTime;
01074 cllBindVarCount=7;
01075
01076 status = cmlExecuteNoAnswerSql(
01077 "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);
01078 if (status != 0) {
01079 rodsLog(LOG_NOTICE, "cmlAudit2 insert failure %d", status);
01080 }
01081 #ifdef ORA_ICAT
01082 #else
01083 else {
01084 cllCheckPending("",2, icss->databaseType);
01085
01086
01087 }
01088 #endif
01089
01090 return(status);
01091 }
01092
01093
01094 int
01095 cmlAudit3(int actionId, char *dataId, char *userName, char *zoneName,
01096 char *comment, icatSessionStruct *icss)
01097 {
01098 char myTime[50];
01099 char actionIdStr[50];
01100 int status;
01101 char myComment[AUDIT_COMMENT_MAX_SIZE+10];
01102
01103 if (auditEnabled==0) return(0);
01104
01105 getNowStr(myTime);
01106
01107 snprintf(actionIdStr, sizeof actionIdStr, "%d", actionId);
01108
01109
01110 myComment[AUDIT_COMMENT_MAX_SIZE-1]='\0';
01111 strncpy(myComment, comment, AUDIT_COMMENT_MAX_SIZE-1);
01112
01113 if (zoneName[0]=='\0') {
01114
01115
01116
01117
01118
01119 cllBindVars[0]=dataId;
01120 cllBindVars[1]=userName;
01121 cllBindVars[2]=actionIdStr;
01122 cllBindVars[3]=myComment;
01123 cllBindVars[4]=myTime;
01124 cllBindVars[5]=myTime;
01125 cllBindVarCount=6;
01126 status = cmlExecuteNoAnswerSql(
01127 "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);
01128 }
01129 else {
01130 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlAudit3 SQL 2 ");
01131 cllBindVars[0]=dataId;
01132 cllBindVars[1]=userName;
01133 cllBindVars[2]=zoneName;
01134 cllBindVars[3]=actionIdStr;
01135 cllBindVars[4]=myComment;
01136 cllBindVars[5]=myTime;
01137 cllBindVars[6]=myTime;
01138 cllBindVarCount=7;
01139 status = cmlExecuteNoAnswerSql(
01140 "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);
01141 }
01142
01143 if (status != 0) {
01144 rodsLog(LOG_NOTICE, "cmlAudit3 insert failure %d", status);
01145 }
01146 #ifdef ORA_ICAT
01147 #else
01148 else {
01149 cllCheckPending("",2, icss->databaseType);
01150
01151
01152 }
01153 #endif
01154
01155 return(status);
01156 }
01157
01158
01159 int
01160 cmlAudit4(int actionId, char *sql, char *sqlParm, char *userName,
01161 char *zoneName, char *comment, icatSessionStruct *icss)
01162 {
01163 char myTime[50];
01164 char actionIdStr[50];
01165 char myComment[AUDIT_COMMENT_MAX_SIZE+10];
01166 char mySQL[MAX_SQL_SIZE];
01167 int status;
01168 int i;
01169
01170 if (auditEnabled==0) return(0);
01171
01172 getNowStr(myTime);
01173
01174 snprintf(actionIdStr, sizeof actionIdStr, "%d", actionId);
01175
01176
01177 myComment[AUDIT_COMMENT_MAX_SIZE-1]='\0';
01178 strncpy(myComment, comment, AUDIT_COMMENT_MAX_SIZE-1);
01179
01180 if (zoneName[0]=='\0') {
01181
01182
01183
01184
01185
01186
01187
01188 snprintf(mySQL, MAX_SQL_SIZE,
01189 "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')), ?, ?, ?, ?)",
01190 sql);
01191 i=0;
01192 if (sqlParm[0]!='\0') {
01193 cllBindVars[i++]=sqlParm;
01194 }
01195 cllBindVars[i++]=userName;
01196 cllBindVars[i++]=actionIdStr;
01197 cllBindVars[i++]=myComment;
01198 cllBindVars[i++]=myTime;
01199 cllBindVars[i++]=myTime;
01200 cllBindVarCount=i;
01201 status = cmlExecuteNoAnswerSql(mySQL,icss);
01202 }
01203 else {
01204 if (logSQL_CML!=0) rodsLog(LOG_SQL, "cmlAudit4 SQL 2 ");
01205 snprintf(mySQL, MAX_SQL_SIZE,
01206 "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=?), ?, ?, ?, ?)",
01207 sql);
01208 i=0;
01209 if (sqlParm[0]!='\0') {
01210 cllBindVars[i++]=sqlParm;
01211 }
01212 cllBindVars[i++]=userName;
01213 cllBindVars[i++]=zoneName;
01214 cllBindVars[i++]=actionIdStr;
01215 cllBindVars[i++]=myComment;
01216 cllBindVars[i++]=myTime;
01217 cllBindVars[i++]=myTime;
01218 cllBindVarCount=i;
01219 status = cmlExecuteNoAnswerSql(mySQL,icss);
01220 }
01221
01222 if (status != 0) {
01223 rodsLog(LOG_NOTICE, "cmlAudit4 insert failure %d", status);
01224 }
01225 #ifdef ORA_ICAT
01226 #else
01227 else {
01228 cllCheckPending("",2, icss->databaseType);
01229
01230
01231 }
01232 #endif
01233
01234 return(status);
01235 }
01236
01237
01238
01239
01240
01241 int
01242 cmlAudit5(int actionId, char *objId, char *userId, char *comment,
01243 icatSessionStruct *icss)
01244 {
01245 char myTime[50];
01246 char actionIdStr[50];
01247 int status;
01248
01249 if (auditEnabled==0) return(0);
01250
01251 getNowStr(myTime);
01252
01253 snprintf(actionIdStr, sizeof actionIdStr, "%d", actionId);
01254
01255 cllBindVars[0]=objId;
01256 cllBindVars[1]=userId;
01257 cllBindVars[2]=actionIdStr;
01258 cllBindVars[3]=comment;
01259 cllBindVars[4]=myTime;
01260 cllBindVars[5]=myTime;
01261 cllBindVarCount=6;
01262
01263 status = cmlExecuteNoAnswerSql(
01264 "insert into R_OBJT_AUDIT (object_id, user_id, action_id, r_comment, create_ts, modify_ts) values (?,?,?,?,?,?)",
01265 icss);
01266 if (status != 0) {
01267 rodsLog(LOG_NOTICE, "cmlAudit5 insert failure %d", status);
01268 }
01269 #ifdef ORA_ICAT
01270 #else
01271 else {
01272 cllCheckPending("",2, icss->databaseType);
01273
01274
01275 }
01276 #endif
01277 return(status);
01278 }