NCBI C++ ToolKit
will_convert.c
Go to the documentation of this file.

Go to the SVN repository for this file.

1 /* Test cs_will_convert
2  */
3 #undef NDEBUG
4 #include <config.h>
5 
6 #include <stdio.h>
7 
8 #if HAVE_STDLIB_H
9 #include <stdlib.h>
10 #endif /* HAVE_STDLIB_H */
11 
12 #if HAVE_STRING_H
13 #include <string.h>
14 #endif /* HAVE_STRING_H */
15 
16 #include <ctpublic.h>
17 #include "common.h"
18 
19 #include <freetds/test_assert.h>
20 
22 
23 static void
24 check_ret(const char *name, CS_RETCODE ret)
25 {
26  if (ret != CS_SUCCEED) {
27  fprintf(stderr, "%s(): failed\n", name);
28  exit(1);
29  }
30 }
31 
32 typedef struct {
33  const char *expected;
35 } test_row;
36 
37 /* from
38  * http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ocs_12.5.1.comlib/html/comlib/X12687.htm
39  * X = conversion supported
40  * . = conversion not supported
41  * x = should be supported, but currently it's not
42  * _ = should be not supported, but currently it is
43  */
44 static const test_row test_rows[] = {
45 /*
46  B L V B C L V D D T S I D N F R M M B S T I U D T
47  I O A I H O A A A I M N E U L E O O O E E M N A I
48  N N R T A N R T T N A T C M O A N N U N X A I T M
49  A G B R G C E E Y L I E A L E E N S T G C E E
50  R B I C H T T I L M R T Y Y D I E H
51  Y I N H A I I N I A I 4 A T A
52  N A A R M M T N L C R I R
53  A R R E E T Y V
54  R Y 4 I
55  Y T
56  Y
57 */
58 {"X X X x X X X x x X X X x x X X X X . . X X X x x", CS_BINARY_TYPE},
59 {"X X X x X X X x x X X X x x X X X X . . X X X x x", CS_LONGBINARY_TYPE},
60 {"X X X x X X X x x X X X x x X X X X . . X X X x x", CS_VARBINARY_TYPE},
61 {"X X X X X X X . . X X X X X X X _ _ . . X X X x x", CS_BIT_TYPE},
62 {"X X X X X X X X X X X X X X X X X X x x X X X X X", CS_CHAR_TYPE},
63 {"X X X X X X X X X X X X X X X X X X x x X X X X X", CS_LONGCHAR_TYPE},
64 {"X X X X X X X X X X X X X X X X X X x x X X X X X", CS_VARCHAR_TYPE},
65 {"_ _ X . X X X X X . . . . . . . . . . . X X X X X", CS_DATETIME_TYPE},
66 {"_ _ X . X X X X X . . . . . . . . . . . X X X X X", CS_DATETIME4_TYPE},
67 {"X X X X X X X . . X X X X X X X X X . . X X _ . .", CS_TINYINT_TYPE},
68 {"X X X X X X X . . X X X X X X X X X . . X X _ . .", CS_SMALLINT_TYPE},
69 {"X X X X X X X . . X X X X X X X X X . . X X _ . .", CS_INT_TYPE},
70 {"X X X X X X X . . X X X X X X X X X . . X X _ . .", CS_DECIMAL_TYPE},
71 {"X X X X X X X . . X X X X X X X X X . . X X _ . .", CS_NUMERIC_TYPE},
72 {"X X X X X X X . . X X X X X X X X X . . X X _ . .", CS_FLOAT_TYPE},
73 {"X X X X X X X . . X X X X X X X X X . . X X _ . .", CS_REAL_TYPE},
74 {"X X X X X X X . . X X X X X X X X X . . X X _ . .", CS_MONEY_TYPE},
75 {"X X X X X X X . . X X X X X X X X X . . X X _ . .", CS_MONEY4_TYPE},
76 {". . . . x x x . . . . . . . . . . . x . x . . . .", CS_BOUNDARY_TYPE},
77 {". . . . x x x . . . . . . . . . . . . x x . . . .", CS_SENSITIVITY_TYPE},
78 {"X X X X X X X X X X X X X X X X X X x x X X _ _ _", CS_TEXT_TYPE},
79 {"X X X x X X X x x X X X x x X X X X . . X X _ . .", CS_IMAGE_TYPE},
80 {"X X X X X X X X X _ _ _ _ _ _ _ _ _ . . _ _ _ _ _", CS_UNICHAR_TYPE},
81 {"_ _ X . X X X X X . . . . . . . . . . . X X X X _", CS_DATE_TYPE},
82 {"_ _ X . X X X X X . . . . . . . . . . . X X X _ X", CS_TIME_TYPE},
83 {NULL, 0}
84 };
85 
86 #define TEST_ALL_TYPES \
87  TEST_TYPE(BINARY) \
88  TEST_TYPE(LONGBINARY) \
89  TEST_TYPE(VARBINARY) \
90  TEST_TYPE(BIT) \
91  TEST_TYPE(CHAR) \
92  TEST_TYPE(LONGCHAR) \
93  TEST_TYPE(VARCHAR) \
94  TEST_TYPE(DATETIME) \
95  TEST_TYPE(DATETIME4) \
96  TEST_TYPE(TINYINT) \
97  TEST_TYPE(SMALLINT) \
98  TEST_TYPE(INT) \
99  TEST_TYPE(DECIMAL) \
100  TEST_TYPE(NUMERIC) \
101  TEST_TYPE(FLOAT) \
102  TEST_TYPE(REAL) \
103  TEST_TYPE(MONEY) \
104  TEST_TYPE(MONEY4) \
105  TEST_TYPE(BOUNDARY) \
106  TEST_TYPE(SENSITIVITY) \
107  TEST_TYPE(TEXT) \
108  TEST_TYPE(IMAGE) \
109  TEST_TYPE(UNICHAR) \
110  TEST_TYPE(DATE) \
111  TEST_TYPE(TIME)
112 
113 
114 static CS_INT column_types[] = {
115 #define TEST_TYPE(type) CS_ ## type ## _TYPE,
117 #undef TEST_TYPE
119 };
120 
121 static const char *
123 {
124  switch (value) {
125 #define TEST_TYPE(type) case CS_ ## type ## _TYPE: return #type;
127 #undef TEST_TYPE
128  }
129  return "unknown!";
130 }
131 
132 static void
133 test0(CS_INT from, CS_INT to, CS_BOOL expected, int line)
134 {
135  CS_BOOL res;
136  res = 123;
137  cs_will_convert(context, from, to, &res);
138  if (res != expected) {
139  fprintf(stderr, "Wrong result %d (%s) -> %d (%s) %d\n",
140  from, type_name(from),
141  to, type_name(to),
142  res);
143  exit(1);
144  }
145  res = 123;
146  cs_will_convert(NULL, from, to, &res);
147  if (res != expected) {
148  fprintf(stderr, "Wrong result %d (%s) -> %d (%s) %d\n",
149  from, type_name(from),
150  to, type_name(to),
151  res);
152  exit(1);
153  }
154 }
155 
156 #define test(from, to, expected) test0(from, to, expected, __LINE__)
157 
158 int
159 main(int argc, char **argv)
160 {
161  int verbose = 0;
163  CS_CONNECTION *connection;
164  CS_INT from, to;
165  const test_row *row;
166 
167  check_ret("try_ctlogin", try_ctlogin(&context, &connection, &command, verbose));
168 
169  for (row = test_rows; row->expected; ++row) {
170  const CS_INT *type;
171  const char *expected = row->expected;
172  for (type = column_types; *type != CS_ILLEGAL_TYPE; ++type) {
173  switch (*expected) {
174  case 'X':
175  test(row->from, *type, CS_TRUE);
176  break;
177  case '.':
178  test(row->from, *type, CS_FALSE);
179  break;
180  case 'x':
181  case '_':
182  /* ignore */
183  break;
184  default:
185  assert(0);
186  }
187  ++expected;
188  assert(*expected == 0 || *expected == ' ');
189  if (*expected)
190  ++expected;
191  }
192  }
193 
194  for (from = CS_MAX_SYBTYPE + 1; from < 256; ++from) {
195  for (to = CS_MAX_SYBTYPE + 1; to < 256; ++to) {
196  CS_BOOL res;
197  res = 123;
198  cs_will_convert(context, from, to, &res);
199  assert(res == CS_FALSE);
200  res = 123;
201  cs_will_convert(NULL, from, to, &res);
202  assert(res == CS_FALSE);
203  }
204  }
205 
206  try_ctlogout(context, connection, command, verbose);
207 
208  return 0;
209 }
#define CS_LONGCHAR_TYPE
Definition: cspublic.h:552
#define CS_SENSITIVITY_TYPE
Definition: cspublic.h:571
#define CS_SMALLINT_TYPE
Definition: cspublic.h:557
#define CS_BINARY_TYPE
Definition: cspublic.h:551
#define CS_DATETIME4_TYPE
Definition: cspublic.h:563
#define CS_BOUNDARY_TYPE
Definition: cspublic.h:572
#define CS_TIME_TYPE
Definition: cspublic.h:578
#define CS_FLOAT_TYPE
Definition: cspublic.h:560
#define CS_LONGBINARY_TYPE
Definition: cspublic.h:553
#define CS_DATE_TYPE
Definition: cspublic.h:577
#define CS_BIT_TYPE
Definition: cspublic.h:561
#define CS_UNICHAR_TYPE
Definition: cspublic.h:575
CS_RETCODE cs_will_convert(CS_CONTEXT *ctx, CS_INT srctype, CS_INT desttype, CS_BOOL *result)
Definition: cs.c:1387
#define CS_REAL_TYPE
Definition: cspublic.h:559
#define CS_FALSE
Definition: cspublic.h:721
#define CS_CHAR_TYPE
Definition: cspublic.h:550
#define CS_MONEY4_TYPE
Definition: cspublic.h:565
#define CS_DATETIME_TYPE
Definition: cspublic.h:562
#define CS_INT_TYPE
Definition: cspublic.h:558
#define CS_TINYINT_TYPE
Definition: cspublic.h:556
#define CS_DECIMAL_TYPE
Definition: cspublic.h:567
#define CS_MONEY_TYPE
Definition: cspublic.h:564
#define CS_VARCHAR_TYPE
Definition: cspublic.h:568
#define CS_TRUE
Definition: cspublic.h:722
#define CS_TEXT_TYPE
Definition: cspublic.h:554
#define CS_SUCCEED
Definition: cspublic.h:40
#define CS_VARBINARY_TYPE
Definition: cspublic.h:569
#define CS_ILLEGAL_TYPE
Definition: cspublic.h:549
#define CS_IMAGE_TYPE
Definition: cspublic.h:555
#define CS_NUMERIC_TYPE
Definition: cspublic.h:566
Int4 CS_INT
Definition: cstypes.h:41
Int4 CS_BOOL
Definition: cstypes.h:52
CS_INT CS_RETCODE
Definition: cstypes.h:63
CS_RETCODE try_ctlogin(CS_CONTEXT **ctx, CS_CONNECTION **conn, CS_COMMAND **cmd, int verbose)
Definition: common.c:194
CS_RETCODE try_ctlogout(CS_CONTEXT *ctx, CS_CONNECTION *conn, CS_COMMAND *cmd, int verbose)
Definition: common.c:308
static const char * expected[]
Definition: bcp.c:42
static int type
Definition: getdata.c:31
#define CS_MAX_SYBTYPE
Definition: cspublic.h:623
#define NULL
Definition: ncbistd.hpp:225
exit(2)
const GenericPointer< typename T::ValueType > T2 value
Definition: pointer.h:1227
const char * command
true_type verbose
Definition: processing.cpp:890
#define assert(x)
Definition: srv_diag.hpp:58
#define row(bind, expected)
Definition: string_bind.c:73
static void test_row(int vartype, const char *vartype_name, const char *expected, int line)
Definition: string_bind.c:16
CS_INT from
Definition: will_convert.c:34
const char * expected
Definition: will_convert.c:33
Definition: type.c:6
static const char * type_name(CS_INT value)
Definition: will_convert.c:122
static void check_ret(const char *name, CS_RETCODE ret)
Definition: will_convert.c:24
#define TEST_ALL_TYPES
Definition: will_convert.c:86
int main(int argc, char **argv)
Definition: will_convert.c:159
static CS_CONTEXT * context
Definition: will_convert.c:21
static CS_INT column_types[]
Definition: will_convert.c:114
static void test0(CS_INT from, CS_INT to, CS_BOOL expected, int line)
Definition: will_convert.c:133
static const test_row test_rows[]
Definition: will_convert.c:44
#define test(from, to, expected)
Definition: will_convert.c:156
Modified on Tue Jul 16 13:17:12 2024 by modify_doxy.py rev. 669887