aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2011-11-17 13:48:46 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2011-11-17 13:48:46 +0200
commitbcbbad2716b09c0c70366825f5bdf2055c8d21b8 (patch)
treefbf1b4150ddb926d95bee341a268608719a46c28
parentc8eda24a4ce5192ea502194387e5053098616561 (diff)
Detect and mark lost connections
-rw-r--r--odb/mssql/error.cxx47
1 files changed, 31 insertions, 16 deletions
diff --git a/odb/mssql/error.cxx b/odb/mssql/error.cxx
index dd94156..4e79a4d 100644
--- a/odb/mssql/error.cxx
+++ b/odb/mssql/error.cxx
@@ -15,8 +15,10 @@ namespace odb
namespace mssql
{
static void
- translate_error (SQLHANDLE h, SQLSMALLINT htype, connection* /*conn*/)
+ translate_error (SQLHANDLE h, SQLSMALLINT htype, connection* conn)
{
+ SQLRETURN r;
+
char sqlstate[SQL_SQLSTATE_SIZE + 1];
SQLINTEGER native_code; // Will be 0 if no natve code.
char msg[512]; // Will be truncated if doesn't fit.
@@ -26,21 +28,20 @@ namespace odb
for (SQLSMALLINT i (1);; ++i)
{
- SQLRETURN r (SQLGetDiagRec (htype,
- h,
- i,
- (SQLCHAR*) sqlstate,
- &native_code,
- (SQLCHAR*) msg,
- sizeof (msg),
- &msg_size));
+ r = SQLGetDiagRec (htype,
+ h,
+ i,
+ (SQLCHAR*) sqlstate,
+ &native_code,
+ (SQLCHAR*) msg,
+ sizeof (msg),
+ &msg_size);
if (r == SQL_NO_DATA)
break;
- else if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO)
+ else if (SQL_SUCCEEDED (r))
{
- //@@ TODO: translate timeout, connection_lost exceptions
- //@@ TODO: if conn != 0, mark it as failed for certain errors
+ //@@ TODO: translate deadlock, timeout, connection_lost exceptions
e.append (native_code, sqlstate, msg);
}
@@ -52,17 +53,31 @@ namespace odb
if (e.size () == 0)
e.append (0, "?????", "no diagnostic record (using wrong handle?)");
+ // Check if the connection has gone bad and mark it as failed if so.
+ //
+ if (conn != 0)
+ {
+ SQLUINTEGER dead (0);
+ r = SQLGetConnectAttr (conn->handle (),
+ SQL_ATTR_CONNECTION_DEAD,
+ (SQLPOINTER) &dead,
+ SQL_IS_UINTEGER,
+ 0);
+
+ if (!SQL_SUCCEEDED (r) || dead == SQL_CD_TRUE)
+ conn->mark_failed ();
+ }
+
throw e;
}
void
- translate_error (connection& /*c*/)
+ translate_error (connection& c)
{
- //@@ TODO enable (also header inclusion)
- // translate_error (c.handle (), SQL_HANDLE_DBC, &c);
+ translate_error (c.handle (), SQL_HANDLE_DBC, &c);
}
- LIBODB_MSSQL_EXPORT void
+ void
translate_error (SQLHANDLE h, SQLSMALLINT htype)
{
translate_error (h, htype, 0);