Changeset: 51e7b33ccc10 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/51e7b33ccc10
Added Files:
clients/odbc/samples/odbcdriverconnect.c
Modified Files:
clients/odbc/samples/CMakeLists.txt
Branch: odbc-tls
Log Message:
Add driverconnect sample
diffs (168 lines):
diff --git a/clients/odbc/samples/CMakeLists.txt
b/clients/odbc/samples/CMakeLists.txt
--- a/clients/odbc/samples/CMakeLists.txt
+++ b/clients/odbc/samples/CMakeLists.txt
@@ -33,10 +33,20 @@ target_link_libraries(odbcbrowse
PRIVATE
ODBC::ODBC)
+
+add_executable(odbcdriverconnect
+ odbcdriverconnect.c)
+
+target_link_libraries(odbcdriverconnect
+ PRIVATE
+ ODBC::ODBC)
+
+
install(TARGETS
odbcsample1
arraytest
odbcbrowse
+ odbcdriverconnect
RUNTIME
DESTINATION
${CMAKE_INSTALL_BINDIR}
@@ -47,6 +57,7 @@ if(WIN32)
$<TARGET_PDB_FILE:odbcsample1>
$<TARGET_PDB_FILE:arraytest>
$<TARGET_PDB_FILE:odbcbrowse>
+ $<TARGET_PDB_FILE:odbcdriverconnect>
DESTINATION ${CMAKE_INSTALL_BINDIR}
OPTIONAL)
endif()
diff --git a/clients/odbc/samples/odbcdriverconnect.c
b/clients/odbc/samples/odbcdriverconnect.c
new file mode 100644
--- /dev/null
+++ b/clients/odbc/samples/odbcdriverconnect.c
@@ -0,0 +1,131 @@
+/*
+ * SPDX-License-Identifier: MPL-2.0
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * Copyright 2024 MonetDB Foundation;
+ * Copyright August 2008 - 2023 MonetDB B.V.;
+ * Copyright 1997 - July 2008 CWI.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <sql.h>
+#include <sqlext.h>
+
+// borrowed from odbcsample1
+static void
+prerr(SQLSMALLINT tpe, SQLHANDLE hnd, const char *func, const char *pref)
+{
+ SQLCHAR state[6];
+ SQLINTEGER errnr;
+ SQLCHAR msg[256];
+ SQLSMALLINT msglen;
+
+ switch (SQLGetDiagRec(tpe, hnd, 1, state, &errnr, msg, sizeof(msg),
&msglen)) {
+ case SQL_SUCCESS_WITH_INFO:
+ if (msglen >= (signed int) sizeof(msg))
+ fprintf(stderr, "(message truncated)\n");
+ /* fall through */
+ case SQL_SUCCESS:
+ fprintf(stderr, "%s: %s: SQLstate %s, Errnr %d, Message %s\n",
func, pref, (char*)state, (int)errnr, (char*)msg);
+ break;
+ case SQL_INVALID_HANDLE:
+ fprintf(stderr, "%s: %s, invalid handle passed to error
function\n", func, pref);
+ break;
+ case SQL_ERROR:
+ fprintf(stderr, "%s: %s, unexpected error from
SQLGetDiagRec\n", func, pref);
+ break;
+ case SQL_NO_DATA:
+ break;
+ default:
+ fprintf(stderr, "%s: %s, weird return value from
SQLGetDiagRec\n", func, pref);
+ break;
+ }
+}
+
+// borrowed from odbcsample1, with changes.
+// return 0 on success, proper exit code on error.
+static int
+check(SQLRETURN ret, SQLSMALLINT tpe, SQLHANDLE hnd, const char *func)
+{
+ switch (ret) {
+ case SQL_SUCCESS:
+ return 0;
+ case SQL_SUCCESS_WITH_INFO:
+ prerr(tpe, hnd, func, "Info");
+ return 0;
+ case SQL_ERROR:
+ prerr(tpe, hnd, func, "Error");
+ return 1;
+ case SQL_INVALID_HANDLE:
+ fprintf(stderr, "%s: Error: invalid handle\n", func);
+ return 1;
+ default:
+ fprintf(stderr, "%s: Unexpected return value: %d\n", func, ret);
+ return 1;
+ }
+}
+
+int
+main(int argc, char **argv)
+{
+ int exit_code;
+ SQLRETURN ret;
+ SQLHANDLE env = NULL;
+ SQLHANDLE conn = NULL;
+ char *connection_string;
+ SQLCHAR prompt[1024];
+ SQLSMALLINT prompt_size = (SQLSMALLINT) sizeof(prompt);
+ SQLSMALLINT required_size;
+
+ if (argc != 2) {
+ fprintf(stderr, "Usage: odbcbrowse CONNECTSTRING\n");
+ fprintf(stderr, "Exit code: 2 = need more data, 1 = other
error\n");
+ exit_code = 1;
+ goto end;
+ }
+ connection_string = argv[1];
+
+ // Prepare
+
+ ret = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &env);
+ exit_code = check(ret, SQL_HANDLE_ENV, NULL, "SQLAllocHandle ENV");
+ if (exit_code)
+ goto end;
+
+ ret = SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)
SQL_OV_ODBC3, 0);
+ exit_code = check(ret, SQL_HANDLE_ENV, env, "SQLSetEnvAttr
SQL_ATTR_ODBC_VERSION");
+ if (exit_code)
+ goto end;
+
+ ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &conn);
+ exit_code = check(ret, SQL_HANDLE_DBC, env, "SQLAllocHandle DBC");
+ if (exit_code)
+ goto end;
+
+ // We have a connection handle, let's connect
+
+ ret = SQLDriverConnect(conn, NULL, (SQLCHAR*)connection_string,
SQL_NTS, prompt, prompt_size, &required_size, SQL_DRIVER_NOPROMPT);
+ // ret = SQLBrowseConnectA(conn, (SQLCHAR*)connection_string, SQL_NTS,
prompt, prompt_size, &required_size);
+ if (required_size > prompt_size - 1) {
+ fprintf(stderr, "Please ask a wizard to enlarge me");
+ exit_code = 1;
+ goto end;
+ }
+ printf("%s\n", (char*)prompt);
+
+ exit_code = check(ret, SQL_HANDLE_DBC, conn, "SQLBrowseConnectA");
+
+end:
+ if (conn) {
+ SQLDisconnect(conn);
+ SQLFreeHandle(SQL_HANDLE_DBC, conn);
+ }
+ if (env)
+ SQLFreeHandle(SQL_HANDLE_ENV, env);
+ return exit_code;
+}
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]