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