Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 

93 rader
2.4 KiB

  1. #pragma once
  2. #include <cppcore/conversion/enum.h>
  3. #include <cppcore/conversion/string.h>
  4. #include "statement.h"
  5. namespace cppmariadb
  6. {
  7. /* statement *********************************************************************************/
  8. statement::statement()
  9. : _changed (true)
  10. , _connection (nullptr)
  11. { }
  12. statement::statement(const std::string& query)
  13. : _changed (true)
  14. , _connection (nullptr)
  15. { parse(query); }
  16. void statement::assign(const std::string& query)
  17. {
  18. _changed = true;
  19. parse(query);
  20. }
  21. const std::string& statement::query(const connection& con) const
  22. {
  23. if (_changed || &con != _connection)
  24. build(con);
  25. return _query;
  26. }
  27. size_t statement::find(const std::string& param)
  28. {
  29. for (size_t i = 0; i < _parameters.size(); ++i)
  30. {
  31. if (_parameters.at(i).first == param)
  32. return i;
  33. }
  34. return npos;
  35. }
  36. void statement::set_null(const std::string& param)
  37. {
  38. auto i = find(param);
  39. if (i == npos)
  40. throw exception(std::string("unknown parameter name in statement: ") + param, error_code::Unknown);
  41. set_null(i);
  42. }
  43. void statement::set_null(size_t index)
  44. {
  45. if (index >= _parameters.size())
  46. throw exception(std::string("unknown parameter index in statement: ") + std::to_string(index), error_code::Unknown);
  47. auto& param = _parameters.at(index).second;
  48. param.has_value = false;
  49. _changed = true;
  50. }
  51. bool statement::empty() const
  52. { return _code.empty(); }
  53. void statement::clear()
  54. {
  55. for (auto& param : _parameters)
  56. param.second.has_value = false;
  57. }
  58. template<class T>
  59. void statement::set(const std::string& param, const T& value)
  60. {
  61. auto i = find(param);
  62. if (i == npos)
  63. throw exception(std::string("unknown parameter name in query: ") + param, error_code::Unknown);
  64. set<T>(i, value);
  65. }
  66. template<class T>
  67. void statement::set(size_t index, const T& value)
  68. {
  69. if (index >= _parameters.size())
  70. throw exception(std::string("unknown parameter index in query: ") + std::to_string(index), error_code::Unknown);
  71. auto& param = _parameters.at(index).second;
  72. param.has_value = true;
  73. param.value = cppcore::to_string(value);
  74. _changed = true;
  75. }
  76. }