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, 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 : int
68 10 : main(int argc, char **argv)
69 : {
70 : LOGINREC *login;
71 : DBINT db_i;
72 : RETCODE ret;
73 :
74 10 : read_login_info(argc, argv);
75 :
76 10 : printf("Starting %s\n", argv[0]);
77 10 : dbinit();
78 :
79 10 : dberrhandle(syb_err_handler);
80 10 : dbmsghandle(syb_msg_handler);
81 :
82 10 : login = dblogin();
83 10 : DBSETLPWD(login, PASSWORD);
84 10 : DBSETLUSER(login, USER);
85 10 : DBSETLAPP(login, "setnull");
86 :
87 :
88 10 : printf("About to open %s.%s\n", SERVER, DATABASE);
89 :
90 10 : dbproc = dbopen(login, SERVER);
91 10 : if (strlen(DATABASE))
92 10 : dbuse(dbproc, DATABASE);
93 10 : dbloginfree(login);
94 :
95 : /* try to set an int */
96 10 : db_i = 0xdeadbeef;
97 10 : ret = dbsetnull(dbproc, INTBIND, 0, (BYTE *) &db_i);
98 10 : if (ret != SUCCEED) {
99 0 : fprintf(stderr, "dbsetnull returned error %d\n", (int) ret);
100 0 : failed = 1;
101 : }
102 :
103 10 : ret = dbsetnull(dbproc, INTBIND, 1, (BYTE *) &db_i);
104 10 : if (ret != SUCCEED) {
105 0 : fprintf(stderr, "dbsetnull returned error %d\n", (int) ret);
106 0 : failed = 1;
107 : }
108 :
109 : /* check result */
110 10 : db_i = 0;
111 10 : dbcmd(dbproc, "select convert(int, null)");
112 :
113 10 : dbsqlexec(dbproc);
114 :
115 10 : if (dbresults(dbproc) != SUCCEED) {
116 0 : fprintf(stderr, "Was expecting a row.\n");
117 0 : failed = 1;
118 0 : dbcancel(dbproc);
119 : }
120 :
121 10 : dbbind(dbproc, 1, INTBIND, 0, (BYTE *) &db_i);
122 10 : printf("db_i = %ld\n", (long int) db_i);
123 :
124 10 : if (dbnextrow(dbproc) != REG_ROW) {
125 0 : fprintf(stderr, "Was expecting a row.\n");
126 0 : failed = 1;
127 0 : dbcancel(dbproc);
128 : }
129 10 : printf("db_i = %ld\n", (long int) db_i);
130 :
131 10 : if (dbnextrow(dbproc) != NO_MORE_ROWS) {
132 0 : fprintf(stderr, "Only one row expected\n");
133 0 : dbcancel(dbproc);
134 0 : failed = 1;
135 : }
136 :
137 10 : while (dbresults(dbproc) == SUCCEED) {
138 : /* nop */
139 : }
140 :
141 10 : if (db_i != 0xdeadbeef) {
142 0 : fprintf(stderr, "Invalid NULL %ld returned (%s:%d)\n", (long int) db_i, basename(__FILE__), __LINE__);
143 0 : failed = 1;
144 : }
145 :
146 : /* try if dbset null consider length */
147 320 : for (db_i = 1; db_i > 0; db_i <<= 1) {
148 310 : printf("db_i = %ld\n", (long int) db_i);
149 310 : ret = dbsetnull(dbproc, INTBIND, db_i, (BYTE *) &db_i);
150 310 : if (ret != SUCCEED) {
151 0 : fprintf(stderr, "dbsetnull returned error %d for bindlen %ld\n", (int) ret, (long int) db_i);
152 0 : failed = 1;
153 0 : break;
154 : }
155 : }
156 :
157 10 : char_test(NULL, -1, "123456");
158 10 : char_test(NULL, 0, "123456");
159 10 : char_test(NULL, 2, " 3456");
160 :
161 10 : char_test("foo", -1, "foo456");
162 10 : char_test("foo", 0, "foo456");
163 : /* char_test("foo", 2, ""); */
164 10 : char_test("foo", 5, "foo 6");
165 :
166 10 : char_test("foo ", -1, "foo 56");
167 10 : char_test("foo ", 0, "foo 56");
168 : /* char_test("foo ", 2, ""); */
169 10 : char_test("foo ", 5, "foo 6");
170 :
171 10 : char_test("foo ", 10, "foo _____");
172 :
173 10 : printf("dblib %s on %s\n", (failed ? "failed!" : "okay"), __FILE__);
174 10 : dbexit();
175 :
176 10 : return failed ? 1 : 0;
177 : }
|