Date: Thursday, March 30, 2006 @ 23:03:19
  Author: marc
    Path: /cvsroot/carob/odbsequoia/src

Modified: env.cpp (1.11 -> 1.12) env.hpp (1.6 -> 1.7) explicit_type.cpp
          (1.8 -> 1.9)

Extracted ODBCEnv::init() from ODBCEnv ctor, so to implement a
skeletal handle and being able to report construction errors to it.


-------------------+
 env.cpp           |   17 +++++++++++++----
 env.hpp           |   12 ++++++++++--
 explicit_type.cpp |   17 ++++++++++-------
 3 files changed, 33 insertions(+), 13 deletions(-)


Index: odbsequoia/src/env.cpp
diff -u odbsequoia/src/env.cpp:1.11 odbsequoia/src/env.cpp:1.12
--- odbsequoia/src/env.cpp:1.11 Thu Mar 30 21:23:52 2006
+++ odbsequoia/src/env.cpp      Thu Mar 30 23:03:19 2006
@@ -35,17 +35,21 @@
 
 using namespace ODBSeqNS;
 
-ODBCEnv::ODBCEnv() : ODBCItem(*this) // I have no father
+SQLRETURN
+ODBCEnv::init()
 {
+    SQLRETURN ret = SQL_SUCCESS;
+
 #define MAX_VALUE_LEN 30
     char temp[MAX_VALUE_LEN];
 
+    // Behaviour of SQLGetPrivateProfileString is complex and weird,
+    // check comments in inst.hpp
+
     /* Fake ODBC version 2 */
     if (0 > SQLGetPrivateProfileString(MYDRIVER_NAME_INST_INI, 
FAKEODBC2_INST_INI, "true",
                                        temp, MAX_VALUE_LEN, ODBCINST_INI))
-        // FIXME: catch above & return diags
-        // Problem: how to return diags without any object?
-        // But how could this fail anyway?
+        // How could this fail anyway?
         throw ODBSeqException(L"TODO",
                               L"Invalid " WIDENMACRO(FAKEODBC2_INST_INI) L" 
value");
 
@@ -53,6 +57,11 @@
         fake_version2 = false;
     else
         fake_version2 = true;
+
+
+    isInitialized = true;
+
+    return ret;
 }
 
 namespace {
Index: odbsequoia/src/env.hpp
diff -u odbsequoia/src/env.hpp:1.6 odbsequoia/src/env.hpp:1.7
--- odbsequoia/src/env.hpp:1.6  Thu Mar 30 21:23:52 2006
+++ odbsequoia/src/env.hpp      Thu Mar 30 23:03:19 2006
@@ -35,14 +35,22 @@
 class ODBCEnv : public ODBCItem
 {
 public:
-    ODBCEnv();
+    ODBCEnv::ODBCEnv()
+        : ODBCItem(*this), // I have no father
+          isInitialized(false)
+    { }
+    // we need a two-phase ctor, so we have an skeletal handle to
+    // report errors to.
+    SQLRETURN
+    init();
+
     SQLRETURN
     ODBCEnv::AllocConnect(SQLHANDLE * OutputHandle);
 
     SQLRETURN
     ODBCEnv::set_env_attr(SQLINTEGER attribute, SQLPOINTER value, SQLINTEGER 
str_len);
     
-    bool fake_version2;
+    bool isInitialized, fake_version2;
 };
 
 }
Index: odbsequoia/src/explicit_type.cpp
diff -u odbsequoia/src/explicit_type.cpp:1.8 
odbsequoia/src/explicit_type.cpp:1.9
--- odbsequoia/src/explicit_type.cpp:1.8        Mon Mar 27 13:06:35 2006
+++ odbsequoia/src/explicit_type.cpp    Thu Mar 30 23:03:19 2006
@@ -63,17 +63,20 @@
 
     switch (HandleType)
     {
-    case SQL_HANDLE_ENV:
-        *OutputHandle = new ODBCEnv;
-        return SQL_SUCCESS;
+    case SQL_HANDLE_ENV: {
+        ODBCEnv & newEnv = * new ODBCEnv;
+        *OutputHandle = & newEnv;
 
+        // TODO: catch & convert exceptions
+        return newEnv.init();
+    }
     case SQL_HANDLE_DBC: {
-        ODBCEnv * env = static_cast<ODBCEnv *>(InputHandle);
-        return env->AllocConnect(OutputHandle);
+        ODBCEnv & env = * static_cast<ODBCEnv *>(InputHandle);
+        return env.AllocConnect(OutputHandle);
     }
     case SQL_HANDLE_STMT: {
-        ODBCConnection * conn = static_cast<ODBCConnection *>(InputHandle);
-        return conn->AllocStmt(OutputHandle);
+        ODBCConnection & conn = * static_cast<ODBCConnection *>(InputHandle);
+        return conn.AllocStmt(OutputHandle);
     }
     case SQL_HANDLE_DESC:
         return SQL_ERROR;

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

Reply via email to