@@ -89,10 +89,25 @@ SQLSetDescFieldW(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber,
8989mylog ("[SQLSetDescFieldW]" );
9090if (BufferLength > 0 )
9191{
92- uval = ucs2_to_utf8 (Value ,BufferLength /2 ,& vallen );
93- val_alloced = TRUE;
92+ switch (FieldIdentifier )
93+ {
94+ case SQL_DESC_BASE_COLUMN_NAME :
95+ case SQL_DESC_BASE_TABLE_NAME :
96+ case SQL_DESC_CATALOG_NAME :
97+ case SQL_DESC_LABEL :
98+ case SQL_DESC_LITERAL_PREFIX :
99+ case SQL_DESC_LITERAL_SUFFIX :
100+ case SQL_DESC_LOCAL_TYPE_NAME :
101+ case SQL_DESC_NAME :
102+ case SQL_DESC_SCHEMA_NAME :
103+ case SQL_DESC_TABLE_NAME :
104+ case SQL_DESC_TYPE_NAME :
105+ uval = ucs2_to_utf8 (Value ,BufferLength /2 ,& vallen );
106+ val_alloced = TRUE;
107+ break ;
108+ }
94109}
95- else
110+ if (! val_alloced )
96111{
97112uval = Value ;
98113vallen = BufferLength ;
@@ -109,11 +124,49 @@ SQLGetDescFieldW(SQLHDESC hdesc, SQLSMALLINT iRecord, SQLSMALLINT iField,
109124SQLINTEGER * pcbValue )
110125{
111126RETCODE ret ;
112- char * qstr = NULL ,* mtxt = NULL ;
127+ BOOL alloced = FALSE;
128+ SQLINTEGER blen ,bMax ,* pcbV ;
129+ char * rgbV = NULL ;
113130
114131mylog ("[SQLGetDescFieldW]" );
115- ret = PGAPI_GetDescField (hdesc ,iRecord ,iField ,rgbValue ,
116- cbValueMax ,pcbValue );
132+ switch (iField )
133+ {
134+ case SQL_DESC_BASE_COLUMN_NAME :
135+ case SQL_DESC_BASE_TABLE_NAME :
136+ case SQL_DESC_CATALOG_NAME :
137+ case SQL_DESC_LABEL :
138+ case SQL_DESC_LITERAL_PREFIX :
139+ case SQL_DESC_LITERAL_SUFFIX :
140+ case SQL_DESC_LOCAL_TYPE_NAME :
141+ case SQL_DESC_NAME :
142+ case SQL_DESC_SCHEMA_NAME :
143+ case SQL_DESC_TABLE_NAME :
144+ case SQL_DESC_TYPE_NAME :
145+ alloced = TRUE;
146+ bMax = cbValueMax * 3 /2 ;
147+ rgbV = malloc (bMax + 1 );
148+ pcbV = & blen ;
149+ break ;
150+ default :
151+ rgbV = rgbValue ;
152+ bMax = cbValueMax ;
153+ pcbV = pcbValue ;
154+ break ;
155+ }
156+ ret = PGAPI_GetDescField (hdesc ,iRecord ,iField ,rgbV ,bMax ,pcbV );
157+ if (alloced )
158+ {
159+ blen = utf8_to_ucs2 (rgbV ,blen , (SQLWCHAR * )rgbValue ,cbValueMax /2 );
160+ if (SQL_SUCCESS == ret && blen * 2 > cbValueMax )
161+ {
162+ ret = SQL_SUCCESS_WITH_INFO ;
163+ Desc_set_error (hdesc ,STMT_TRUNCATED ,"The buffer was too small for the rgbDesc." );
164+ }
165+ if (pcbValue )
166+ * pcbValue = blen * 2 ;
167+ free (rgbV );
168+ }
169+
117170return ret ;
118171}
119172
@@ -171,6 +224,9 @@ RETCODE SQL_API SQLColAttributeW(
171224SQLINTEGER * pfDesc )
172225{
173226RETCODE ret ;
227+ BOOL alloced = FALSE;
228+ SQLSMALLINT * rgbL ,blen ,bMax ;
229+ char * rgbD = NULL ;
174230
175231mylog ("[SQLColAttributeW]" );
176232switch (fDescType )
@@ -187,11 +243,35 @@ RETCODE SQL_API SQLColAttributeW(
187243case SQL_DESC_TABLE_NAME :
188244case SQL_DESC_TYPE_NAME :
189245case SQL_COLUMN_NAME :
246+ alloced = TRUE;
247+ bMax = cbDescMax * 3 /2 ;
248+ rgbD = malloc (bMax + 1 );
249+ rgbL = & blen ;
190250break ;
251+ default :
252+ rgbD = rgbDesc ;
253+ bMax = cbDescMax ;
254+ rgbL = pcbDesc ;
255+ break ;
191256}
192257
193- ret = PGAPI_ColAttributes (hstmt ,icol ,fDescType ,rgbDesc ,
194- cbDescMax ,pcbDesc ,pfDesc );
258+ ret = PGAPI_ColAttributes (hstmt ,icol ,fDescType ,rgbD ,
259+ bMax ,rgbL ,pfDesc );
260+ if (alloced )
261+ {
262+ blen = utf8_to_ucs2 (rgbD ,blen , (SQLWCHAR * )rgbDesc ,cbDescMax /2 );
263+ if (SQL_SUCCESS == ret && blen * 2 > cbDescMax )
264+ {
265+ StatementClass * stmt = (StatementClass * )hstmt ;
266+
267+ ret = SQL_SUCCESS_WITH_INFO ;
268+ stmt -> errornumber = STMT_TRUNCATED ;
269+ stmt -> errormsg = "The buffer was too small for the rgbDesc." ;
270+ }
271+ if (pcbDesc )
272+ * pcbDesc = blen * 2 ;
273+ free (rgbD );
274+ }
195275
196276return ret ;
197277}