class SqlObj final
{
public:
template
<
typename Fn,
typename... Args,
typename = typename std::enable_if
<
std::is_assignable
<
std::function<typename std::result_of<Fn(Args...)>::type(Args...)>,
typename std::decay<Fn>::type
>::value &&
!std::is_same<typename std::result_of<Fn(Args...)>::type, void>::value
>::type
>
inline auto Transaction(Fn&& func, Args&&... args) -> typename std::result_of<Fn(Args...)>::type
{
Query("begin;");
try
{
auto res = func(std::forward<Args>(args)...);
Query("commit;");
return res;
}
catch (const char*)
{
Query("rollback;");
return NULL;
}
catch (...)
{
Query("rollback;");
return NULL;
}
}
template
<
typename Fn,
typename... Args,
typename = typename std::enable_if
<
std::is_same<typename std::result_of<Fn(Args...)>::type, void>::value
>::type
>
inline void Transaction(Fn&& func, Args&&... args)
{
Query("begin;");
try
{
func(std::forward<Args>(args)...);
Query("commit;");
}
catch (const char*)
{
Query("rollback;");
}
catch (...)
{
Query("rollback;");
}
}
}
调用
template<typename Fn, typename... Args>
inline auto Transaction(Fn&& func, Args&&... args) -> typename std::result_of<Fn(Args...)>::type
{
std::shared_ptr<SqlObj> conn;
return conn->Transaction(std::forward<Fn>(func), std::forward<Args>(args)...);
}