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