@@ -10,6 +10,157 @@ ECPGget_desc_header(int lineno, char * desc_name, int *count)
1010return false;
1111
1212* count = PQnfields (ECPGresult );
13- ECPGlog ("ECPGget-desc_header : found %dsttributes .\n" ,* count );
13+ ECPGlog ("ECPGget_desc_header : found %dattributes .\n" ,* count );
1414return true;
1515}
16+
17+ static bool
18+ get_int_item (int lineno ,void * var ,enum ECPGdtype vartype ,int value )
19+ {
20+ switch (vartype )
21+ {
22+ case ECPGt_short :
23+ * (short * )var = value ;
24+ break ;
25+ case ECPGt_int :
26+ * (int * )var = value ;
27+ break ;
28+ case ECPGt_long :
29+ * (long * )var = value ;
30+ break ;
31+ case ECPGt_unsigned_short :
32+ * (unsigned short * )var = value ;
33+ break ;
34+ case ECPGt_unsigned_int :
35+ * (unsignedint * )var = value ;
36+ break ;
37+ case ECPGt_unsigned_long :
38+ * (unsigned long * )var = value ;
39+ break ;
40+ case ECPGt_float :
41+ * (float * )var = value ;
42+ break ;
43+ case ECPGt_double :
44+ * (double * )var = value ;
45+ break ;
46+ default :
47+ ECPGraise (lineno ,ECPG_VAR_NOT_NUMERIC ,NULL );
48+ return (false);
49+ }
50+
51+ return (true);
52+ }
53+
54+ bool
55+ ECPGget_desc (int lineno ,char * desc_name ,int index , ...)
56+ {
57+ va_list args ;
58+ PGresult * ECPGresult = ECPGresultByDescriptor (lineno ,desc_name );
59+ enum ECPGdtype type ;
60+ bool DataButNoIndicator = false;
61+
62+ va_start (args ,index );
63+ if (!ECPGresult )
64+ return (false);
65+
66+ if (PQntuples (ECPGresult )< 1 )
67+ {
68+ ECPGraise (lineno ,ECPG_NOT_FOUND ,NULL );
69+ return (false);
70+ }
71+
72+ if (index < 1 || index > PQnfields (ECPGresult ))
73+ {
74+ ECPGraise (lineno ,ECPG_INVALID_DESCRIPTOR_INDEX ,NULL );
75+ return (false);
76+ }
77+
78+ ECPGlog ("ECPGget_desc: reading items for tuple %d\n" ,index );
79+ -- index ;
80+
81+ type = va_arg (args ,enum ECPGdtype );
82+
83+ while (type != ECPGd_EODT )
84+ {
85+ char type_str [20 ];
86+ long varcharsize ;
87+ long offset ;
88+ long arrsize ;
89+ enum ECPGttype vartype ;
90+ void * var ;
91+
92+ vartype = va_arg (args ,enum ECPGttype );
93+ var = va_arg (args ,void * );
94+ varcharsize = va_arg (args ,long );
95+ arrsize = va_arg (args ,long );
96+ offset = va_arg (args ,long );
97+
98+ switch (type )
99+ {
100+ case (ECPGd_indicator ):
101+ if (!get_int_item (lineno ,var ,vartype ,- PQgetisnull (ECPGresult ,0 ,index )))
102+ return (false);
103+ break ;
104+
105+ case ECPGd_name :
106+ strncpy ((char * )var ,PQfname (ECPGresult ,index ),varcharsize );
107+ break ;
108+
109+ case ECPGd_nullable :
110+ if (!get_int_item (lineno ,var ,vartype ,1 ))
111+ return (false);
112+ break ;
113+
114+ case ECPGd_key_member :
115+ if (!get_int_item (lineno ,var ,vartype ,0 ))
116+ return (false);
117+ break ;
118+
119+ case ECPGd_scale :
120+ if (!get_int_item (lineno ,var ,vartype , (PQfmod (ECPGresult ,index )- VARHDRSZ )& 0xffff ))
121+ return (false);
122+ break ;
123+
124+ case ECPGd_precision :
125+ if (!get_int_item (lineno ,var ,vartype ,PQfmod (ECPGresult ,index ) >>16 ))
126+ return (false);
127+ break ;
128+
129+ case ECPGd_ret_length :
130+ case ECPGd_ret_octet :
131+ if (!get_int_item (lineno ,var ,vartype ,PQgetlength (ECPGresult ,0 ,index )))
132+ return (false);
133+ break ;
134+
135+ case ECPGd_octet :
136+ if (!get_int_item (lineno ,var ,vartype ,PQfsize (ECPGresult ,index )))
137+ return (false);
138+ break ;
139+
140+ case ECPGd_length :
141+ if (!get_int_item (lineno ,var ,vartype ,PQfmod (ECPGresult ,index )- VARHDRSZ ))
142+ return (false);
143+ break ;
144+
145+ case ECPGd_type :
146+ if (!get_int_item (lineno ,var ,vartype ,ECPGDynamicType (PQftype (ECPGresult ,index ))))
147+ return (false);
148+ break ;
149+
150+ default :
151+ snprintf (type_str ,sizeof (type_str ),"%d" ,type );
152+ ECPGraise (lineno ,ECPG_UNKNOWN_DESCRIPTOR_ITEM ,type_str );
153+ return (false);
154+ }
155+
156+ type = va_arg (args ,enum ECPGdtype );
157+ }
158+
159+ if (DataButNoIndicator && PQgetisnull (ECPGresult ,0 ,index ))
160+ {
161+ ECPGraise (lineno ,ECPG_MISSING_INDICATOR ,NULL );
162+ return (false);
163+ }
164+
165+ return (true);
166+ }