*** empty log message ***
[csql.git] / test / performance / ODBCTest.c
blob846dd79693d1f367082939f7b9cde5e23c5a07d6
2 #include <iostream>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <time.h>
7 #include <sql.h>
8 #include <sqlext.h>
9 #include "NanoTimer.h"
10 #define ITERATION 100
11 using namespace std;
13 NanoTimer timer;
15 void extract_error(
16 char *fn,
17 SQLHANDLE handle,
18 SQLSMALLINT type)
20 SQLINTEGER i = 0;
21 SQLINTEGER native;
22 SQLCHAR state[ 7 ];
23 SQLCHAR text[256];
24 SQLSMALLINT len;
25 SQLRETURN ret;
27 fprintf(stderr,
28 "\n"
29 "The driver reported the following diagnostics whilst running "
30 "%s\n\n",
31 fn);
35 ret = SQLGetDiagRec(type, handle, ++i, state, &native, text,
36 sizeof(text), &len );
37 if (SQL_SUCCEEDED(ret))
38 printf("%s:%ld:%ld:%s\n", state, i, native, text);
40 while( ret == SQL_SUCCESS );
43 inline void
44 check_error (SQLSMALLINT handleType, SQLHANDLE handle, int rc, int line)
46 if (rc)
48 cout << "Error " << rc << " at line: " << line << endl;
49 SQLCHAR state[10];
50 SQLINTEGER native;
51 SQLCHAR mesg[300];
52 int i=0;
53 while (SQLGetDiagRec (handleType, handle, i++, state, &native, mesg, 300,
54 NULL) == SQL_SUCCESS)
56 mesg[299] = '\0';
57 cout << "state: " << state << endl;
58 cout << "native: " << native << endl;
59 cout << "mesg: " << mesg << endl;
61 exit (1);
66 inline void
67 checkrc (int rc, int line)
69 if (rc)
71 cout << "Error " << rc << " at line: " << line << endl;
72 exit (1);
76 void
77 readWriteTrans (SQLHDBC hdbc)
79 int rc = SQLSetConnectAttr (hdbc, SQL_ATTR_ACCESS_MODE,
80 (SQLPOINTER) SQL_MODE_READ_WRITE, 0);
81 checkrc (rc, __LINE__);
82 rc = SQLEndTran (SQL_HANDLE_DBC, hdbc, SQL_COMMIT);
83 checkrc (rc, __LINE__);
86 void
87 readOnlyTrans (SQLHDBC hdbc)
89 int rc = SQLSetConnectAttr (hdbc, SQL_ATTR_ACCESS_MODE,
90 (SQLPOINTER) SQL_MODE_READ_ONLY, 0);
91 checkrc (rc, __LINE__);
92 rc = SQLEndTran (SQL_HANDLE_DBC, hdbc, SQL_COMMIT);
93 checkrc (rc, __LINE__);
96 int
97 runInsertTest (SQLHANDLE henv, SQLHANDLE hdbc, SQLHANDLE hstmt)
99 int rc;
100 int iHolder;
101 char sHolder[200];
102 char sData[200];
104 iHolder = 0;
105 strcpy (sData, "0123456789012345678901234567890123456789");
106 rc = SQLPrepare (hstmt, (unsigned char *) "INSERT INTO t1 VALUES (?, ?)",
107 SQL_NTS);
108 checkrc (rc, __LINE__);
109 rc = SQLBindParameter (hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER,
110 0, 0, &iHolder, 0, NULL);
111 checkrc (rc, __LINE__);
112 SQLINTEGER sLen = SQL_NTS;
113 rc = SQLBindParameter (hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,
114 196, 0, (void *) sHolder, 0, &sLen);
115 checkrc (rc, __LINE__);
116 int i, j, k;
117 int tCount;
119 timer.reset ();
121 /* Run 1per Test */
122 for (i = 0; i < ITERATION; i++)
124 timer.start ();
125 iHolder = i ;
126 strcpy (sHolder, sData);
127 rc = SQLExecute (hstmt);
128 checkrc (rc, __LINE__);
129 rc = SQLTransact (henv, hdbc, SQL_COMMIT);
130 checkrc (rc, __LINE__);
131 timer.stop ();
134 printf ("Insert: 1 %lld %lld %lld\n", timer.min (), timer.max (),
135 timer.avg ());
137 return 0;
142 runReadTest (SQLHANDLE henv, SQLHANDLE hdbc, SQLHANDLE hstmt)
144 int iHolder;
145 char sHolder[200];
146 char sData[200];
148 int tempTermVar = 0;
149 int tempTermVal = 0;
150 int rc;
152 /* Set read-only transaction type */
153 readOnlyTrans (hdbc);
154 rc = SQLPrepare (hstmt, (unsigned char *)
155 "SELECT f1, f2 FROM t1 where f1 = ?", SQL_NTS);
156 checkrc (rc, __LINE__);
157 long sz = 0;
158 rc = SQLBindParameter (hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER,
159 0, 0, &tempTermVar, 0, NULL);
160 checkrc (rc, __LINE__);
161 rc = SQLBindCol (hstmt, 1, SQL_INTEGER, &iHolder, 0, NULL);
162 checkrc (rc, __LINE__);
163 rc = SQLBindCol (hstmt, 2, SQL_C_CHAR, sHolder, sizeof (sHolder), NULL);
164 checkrc (rc, __LINE__);
165 iHolder = 0;
166 strcpy (sData, "0123456789012345678901234567890123456789");
168 int i, j, k;
169 int tCount;
171 timer.reset ();
173 /* Run 1per Test */
174 for (i = 0; i < ITERATION; i++)
176 timer.start ();
177 tempTermVar = i ;
178 rc = SQLExecute (hstmt);
179 checkrc (rc, __LINE__);
180 rc = SQLFetch (hstmt);
181 checkrc (rc, __LINE__);
182 tempTermVal = iHolder;
183 strcpy (sData, sHolder);
184 rc = SQLCloseCursor (hstmt);
185 checkrc (rc, __LINE__);
186 rc = SQLTransact (henv, hdbc, SQL_COMMIT);
187 checkrc (rc, __LINE__);
188 timer.stop ();
190 printf ("Read: 1 %lld %lld %lld\n", timer.min (), timer.max (),
191 timer.avg ());
192 /* Set read-write transaction type */
193 readWriteTrans (hdbc);
194 return rc;
198 runUpdateTest (SQLHANDLE henv, SQLHANDLE hdbc, SQLHANDLE hstmt)
200 int rc;
201 int iHolder;
202 char sHolder[200];
203 char sData[200];
205 rc = SQLPrepare (hstmt,
206 (unsigned char *) "UPDATE t1 SET f2 = ? WHERE f1 = ?",
207 SQL_NTS);
208 checkrc (rc, __LINE__);
209 SQLINTEGER sLen = SQL_NTS;
210 rc = SQLBindParameter (hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,
211 196, 0, (void *) sHolder, 0, &sLen);
212 checkrc (rc, __LINE__);
213 rc = SQLBindParameter (hstmt, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER,
214 0, 0, &iHolder, 0, NULL);
215 checkrc (rc, __LINE__);
216 iHolder = 0;
217 strcpy (sData, "9876543210987654321098765432109876543210");
219 int i, j, k;
220 int tCount;
222 timer.reset ();
224 /* Run 1per Test */
225 for (i = 0; i < ITERATION; i++)
227 timer.start ();
228 iHolder = i ;
229 strcpy (sHolder, sData);
230 rc = SQLExecute (hstmt);
231 checkrc (rc, __LINE__);
232 rc = SQLTransact (henv, hdbc, SQL_COMMIT);
233 checkrc (rc, __LINE__);
234 timer.stop ();
236 printf ("Update: 1 %lld %lld %lld\n", timer.min (), timer.max (),
237 timer.avg ());
239 return 0;
243 runDeleteTest (SQLHANDLE henv, SQLHANDLE hdbc, SQLHANDLE hstmt)
245 int rc;
246 int iHolder;
248 rc = SQLPrepare (hstmt, (unsigned char *)
249 "DELETE FROM t1 WHERE f1 = ?", SQL_NTS);
250 checkrc (rc, __LINE__);
251 rc = SQLBindParameter (hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER,
252 0, 0, &iHolder, 0, NULL);
253 checkrc (rc, __LINE__);
254 iHolder = 0;
255 int i, j, k;
256 int tCount;
257 timer.reset ();
258 /* Run 1per Test */
259 for (i = 0; i < ITERATION; i++)
261 timer.start ();
262 iHolder = i ;
263 rc = SQLExecute (hstmt);
264 checkrc (rc, __LINE__);
265 rc = SQLTransact (henv, hdbc, SQL_COMMIT);
266 checkrc (rc, __LINE__);
267 timer.stop ();
269 printf ("Delete: 1 %lld %lld %lld\n", timer.min (), timer.max (),
270 timer.avg ());
271 return 0;
276 main (int ac, char **av)
278 int rc;
279 char *dsn;
280 //SQLHANDLE henv, hdbc, hstmt;
281 SQLHENV henv;
282 SQLHDBC hdbc;
283 SQLHSTMT hstmt;
285 dsn = (char *) "DSN=myodbc3;";
287 rc = SQLAllocHandle (SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
288 checkrc (rc, __LINE__);
289 SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);
291 rc = SQLAllocHandle (SQL_HANDLE_DBC, henv, &hdbc);
292 checkrc (rc, __LINE__);
293 rc = SQLConnect (hdbc,
294 (SQLCHAR *) "test", (SQLSMALLINT) strlen ("test"),
295 (SQLCHAR *) "root",
296 (SQLSMALLINT) strlen ("root"),
297 (SQLCHAR *) "manager",
298 (SQLSMALLINT) strlen (""));
300 SQLCHAR outstr[1024];
301 SQLSMALLINT outstrlen;
304 rc = SQLDriverConnect(hdbc, NULL, (SQLCHAR*)"DSN=myodbc3;", SQL_NTS,
305 outstr, sizeof(outstr), &outstrlen,
306 SQL_DRIVER_NOPROMPT);
309 if (SQL_SUCCEEDED(rc)) {
310 printf("Connected\n");
311 //printf("Returned connection string was:\n\t%s\n", outstr);
312 if (rc == SQL_SUCCESS_WITH_INFO) {
313 printf("Driver reported the following diagnostics\n");
314 extract_error("SQLDriverConnect", hdbc, SQL_HANDLE_DBC);
316 } else {
317 fprintf(stderr, "Failed to connect\n");
318 extract_error("SQLDriverConnect", hdbc, SQL_HANDLE_DBC);
321 //check_error (SQL_HANDLE_DBC, hdbc, rc, __LINE__);
322 checkrc (rc, __LINE__);
323 rc = SQLSetConnectOption (hdbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF);
324 checkrc (rc, __LINE__);
325 rc = SQLAllocHandle (SQL_HANDLE_STMT, hdbc, &hstmt);
326 checkrc (rc, __LINE__);
327 rc = SQLExecDirect(hstmt, (SQLCHAR*) "CREATE TABLE t1 (f1 INTEGER, f2 char(196), primary key (f1));", SQL_NTS );
328 checkrc (rc, __LINE__);
330 runInsertTest (henv, hdbc, hstmt);
331 runReadTest (henv, hdbc, hstmt);
332 runUpdateTest (henv, hdbc, hstmt);
333 runDeleteTest (henv, hdbc, hstmt);
335 rc = SQLExecDirect(hstmt, (SQLCHAR*) "DROP TABLE t1;", SQL_NTS );
336 checkrc (rc, __LINE__);
337 rc = SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT );
338 checkrc (rc, __LINE__);
340 rc = SQLFreeHandle (SQL_HANDLE_STMT, hstmt);
341 checkrc (rc, __LINE__);
342 rc = SQLDisconnect (hdbc);
343 checkrc (rc, __LINE__);
344 rc = SQLFreeHandle (SQL_HANDLE_DBC, hdbc);
345 checkrc (rc, __LINE__);
346 rc = SQLFreeHandle (SQL_HANDLE_ENV, henv);
347 checkrc (rc, __LINE__);
348 exit (0);