aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/ecpg/test/complex/test2.pgc
blob: 282ef96e178922d2867eaa471134ac5e98abb475 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <stdlib.h>
#include <string.h>

exec sql include header_test;
exec sql include ../regression;

exec sql type c is char reference;
typedef char* c;

exec sql type ind is union { int integer; short smallint; };
typedef union { int integer; short smallint; } ind;

#define BUFFERSIZ 8
exec sql type str is varchar[BUFFERSIZ];

exec sql declare cur cursor for
       select name, born, age, married, children from meskes;

int
main (void)
{
	exec sql struct birthinfo { long born; short age; };
exec sql begin declare section;
	struct personal_struct	{	str name;
					struct birthinfo birth;
				} personal, *p;
	struct personal_indicator {	int ind_name;
					struct birthinfo ind_birth;
				  } ind_personal, *i;
	ind ind_children;
	char *query="select name, born, age, married, children from meskes where name = :var1";
exec sql end declare section;

	exec sql char *married = NULL;
	exec sql long ind_married;
	exec sql ind children;

	char msg[128];

        ECPGdebug(1, stderr);

	strcpy(msg, "connect");
	exec sql connect to REGRESSDB1;

	strcpy(msg, "create");
	exec sql create table meskes(name char(8), born integer, age smallint, married date, children integer);

	strcpy(msg, "insert");
	exec sql insert into meskes(name, married, children) values ('Petra', '19900404', 3);
	exec sql insert into meskes(name, born, age, married, children) values ('Michael', 19660117, 35, '19900404', 3);
	exec sql insert into meskes(name, born, age) values ('Carsten', 19910103,10);
	exec sql insert into meskes(name, born, age) values ('Marc', 19930907, 8);
	exec sql insert into meskes(name, born, age) values ('Chris', 19970923, 4);

	strcpy(msg, "commit");
	exec sql commit;

	strcpy(msg, "open");
	exec sql open cur;

	exec sql whenever not found do break;

	p=&personal;
	i=&ind_personal;
	memset(i, 0, sizeof(ind_personal));
	while (1) {
		strcpy(msg, "fetch");
		exec sql fetch cur into :p:i, :married:ind_married, :children.integer:ind_children.smallint;
		printf("%8.8s", personal.name.arr);
		if (i->ind_birth.born >= 0)
			printf(", born %ld", personal.birth.born);
		if (i->ind_birth.age >= 0)
			printf(", age = %d", personal.birth.age);
		if (ind_married >= 0)
			printf(", married %s", married);
		if (ind_children.smallint >= 0)
			printf(", children = %d", children.integer);
		putchar('\n');

		free(married);
		married = NULL;
	}

	strcpy(msg, "close");
	exec sql close cur;

	/* and now a same query with prepare */
	exec sql prepare MM from :query;
	exec sql declare prep cursor for MM;

	strcpy(msg, "open");
	exec sql open prep using 'Petra';

	exec sql whenever not found do break;

	while (1) {
		strcpy(msg, "fetch");
		exec sql fetch in prep into :personal:ind_personal, :married:ind_married, :children.integer:ind_children.smallint;
		printf("%8.8s", personal.name.arr);
		if (ind_personal.ind_birth.born >= 0)
			printf(", born %ld", personal.birth.born);
		if (ind_personal.ind_birth.age >= 0)
			printf(", age = %d", personal.birth.age);
		if (ind_married >= 0)
			printf(", married %s", married);
		if (ind_children.smallint >= 0)
			printf(", children = %d", children.integer);
		putchar('\n');
	}

	free(married);

	strcpy(msg, "close");
	exec sql close prep;

	strcpy(msg, "drop");
	exec sql drop table meskes;

	strcpy(msg, "commit");
	exec sql commit;

	strcpy(msg, "disconnect"); 
	exec sql disconnect;

	return (0);
}