C Function Definition - Analytics Database - Teradata Vantage

SQL External Routine Programming

Deployment
VantageCloud
VantageCore
Edition
Enterprise
IntelliFlex
VMware
Product
Analytics Database
Teradata Vantage
Release Number
17.20
Published
June 2022
Language
English (United States)
Last Update
2023-07-11
dita:mapPath
iiv1628111441820.ditamap
dita:ditavalPath
qkf1628213546010.ditaval
dita:id
B035-1147
lifecycle
latest
Product Category
Teradata Vantage™
/*****  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;
  }

}