/* Copyright 2013, by Teradata Corporation. All rights reserved. */ /* Teradata PROPRIETARY AND CONFIDENTIAL-RESTRICTED */ /* This program demonstrates use of "using_data_ptr_array" in DBCAREA*/ /* It shows how to set up pointer to an array of data items. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "dbcarea.h" #include "dbchqep.h" #include <parcel.h> struct DBCAREA dbcarea; DBCHQEP dbchqep; int rc, quit, row_count, i, count_pcl; char *context; char cont[4]; char result; short epis; char TDPid[30]; char create[] = "CREATE TABLE ARRAY_TAB" ",NO FALLBACK, NO BEFORE JOURNAL, NO AFTER JOURNAL " "(C1 CHAR(8)) " "UNIQUE PRIMARY INDEX (C1);"; char request_1[] = "USING (A CHAR(8)) INSERT INTO ARRAY_TAB VALUES (:A);"; #pragma pack(1) struct var_req { short length; char req[sizeof(request_1)]; } request_2; #pragma pack() char selectc1[] = "SELECT C1 FROM ARRAY_TAB ORDER BY C1;"; char dropit[] = "DROP TABLE ARRAY_TAB;"; #define ARRAY_COUNT 15 char *data_array[ARRAY_COUNT] = {"Jim ", "Jane ", "Jack ", "Jill ", "Joe ", "Jesse ", "Juan ", "Jordan ", "Jamal ", "Jerry ", "JoAnn ", "Jorgen ", "Judd ", "Josiah ", "Junior "}; int data_array_lens[ARRAY_COUNT] = {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}; struct v_array { short length; char name[8]; } data_array_v[ARRAY_COUNT] = {{8,"Bill "}, {8,"Ben "}, {8,"Buddy "}, {8,"Bertha "}, {8,"Booboo "}, {8,"Bambam "}, {8,"Brian "}, {8,"Barry "}, {8,"Beth "}, {8,"Bo "}, {8,"Banana "}, {8,"Boris "}, {8,"Bessie "}, {8,"Bernie "}, {8,"Buster "}}; struct v_array * data_array_p[ARRAY_COUNT] = {&data_array_v[0], &data_array_v[1], &data_array_v[2], &data_array_v[3], &data_array_v[4], &data_array_v[5], &data_array_v[6], &data_array_v[7], &data_array_v[8], &data_array_v[9], &data_array_v[10], &data_array_v[11], &data_array_v[12], &data_array_v[13], &data_array_v[14]}; struct CliSuccessType *success_ptr; int x; void main(int argc, char **argv) { printf("array ops demo\n"); context = cont; /* determine if the server supports this feature */ dbchqep.qepLevel = 1; dbchqep.qepItem = QEPIAOP; dbchqep.qepTLen = strchr(argv[1], '/') - argv[1]; memcpy(TDPid, argv[1], dbchqep.qepTLen); dbchqep.qepTDP = (int) TDPid; dbchqep.qepRArea = &result; dbchqep.qepRALen = 1; DBCHQE(&rc, context, &dbchqep); if (rc) { printf("DBCHQE 1 failed: %d\n", rc); exit(4); } if (result == 'Y') printf("array ops *IS* supported\n"); else { printf("array ops *IS NOT* supported\n"); exit(4); } /* Initialize CLIv2 */ dbcarea.total_len = sizeof(struct DBCAREA); DBCHINI(&rc, context, &dbcarea); if (rc) { printf("DBCHINI failed: %d\n", rc); exit(4); } /* connect a single session */ dbcarea.wait_for_resp = 'Y'; dbcarea.loc_mode = 'Y'; dbcarea.logon_ptr = argv[1]; dbcarea.logon_len = strlen(argv[1]); dbcarea.connect_type = 'C'; dbcarea.func = DBFCON; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFCON) failed: %d\n", rc); exit(4); } /* fetch the response */ dbcarea.i_sess_id = dbcarea.o_sess_id; dbcarea.i_req_id = dbcarea.o_req_id; dbcarea.func = DBFFET; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFFET) failed: %d\n", rc); exit(4); } if (dbcarea.fet_parcel_flavor == PclSUCCESS) printf("*** connect was successful ***\n"); else { printf("*** connect failed ***\n"); exit(4); } /* end the request */ dbcarea.func = DBFERQ; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFERQ) failed: %d\n", rc); exit(4); } /* create the test table */ dbcarea.req_ptr = create; dbcarea.req_len = strlen(create); dbcarea.func = DBFIRQ; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFIRQ) failed: %d\n", rc); exit(4); } /* fetch the response */ dbcarea.i_req_id = dbcarea.o_req_id; dbcarea.func = DBFFET; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFFET) failed: %d\n", rc); exit(4); } if (dbcarea.fet_parcel_flavor == PclSUCCESS) printf("*** create-table was successful ***\n"); else { printf("*** create-table failed ***\n"); exit(4); } /* end the request */ dbcarea.func = DBFERQ; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFERQ) failed: %d\n", rc); exit(4); } /* insert using array ops feature */ dbcarea.req_ptr = request_1; dbcarea.req_len = strlen(request_1); /* dbcarea.use_presence_bits = 'Y'; dbcarea.change_opts='Y'; */ /* array ops support code here */ dbcarea.using_data_ptr_array = (char *) &data_array; dbcarea.using_data_len_array = data_array_lens; dbcarea.using_data_count = ARRAY_COUNT; dbcarea.resp_mode = 'M'; dbcarea.change_opts = 'Y'; dbcarea.func = DBFIRQ; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFIRQ) failed: %d\n", rc); printf("%s\n", dbcarea.msg_text); exit(4); } /* fetch the response */ dbcarea.i_req_id = dbcarea.o_req_id; dbcarea.func = DBFFET; count_pcl = 2 * ARRAY_COUNT; do { DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFFET) failed: %d\n", rc); exit(4); } if ((dbcarea.fet_parcel_flavor != PclSUCCESS) && (dbcarea.fet_parcel_flavor != PclENDSTATEMENT)) { printf("*** insert-rows failed for var_len_req='N' ***\n"); exit(4); } } while (--count_pcl); printf("*** insert-rows was successful for var_len_req='N' ***\n"); /* end the request */ dbcarea.func = DBFERQ; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFERQ) failed: %d\n", rc); exit(4); } /* verify the contents of the table */ dbcarea.req_ptr = selectc1; dbcarea.req_len = strlen(selectc1); dbcarea.using_data_ptr_array = 0; dbcarea.using_data_len_array = 0; dbcarea.using_data_count = 0; dbcarea.func = DBFIRQ; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFIRQ) failed: %d\n", rc); exit(4); } /* fetch the response */ dbcarea.i_req_id = dbcarea.o_req_id; dbcarea.func = DBFFET; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFFET) failed: %d\n", rc); exit(4); } if (dbcarea.fet_parcel_flavor == PclSUCCESS) { printf("*** select-rows was successful ***\n"); success_ptr = (struct CliSuccessType *) dbcarea.fet_data_ptr; #if (defined(I370) && defined(_O_BYTEALIGN)) memcpy(&x, &success_ptr->ActivityCount, sizeof(int)); #else memcpy(&x, success_ptr->ActivityCount, sizeof(int)); #endif printf("*** %d rows were returned ***\n", x); } else { printf("*** select-rows failed ***\n"); exit(4); } quit = 1; do { DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFFET) failed: %d\n", rc); exit(4); } switch (dbcarea.fet_parcel_flavor) { case PclRECORD: case PclSMR: printf("Row %2d: %s\n", ++row_count, (dbcarea.resp_mode == 'M' ? dbcarea.fet_data_ptr + 1 : dbcarea.fet_data_ptr)); break; case PclXDIX: case PclSEMR: case PclENDSTATEMENT: break; case PclENDREQUEST: quit = 0; break; case PclERROR: case PclFAILURE: printf("an error or failure occurred\n"); exit(4); default: printf("unexpected parcel received\n"); exit(4); } } while (quit); /* end the request */ dbcarea.func = DBFERQ; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFERQ) failed: %d\n", rc); exit(4); } /* drop the table */ dbcarea.req_ptr = dropit; dbcarea.req_len = strlen(dropit); dbcarea.func = DBFIRQ; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFIRQ) failed: %d\n", rc); exit(4); } /* fetch the response */ dbcarea.i_req_id = dbcarea.o_req_id; dbcarea.func = DBFFET; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFFET)failed: %d\n", rc); exit(4); } if (dbcarea.fet_parcel_flavor == PclSUCCESS) printf("*** drop-table was successful ***\n"); else { printf("*** drop-table failed ***\n"); exit(4); } /* end the request */ dbcarea.func = DBFERQ; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFERQ) failed: %d\n", rc); exit(4); } /* create the test table */ dbcarea.req_ptr = create; dbcarea.req_len = strlen(create); dbcarea.func = DBFIRQ; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFIRQ) failed: %d\n", rc); exit(4); } /* fetch the response */ dbcarea.i_req_id = dbcarea.o_req_id; dbcarea.func = DBFFET; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFFET) failed: %d\n", rc); exit(4); } if (dbcarea.fet_parcel_flavor == PclSUCCESS) printf("*** create-table was successful ***\n"); else { printf("*** create-table failed ***\n"); exit(4); } /* end the request */ dbcarea.func = DBFERQ; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFERQ) failed: %d\n", rc); exit(4); } /* insert using array ops feature */ request_2.length = strlen(request_1); strcpy(request_2.req, request_1); dbcarea.req_ptr = (char *) &request_2; dbcarea.req_len = 0; dbcarea.var_len_req = 'Y'; dbcarea.change_opts='Y'; /* array ops support code here */ dbcarea.using_data_ptr_array = (char *) &data_array_p; dbcarea.using_data_count = ARRAY_COUNT; dbcarea.func = DBFIRQ; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFIRQ) failed: %d\n", rc); exit(4); } /* fetch the response */ dbcarea.var_len_req = 'N'; dbcarea.change_opts='Y'; dbcarea.i_req_id = dbcarea.o_req_id; dbcarea.func = DBFFET; count_pcl = 2 * ARRAY_COUNT; do { DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFFET) failed: %d\n", rc); exit(4); } if ((dbcarea.fet_parcel_flavor != PclSUCCESS) && (dbcarea.fet_parcel_flavor != PclENDSTATEMENT)) { printf("*** insert-rows failed for var_len_req='Y' ***\n"); exit(4); } } while (--count_pcl); printf("*** insert-rows was successful for var_len_req='Y' ***\n"); /* end the request */ dbcarea.func = DBFERQ; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFERQ) failed: %d\n", rc); exit(4); } /* verify the contents of the table */ dbcarea.req_ptr = selectc1; dbcarea.req_len = strlen(selectc1); dbcarea.using_data_ptr_array = 0; dbcarea.using_data_len_array = 0; dbcarea.using_data_count = 0; dbcarea.func = DBFIRQ; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFIRQ) failed: %d\n", rc); exit(4); } /* fetch the response */ dbcarea.i_req_id = dbcarea.o_req_id; dbcarea.func = DBFFET; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFFET) failed: %d\n", rc); exit(4); } if (dbcarea.fet_parcel_flavor == PclSUCCESS) { printf("*** select-rows was successful ***\n"); success_ptr = (struct CliSuccessType *) dbcarea.fet_data_ptr; #if (defined(I370) && defined(_O_BYTEALIGN)) memcpy(&x, &success_ptr->ActivityCount, sizeof(int)); #else memcpy(&x, success_ptr->ActivityCount, sizeof(int)); #endif printf("*** %d rows were returned ***\n", x); } else { printf("*** select-rows failed ***\n"); exit(4); } quit = 1; row_count = 0; do { DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFFET) failed: %d\n", rc); exit(4); } switch (dbcarea.fet_parcel_flavor) { case PclRECORD: case PclSMR: printf("Row %2d: %s\n", ++row_count, (dbcarea.resp_mode == 'M' ? dbcarea.fet_data_ptr + 1 : dbcarea.fet_data_ptr)); break; case PclXDIX: case PclSEMR: case PclENDSTATEMENT: break; case PclENDREQUEST: quit = 0; break; case PclERROR: case PclFAILURE: printf("an error or failure occurred\n"); exit(4); default: printf("unexpected parcel received\n"); exit(4); } } while (quit); /* end the request */ dbcarea.func = DBFERQ; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFERQ) failed: %d\n", rc); exit(4); } /* drop the table */ dbcarea.req_ptr = dropit; dbcarea.req_len = strlen(dropit); dbcarea.func = DBFIRQ; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFIRQ) failed: %d\n", rc); exit(4); } /* fetch the response */ dbcarea.i_req_id = dbcarea.o_req_id; dbcarea.func = DBFFET; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFFET)failed: %d\n", rc); exit(4); } if (dbcarea.fet_parcel_flavor == PclSUCCESS) printf("*** drop-table was successful ***\n"); else { printf("*** drop-table failed ***\n"); exit(4); } /* end the request */ dbcarea.func = DBFERQ; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFERQ) failed: %d\n", rc); exit(4); } /* disconnect the session */ dbcarea.func = DBFDSC; DBCHCL(&rc, context, &dbcarea); if (rc) { printf("DBCHCL(DBFDSC) failed: %d\n", rc); exit(4); } /* clean up CLIv2 */ DBCHCLN(&rc, context); if (rc) { printf("DBCHCLN failed: %d\n", rc); exit(4); } }