1 /*
2 * Purpose: Test different string binding combinations.
3 * Functions: dbbind
4 */
5
6 #include "common.h"
7
8 static DBPROCESS *dbproc = NULL;
9 static int bind_len = -1;
10 static int expected_error = 0;
11 static const char *select_cmd = "select 'foo '";
12
13 static void
test_row(int vartype,const char * vartype_name,const char * expected,int line)14 test_row(int vartype, const char *vartype_name, const char *expected, int line)
15 {
16 char str[11];
17 int i;
18
19 printf("%d: row type %s bind len %d\n", line, vartype_name, bind_len);
20
21 if (dbcmd(dbproc, select_cmd) != SUCCEED) {
22 fprintf(stderr, "error: dbcmd\n");
23 exit(1);
24 }
25 dbsqlexec(dbproc);
26
27 if (dbresults(dbproc) != SUCCEED) {
28 fprintf(stderr, "error: expected a result set, none returned.\n");
29 exit(1);
30 }
31
32 memset(str, '$', sizeof(str));
33 str[sizeof(str) - 1] = 0;
34 if (dbbind(dbproc, 1, vartype, bind_len, (BYTE *) str) != SUCCEED) {
35 fprintf(stderr, "Had problem with bind\n");
36 exit(1);
37 }
38 if (dbnextrow(dbproc) != REG_ROW) {
39 fprintf(stderr, "Failed. Expected a row\n");
40 exit(1);
41 }
42
43 assert(str[sizeof(str) - 1] == 0);
44 if (vartype == CHARBIND) {
45 /* not terminated space padded */
46 char *p = strchr(str, '$');
47 i = p ? p - str : sizeof(str);
48 } else {
49 /* terminated */
50 char *p = strchr(str, 0);
51 i = p - str + 1;
52 }
53 for (; i < sizeof(str)-1; ++i) {
54 assert(str[i] == '$');
55 str[i] = 0;
56 }
57
58 printf("str '%s'\n", str);
59 if (strcmp(str, expected) != 0) {
60 fprintf(stderr, "Expected '%s' string\n", expected);
61 exit(1);
62 }
63
64 if (dbnextrow(dbproc) != NO_MORE_ROWS) {
65 fprintf(stderr, "Was expecting no more rows\n");
66 exit(1);
67 }
68 assert(expected_error == 0);
69 }
70
71 #define row(bind, expected) test_row(bind, #bind, expected, __LINE__)
72
73 int
main(int argc,char ** argv)74 main(int argc, char **argv)
75 {
76 LOGINREC *login;
77
78 set_malloc_options();
79
80 read_login_info(argc, argv);
81
82 printf("Starting %s\n", argv[0]);
83
84 dbinit();
85
86 dberrhandle(syb_err_handler);
87 dbmsghandle(syb_msg_handler);
88
89 printf("About to logon as \"%s\"\n", USER);
90
91 login = dblogin();
92 DBSETLPWD(login, PASSWORD);
93 DBSETLUSER(login, USER);
94 DBSETLAPP(login, "spid");
95
96 printf("About to open \"%s\"\n", SERVER);
97
98 dbproc = dbopen(login, SERVER);
99 if (!dbproc) {
100 fprintf(stderr, "Unable to connect to %s\n", SERVER);
101 return 1;
102 }
103 dbloginfree(login);
104
105 dbsetuserdata(dbproc, (BYTE*) &expected_error);
106
107 row(NTBSTRINGBIND, "foo");
108 row(STRINGBIND, "foo ");
109 row(CHARBIND, "foo ");
110
111 bind_len = 4;
112 row(NTBSTRINGBIND, "foo");
113 expected_error = SYBECOFL;
114 row(STRINGBIND, "foo");
115 expected_error = SYBECOFL;
116 row(CHARBIND, "foo ");
117
118 bind_len = 5;
119 row(NTBSTRINGBIND, "foo");
120 expected_error = SYBECOFL;
121 row(STRINGBIND, "foo ");
122 row(CHARBIND, "foo ");
123
124 bind_len = 8;
125 row(NTBSTRINGBIND, "foo");
126 row(STRINGBIND, "foo ");
127 row(CHARBIND, "foo ");
128
129 bind_len = 3;
130 expected_error = SYBECOFL;
131 row(NTBSTRINGBIND, "fo");
132
133 select_cmd = "select 123";
134
135 bind_len = -1;
136 row(NTBSTRINGBIND, "123");
137 row(STRINGBIND, "123");
138 row(CHARBIND, "123");
139
140 bind_len = 4;
141 row(NTBSTRINGBIND, "123");
142 row(STRINGBIND, "123");
143 row(CHARBIND, "123 ");
144
145 bind_len = 6;
146 row(NTBSTRINGBIND, "123");
147 row(STRINGBIND, "123 ");
148 row(CHARBIND, "123 ");
149
150 bind_len = 3;
151 expected_error = SYBECOFL;
152 row(NTBSTRINGBIND, "12");
153 expected_error = SYBECOFL;
154 row(STRINGBIND, "12");
155 row(CHARBIND, "123");
156
157 bind_len = 2;
158 expected_error = SYBECOFL;
159 row(CHARBIND, "12");
160
161 dbclose(dbproc);
162
163 dbexit();
164 return 0;
165 }
166