1 #define TDS_DONT_DEFINE_DEFAULT_FUNCTIONS
2 #include "common.h"
3 
4 #include <common/test_assert.h>
5 
6 static char software_version[] = "$Id: common.c 490376 2016-01-25 15:41:46Z ucko $";
7 static void *no_unused_var_warn[] = { software_version, no_unused_var_warn };
8 
9 char USER[512];
10 char SERVER[512];
11 char PASSWORD[512];
12 char DATABASE[512];
13 /* TODO use another default ?? */
14 char CHARSET[512] = "ISO-8859-1";
15 
16 int read_login_info(void);
17 
18 int
read_login_info(void)19 read_login_info(void)
20 {
21 	FILE *in = NULL;
22 	char line[512];
23 	char *s1, *s2;
24 
25 	s1 = getenv("TDSPWDFILE");
26 	if (s1 && s1[0])
27 		in = fopen(s1, "r");
28 	if (!in)
29 		in = fopen("../../../PWD", "r");
30 	if (!in) {
31 		fprintf(stderr, "Can not open PWD file\n\n");
32 		return TDS_FAIL;
33 	}
34 
35 	while (fgets(line, 512, in)) {
36 		s1 = strtok(line, "=");
37 		s2 = strtok(NULL, "\n");
38 		if (!s1 || !s2) {
39 			continue;
40 		}
41 		if (!strcmp(s1, "UID")) {
42 			strcpy(USER, s2);
43 		} else if (!strcmp(s1, "SRV")) {
44 			strcpy(SERVER, s2);
45 		} else if (!strcmp(s1, "PWD")) {
46 			strcpy(PASSWORD, s2);
47 		} else if (!strcmp(s1, "DB")) {
48 			strcpy(DATABASE, s2);
49 		}
50 	}
51 	fclose(in);
52 	return TDS_SUCCESS;
53 }
54 
55 TDSCONTEXT *test_context = NULL;
56 
57 int
try_tds_login(TDSLOGIN ** login,TDSSOCKET ** tds,const char * appname,int verbose)58 try_tds_login(TDSLOGIN ** login, TDSSOCKET ** tds, const char *appname, int verbose)
59 {
60 	TDSLOGIN *connection;
61     const char* base_appname;
62 
63     base_appname = strrchr(appname, '/');
64     if (base_appname == NULL) {
65         base_appname = appname;
66     } else {
67         ++base_appname;
68     }
69 
70 	if (verbose) {
71 		fprintf(stdout, "Entered tds_try_login()\n");
72 	}
73 	if (!login) {
74 		fprintf(stderr, "Invalid TDSLOGIN**\n");
75 		return TDS_FAIL;
76 	}
77 	if (!tds) {
78 		fprintf(stderr, "Invalid TDSSOCKET**\n");
79 		return TDS_FAIL;
80 	}
81 
82 	if (verbose) {
83 		fprintf(stdout, "Trying read_login_info()\n");
84 	}
85 	read_login_info();
86 
87 	if (verbose) {
88 		fprintf(stdout, "Setting login parameters\n");
89 	}
90 	*login = tds_alloc_login(1);
91 	if (!*login) {
92 		fprintf(stderr, "tds_alloc_login() failed.\n");
93 		return TDS_FAIL;
94 	}
95 	tds_set_passwd(*login, PASSWORD);
96 	tds_set_user(*login, USER);
97     tds_set_app(*login, base_appname);
98 	tds_set_host(*login, "myhost");
99 	tds_set_library(*login, "TDS-Library");
100 	tds_set_server(*login, SERVER);
101 	tds_set_client_charset(*login, CHARSET);
102 	tds_set_language(*login, "us_english");
103 
104 	if (verbose) {
105 		fprintf(stdout, "Connecting to database\n");
106 	}
107 	test_context = tds_alloc_context(NULL);
108 	*tds = tds_alloc_socket(test_context, 512);
109 	tds_set_parent(*tds, NULL);
110 	connection = tds_read_config_info(*tds, *login, test_context->locale);
111 	if (!connection || tds_connect_and_login(*tds, connection) != TDS_SUCCESS) {
112 		if (connection) {
113 			tds_free_socket(*tds);
114 			*tds = NULL;
115 			tds_free_login(connection);
116 		}
117 		fprintf(stderr, "tds_connect_and_login() failed\n");
118 		return TDS_FAIL;
119 	}
120 	tds_free_login(connection);
121 
122 	return TDS_SUCCESS;
123 }
124 
125 
126 /* Note that this always suceeds */
127 int
try_tds_logout(TDSLOGIN * login,TDSSOCKET * tds,int verbose)128 try_tds_logout(TDSLOGIN * login, TDSSOCKET * tds, int verbose)
129 {
130 	if (verbose) {
131 		fprintf(stdout, "Entered tds_try_logout()\n");
132 	}
133 	tds_close_socket(tds);
134 	tds_free_socket(tds);
135 	tds_free_login(login);
136 	tds_free_context(test_context);
137 	test_context = NULL;
138 	return TDS_SUCCESS;
139 }
140 
141 /* Run query for which there should be no return results */
142 int
run_query(TDSSOCKET * tds,const char * query)143 run_query(TDSSOCKET * tds, const char *query)
144 {
145 	int rc;
146 	int result_type;
147 
148 	rc = tds_submit_query(tds, query);
149 	if (rc != TDS_SUCCESS) {
150 		fprintf(stderr, "tds_submit_query() failed for query '%s'\n", query);
151 		return TDS_FAIL;
152 	}
153 
154 	while ((rc = tds_process_tokens(tds, &result_type, NULL, TDS_TOKEN_RESULTS)) == TDS_SUCCESS) {
155 
156 		switch (result_type) {
157 		case TDS_DONE_RESULT:
158 		case TDS_DONEPROC_RESULT:
159 		case TDS_DONEINPROC_RESULT:
160 			/* ignore possible spurious result (TDS7+ send it) */
161 		case TDS_STATUS_RESULT:
162 			break;
163 		default:
164 			fprintf(stderr, "Error:  query should not return results\n");
165 			return TDS_FAIL;
166 		}
167 	}
168 	if (rc == TDS_FAIL) {
169 		fprintf(stderr, "tds_process_tokens() returned TDS_FAIL for '%s'\n", query);
170 		return TDS_FAIL;
171 	} else if (rc != TDS_NO_MORE_RESULTS) {
172 		fprintf(stderr, "tds_process_tokens() unexpected return\n");
173 		return TDS_FAIL;
174 	}
175 
176 	return TDS_SUCCESS;
177 }
178