18
18
* Also we have to check normal char and wide char
19
19
*/
20
20
21
- static char software_version [] = "$Id: genparams.c,v 1.48 2011/07/12 10:16:59 freddy77 Exp $" ;
21
+ static char software_version [] = "$Id: genparams.c,v 1.49 2011/08/17 13:21:10 freddy77 Exp $" ;
22
22
static void * no_unused_var_warn [] = { software_version , no_unused_var_warn };
23
23
24
24
#ifdef TDS_NO_DM
@@ -31,8 +31,9 @@ static char precision = 18;
31
31
static char exec_direct = 0 ;
32
32
static char prepare_before = 0 ;
33
33
static char use_cursors = 0 ;
34
+ static int only_test = 0 ;
34
35
35
- static void
36
+ static int
36
37
TestOutput (const char * type , const char * value_to_convert , SQLSMALLINT out_c_type , SQLSMALLINT out_sql_type , const char * expected )
37
38
{
38
39
char sbuf [1024 ];
@@ -112,11 +113,18 @@ TestOutput(const char *type, const char *value_to_convert, SQLSMALLINT out_c_typ
112
113
}
113
114
114
115
if (strcmp (sbuf , expected ) != 0 ) {
116
+ if (only_test ) {
117
+ odbc_command ("drop proc spTestProc" );
118
+ ODBC_FREE ();
119
+ return 1 ;
120
+ }
115
121
fprintf (stderr , "Wrong result\n Got: %s\n Expected: %s\n" , sbuf , expected );
116
122
exit (1 );
117
123
}
124
+ only_test = 0 ;
118
125
odbc_command ("drop proc spTestProc" );
119
126
ODBC_FREE ();
127
+ return 0 ;
120
128
}
121
129
122
130
static char check_truncation = 0 ;
@@ -268,6 +276,37 @@ NullInput(SQLSMALLINT out_c_type, SQLSMALLINT out_sql_type, const char *param_ty
268
276
269
277
static int big_endian = 1 ;
270
278
279
+ static const char *
280
+ pack (const char * fmt , ...)
281
+ {
282
+ static char out [80 ];
283
+ char * p = out ;
284
+
285
+ va_list v ;
286
+ va_start (v , fmt );
287
+ for (; * fmt ; ++ fmt ) {
288
+ unsigned n = va_arg (v , unsigned );
289
+ int i , l = 2 ;
290
+
291
+ assert (p - out + 8 < sizeof (out ));
292
+ switch (* fmt ) {
293
+ case 'l' :
294
+ l += 2 ;
295
+ case 's' :
296
+ for (i = 0 ; i < l ; ++ i ) {
297
+ sprintf (p , "%02X" , (n >> (8 * (big_endian ? l - 1 - i : i ))) & 0xffu );
298
+ p += 2 ;
299
+ }
300
+ break ;
301
+ default :
302
+ assert (0 );
303
+ }
304
+ }
305
+ * p = 0 ;
306
+ va_end (v );
307
+ return out ;
308
+ }
309
+
271
310
static void
272
311
AllTests (void )
273
312
{
@@ -306,13 +345,20 @@ AllTests(void)
306
345
*/
307
346
if (odbc_driver_is_freetds ())
308
347
TestOutput ("VARCHAR(20)" , "313233" , SQL_C_BINARY , SQL_VARCHAR , "333133323333" );
309
- /* FIXME our driver ignore precision for date */
348
+
349
+ only_test = 1 ;
310
350
precision = 3 ;
311
- /* Some MS driver incorrectly prepare with smalldatetime*/
312
- if (!use_cursors || odbc_driver_is_freetds ())
313
- TestOutput ("DATETIME" , "2004-02-24 15:16:17" , SQL_C_BINARY , SQL_TIMESTAMP , big_endian ? "0000949700FBAA2C" : "979400002CAAFB00" );
314
- TestOutput ("SMALLDATETIME" , "2004-02-24 15:16:17" , SQL_C_BINARY , SQL_TIMESTAMP ,
315
- big_endian ? "0000949700FB9640" : "979400004096FB00" );
351
+ if (TestOutput ("DATETIME" , "2004-02-24 15:16:17" , SQL_C_BINARY , SQL_TIMESTAMP , pack ("ssssssl" , 2004 , 2 , 24 , 15 , 16 , 17 , 0 ))) {
352
+ /* FIXME our driver ignore precision for date */
353
+ precision = 3 ;
354
+ /* Some MS driver incorrectly prepare with smalldatetime*/
355
+ if (!use_cursors || odbc_driver_is_freetds ()) {
356
+ TestOutput ("DATETIME" , "2004-02-24 15:16:17" , SQL_C_BINARY , SQL_TIMESTAMP , pack ("ll" , 0x9497 , 0xFBAA2C ));
357
+ }
358
+ TestOutput ("SMALLDATETIME" , "2004-02-24 15:16:17" , SQL_C_BINARY , SQL_TIMESTAMP , pack ("ll" , 0x9497 , 0xFB9640 ));
359
+ } else {
360
+ TestOutput ("SMALLDATETIME" , "2004-02-24 15:16:17" , SQL_C_BINARY , SQL_TIMESTAMP , pack ("ssssssl" , 2004 , 2 , 24 , 15 , 16 , 0 , 0 ));
361
+ }
316
362
TestInput (SQL_C_TYPE_TIMESTAMP , "DATETIME" , SQL_TYPE_TIMESTAMP , "DATETIME" , "2005-07-22 09:51:34" );
317
363
318
364
/* test timestamp millisecond round off */
0 commit comments