1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
/*
* Test functions related to establishing a connection.
*/
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
static void
test_SQLConnect()
{
SQLRETURN ret;
SQLCHAR *dsn = (SQLCHAR *) get_test_dsn();
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);
SQLAllocHandle(SQL_HANDLE_DBC, env, &conn);
printf("Connecting with SQLConnect...");
ret = SQLConnect(conn, dsn, SQL_NTS, NULL, 0, NULL, 0);
if (SQL_SUCCEEDED(ret)) {
printf("connected\n");
} else {
print_diag("SQLConnect failed.", SQL_HANDLE_DBC, conn);
return;
}
}
/*
* Test that attributes can be set *before* establishing a connection. (We
* used to have a bug where it got reset when the per-DSN options were read.)
*/
static void
test_setting_attribute_before_connect()
{
SQLRETURN ret;
SQLCHAR str[1024];
SQLSMALLINT strl;
SQLCHAR dsn[1024];
SQLULEN value;
HSTMT hstmt = SQL_NULL_HSTMT;
snprintf(dsn, sizeof(dsn), "DSN=%s", get_test_dsn());
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);
SQLAllocHandle(SQL_HANDLE_DBC, env, &conn);
printf("Testing that autocommit persists SQLDriverConnect...\n");
/* Disable autocommit */
SQLSetConnectAttr(conn,
SQL_ATTR_AUTOCOMMIT,
(SQLPOINTER) SQL_AUTOCOMMIT_OFF,
0);
/* Connect */
ret = SQLDriverConnect(conn, NULL, dsn, SQL_NTS,
str, sizeof(str), &strl,
SQL_DRIVER_COMPLETE);
if (SQL_SUCCEEDED(ret)) {
printf("connected\n");
} else {
print_diag("SQLDriverConnect failed.", SQL_HANDLE_DBC, conn);
return;
}
/*** Test that SQLGetConnectAttr says that it's still disabled. ****/
value = 0;
ret = SQLGetConnectAttr(conn,
SQL_ATTR_AUTOCOMMIT,
&value,
0, /* BufferLength, ignored for an int attribute */
NULL);
CHECK_CONN_RESULT(ret, "SQLGetConnectAttr failed", conn);
if (value == SQL_AUTOCOMMIT_ON)
printf("autocommit is on (should've been off!)\n");
else if (value == SQL_AUTOCOMMIT_OFF)
printf("autocommit is still off (correct).\n");
else
printf("unexpected autocommit value: %lu\n", (unsigned long) value);
/*
* Test that we're really not autocommitting.
*
* Insert a row, then rollback, and check that the row is not there
* anymore.
*/
ret = SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt);
if (!SQL_SUCCEEDED(ret))
{
print_diag("failed to allocate stmt handle", SQL_HANDLE_DBC, conn);
return;
}
ret = SQLExecDirect(hstmt, (SQLCHAR *) "INSERT INTO testtab1 VALUES (10000, 'shouldn''t be here!')", SQL_NTS);
CHECK_STMT_RESULT(ret, "SQLExecDirect failed", hstmt);
ret = SQLFreeStmt(hstmt, SQL_CLOSE);
CHECK_STMT_RESULT(ret, "SQLFreeStmt failed", hstmt);
ret = SQLTransact(SQL_NULL_HENV, conn, SQL_ROLLBACK);
CHECK_CONN_RESULT(ret, "SQLTransact failed", conn);
ret = SQLExecDirect(hstmt, (SQLCHAR *) "SELECT * FROM testtab1 WHERE id = 10000", SQL_NTS);
CHECK_STMT_RESULT(ret, "SQLExecDirect failed", hstmt);
print_result(hstmt);
test_disconnect();
}
int main(int argc, char **argv)
{
/* the common test_connect() function uses SQLDriverConnect */
test_connect();
test_disconnect();
test_SQLConnect();
test_disconnect();
test_setting_attribute_before_connect();
return 0;
}
|