mirror of
https://github.com/rbock/sqlpp11.git
synced 2024-11-15 20:31:16 +08:00
Changed NULL handling in results.
If the column or the connector indicates that NULL corresponds to a trivial value, then the trivial value is returned. Otherwise, an assert fails or an exception is thrown, depending on the preferences of the connector.
This commit is contained in:
parent
78d2d9e67a
commit
1824f9cde0
@ -28,6 +28,7 @@
|
|||||||
#define SQLPP_BOOLEAN_H
|
#define SQLPP_BOOLEAN_H
|
||||||
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <cassert>
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
#include <sqlpp11/basic_operators.h>
|
#include <sqlpp11/basic_operators.h>
|
||||||
#include <sqlpp11/type_traits.h>
|
#include <sqlpp11/type_traits.h>
|
||||||
@ -98,7 +99,7 @@ namespace sqlpp
|
|||||||
bool _is_null;
|
bool _is_null;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Db, bool TrivialIsNull = false>
|
template<typename Db, bool NullIsTrivial = false>
|
||||||
struct _result_entry_t
|
struct _result_entry_t
|
||||||
{
|
{
|
||||||
_result_entry_t():
|
_result_entry_t():
|
||||||
@ -134,15 +135,28 @@ namespace sqlpp
|
|||||||
|
|
||||||
bool is_null() const
|
bool is_null() const
|
||||||
{
|
{
|
||||||
if (not _is_valid)
|
if (connector_assert_result_validity_t<Db>::value)
|
||||||
|
assert(_is_valid);
|
||||||
|
else if (not _is_valid)
|
||||||
throw exception("accessing is_null in non-existing row");
|
throw exception("accessing is_null in non-existing row");
|
||||||
return _is_null;
|
return _is_null;
|
||||||
}
|
}
|
||||||
|
|
||||||
_cpp_value_type value() const
|
_cpp_value_type value() const
|
||||||
{
|
{
|
||||||
if (not _is_valid)
|
const bool null_value = _is_null and not NullIsTrivial and not connector_null_result_is_trivial_value_t<Db>::value;
|
||||||
throw exception("accessing value in non-existing row");
|
if (connector_assert_result_validity_t<Db>::value)
|
||||||
|
{
|
||||||
|
assert(_is_valid);
|
||||||
|
assert(not null_value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (not _is_valid)
|
||||||
|
throw exception("accessing value in non-existing row");
|
||||||
|
if (null_value)
|
||||||
|
throw exception("accessing value of NULL field");
|
||||||
|
}
|
||||||
return _value;
|
return _value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#define SQLPP_FLOATING_POINT_H
|
#define SQLPP_FLOATING_POINT_H
|
||||||
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <cassert>
|
||||||
#include <sqlpp11/basic_operators.h>
|
#include <sqlpp11/basic_operators.h>
|
||||||
#include <sqlpp11/type_traits.h>
|
#include <sqlpp11/type_traits.h>
|
||||||
#include <sqlpp11/exception.h>
|
#include <sqlpp11/exception.h>
|
||||||
@ -98,7 +99,7 @@ namespace sqlpp
|
|||||||
bool _is_null;
|
bool _is_null;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Db, bool TrivialIsNull = false>
|
template<typename Db, bool NullIsTrivial = false>
|
||||||
struct _result_entry_t
|
struct _result_entry_t
|
||||||
{
|
{
|
||||||
using _value_type = integral;
|
using _value_type = integral;
|
||||||
@ -136,15 +137,28 @@ namespace sqlpp
|
|||||||
|
|
||||||
bool is_null() const
|
bool is_null() const
|
||||||
{
|
{
|
||||||
if (not _is_valid)
|
if (connector_assert_result_validity_t<Db>::value)
|
||||||
|
assert(_is_valid);
|
||||||
|
else if (not _is_valid)
|
||||||
throw exception("accessing is_null in non-existing row");
|
throw exception("accessing is_null in non-existing row");
|
||||||
return _is_null;
|
return _is_null;
|
||||||
}
|
}
|
||||||
|
|
||||||
_cpp_value_type value() const
|
_cpp_value_type value() const
|
||||||
{
|
{
|
||||||
if (not _is_valid)
|
const bool null_value = _is_null and not NullIsTrivial and not connector_null_result_is_trivial_value_t<Db>::value;
|
||||||
throw exception("accessing value in non-existing row");
|
if (connector_assert_result_validity_t<Db>::value)
|
||||||
|
{
|
||||||
|
assert(_is_valid);
|
||||||
|
assert(not null_value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (not _is_valid)
|
||||||
|
throw exception("accessing value in non-existing row");
|
||||||
|
if (null_value)
|
||||||
|
throw exception("accessing value of NULL field");
|
||||||
|
}
|
||||||
return _value;
|
return _value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#define SQLPP_INTEGRAL_H
|
#define SQLPP_INTEGRAL_H
|
||||||
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <cassert>
|
||||||
#include <sqlpp11/basic_operators.h>
|
#include <sqlpp11/basic_operators.h>
|
||||||
#include <sqlpp11/type_traits.h>
|
#include <sqlpp11/type_traits.h>
|
||||||
#include <sqlpp11/exception.h>
|
#include <sqlpp11/exception.h>
|
||||||
@ -136,15 +137,28 @@ namespace sqlpp
|
|||||||
|
|
||||||
bool is_null() const
|
bool is_null() const
|
||||||
{
|
{
|
||||||
if (not _is_valid)
|
if (connector_assert_result_validity_t<Db>::value)
|
||||||
|
assert(_is_valid);
|
||||||
|
else if (not _is_valid)
|
||||||
throw exception("accessing is_null in non-existing row");
|
throw exception("accessing is_null in non-existing row");
|
||||||
return _is_null;
|
return _is_null;
|
||||||
}
|
}
|
||||||
|
|
||||||
_cpp_value_type value() const
|
_cpp_value_type value() const
|
||||||
{
|
{
|
||||||
if (not _is_valid)
|
const bool null_value = _is_null and not NullIsTrivial and not connector_null_result_is_trivial_value_t<Db>::value;
|
||||||
throw exception("accessing value in non-existing row");
|
if (connector_assert_result_validity_t<Db>::value)
|
||||||
|
{
|
||||||
|
assert(_is_valid);
|
||||||
|
assert(not null_value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (not _is_valid)
|
||||||
|
throw exception("accessing value in non-existing row");
|
||||||
|
if (null_value)
|
||||||
|
throw exception("accessing value of NULL field");
|
||||||
|
}
|
||||||
return _value;
|
return _value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#ifndef SQLPP_TEXT_H
|
#ifndef SQLPP_TEXT_H
|
||||||
#define SQLPP_TEXT_H
|
#define SQLPP_TEXT_H
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
#include <sqlpp11/basic_operators.h>
|
#include <sqlpp11/basic_operators.h>
|
||||||
#include <sqlpp11/type_traits.h>
|
#include <sqlpp11/type_traits.h>
|
||||||
#include <sqlpp11/exception.h>
|
#include <sqlpp11/exception.h>
|
||||||
@ -97,7 +98,7 @@ namespace sqlpp
|
|||||||
bool _is_null;
|
bool _is_null;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Db, bool TrivialIsNull = false>
|
template<typename Db, bool NullIsTrivial = false>
|
||||||
struct _result_entry_t
|
struct _result_entry_t
|
||||||
{
|
{
|
||||||
_result_entry_t():
|
_result_entry_t():
|
||||||
@ -136,16 +137,29 @@ namespace sqlpp
|
|||||||
|
|
||||||
bool is_null() const
|
bool is_null() const
|
||||||
{
|
{
|
||||||
if (not _is_valid)
|
if (connector_assert_result_validity_t<Db>::value)
|
||||||
|
assert(_is_valid);
|
||||||
|
else if (not _is_valid)
|
||||||
throw exception("accessing is_null in non-existing row");
|
throw exception("accessing is_null in non-existing row");
|
||||||
return _value_ptr == nullptr;
|
return _value_ptr == nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
_cpp_value_type value() const
|
_cpp_value_type value() const
|
||||||
{
|
{
|
||||||
if (not _is_valid)
|
const bool null_value = _value_ptr == nullptr and not NullIsTrivial and not connector_null_result_is_trivial_value_t<Db>::value;
|
||||||
throw exception("accessing value in non-existing row");
|
if (connector_assert_result_validity_t<Db>::value)
|
||||||
if (_value_ptr)
|
{
|
||||||
|
assert(_is_valid);
|
||||||
|
assert(not null_value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (not _is_valid)
|
||||||
|
throw exception("accessing value in non-existing row");
|
||||||
|
if (null_value)
|
||||||
|
throw exception("accessing value of NULL field");
|
||||||
|
}
|
||||||
|
if (_value_ptr)
|
||||||
return std::string(_value_ptr, _value_ptr + _len);
|
return std::string(_value_ptr, _value_ptr + _len);
|
||||||
else
|
else
|
||||||
return "";
|
return "";
|
||||||
|
@ -124,7 +124,8 @@ namespace sqlpp
|
|||||||
SQLPP_TYPE_TRAIT_GENERATOR(requires_braces);
|
SQLPP_TYPE_TRAIT_GENERATOR(requires_braces);
|
||||||
SQLPP_TYPE_TRAIT_GENERATOR(is_parameter);
|
SQLPP_TYPE_TRAIT_GENERATOR(is_parameter);
|
||||||
|
|
||||||
SQLPP_CONNECTOR_TRAIT_GENERATOR(has_empty_list_insert);
|
SQLPP_CONNECTOR_TRAIT_GENERATOR(null_result_is_trivial_value);
|
||||||
|
SQLPP_CONNECTOR_TRAIT_GENERATOR(assert_result_validity);
|
||||||
|
|
||||||
template<typename T, template<typename> class IsTag>
|
template<typename T, template<typename> class IsTag>
|
||||||
using copy_type_trait = typename std::conditional<IsTag<T>::value, std::true_type, std::false_type>::type;
|
using copy_type_trait = typename std::conditional<IsTag<T>::value, std::true_type, std::false_type>::type;
|
||||||
|
Loading…
Reference in New Issue
Block a user