/***** C source file name: ET001_xsp.c *****/ #define SQL_TEXT Latin_Text #include <sqltypes_td.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <coptypes.h> #include <coperr.h> #include <parcel.h> #include <dbcarea.h> #include <dbchqep.h> #define CONNECTED 0 #define NOT_CONNECTED 1 #define OK 0 #define STOP 1 #define FAILED -1 #define MAX_SESSIONS 1 #define D8CAIRXSIZ 24 #define FIXED_ELM_LEN_8 42 #define D8XILMNTSIZE 4 #define SPOPTIONSSIZE 2 struct ERROR_FAIL_Type { Word StatementNo; Word Info; Word Code; Word Length; char Msg[255]; } ; /****************************************************************** dbc_init() Initialize DBCAREA. ******************************************************************/ static Int16 dbc_init(DBCAREA *dbcarea_pt, SQL_TEXT *error_message) { Int32 result; char cnta[4]; dbcarea_pt->total_len = sizeof(struct DBCAREA); DBCHINI(&result, cnta, dbcarea_pt); if (result != EM_OK) { sprintf((char *) error_message, "Error in initialization --%s", dbcarea_pt->msg_text); return result; } return EM_OK; } /****************************************************************** set_options() Set DBCAREA options. ******************************************************************/ static void set_options(DBCAREA *dbcarea_pt) { dbcarea_pt->change_opts = 'Y'; dbcarea_pt->use_presence_bits = 'N'; dbcarea_pt->keep_resp = 'N'; dbcarea_pt->loc_mode = 'Y'; dbcarea_pt->var_len_req = 'N'; dbcarea_pt->save_resp_buf = 'N'; dbcarea_pt->two_resp_bufs = 'N'; dbcarea_pt->ret_time = 'N'; dbcarea_pt->wait_for_resp = 'Y'; dbcarea_pt->req_proc_opt = 'E'; dbcarea_pt->req_buf_len = 1024; dbcarea_pt->resp_buf_len = 1024; dbcarea_pt->data_encryption = 'N'; dbcarea_pt->create_default_connection = 'Y'; } /****************************************************************** dbc_con() Establish a default connection. ******************************************************************/ static Int16 dbc_con(DBCAREA *dbcarea_pt, SQL_TEXT *error_message) { char cnta[4]; Int32 result; dbcarea_pt->func=DBFCON; DBCHCL(&result, cnta, dbcarea_pt); if (result != EM_OK) { sprintf((char *)error_message, "Error in Logon--%s\n", dbcarea_pt->msg_text); return result; } return EM_OK; } /****************************************************************** dbc_irq() Initiate request. ******************************************************************/ static Int16 dbc_irq(DBCAREA *dbcarea_pt, SQL_TEXT *error_message, char *str) { Int32 result; char cnta[4]; dbcarea_pt->func = DBFIRQ; dbcarea_pt->req_ptr = str; dbcarea_pt->req_len = strlen(str); DBCHCL(&result, cnta, dbcarea_pt); if (result != EM_OK) { sprintf((char *)error_message, "Error in initiating a request--%s", dbcarea_pt->msg_text); return result; } return EM_OK; } /****************************************************************** fetch_request() Fetch parcels and check activity type. ******************************************************************/ static Int16 fetch_request(DBCAREA *dbcarea_pt, int stmnt_no, char *resultx, SQL_TEXT *error_message) { long request, session; Int32 result; char cnta[4]; union { int acc_value; unsigned char acc_c[4]; } acc; char strptr[256]; int count, i, status, rowcount; int ShowFlag = 0; char ctc[6400]; struct CliSuccessType *SuccPcl; struct CliOkType *OKPcl; struct CliFailureType *FailPcl; request = dbcarea_pt->o_req_id; session = dbcarea_pt->o_sess_id; dbcarea_pt->i_sess_id = session; dbcarea_pt->i_req_id = request; dbcarea_pt->func = DBFFET; status=OK; rowcount=1; while (status == OK) { DBCHCL(&result, cnta, dbcarea_pt); count=1; if (result == REQEXHAUST) status = STOP; else if (result != EM_OK) status = FAILED; else { switch(dbcarea_pt->fet_parcel_flavor) { case PclSUCCESS : SuccPcl = (struct CliSuccessType *)dbcarea_pt->fet_data_ptr; memcpy(acc.acc_c, SuccPcl->ActivityCount, 4); sprintf(strptr, "[%d]Succ:Act(%d)|\0", stmnt_no, SuccPcl->ActivityType); strcat(resultx, strptr); break; case PclOK : OKPcl = (struct CliOkType *)dbcarea_pt->fet_data_ptr; sprintf(strptr, "[%d]OK:Act(%d)|\0", stmnt_no, OKPcl->ActivityType); strcat(resultx, strptr); break; case PclRECORD : memcpy(&ctc[0], &dbcarea_pt->fet_data_ptr[0],1); memcpy(&ctc[1], &dbcarea_pt->fet_data_ptr[1],1); memcpy(&ctc[2], &dbcarea_pt->fet_data_ptr[2],1); break; case PclENDSTATEMENT : break; case PclFAILURE : FailPcl = (struct CliFailureType *)dbcarea_pt->fet_data_ptr; sprintf(strptr, "[%d]Fail:Cde(%d)|\0", stmnt_no, FailPcl->Code); strcat(resultx, strptr); break; case PclERROR : sprintf(strptr, "[%d]PclError"); strcat(resultx, strptr); status = STOP; return -1; } /* end of switch */ } /* end of else */ } /* end of while */ if (status == FAILED) { sprintf((char *)error_message, "Error in fetching a request--%s",dbcarea_pt->msg_text); return status; } return EM_OK; } /****************************************************************** end_request() End request. ******************************************************************/ static Int16 end_request(DBCAREA *dbcarea_pt, SQL_TEXT *error_message) { Int32 result; char cnta[4]; dbcarea_pt->i_sess_id = dbcarea_pt->o_sess_id; dbcarea_pt->i_req_id = dbcarea_pt->o_req_id; dbcarea_pt->func = DBFERQ; DBCHCL(&result, cnta, dbcarea_pt); if (result != EM_OK) { sprintf((char *)error_message, "Error in EndRequest--%s", dbcarea_pt->msg_text); return result; } return EM_OK; } /****************************************************************** Entry point for external stored procedure. ******************************************************************/ void ET001_xsp1(VARCHAR_LATIN *A_Name, VARCHAR_LATIN *result, int *a_name_i, int *result_i, char sqlstate[6], SQL_TEXT extname[129], SQL_TEXT specific_name[129], SQL_TEXT error_message[257]) { DBCAREA dbcarea; char str1[200]; /* DELETE USER request */ char str2[200]; /* DROP USER request */ char str3[200]; /* DROP ROLE R_001 request */ char str4[200]; /* CREATE ROLE R_001 request */ char str5[200]; /* GRANT ... to R_001 request */ char str6[200]; /* DROP PROFILE request */ char str7[200]; /* CREATE PROFILE P_001 request */ char str8[200]; /* CREATE USER request */ if (dbc_init(&dbcarea, error_message) != EM_OK) { strcpy (sqlstate, "U0005"); return; } set_options(&dbcarea); if (dbc_con(&dbcarea, error_message) != EM_OK) { strcpy (sqlstate, "U0006"); return; } if (fetch_request(&dbcarea, 0, (char *) result, error_message) != EM_OK) { strcpy (sqlstate, "U0007"); return; } if (end_request(&dbcarea, error_message) != EM_OK) { strcpy(sqlstate, "U0008"); return; } /***** DELETE USER request *****/ memset(&str1, ' ', 100); sprintf(str1, "Delete User %s;", A_Name); if (dbc_irq(&dbcarea, error_message, str1) != EM_OK) { strcpy(sqlstate, "U0009"); return; } if (fetch_request(&dbcarea, 1, (char*)result, error_message) != EM_OK) { strcpy (sqlstate, "U0010"); return; } if (end_request(&dbcarea, error_message) != EM_OK) { strcpy(sqlstate, "U0011"); return; } /***** DROP USER request *****/ memset(&str2, ' ', 100); sprintf(str2, "Drop User %s;", A_Name); if (dbc_irq(&dbcarea, error_message, str2) != EM_OK) { strcpy(sqlstate, "U0009"); return; } if (fetch_request(&dbcarea, 2, (char*)result, error_message) != EM_OK) { strcpy (sqlstate, "U0010"); return; } if (end_request(&dbcarea, error_message) != EM_OK) { strcpy(sqlstate, "U0011"); return; } /***** DROP ROLE request *****/ memset(&str3, ' ', 100); sprintf(str3, "Drop Role R_001;"); if (dbc_irq(&dbcarea, error_message, str3) != EM_OK) { strcpy(sqlstate, "U0009"); return; } if (fetch_request(&dbcarea, 3, (char*)result, error_message) != EM_OK) { strcpy (sqlstate, "U0010"); return; } if (end_request(&dbcarea, error_message) != EM_OK) { strcpy(sqlstate, "U0011"); return; } /***** CREATE ROLE request *****/ memset(&str4, ' ', 100); sprintf(str4, "CREATE ROLE R_001;"); if (dbc_irq(&dbcarea, error_message, str4) != EM_OK) { strcpy(sqlstate, "U0009"); return; } if (fetch_request(&dbcarea, 4, (char*)result, error_message) != EM_OK) { strcpy (sqlstate, "U0010"); return; } if (end_request(&dbcarea, error_message) != EM_OK) { strcpy(sqlstate, "U0011"); return; } /***** GRANT request *****/ memset(&str5, ' ', 100); sprintf(str5, "GRANT ALL BUT CREATE USER, DROP USER ON CliXSP_ETUser TO R_001;"); if (dbc_irq(&dbcarea, error_message, str5) != EM_OK) { strcpy(sqlstate, "U0009"); return; } if (fetch_request(&dbcarea, 5, (char*)result, error_message) != EM_OK) { strcpy (sqlstate, "U0010"); return; } if (end_request(&dbcarea, error_message) != EM_OK) { strcpy(sqlstate, "U0011"); return; } /***** DROP PROFILE request *****/ memset(&str6, ' ', 100); sprintf(str6, "DROP PROFILE P_001;"); if (dbc_irq(&dbcarea, error_message, str6) != EM_OK) { strcpy(sqlstate, "U0009"); return; } if (fetch_request(&dbcarea, 6, (char*)result, error_message) != EM_OK) { strcpy (sqlstate, "U0010"); return; } if (end_request(&dbcarea, error_message) != EM_OK) { strcpy(sqlstate, "U0011"); return; } /***** CREATE PROFILE request *****/ memset(&str7, ' ', 100); sprintf(str7, "CREATE PROFILE P_001 AS ACCOUNT = '&M', SPOOL = 100000, TEMPORARY = 100000;"); if (dbc_irq(&dbcarea, error_message, str7) != EM_OK) { strcpy(sqlstate, "U0009"); return; } if (fetch_request(&dbcarea, 7, (char*)result, error_message) != EM_OK) { strcpy (sqlstate, "U0010"); return; } if (end_request(&dbcarea, error_message) != EM_OK) { strcpy(sqlstate, "U0011"); return; } /***** CREATE USER request *****/ memset(&str8, ' ', 100); sprintf(str8, "CREATE USER %s from CliXSP_ETUser AS PERM = 100000, PASSWORD = u001, DEFAULT ROLE = R_001, PROFILE = P_001;", A_Name); if (dbc_irq(&dbcarea, error_message, str8) != EM_OK) { strcpy(sqlstate, "U0009"); return; } if (fetch_request(&dbcarea, 8, (char*)result, error_message) != EM_OK) { strcpy (sqlstate, "U0010"); return; } if (end_request(&dbcarea, error_message) != EM_OK) { strcpy(sqlstate, "U0011"); return; } }