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