Date: Monday, January 30, 2006 @ 22:46:17
Author: marc
Path: /cvsroot/carob/carob
Modified: include/ParameterStatement.hpp (1.10 -> 1.11)
src/ParameterStatement.cpp (1.17 -> 1.18)
Major change: templatized all setXXX() calls, opening the door for a
new great world of data types conversions made easy.
BREAKAGE WARNING: some setString() calls may not compile anymore;
check doxygen in .hpp for the explanation and the (trivial) fix.
Should be enough to close CAROB-55.
--------------------------------+
include/ParameterStatement.hpp | 97 +++++++++++++++++++++++-----------
src/ParameterStatement.cpp | 111 ++++++++++++++++++++++++++++++---------
2 files changed, 156 insertions(+), 52 deletions(-)
Index: carob/include/ParameterStatement.hpp
diff -u carob/include/ParameterStatement.hpp:1.10
carob/include/ParameterStatement.hpp:1.11
--- carob/include/ParameterStatement.hpp:1.10 Mon Jan 30 15:47:59 2006
+++ carob/include/ParameterStatement.hpp Mon Jan 30 22:46:17 2006
@@ -16,7 +16,7 @@
* limitations under the License.
*
* Initial developer(s): Zsolt Simon
- * Contributor(s): Gilles Rayrat
+ * Contributor(s): Gilles Rayrat, Marc Herbert
*/
#ifndef PARAMETERSTATEMENT_HPP_
#define PARAMETERSTATEMENT_HPP_
@@ -109,84 +109,113 @@
throw (DriverException, UnexpectedException);
/**
- * Sets a parameter to a boolean value. The driver converts this to a SQL
- * BIT value when it sends it to the database.
+ * This JDBC call will be forwarded to the JDBC driver of the
+ * backend(s) of a sequoia controller. Some type conversions of the
+ * value may happen on the way (at different places) when called
+ * with a argument of a type different from the corresponding java
+ * type.
+ *
* @param parameterIndex the first parameter is 1...
* @param x the parameter value
*/
- void setBoolean(const int parameterIndex, const bool x)
+ template <typename CParamType>
+ void setBoolean(int parameterIndex, const CParamType& x)
throw (DriverException, UnexpectedException);
/**
- * Sets a parameter to a Java byte value.
+ * @see #setBoolean()
+ *
* @param parameterIndex the first parameter is 1...
* @param x the parameter value
*/
- void setByte(const int parameterIndex, const java_byte x)
+ template <typename CParamType>
+ void setByte(int parameterIndex, const CParamType& x)
throw (DriverException, UnexpectedException);
/**
- * Sets a parameter to a short value. The driver converts this to a SQL
- * SMALLINT value when it sends it to the database.
+ * @see #setBoolean()
+ *
* @param parameterIndex the first parameter is 1...
* @param x the parameter value
*/
- void setShort(const int parameterIndex, const short x)
+ template <typename CParamType>
+ void setShort(int parameterIndex, const CParamType& x)
throw (DriverException, UnexpectedException);
/**
- * Sets a parameter to an int value. The driver converts this to a SQL
- * INTEGER value when it sends it to the database.
+ * @see #setBoolean()
+ *
* @param parameterIndex the first parameter is 1...
* @param x the parameter value
*/
- void setInt(const int parameterIndex, const int x)
+ template <typename CParamType>
+ void setInt(int parameterIndex, const CParamType& x)
throw (DriverException, UnexpectedException);
/**
- * Sets a parameter to a long value. The driver converts this to a SQL
- * BIGINT value when it sends it to the database.
+ * @see #setBoolean()
+ *
* @param parameterIndex the first parameter is 1...
* @param x the parameter value
*/
- void setLong(const int parameterIndex, const long long x)
+ template <typename CParamType>
+ void setLong(int parameterIndex, const CParamType& x)
throw (DriverException, UnexpectedException);
/**
- * Sets a parameter to a float value. The driver converts this to a SQL
- * FLOAT value when it sends it to the database.
+ * @see #setBoolean()
+ *
* @param parameterIndex the first parameter is 1...
* @param x the parameter value
*/
- void setFloat(const int parameterIndex, const float x)
+ template <typename CParamType>
+ void setFloat(int parameterIndex, const CParamType& x)
throw (DriverException, UnexpectedException);
/**
- * Sets a parameter to a double value. The driver converts this to a SQL
- * DOUBLE value when it sends it to the database.
+ * @see #setBoolean()
+ *
* @param parameterIndex the first parameter is 1...
* @param x the parameter value
*/
- void setDouble(const int parameterIndex, const double x)
+ template <typename CParamType>
+ void setDouble(int parameterIndex, const CParamType& x)
throw (DriverException, UnexpectedException);
/**
- * Sets a parameter to a BigDecimal value. The driver converts this
- * to a SQL NUMERIC value when it sends it to the database.
+ * @see #setBoolean()
+ *
* @param parameterIndex the first parameter is 1...
* @param x the parameter value
*/
- void setBigDecimal(const int parameterIndex, const
BigDecimal &x)
+ template <typename CParamType>
+ void setBigDecimal(int parameterIndex, const CParamType
&x)
throw (DriverException, UnexpectedException);
/**
- * Sets a parameter to string value. The driver converts this to a SQL
- * VARCHAR or LONGVARCHAR value (depending on the arguments size relative to
- * the driver's limits on VARCHARs) when it sends it to the database.
+ *
+ * Warning:
+ * setString (i, L"foo");
+ *
+ * does not compile with gcc 4.0.2 because it searches the following
instantiation:
+ * setString < wchar_t *> (int parameterIndex, const wchar_t *
const& x);
+ *
+ * which cannot exist. So you have to invoke the pointed-to-const instance:
+ * setString <const wchar_t *> (int parameterIndex, const wchar_t *
const& x);
+ *
+ * using a explicit instantiation like this:
+ * setString <const wchar_t *> (i, L"foo");
+ *
+ * Or you can use this std::wstring alternative:
+ * setString (i, std::wstring(L"foo");
+ *
+ * @see #setBoolean()
+ *
* @param parameterIndex the first parameter is 1...
* @param x the parameter value
*/
- void setString(const int parameterIndex, const
std::wstring &x)
+ template <typename CParamType>
+ void setString(int parameterIndex, const CParamType &x)
throw (DriverException, UnexpectedException);
/**
@@ -230,7 +259,8 @@
* Actually stores the IN parameter into parameters String array. Called by
* most setXXX() methods.
* @param paramIndex the index into the inString
- * @param typeTag type of the parameter
+ * @param typeTag the JDBC call that will be used by the controller
+ * @param value the parameter
* @exception DriverException if something goes wrong
*/
template <class T> void set(const int paramIndex, const std::wstring
&typeTag,
@@ -260,3 +290,12 @@
} //namespace CarobNS
#endif /*PARAMETERSTATEMENT_HPP_*/
+
+
+/*
+ * Local Variables:
+ * c-file-style: "bsd"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * End:
+ */
Index: carob/src/ParameterStatement.cpp
diff -u carob/src/ParameterStatement.cpp:1.17
carob/src/ParameterStatement.cpp:1.18
--- carob/src/ParameterStatement.cpp:1.17 Mon Jan 30 12:06:27 2006
+++ carob/src/ParameterStatement.cpp Mon Jan 30 22:46:17 2006
@@ -375,68 +375,133 @@
}
-// Don't add any code in here, use template specializations
-// above. CAROB-55: We may deprecate these methods in the future in
-// profit of the underlying templates
-
-void ParameterStatement::setBoolean(const int parameterIndex, const bool x)
+template<typename CParamType> void
+ParameterStatement::setBoolean(int parameterIndex, const CParamType& x)
throw (DriverException, UnexpectedException)
{
- set<bool>(parameterIndex, BOOLEAN_TAG, x);
+ set<CParamType>(parameterIndex, BOOLEAN_TAG, x);
}
-void ParameterStatement::setByte(const int parameterIndex, const java_byte x)
+template<typename CParamType> void
+ParameterStatement::setByte(int parameterIndex, const CParamType& x)
throw (DriverException, UnexpectedException)
{
- set<java_byte>(parameterIndex, BYTE_TAG, x);
+ set<CParamType>(parameterIndex, BYTE_TAG, x);
}
-void ParameterStatement::setShort(const int parameterIndex, const short x)
+template<typename CParamType> void
+ParameterStatement::setShort(int parameterIndex, const CParamType& x)
throw (DriverException, UnexpectedException)
{
- set<short>(parameterIndex, SHORT_TAG, x);
+ set<CParamType>(parameterIndex, SHORT_TAG, x);
}
-void ParameterStatement::setInt(const int parameterIndex, const int x)
+template<typename CParamType> void
+ParameterStatement::setInt(int parameterIndex, const CParamType& x)
throw (DriverException, UnexpectedException)
{
- set<int>(parameterIndex, INTEGER_TAG, x);
+ set<CParamType>(parameterIndex, INTEGER_TAG, x);
}
-void ParameterStatement::setLong(const int parameterIndex, const long long x)
+template<typename CParamType> void
+ParameterStatement::setLong(int parameterIndex, const CParamType& x)
throw (DriverException, UnexpectedException)
{
- set<long long>(parameterIndex, LONG_TAG, x);
+ set<CParamType>(parameterIndex, LONG_TAG, x);
}
-void ParameterStatement::setFloat(const int parameterIndex, const float x)
+template<typename CParamType> void
+ParameterStatement::setFloat(int parameterIndex, const CParamType& x)
throw (DriverException, UnexpectedException)
{
- set<float>(parameterIndex, FLOAT_TAG, x);
+ set<CParamType>(parameterIndex, FLOAT_TAG, x);
}
-void ParameterStatement::setDouble(const int parameterIndex, const double x)
+template<typename CParamType> void
+ParameterStatement::setDouble(int parameterIndex, const CParamType& x)
throw (DriverException, UnexpectedException)
{
- set<double>(parameterIndex, DOUBLE_TAG, x);
+ set<CParamType>(parameterIndex, DOUBLE_TAG, x);
}
-void ParameterStatement::setBigDecimal(const int parameterIndex, const
BigDecimal &x)
+template<typename CParamType> void
+ParameterStatement::setBigDecimal(int parameterIndex, const CParamType& x)
throw (DriverException, UnexpectedException)
{
- set<wstring>(parameterIndex, BIG_DECIMAL_TAG, x); // FIXME: should be
set<BigDecimal>, else explain
+ set<CParamType>(parameterIndex, BIG_DECIMAL_TAG, x);
}
-void ParameterStatement::setString(const int parameterIndex, const
std::wstring &x)
+template<typename CParamType> void
+ParameterStatement::setString(int parameterIndex, const CParamType& x)
throw (DriverException, UnexpectedException)
{
- set<wstring>(parameterIndex, STRING_TAG, x);
+ set<CParamType>(parameterIndex, STRING_TAG, x);
}
+
+/*
+ * Explicit instantiation of supported/approved setters
+ */
+
+/*
+ * 1. First the zero-converting setters. The C-types instantiated here
+ * are bit-compatible with the corresponding java type that will be
+ * deserialized by the controller.
+ *
+ */
+
+template void
+ParameterStatement::setBoolean<bool>(int parameterIndex, const bool& x);
+template void
+ParameterStatement::setByte<int8_t>(int parameterIndex, const int8_t& x);
+template void
+ParameterStatement::setShort<int16_t>(int parameterIndex, const int16_t& x);
+template void
+ParameterStatement::setInt<int32_t>(int parameterIndex, const int32_t& x);
+template void
+ParameterStatement::setLong<int64_t>(int parameterIndex, const int64_t& x);
+template void
+ParameterStatement::setFloat<float>(int parameterIndex, const float& x);
+template void
+ParameterStatement::setDouble<double>(int parameterIndex, const double& x);
+// template void // TODO
+// ParameterStatement::setBigDecimal<BigDecimal>(int parameterIndex, const
BigDecimal& x);
+template void
+ParameterStatement::setString<std::wstring>(int parameterIndex, const
std::wstring& x);
+template void // for convenience. See limitation in .hpp doxygen
+ParameterStatement::setString<const wchar_t *>(int parameterIndex, const
wchar_t * const& x);
+
+
+/*
+ * 2. Then the "sstream-converting" setters. Add new lines here only
+ * if you really understand what you are doing. -- MH.
+ *
+ * Related:
+ * - "ODBC Programmer's Reference: Converting Data from C to SQL Data Types"
+ *
<http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcconverting_data_from_c_to_sql_data_types.asp>
+ * - Sun's "Getting Started" JDBC online guide, chapter "Mapping SQL and Java
Types"
+ * <http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/getstart/mapping.html>
+ */
+
+/*
+ * Unfortunately we currently lose the original type, and the controller
+ * cannot/does not make the difference between:
+ * "setFloat<float>(f1)" vs "setFloat<otherType>(convertedf2)"
+ * Ideally we would be much more transparent than that, performing NO
+ * type conversion at all and letting the backend driver doing it
+ * alone by himself.
+ */
+
+// Current semantic: "true".equalsIgnoreCase("xxxx")
+// See: java.lang.Boolean#toBoolean()
+template void
+ParameterStatement::setBoolean<std::wstring>(int parameterIndex, const
std::wstring& x);
+
+
/*
* Local Variables:
* c-file-style: "bsd"
- * c-basic-offset: 2
+ * c-basic-offset: 4
* indent-tabs-mode: nil
* End:
*/
_______________________________________________
Carob-commits mailing list
[email protected]
https://forge.continuent.org/mailman/listinfo/carob-commits