Line data Source code
1 : #include <stdio.h> 2 : #include <stdlib.h> 3 : 4 : exec sql include ../regression; 5 : 6 : EXEC SQL WHENEVER sqlerror sqlprint; 7 : EXEC SQL WHENEVER sqlwarning sqlprint; 8 : EXEC SQL WHENEVER not found sqlprint; 9 : 10 : EXEC SQL TYPE customer IS 11 : struct 12 : { 13 : varchar name[50]; 14 : int phone; 15 : }; 16 : 17 : EXEC SQL TYPE cust_ind IS 18 : struct ind 19 : { 20 : short name_ind; 21 : short phone_ind; 22 : }; 23 : 24 : EXEC SQL TYPE company IS 25 : struct 26 : { 27 : customer *customers; 28 : }; 29 : 30 4 : int main() 31 : { 32 : EXEC SQL begin declare section; 33 4 : customer *custs1 = (customer *) malloc(sizeof(customer) * 10); 34 4 : cust_ind *inds = (cust_ind *) malloc(sizeof(cust_ind) * 10); 35 : typedef struct 36 : { 37 : varchar name[50]; 38 : int phone; 39 : } customer2; 40 4 : customer2 *custs2 = (customer2 *) malloc(sizeof(customer2) * 10); 41 : 42 : struct customer3 43 : { 44 : char name[50]; 45 : int phone; 46 4 : } *custs3 = (struct customer3 *) malloc(sizeof(struct customer3) * 10); 47 : 48 : struct customer4 49 : { 50 : varchar name[50]; 51 : int phone; 52 4 : } *custs4 = (struct customer4 *) malloc(sizeof(struct customer4)); 53 : 54 : company acme; 55 : 56 : int r; 57 : varchar onlyname[2][50]; 58 : EXEC SQL end declare section; 59 : 60 4 : ECPGdebug(1, stderr); 61 : 62 4 : acme.customers = (customer *) malloc(sizeof(customer) * 10); 63 : 64 4 : EXEC SQL connect to REGRESSDB1; 65 4 : 66 4 : EXEC SQL create table customers (c varchar(50), p int); 67 4 : 68 : /* First we'll insert some data using C variable references */ 69 4 : strcpy(custs1[0].name.arr, "John Doe"); 70 4 : custs1[0].name.len = strlen(custs1[0].name.arr); 71 4 : custs1[0].phone = 12345; 72 : 73 4 : strcpy(acme.customers[1].name.arr, "Jane Doe"); 74 4 : acme.customers[1].name.len = strlen(acme.customers[1].name.arr); 75 4 : acme.customers[1].phone = 67890; 76 : 77 4 : EXEC SQL insert into customers values (:custs1->name, 78 : :custs1[0].phone); 79 4 : EXEC SQL insert into customers values (:acme.customers[1].name, 80 4 : :acme.customers[1].phone); 81 4 : 82 4 : /* Clear the array, to be sure reading back into it actually gets data */ 83 4 : memset(custs1, 0, sizeof(customer) * 10); 84 : 85 : /* Now read back the data */ 86 4 : EXEC SQL select * INTO :custs1:inds from customers limit 2; 87 4 : printf("custs1:\n"); 88 12 : for (r = 0; r < 2; r++) 89 : { 90 8 : printf( "name - %s\n", custs1[r].name.arr ); 91 8 : printf( "phone - %d\n", custs1[r].phone ); 92 : } 93 : 94 4 : EXEC SQL select * INTO :custs2:inds from customers limit 2; 95 4 : printf("\ncusts2:\n"); 96 12 : for (r = 0; r < 2; r++) 97 : { 98 8 : printf( "name - %s\n", custs2[r].name.arr ); 99 8 : printf( "phone - %d\n", custs2[r].phone ); 100 : } 101 : 102 4 : EXEC SQL select * INTO :custs3:inds from customers limit 2; 103 4 : printf("\ncusts3:\n"); 104 12 : for (r = 0; r < 2; r++) 105 : { 106 8 : printf( "name - %s\n", custs3[r].name ); 107 8 : printf( "phone - %d\n", custs3[r].phone ); 108 : } 109 : 110 4 : EXEC SQL select * INTO :custs4:inds from customers limit 1; 111 4 : printf("\ncusts4:\n"); 112 4 : printf( "name - %s\n", custs4->name.arr ); 113 4 : printf( "phone - %d\n", custs4->phone ); 114 : 115 4 : EXEC SQL select c INTO :onlyname from customers limit 2; 116 4 : printf("\nname:\n"); 117 12 : for (r = 0; r < 2; r++) 118 : { 119 8 : printf( "name - %s\n", onlyname[r].arr ); 120 : } 121 : 122 4 : EXEC SQL disconnect all; 123 4 : 124 : /* All the memory will anyway be freed at the end */ 125 4 : return 0; 126 : }