You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by mm...@apache.org on 2021/12/17 10:01:46 UTC
[ignite] 01/03: IGNITE-15677 Correctly handle windows in ODBC on Windows
This is an automated email from the ASF dual-hosted git repository.
mmuzaf pushed a commit to branch ignite-2.11.1
in repository https://gitbox.apache.org/repos/asf/ignite.git
commit 544c3bd08c3184c8b92dc0dd4f1310388acff65b
Author: Igor Sapego <is...@apache.org>
AuthorDate: Tue Oct 5 13:13:16 2021 +0200
IGNITE-15677 Correctly handle windows in ODBC on Windows
This closes #9469
---
modules/platforms/cpp/odbc/CMakeLists.txt | 2 +-
.../cpp/odbc/include/ignite/odbc/common_types.h | 3 ++
.../cpp/odbc/include/ignite/odbc/connection.h | 6 ++-
.../odbc/include/ignite/odbc/system/system_dsn.h | 43 ++++++++++++++++++++++
.../platforms/cpp/odbc/os/win/src/system_dsn.cpp | 17 +++------
modules/platforms/cpp/odbc/src/connection.cpp | 20 +++++++---
modules/platforms/cpp/odbc/src/odbc.cpp | 29 ++++++++++++---
7 files changed, 95 insertions(+), 25 deletions(-)
diff --git a/modules/platforms/cpp/odbc/CMakeLists.txt b/modules/platforms/cpp/odbc/CMakeLists.txt
index 6d6d50b..742d36f 100644
--- a/modules/platforms/cpp/odbc/CMakeLists.txt
+++ b/modules/platforms/cpp/odbc/CMakeLists.txt
@@ -91,7 +91,7 @@ if (WIN32)
remove_definitions(-DUNICODE=1)
- add_definitions(-DTARGET_MODULE_FULL_NAME="${TARGET}")
+ add_definitions(-DTARGET_MODULE_FULL_NAME="$<TARGET_FILE_NAME:${TARGET}>")
if (MSVC_VERSION GREATER_EQUAL 1900)
target_link_libraries(${TARGET} legacy_stdio_definitions)
diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/common_types.h b/modules/platforms/cpp/odbc/include/ignite/odbc/common_types.h
index 9241bbc..c2158ab 100644
--- a/modules/platforms/cpp/odbc/include/ignite/odbc/common_types.h
+++ b/modules/platforms/cpp/odbc/include/ignite/odbc/common_types.h
@@ -171,6 +171,9 @@ namespace ignite
/** Invalid SQL data type. */
SHY004_INVALID_SQL_DATA_TYPE,
+ /** Operation canceled. */
+ SHY008_OPERATION_CANCELED,
+
/** Invalid use of null pointer. */
SHY009_INVALID_USE_OF_NULL_POINTER,
diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/connection.h b/modules/platforms/cpp/odbc/include/ignite/odbc/connection.h
index 4b1df30..b670ee0 100644
--- a/modules/platforms/cpp/odbc/include/ignite/odbc/connection.h
+++ b/modules/platforms/cpp/odbc/include/ignite/odbc/connection.h
@@ -90,8 +90,9 @@ namespace ignite
* Establish connection to ODBC server.
*
* @param connectStr Connection string.
+ * @param parentWindow Parent window pointer.
*/
- void Establish(const std::string& connectStr);
+ void Establish(const std::string& connectStr, void* parentWindow);
/**
* Establish connection to ODBC server.
@@ -360,9 +361,10 @@ namespace ignite
* Internal call.
*
* @param connectStr Connection string.
+ * @param parentWindow Parent window.
* @return Operation result.
*/
- SqlResult::Type InternalEstablish(const std::string& connectStr);
+ SqlResult::Type InternalEstablish(const std::string& connectStr, void* parentWindow);
/**
* Establish connection to ODBC server.
diff --git a/modules/platforms/cpp/odbc/include/ignite/odbc/system/system_dsn.h b/modules/platforms/cpp/odbc/include/ignite/odbc/system/system_dsn.h
new file mode 100644
index 0000000..38da117
--- /dev/null
+++ b/modules/platforms/cpp/odbc/include/ignite/odbc/system/system_dsn.h
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _IGNITE_ODBC_SYSTEM_SYSTEM_DSN
+#define _IGNITE_ODBC_SYSTEM_SYSTEM_DSN
+
+#include <ignite/odbc/system/odbc_constants.h>
+
+namespace ignite
+{
+ namespace odbc
+ {
+ namespace config
+ {
+ class Configuration;
+ }
+ }
+}
+
+/**
+ * Display connection window for user to configure connection parameters.
+ *
+ * @param windowParent Parent window handle.
+ * @param config Output configuration.
+ * @return True on success and false on fail.
+ */
+bool DisplayConnectionWindow(void* windowParent, ignite::odbc::config::Configuration& config);
+
+#endif //_IGNITE_ODBC_SYSTEM_SYSTEM_DSN
diff --git a/modules/platforms/cpp/odbc/os/win/src/system_dsn.cpp b/modules/platforms/cpp/odbc/os/win/src/system_dsn.cpp
index 0672911..0693550 100644
--- a/modules/platforms/cpp/odbc/os/win/src/system_dsn.cpp
+++ b/modules/platforms/cpp/odbc/os/win/src/system_dsn.cpp
@@ -28,19 +28,14 @@
using ignite::odbc::config::Configuration;
-/**
- * Display configuration window for user to configure DSN.
- *
- * @param hwndParent Parent window handle.
- * @param config Output configuration.
- * @return True on success and false on fail.
- */
-bool DisplayConfigureDsnWindow(HWND hwndParent, Configuration& config)
+bool DisplayConnectionWindow(void* windowParent, Configuration& config)
{
using namespace ignite::odbc::system::ui;
+ HWND hwndParent = (HWND) windowParent;
+
if (!hwndParent)
- return false;
+ return true;
try
{
@@ -172,7 +167,7 @@ BOOL INSTAPI ConfigDSN(HWND hwndParent, WORD req, LPCSTR driver, LPCSTR attribut
{
LOG_MSG("ODBC_ADD_DSN");
- if (!DisplayConfigureDsnWindow(hwndParent, config))
+ if (!DisplayConnectionWindow(hwndParent, config))
return FALSE;
if (!RegisterDsn(config, driver))
@@ -191,7 +186,7 @@ BOOL INSTAPI ConfigDSN(HWND hwndParent, WORD req, LPCSTR driver, LPCSTR attribut
ReadDsnConfiguration(dsn.c_str(), loaded, &diag);
- if (!DisplayConfigureDsnWindow(hwndParent, loaded))
+ if (!DisplayConnectionWindow(hwndParent, loaded))
return FALSE;
if (!RegisterDsn(loaded, driver))
diff --git a/modules/platforms/cpp/odbc/src/connection.cpp b/modules/platforms/cpp/odbc/src/connection.cpp
index b073580..337cacc 100644
--- a/modules/platforms/cpp/odbc/src/connection.cpp
+++ b/modules/platforms/cpp/odbc/src/connection.cpp
@@ -35,6 +35,7 @@
#include "ignite/odbc/dsn_config.h"
#include "ignite/odbc/config/configuration.h"
#include "ignite/odbc/config/connection_string_parser.h"
+#include "ignite/odbc/system/system_dsn.h"
// Uncomment for per-byte debug.
//#define PER_BYTE_DEBUG
@@ -102,19 +103,28 @@ namespace ignite
return res;
}
- void Connection::Establish(const std::string& connectStr)
+ void Connection::Establish(const std::string& connectStr, void* parentWindow)
{
- IGNITE_ODBC_API_CALL(InternalEstablish(connectStr));
+ IGNITE_ODBC_API_CALL(InternalEstablish(connectStr, parentWindow));
}
- SqlResult::Type Connection::InternalEstablish(const std::string& connectStr)
+ SqlResult::Type Connection::InternalEstablish(const std::string& connectStr, void* parentWindow)
{
config::Configuration config;
-
config::ConnectionStringParser parser(config);
-
parser.ParseConnectionString(connectStr, &GetDiagnosticRecords());
+ if (parentWindow)
+ {
+ LOG_MSG("Parent window is passed. Creating configuration window.");
+ if (!DisplayConnectionWindow(parentWindow, config))
+ {
+ AddStatusRecord(odbc::SqlState::SHY008_OPERATION_CANCELED, "Connection canceled by user");
+
+ return SqlResult::AI_ERROR;
+ }
+ }
+
if (config.IsDsnSet())
{
std::string dsn = config.GetDsn();
diff --git a/modules/platforms/cpp/odbc/src/odbc.cpp b/modules/platforms/cpp/odbc/src/odbc.cpp
index f297ec4..ef61bb4 100644
--- a/modules/platforms/cpp/odbc/src/odbc.cpp
+++ b/modules/platforms/cpp/odbc/src/odbc.cpp
@@ -23,6 +23,7 @@
#include "ignite/odbc/log.h"
#include "ignite/odbc/utility.h"
#include "ignite/odbc/system/odbc_constants.h"
+#include "ignite/odbc/system/system_dsn.h"
#include "ignite/odbc/config/connection_string_parser.h"
#include "ignite/odbc/config/configuration.h"
@@ -33,6 +34,26 @@
#include "ignite/odbc/dsn_config.h"
#include "ignite/odbc.h"
+/**
+ * Handle window handle.
+ * @param windowHandle Window handle.
+ * @param config Configuration.
+ * @return @c true on success and @c false otherwise.
+ */
+bool HandleParentWindow(SQLHWND windowHandle, ignite::odbc::config::Configuration &config)
+{
+#ifdef _WIN32
+ if (windowHandle)
+ {
+ LOG_MSG("Parent window is passed. Creating configuration window.");
+ return DisplayConnectionWindow(windowHandle, config);
+ }
+#else
+ IGNITE_UNUSED(windowHandle);
+ IGNITE_UNUSED(config);
+#endif
+ return true;
+}
namespace ignite
{
@@ -262,8 +283,6 @@ namespace ignite
using utility::SqlStringToString;
using utility::CopyStringToBuffer;
- UNREFERENCED_PARAMETER(windowHandle);
-
LOG_MSG("SQLDriverConnect called");
if (inConnectionString)
LOG_MSG("Connection String: [" << inConnectionString << "]");
@@ -274,11 +293,9 @@ namespace ignite
return SQL_INVALID_HANDLE;
std::string connectStr = SqlStringToString(inConnectionString, inConnectionStringLen);
+ connection->Establish(connectStr, windowHandle);
- connection->Establish(connectStr);
-
- const DiagnosticRecordStorage& diag = connection->GetDiagnosticRecords();
-
+ DiagnosticRecordStorage& diag = connection->GetDiagnosticRecords();
if (!diag.IsSuccessful())
return diag.GetReturnCode();