Line data Source code
1 : #include "common.h"
2 :
3 : #if HAVE_UNISTD_H
4 : #include <unistd.h>
5 : #endif /* HAVE_UNISTD_H */
6 :
7 : #if HAVE_SYS_SOCKET_H
8 : #include <sys/socket.h>
9 : #endif /* HAVE_SYS_SOCKET_H */
10 :
11 : #if HAVE_SYS_STAT_H
12 : #include <sys/stat.h>
13 : #endif /* HAVE_SYS_STAT_H */
14 :
15 : #if HAVE_SYS_IOCTL_H
16 : #include <sys/ioctl.h>
17 : #endif /* HAVE_SYS_IOCTL_H */
18 :
19 : #if HAVE_SYS_WAIT_H
20 : #include <sys/wait.h>
21 : #endif /* HAVE_SYS_WAIT_H */
22 :
23 : #include <freetds/utils.h>
24 :
25 : /* Test for SQLEndTran */
26 :
27 : static void
28 8 : ReadErrorConn(void)
29 : {
30 8 : ODBC_BUF *odbc_buf = NULL;
31 8 : SQLTCHAR *err = (SQLTCHAR *) ODBC_GET(sizeof(odbc_err)*sizeof(SQLTCHAR));
32 8 : SQLTCHAR *state = (SQLTCHAR *) ODBC_GET(sizeof(odbc_sqlstate)*sizeof(SQLTCHAR));
33 :
34 8 : memset(odbc_err, 0, sizeof(odbc_err));
35 8 : memset(odbc_sqlstate, 0, sizeof(odbc_sqlstate));
36 8 : CHKGetDiagRec(SQL_HANDLE_DBC, odbc_conn, 1, state, NULL, err, sizeof(odbc_err), NULL, "SI");
37 8 : strcpy(odbc_err, C(err));
38 8 : strcpy(odbc_sqlstate, C(state));
39 8 : ODBC_FREE();
40 8 : printf("Message: '%s' %s\n", odbc_sqlstate, odbc_err);
41 8 : }
42 :
43 : #ifdef _WIN32
44 : #define SHUT_RDWR SD_BOTH
45 : #endif
46 :
47 : static int
48 8 : close_last_socket(void)
49 : {
50 8 : TDS_SYS_SOCKET max_socket = odbc_find_last_socket();
51 :
52 8 : if (max_socket < 0) {
53 0 : fprintf(stderr, "Error finding last socket\n");
54 0 : return 0;
55 : }
56 :
57 : /* close connection */
58 8 : shutdown(max_socket, SHUT_RDWR);
59 :
60 8 : return 1;
61 : }
62 :
63 : int
64 8 : main(void)
65 : {
66 8 : odbc_use_version3 = 1;
67 :
68 8 : odbc_mark_sockets_opened();
69 8 : odbc_connect();
70 :
71 8 : CHKSetConnectAttr(SQL_ATTR_AUTOCOMMIT, (void *) SQL_AUTOCOMMIT_OFF, 0, "S");
72 :
73 8 : odbc_command("SELECT 1");
74 8 : CHKMoreResults("No");
75 :
76 8 : if (!close_last_socket()) {
77 0 : fprintf(stderr, "Error closing connection\n");
78 0 : return 1;
79 : }
80 8 : CHKEndTran(SQL_HANDLE_DBC, odbc_conn, SQL_ROLLBACK, "E");
81 :
82 : /* the error should be written in the connection, not in the statement */
83 8 : ReadErrorConn();
84 8 : if (strcmp(odbc_sqlstate, "08S01") != 0 || strstr(odbc_err, "Write to the server") == NULL) {
85 0 : odbc_disconnect();
86 0 : fprintf(stderr, "Unexpected error message %s %s\n", odbc_sqlstate, odbc_err);
87 0 : return 1;
88 : }
89 :
90 8 : odbc_disconnect();
91 8 : return 0;
92 : }
|