Line data Source code
1 : /*
2 : * Purpose: dbnull behavior
3 : */
4 :
5 : #include "common.h"
6 : #include <freetds/replacements.h>
7 :
8 : static int failed = 0;
9 : static DBPROCESS *dbproc = NULL;
10 :
11 : static void
12 100 : char_test(const char *null, int bindlen, const char *expected)
13 : {
14 : char db_c[16];
15 : RETCODE ret;
16 :
17 100 : if (null) {
18 70 : fprintf(stderr, "\tdbsetnull(CHARBIND, %u, '%s').\n", (unsigned int) strlen(null), null);
19 70 : ret = dbsetnull(dbproc, CHARBIND, (int) strlen(null), (BYTE *) null);
20 70 : if (ret != SUCCEED) {
21 0 : fprintf(stderr, "dbsetnull returned error %d\n", (int) ret);
22 0 : failed = 1;
23 : }
24 : }
25 :
26 100 : memset(db_c, '_', sizeof(db_c));
27 100 : strcpy(db_c, "123456");
28 100 : dbcmd(dbproc, "select convert(char(20), null)");
29 :
30 100 : dbsqlexec(dbproc);
31 :
32 100 : if (dbresults(dbproc) != SUCCEED) {
33 0 : fprintf(stderr, "Was expecting a row.\n");
34 0 : failed = 1;
35 0 : dbcancel(dbproc);
36 : }
37 :
38 100 : fprintf(stderr, "dbbind(CHARBIND, bindlen= %d).\n", bindlen);
39 100 : dbbind(dbproc, 1, CHARBIND, bindlen, (BYTE *) &db_c);
40 100 : db_c[sizeof(db_c)-1] = 0;
41 100 : printf("buffer before/after dbnextrow: '%s'/", db_c);
42 :
43 100 : if (dbnextrow(dbproc) != REG_ROW) {
44 0 : fprintf(stderr, "Was expecting a row.\n");
45 0 : failed = 1;
46 0 : dbcancel(dbproc);
47 : }
48 100 : db_c[sizeof(db_c)-1] = 0;
49 100 : printf("'%s'\n", db_c);
50 :
51 100 : if (dbnextrow(dbproc) != NO_MORE_ROWS) {
52 0 : fprintf(stderr, "Only one row expected\n");
53 0 : dbcancel(dbproc);
54 0 : failed = 1;
55 : }
56 :
57 100 : while (dbresults(dbproc) == SUCCEED) {
58 : /* nop */
59 : }
60 :
61 100 : if (strcmp(db_c, expected) != 0) {
62 0 : fprintf(stderr, "Invalid NULL '%s' returned expected '%s' (%s:%d)\n", db_c, expected, basename(__FILE__), __LINE__);
63 0 : failed = 1;
64 : }
65 100 : }
66 :
67 10 : TEST_MAIN()
68 : {
69 : LOGINREC *login;
70 : DBINT db_i;
71 : RETCODE ret;
72 :
73 10 : read_login_info(argc, argv);
74 :
75 10 : printf("Starting %s\n", argv[0]);
76 10 : dbinit();
77 :
78 10 : dberrhandle(syb_err_handler);
79 10 : dbmsghandle(syb_msg_handler);
80 :
81 10 : login = dblogin();
82 10 : DBSETLPWD(login, PASSWORD);
83 10 : DBSETLUSER(login, USER);
84 10 : DBSETLAPP(login, "setnull");
85 :
86 :
87 10 : printf("About to open %s.%s\n", SERVER, DATABASE);
88 :
89 10 : dbproc = dbopen(login, SERVER);
90 10 : if (strlen(DATABASE))
91 10 : dbuse(dbproc, DATABASE);
92 10 : dbloginfree(login);
93 :
94 : /* try to set an int */
95 10 : db_i = 0xdeadbeef;
96 10 : ret = dbsetnull(dbproc, INTBIND, 0, (BYTE *) &db_i);
97 10 : if (ret != SUCCEED) {
98 0 : fprintf(stderr, "dbsetnull returned error %d\n", (int) ret);
99 0 : failed = 1;
100 : }
101 :
102 10 : ret = dbsetnull(dbproc, INTBIND, 1, (BYTE *) &db_i);
103 10 : if (ret != SUCCEED) {
104 0 : fprintf(stderr, "dbsetnull returned error %d\n", (int) ret);
105 0 : failed = 1;
106 : }
107 :
108 : /* check result */
109 10 : db_i = 0;
110 10 : dbcmd(dbproc, "select convert(int, null)");
111 :
112 10 : dbsqlexec(dbproc);
113 :
114 10 : if (dbresults(dbproc) != SUCCEED) {
115 0 : fprintf(stderr, "Was expecting a row.\n");
116 0 : failed = 1;
117 0 : dbcancel(dbproc);
118 : }
119 :
120 10 : dbbind(dbproc, 1, INTBIND, 0, (BYTE *) &db_i);
121 10 : printf("db_i = %ld\n", (long int) db_i);
122 :
123 10 : if (dbnextrow(dbproc) != REG_ROW) {
124 0 : fprintf(stderr, "Was expecting a row.\n");
125 0 : failed = 1;
126 0 : dbcancel(dbproc);
127 : }
128 10 : printf("db_i = %ld\n", (long int) db_i);
129 :
130 10 : if (dbnextrow(dbproc) != NO_MORE_ROWS) {
131 0 : fprintf(stderr, "Only one row expected\n");
132 0 : dbcancel(dbproc);
133 0 : failed = 1;
134 : }
135 :
136 10 : while (dbresults(dbproc) == SUCCEED) {
137 : /* nop */
138 : }
139 :
140 10 : if (db_i != 0xdeadbeef) {
141 0 : fprintf(stderr, "Invalid NULL %ld returned (%s:%d)\n", (long int) db_i, basename(__FILE__), __LINE__);
142 0 : failed = 1;
143 : }
144 :
145 : /* try if dbset null consider length */
146 320 : for (db_i = 1; db_i > 0; db_i <<= 1) {
147 310 : printf("db_i = %ld\n", (long int) db_i);
148 310 : ret = dbsetnull(dbproc, INTBIND, db_i, (BYTE *) &db_i);
149 310 : if (ret != SUCCEED) {
150 0 : fprintf(stderr, "dbsetnull returned error %d for bindlen %ld\n", (int) ret, (long int) db_i);
151 0 : failed = 1;
152 0 : break;
153 : }
154 : }
155 :
156 10 : char_test(NULL, -1, "123456");
157 10 : char_test(NULL, 0, "123456");
158 10 : char_test(NULL, 2, " 3456");
159 :
160 10 : char_test("foo", -1, "foo456");
161 10 : char_test("foo", 0, "foo456");
162 : /* char_test("foo", 2, ""); */
163 10 : char_test("foo", 5, "foo 6");
164 :
165 10 : char_test("foo ", -1, "foo 56");
166 10 : char_test("foo ", 0, "foo 56");
167 : /* char_test("foo ", 2, ""); */
168 10 : char_test("foo ", 5, "foo 6");
169 :
170 10 : char_test("foo ", 10, "foo _____");
171 :
172 10 : printf("dblib %s on %s\n", (failed ? "failed!" : "okay"), __FILE__);
173 10 : dbexit();
174 :
175 10 : return failed ? 1 : 0;
176 : }
|