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