aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2014-11-19 13:54:38 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2014-11-19 13:54:38 +0200
commitb10fcbcb273704026641a07e3d09643798a431dd (patch)
tree986c6be1c79f489ae14b113999616d61430cf97d
parent3b3c82b31116cc55f0e752fe69b15861e8f13d97 (diff)
Allow empty runtime and execute views
Use them to handle INSERT/UPDATE SQL Server stored procedures.
-rw-r--r--odb/mssql/statement.cxx38
-rw-r--r--odb/mssql/statement.hxx1
-rw-r--r--odb/mssql/view-statements.hxx4
3 files changed, 28 insertions, 15 deletions
diff --git a/odb/mssql/statement.cxx b/odb/mssql/statement.cxx
index 00180ee..e87374b 100644
--- a/odb/mssql/statement.cxx
+++ b/odb/mssql/statement.cxx
@@ -862,16 +862,19 @@ namespace odb
// Skip result sets that have no columns. These seem to be added
// by DML statements that don't produce any result (e.g., EXEC).
//
- SQLSMALLINT cols (0);
-
- while (cols == 0)
+ for (columns_ = 0; columns_ == 0;)
{
- r = SQLNumResultCols (stmt_, &cols);
+ {
+ SQLSMALLINT c;
+ r = SQLNumResultCols (stmt_, &c);
- if (!SQL_SUCCEEDED (r))
- translate_error (r, conn_, stmt_);
+ if (!SQL_SUCCEEDED (r))
+ translate_error (r, conn_, stmt_);
+
+ columns_ = static_cast<SQLUSMALLINT> (c);
+ }
- if (cols == 0)
+ if (columns_ == 0)
{
r = SQLMoreResults (stmt_);
@@ -887,7 +890,7 @@ namespace odb
// of this assertion is a native view with a number of data members
// not matching the number of columns in the SELECT-list.
//
- assert (static_cast<SQLUSMALLINT> (cols) == result_count_ + long_count_);
+ assert (columns_ == result_count_ + long_count_);
}
select_statement::result select_statement::
@@ -898,15 +901,22 @@ namespace odb
if (cc != 0 && cc->callback != 0)
(cc->callback) (cc->context);
- SQLRETURN r (SQLFetch (stmt_));
-
- if (r == SQL_NO_DATA)
+ // Don't bother calling SQLFetch() if there are no columns.
+ //
+ if (columns_ == 0)
return no_data;
+ else
+ {
+ SQLRETURN r (SQLFetch (stmt_));
- if (!SQL_SUCCEEDED (r))
- translate_error (r, conn_, stmt_);
+ if (r == SQL_NO_DATA)
+ return no_data;
- return success;
+ if (!SQL_SUCCEEDED (r))
+ translate_error (r, conn_, stmt_);
+
+ return success;
+ }
}
void select_statement::
diff --git a/odb/mssql/statement.hxx b/odb/mssql/statement.hxx
index 1c012ce..36c87f1 100644
--- a/odb/mssql/statement.hxx
+++ b/odb/mssql/statement.hxx
@@ -201,6 +201,7 @@ namespace odb
binding& result_;
SQLUSMALLINT result_count_; // Actual number of columns bound.
SQLUSMALLINT long_count_; // Number of long data columns.
+ SQLUSMALLINT columns_; // Number of columns in result set.
};
struct LIBODB_MSSQL_EXPORT auto_result
diff --git a/odb/mssql/view-statements.hxx b/odb/mssql/view-statements.hxx
index beb8d62..7a315a9 100644
--- a/odb/mssql/view-statements.hxx
+++ b/odb/mssql/view-statements.hxx
@@ -70,7 +70,9 @@ namespace odb
image_type image_;
std::size_t image_version_;
binding image_binding_;
- bind image_bind_[view_traits::column_count];
+ bind image_bind_[view_traits::column_count != 0
+ ? view_traits::column_count
+ : 1];
};
}
}