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