Date: Thursday, March 30, 2006 @ 18:42:58
  Author: marc
    Path: /cvsroot/carob/odbsequoia/src

Modified: env.cpp (1.8 -> 1.9) env.hpp (1.4 -> 1.5)

(incomplete, but working) fix for ODBSEQ-20. Extracted set_env_attr() method 
from SQLSetEnvAttr() 


---------+
 env.cpp |   71 +++++++++++++++++++++++++++++++++++++++++++++++++++-----------
 env.hpp |    6 ++++-
 2 files changed, 64 insertions(+), 13 deletions(-)


Index: odbsequoia/src/env.cpp
diff -u odbsequoia/src/env.cpp:1.8 odbsequoia/src/env.cpp:1.9
--- odbsequoia/src/env.cpp:1.8  Thu Mar 23 00:10:59 2006
+++ odbsequoia/src/env.cpp      Thu Mar 30 18:42:58 2006
@@ -22,39 +22,86 @@
 #include "env.hpp"
 
 #include "connect.hpp"
+#include "odbc_exception.hpp"
+
+#include "Common.hpp" // for the logger
 
 #include <sql.h>
 #include <sqlucode.h>
 
+#include <string>
+
 
 using namespace ODBSeqNS;
-using namespace CarobNS;
 
+namespace {
+    const std::wstring SETENVATTR_FUNC = L"env.cpp:SQLSetEnvAttr";
+}
 
 /* Is there a SQLGetEnvAttrW()? Does not look like. */
 SQLRETURN
 SQLSetEnvAttr(SQLHENV env_handle, SQLINTEGER attribute, SQLPOINTER value,
               SQLINTEGER str_len)
 {
-        static_cast<ODBCEnv *>(env_handle)->clear_diags();
+    ODBCEnv * self_p = static_cast<ODBCEnv *>(env_handle);
+    self_p->clear_diags();
 
-       SQLRETURN       ret = SQL_ERROR;
+    _PROTECT_SQLRETURN(self_p, set_env_attr(attribute, value, str_len));
+}
+
+SQLRETURN
+ODBCEnv::set_env_attr(SQLINTEGER attribute, SQLPOINTER value, SQLINTEGER 
str_len)
+{
 
-        switch (attribute)
-        {
-        case SQL_ATTR_ODBC_VERSION:
-            if (SQL_OV_ODBC2 == (int) value)
-                exit(200); // we have to be so violent else unixODBC DM will
-                           // happily go on if we just return an error
-            if (SQL_OV_ODBC3 == (int) value)
-                ret = SQL_SUCCESS;
+    SQLRETURN ret = SQL_SUCCESS; // else throw
+
+    switch (attribute)
+    {
+        // Warning: the logic of the unixODBC v2.2 code calling us
+        // here (in SQLConnect.c:__connect_part_one() is not
+        // understandable. It's something like: "do whatever but
+        // fail"...
+
+    case SQL_ATTR_ODBC_VERSION:
+
+        // version 2 asked
+        if (SQL_OV_ODBC2 == (int) value) {
+
+            std::wstring func_witharg(SETENVATTR_FUNC + L"(ODBC_VERSION, 2, 
)");
+            
+            // TODO: move this constant to odbc.ini
+            bool fake_version2 = true;
+
+            if (!fake_version2) {
+                std::wstring msg(L"faking ODBC version 2 is disabled");
+                CarobNS::logFatal(func_witharg, msg);
+                // this failure will be ignored by unixODBC 2.2
+                throw ODBSeqException(L"01S02", func_witharg + msg);
+            }
+
+            ret = SQL_SUCCESS_WITH_INFO;
+            std::wstring msg(L"now faking ODBC version 2");
+            CarobNS::logWarn(func_witharg, msg);
+            push_diag_chain(ODBSeqException(L"HYC00", func_witharg + msg));
             break;
         }
 
-       return ret;
+        // version 3 asked
+        if (SQL_OV_ODBC3 == (int) value)
+        break;
+
+    default:
+        throw ODBSeqException(L"HYC00",
+                              SETENVATTR_FUNC + L", unsupported attribute");
+
+    }
+
+    return ret;
 }
 
 
+
+
 SQLRETURN
 ODBCEnv::AllocConnect(SQLHANDLE * OutputHandle)
 {
Index: odbsequoia/src/env.hpp
diff -u odbsequoia/src/env.hpp:1.4 odbsequoia/src/env.hpp:1.5
--- odbsequoia/src/env.hpp:1.4  Wed Jan 11 17:13:00 2006
+++ odbsequoia/src/env.hpp      Thu Mar 30 18:42:58 2006
@@ -36,7 +36,11 @@
 {
 public:
     ODBCEnv() : ODBCItem(*this) { }; // I have no father
-    SQLRETURN ODBCEnv::AllocConnect(SQLHANDLE * OutputHandle);
+    SQLRETURN
+    ODBCEnv::AllocConnect(SQLHANDLE * OutputHandle);
+
+    SQLRETURN
+    ODBCEnv::set_env_attr(SQLINTEGER attribute, SQLPOINTER value, SQLINTEGER 
str_len);
 };
 
 }

_______________________________________________
Carob-commits mailing list
[email protected]
https://forge.continuent.org/mailman/listinfo/carob-commits

Reply via email to