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