25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

66 lines
1.9 KiB

  1. #pragma once
  2. beg_namespace_cpphibernate_driver_mariadb
  3. {
  4. /* limit_builder */
  5. template<typename T_modifiers>
  6. struct limit_builder
  7. {
  8. ::cppmariadb::statement statement;
  9. limit_builder(const T_modifiers& p_modifier)
  10. {
  11. ssize_t limit = -1;
  12. ssize_t offset = -1;
  13. hana::for_each(p_modifier, [&limit, &offset](auto& x_modifier){
  14. using modifier_type = mp::decay_t<decltype(x_modifier)>;
  15. using is_limit_type = modifier::is_limit_modifier<modifier_type>;
  16. using is_offset_type = modifier::is_offset<modifier_type>;
  17. hana::eval_if(
  18. is_limit_type { },
  19. [&limit, &x_modifier](auto _){
  20. limit = static_cast<ssize_t>(hana::value(_(x_modifier).value));
  21. },
  22. [&offset, &x_modifier](){
  23. hana::eval_if(
  24. is_offset_type { },
  25. [&offset, &x_modifier](auto _){
  26. offset = static_cast<ssize_t>(hana::value(_(x_modifier).value));
  27. },
  28. []{
  29. /* no-op */
  30. });
  31. });
  32. });
  33. if (offset >= 0 && limit < 0)
  34. limit = 1000000;
  35. if (limit >= 0)
  36. {
  37. std::ostringstream ss;
  38. ss << "LIMIT " << limit;
  39. if (offset >= 0)
  40. ss << " OFFSET " << offset;
  41. statement.assign(ss.str());
  42. }
  43. }
  44. };
  45. template<typename T_modifiers>
  46. inline ::cppmariadb::statement& build_limit(const T_modifiers& modifiers)
  47. {
  48. static limit_builder<T_modifiers> builder(modifiers);
  49. return builder.statement;
  50. }
  51. }
  52. end_namespace_cpphibernate_driver_mariadb