|
@@ -22,1822 +22,1824 @@
|
|
|
#include "orm.hpp"
|
|
|
#include "logger.hpp"
|
|
|
|
|
|
-namespace robotics::v3 {
|
|
|
- /**
|
|
|
- * @brief 执行类型
|
|
|
- */
|
|
|
- enum sql_event_type {
|
|
|
+namespace robotics {
|
|
|
+ namespace v3 {
|
|
|
/**
|
|
|
- * @brief 添加
|
|
|
+ * @brief 执行类型
|
|
|
*/
|
|
|
- Insert = 0,
|
|
|
- /**
|
|
|
- * @brief 删除
|
|
|
- */
|
|
|
- Delete,
|
|
|
- /**
|
|
|
- * @brief 更新
|
|
|
- */
|
|
|
- Update,
|
|
|
- /**
|
|
|
- * @brief 查询
|
|
|
- */
|
|
|
- Select,
|
|
|
- /**
|
|
|
- * @brief 查询数量
|
|
|
- */
|
|
|
- Count,
|
|
|
- /**
|
|
|
- * @brief 错误
|
|
|
- */
|
|
|
- Error
|
|
|
- };
|
|
|
- /**
|
|
|
- * @brief 排序
|
|
|
- */
|
|
|
- enum sql_order_by_type {
|
|
|
- /**
|
|
|
- * @brief 升序
|
|
|
- */
|
|
|
- Asc,
|
|
|
- /**
|
|
|
- * @brief 降序
|
|
|
- */
|
|
|
- Desc
|
|
|
- };
|
|
|
- /**
|
|
|
- * @brief 表达式
|
|
|
- */
|
|
|
- struct sql_expression {
|
|
|
- /**
|
|
|
- * @brief 表达式类型
|
|
|
- */
|
|
|
- enum symbol_type {
|
|
|
+ enum sql_event_type {
|
|
|
/**
|
|
|
- * @brief 无效表达式
|
|
|
+ * @brief 添加
|
|
|
*/
|
|
|
- Invalid = 0,
|
|
|
+ Insert = 0,
|
|
|
/**
|
|
|
- * @brief =
|
|
|
+ * @brief 删除
|
|
|
*/
|
|
|
- Equal,
|
|
|
+ Delete,
|
|
|
/**
|
|
|
- * @brief ==
|
|
|
+ * @brief 更新
|
|
|
*/
|
|
|
- EqualEqual,
|
|
|
+ Update,
|
|
|
/**
|
|
|
- * @brief !=
|
|
|
+ * @brief 查询
|
|
|
*/
|
|
|
- NotEqual,
|
|
|
+ Select,
|
|
|
/**
|
|
|
- * @brief >
|
|
|
+ * @brief 查询数量
|
|
|
*/
|
|
|
- Greater,
|
|
|
+ Count,
|
|
|
/**
|
|
|
- * @brief <
|
|
|
+ * @brief 错误
|
|
|
*/
|
|
|
- Less,
|
|
|
+ Error
|
|
|
+ };
|
|
|
+ /**
|
|
|
+ * @brief 排序
|
|
|
+ */
|
|
|
+ enum sql_order_by_type {
|
|
|
/**
|
|
|
- * @brief >=
|
|
|
+ * @brief 升序
|
|
|
*/
|
|
|
- GreaterEqual,
|
|
|
+ Asc,
|
|
|
/**
|
|
|
- * @brief <=
|
|
|
+ * @brief 降序
|
|
|
*/
|
|
|
- LessEqual,
|
|
|
+ Desc
|
|
|
+ };
|
|
|
+ /**
|
|
|
+ * @brief 表达式
|
|
|
+ */
|
|
|
+ struct sql_expression {
|
|
|
/**
|
|
|
- * @brief in
|
|
|
+ * @brief 表达式类型
|
|
|
*/
|
|
|
- In,
|
|
|
+ enum symbol_type {
|
|
|
+ /**
|
|
|
+ * @brief 无效表达式
|
|
|
+ */
|
|
|
+ Invalid = 0,
|
|
|
+ /**
|
|
|
+ * @brief =
|
|
|
+ */
|
|
|
+ Equal,
|
|
|
+ /**
|
|
|
+ * @brief ==
|
|
|
+ */
|
|
|
+ EqualEqual,
|
|
|
+ /**
|
|
|
+ * @brief !=
|
|
|
+ */
|
|
|
+ NotEqual,
|
|
|
+ /**
|
|
|
+ * @brief >
|
|
|
+ */
|
|
|
+ Greater,
|
|
|
+ /**
|
|
|
+ * @brief <
|
|
|
+ */
|
|
|
+ Less,
|
|
|
+ /**
|
|
|
+ * @brief >=
|
|
|
+ */
|
|
|
+ GreaterEqual,
|
|
|
+ /**
|
|
|
+ * @brief <=
|
|
|
+ */
|
|
|
+ LessEqual,
|
|
|
+ /**
|
|
|
+ * @brief in
|
|
|
+ */
|
|
|
+ In,
|
|
|
+ /**
|
|
|
+ * @brief like
|
|
|
+ */
|
|
|
+ Like,
|
|
|
+ /**
|
|
|
+ * @brief &&
|
|
|
+ */
|
|
|
+ And,
|
|
|
+ /**
|
|
|
+ * @brief ||
|
|
|
+ */
|
|
|
+ Or,
|
|
|
+ /**
|
|
|
+ * @brief 逗号
|
|
|
+ */
|
|
|
+ Comma,
|
|
|
+ /**
|
|
|
+ * @brief 排序
|
|
|
+ */
|
|
|
+ OrderBy,
|
|
|
+ /**
|
|
|
+ * @brief 分页
|
|
|
+ */
|
|
|
+ Limit,
|
|
|
+ /**
|
|
|
+ * @brief 分隔符
|
|
|
+ */
|
|
|
+ Separator
|
|
|
+ };
|
|
|
/**
|
|
|
- * @brief like
|
|
|
+ * @brief 括号
|
|
|
*/
|
|
|
- Like,
|
|
|
+ enum brace_type {
|
|
|
+ /**
|
|
|
+ * @brief 无效
|
|
|
+ */
|
|
|
+ Not,
|
|
|
+ /**
|
|
|
+ * @brief 开
|
|
|
+ */
|
|
|
+ On,
|
|
|
+ /**
|
|
|
+ * @brief 关
|
|
|
+ */
|
|
|
+ Off,
|
|
|
+ /**
|
|
|
+ * @brief 开关
|
|
|
+ */
|
|
|
+ OnOff
|
|
|
+ };
|
|
|
/**
|
|
|
- * @brief &&
|
|
|
+ * @brief 字段名称
|
|
|
*/
|
|
|
- And,
|
|
|
+ std::string name;
|
|
|
/**
|
|
|
- * @brief ||
|
|
|
+ * @brief 表达式符号
|
|
|
*/
|
|
|
- Or,
|
|
|
+ symbol_type symbol = symbol_type::Invalid;
|
|
|
/**
|
|
|
- * @brief 逗号
|
|
|
+ * @brief 值
|
|
|
*/
|
|
|
- Comma,
|
|
|
+ std::vector<rttr::variant> values;
|
|
|
/**
|
|
|
- * @brief 排序
|
|
|
+ * @brief 括号
|
|
|
*/
|
|
|
- OrderBy,
|
|
|
+ brace_type brace = brace_type::Not;
|
|
|
/**
|
|
|
* @brief 分页
|
|
|
*/
|
|
|
- Limit,
|
|
|
+ std::pair<int, int> limit = std::pair(0, 0);
|
|
|
/**
|
|
|
- * @brief 分隔符
|
|
|
+ * @brief 排序
|
|
|
*/
|
|
|
- Separator
|
|
|
+ std::vector<std::pair<std::string, sql_order_by_type>> order_by;
|
|
|
};
|
|
|
/**
|
|
|
- * @brief 括号
|
|
|
+ * @brief sql参数
|
|
|
*/
|
|
|
- enum brace_type {
|
|
|
+ struct sql_param {
|
|
|
/**
|
|
|
- * @brief 无效
|
|
|
+ * @brief sql
|
|
|
*/
|
|
|
- Not,
|
|
|
+ std::string sql;
|
|
|
/**
|
|
|
- * @brief 开
|
|
|
+ * @brief 返回值
|
|
|
*/
|
|
|
- On,
|
|
|
+ rttr::variant result;
|
|
|
/**
|
|
|
- * @brief 关
|
|
|
- */
|
|
|
- Off,
|
|
|
+ * @brief 执行类型
|
|
|
+ */
|
|
|
+ sql_event_type event_type;
|
|
|
/**
|
|
|
- * @brief 开关
|
|
|
+ * @brief 参数
|
|
|
*/
|
|
|
- OnOff
|
|
|
+ std::vector<rttr::variant> params;
|
|
|
};
|
|
|
/**
|
|
|
- * @brief 字段名称
|
|
|
- */
|
|
|
- std::string name;
|
|
|
- /**
|
|
|
- * @brief 表达式符号
|
|
|
+ * @brief web查询条件
|
|
|
+ * @tparam _Type
|
|
|
*/
|
|
|
- symbol_type symbol = symbol_type::Invalid;
|
|
|
- /**
|
|
|
- * @brief 值
|
|
|
- */
|
|
|
- std::vector<rttr::variant> values;
|
|
|
- /**
|
|
|
- * @brief 括号
|
|
|
- */
|
|
|
- brace_type brace = brace_type::Not;
|
|
|
- /**
|
|
|
- * @brief 分页
|
|
|
- */
|
|
|
- std::pair<int, int> limit = std::pair(0, 0);
|
|
|
- /**
|
|
|
- * @brief 排序
|
|
|
- */
|
|
|
- std::vector<std::pair<std::string, sql_order_by_type>> order_by;
|
|
|
- };
|
|
|
- /**
|
|
|
- * @brief sql参数
|
|
|
- */
|
|
|
- struct sql_param {
|
|
|
- /**
|
|
|
- * @brief sql
|
|
|
- */
|
|
|
- std::string sql;
|
|
|
- /**
|
|
|
- * @brief 返回值
|
|
|
- */
|
|
|
- rttr::variant result;
|
|
|
- /**
|
|
|
- * @brief 执行类型
|
|
|
- */
|
|
|
- sql_event_type event_type;
|
|
|
- /**
|
|
|
- * @brief 参数
|
|
|
- */
|
|
|
- std::vector<rttr::variant> params;
|
|
|
- };
|
|
|
- /**
|
|
|
- * @brief web查询条件
|
|
|
- * @tparam _Type
|
|
|
- */
|
|
|
- template<typename _Type>
|
|
|
- class sql_where_web {
|
|
|
- public:
|
|
|
- /**
|
|
|
- * @brief 重置
|
|
|
- */
|
|
|
- void reset() {
|
|
|
- where_.clear();
|
|
|
- }
|
|
|
- template<typename _Param>
|
|
|
- sql_where_web& operator<<(_Param& value) {
|
|
|
- where_.push_back(sql_expression{ v3::utils::property_sql_name<_Type>(v3::utils::pointer_obj_cast<std::size_t>(value) - v3::utils::pointer_obj_cast<std::size_t>(type_)),sql_expression::Invalid,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
- return *this;
|
|
|
- }
|
|
|
- sql_where_web& operator==(std::string const& value) {
|
|
|
- rttr::variant result;
|
|
|
- rttr::type type = v3::utils::property_type<_Type>(where_[where_.size() - 1].name);
|
|
|
- if (get_value(result, value, type)) {
|
|
|
- if (type.is_sequential_container()) {
|
|
|
- where_[where_.size() - 1].symbol = sql_expression::Like;
|
|
|
+ template<typename _Type>
|
|
|
+ class sql_where_web {
|
|
|
+ public:
|
|
|
+ /**
|
|
|
+ * @brief 重置
|
|
|
+ */
|
|
|
+ void reset() {
|
|
|
+ where_.clear();
|
|
|
+ }
|
|
|
+ template<typename _Param>
|
|
|
+ sql_where_web& operator<<(_Param& value) {
|
|
|
+ where_.push_back(sql_expression{ v3::utils::property_sql_name<_Type>(v3::utils::pointer_obj_cast<std::size_t>(value) - v3::utils::pointer_obj_cast<std::size_t>(type_)),sql_expression::Invalid,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
+ return *this;
|
|
|
+ }
|
|
|
+ sql_where_web& operator==(std::string const& value) {
|
|
|
+ rttr::variant result;
|
|
|
+ rttr::type type = v3::utils::property_type<_Type>(where_[where_.size() - 1].name);
|
|
|
+ if (get_value(result, value, type)) {
|
|
|
+ if (type.is_sequential_container()) {
|
|
|
+ where_[where_.size() - 1].symbol = sql_expression::Like;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ where_[where_.size() - 1].symbol = sql_expression::EqualEqual;
|
|
|
+ }
|
|
|
+ where_[where_.size() - 1].values.push_back(result);
|
|
|
}
|
|
|
else {
|
|
|
- where_[where_.size() - 1].symbol = sql_expression::EqualEqual;
|
|
|
+ where_.pop_back();
|
|
|
}
|
|
|
- where_[where_.size() - 1].values.push_back(result);
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else {
|
|
|
- where_.pop_back();
|
|
|
+ sql_where_web& operator!=(std::string const& value) {
|
|
|
+ rttr::variant result;
|
|
|
+ if (get_value(result, value, v3::utils::property_type<_Type>(where_[where_.size() - 1].name))) {
|
|
|
+ where_[where_.size() - 1].symbol = sql_expression::NotEqual;
|
|
|
+ where_[where_.size() - 1].values.push_back(result);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ where_.pop_back();
|
|
|
+ }
|
|
|
+ return *this;
|
|
|
}
|
|
|
- return *this;
|
|
|
- }
|
|
|
- sql_where_web& operator!=(std::string const& value) {
|
|
|
- rttr::variant result;
|
|
|
- if (get_value(result, value, v3::utils::property_type<_Type>(where_[where_.size() - 1].name))) {
|
|
|
- where_[where_.size() - 1].symbol = sql_expression::NotEqual;
|
|
|
- where_[where_.size() - 1].values.push_back(result);
|
|
|
+ sql_where_web& operator>(std::string const& value) {
|
|
|
+ rttr::variant result;
|
|
|
+ if (get_value(result, value, v3::utils::property_type<_Type>(where_[where_.size() - 1].name))) {
|
|
|
+ where_[where_.size() - 1].symbol = sql_expression::Greater;
|
|
|
+ where_[where_.size() - 1].values.push_back(result);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ where_.pop_back();
|
|
|
+ }
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else {
|
|
|
- where_.pop_back();
|
|
|
+ sql_where_web& operator<(std::string const& value) {
|
|
|
+ rttr::variant result;
|
|
|
+ if (get_value(result, value, v3::utils::property_type<_Type>(where_[where_.size() - 1].name))) {
|
|
|
+ where_[where_.size() - 1].symbol = sql_expression::Less;
|
|
|
+ where_[where_.size() - 1].values.push_back(result);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ where_.pop_back();
|
|
|
+ }
|
|
|
+ return *this;
|
|
|
}
|
|
|
- return *this;
|
|
|
- }
|
|
|
- sql_where_web& operator>(std::string const& value) {
|
|
|
- rttr::variant result;
|
|
|
- if (get_value(result, value, v3::utils::property_type<_Type>(where_[where_.size() - 1].name))) {
|
|
|
- where_[where_.size() - 1].symbol = sql_expression::Greater;
|
|
|
- where_[where_.size() - 1].values.push_back(result);
|
|
|
+ sql_where_web& operator>=(std::string const& value) {
|
|
|
+ rttr::variant result;
|
|
|
+ if (get_value(result, value, v3::utils::property_type<_Type>(where_[where_.size() - 1].name))) {
|
|
|
+ where_[where_.size() - 1].symbol = sql_expression::GreaterEqual;
|
|
|
+ where_[where_.size() - 1].values.push_back(result);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ where_.pop_back();
|
|
|
+ }
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else {
|
|
|
- where_.pop_back();
|
|
|
+ sql_where_web& operator<=(std::string const& value) {
|
|
|
+ rttr::variant result;
|
|
|
+ if (get_value(result, value, v3::utils::property_type<_Type>(where_[where_.size() - 1].name))) {
|
|
|
+ where_[where_.size() - 1].symbol = sql_expression::LessEqual;
|
|
|
+ where_[where_.size() - 1].values.push_back(result);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ where_.pop_back();
|
|
|
+ }
|
|
|
+ return *this;
|
|
|
}
|
|
|
- return *this;
|
|
|
- }
|
|
|
- sql_where_web& operator<(std::string const& value) {
|
|
|
- rttr::variant result;
|
|
|
- if (get_value(result, value, v3::utils::property_type<_Type>(where_[where_.size() - 1].name))) {
|
|
|
- where_[where_.size() - 1].symbol = sql_expression::Less;
|
|
|
- where_[where_.size() - 1].values.push_back(result);
|
|
|
+ sql_where_web& operator and(sql_where_web<_Type>& value) {
|
|
|
+ if (where_.empty() || where_.size() % 2)
|
|
|
+ return *this;
|
|
|
+ insert_child(value);
|
|
|
+ insert_and();
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else {
|
|
|
- where_.pop_back();
|
|
|
+ sql_where_web& operator or(sql_where_web<_Type>& value) {
|
|
|
+ if (where_.empty() || where_.size() % 2)
|
|
|
+ return *this;
|
|
|
+ insert_child(value);
|
|
|
+ insert_or();
|
|
|
+ return *this;
|
|
|
}
|
|
|
- return *this;
|
|
|
- }
|
|
|
- sql_where_web& operator>=(std::string const& value) {
|
|
|
- rttr::variant result;
|
|
|
- if (get_value(result, value, v3::utils::property_type<_Type>(where_[where_.size() - 1].name))) {
|
|
|
- where_[where_.size() - 1].symbol = sql_expression::GreaterEqual;
|
|
|
- where_[where_.size() - 1].values.push_back(result);
|
|
|
+ _Type* operator->() {
|
|
|
+ return &type_;
|
|
|
}
|
|
|
- else {
|
|
|
- where_.pop_back();
|
|
|
+ /**
|
|
|
+ * @brief 获取数据
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ std::vector<sql_expression> get_sql_expression_value() {
|
|
|
+ return where_;
|
|
|
}
|
|
|
- return *this;
|
|
|
- }
|
|
|
- sql_where_web& operator<=(std::string const& value) {
|
|
|
- rttr::variant result;
|
|
|
- if (get_value(result, value, v3::utils::property_type<_Type>(where_[where_.size() - 1].name))) {
|
|
|
- where_[where_.size() - 1].symbol = sql_expression::LessEqual;
|
|
|
- where_[where_.size() - 1].values.push_back(result);
|
|
|
+ operator std::vector<sql_expression>() {
|
|
|
+ return where_;
|
|
|
}
|
|
|
- else {
|
|
|
- where_.pop_back();
|
|
|
+ /**
|
|
|
+ * @brief 添加分页
|
|
|
+ * @param page
|
|
|
+ * @param page_size
|
|
|
+ */
|
|
|
+ void add_limit(unsigned int page, unsigned int page_size) {
|
|
|
+ where_.push_back(sql_expression{ "",sql_expression::Limit,{},sql_expression::OnOff ,std::pair(page, page_size),{} });
|
|
|
}
|
|
|
- return *this;
|
|
|
- }
|
|
|
- sql_where_web& operator and(sql_where_web<_Type>& value) {
|
|
|
- if (where_.empty() || where_.size() % 2)
|
|
|
- return *this;
|
|
|
- insert_child(value);
|
|
|
- insert_and();
|
|
|
- return *this;
|
|
|
- }
|
|
|
- sql_where_web& operator or(sql_where_web<_Type>& value) {
|
|
|
- if (where_.empty() || where_.size() % 2)
|
|
|
- return *this;
|
|
|
- insert_child(value);
|
|
|
- insert_or();
|
|
|
- return *this;
|
|
|
- }
|
|
|
- _Type* operator->() {
|
|
|
- return &type_;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 获取数据
|
|
|
- * @return
|
|
|
- */
|
|
|
- std::vector<sql_expression> get_sql_expression_value() {
|
|
|
- return where_;
|
|
|
- }
|
|
|
- operator std::vector<sql_expression>() {
|
|
|
- return where_;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 添加分页
|
|
|
- * @param page
|
|
|
- * @param page_size
|
|
|
- */
|
|
|
- void add_limit(unsigned int page, unsigned int page_size) {
|
|
|
- where_.push_back(sql_expression{ "",sql_expression::Limit,{},sql_expression::OnOff ,std::pair(page, page_size),{} });
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 添加排序
|
|
|
- * @param value
|
|
|
- */
|
|
|
- void add_order_by(sql_expression const& value) {
|
|
|
- where_.push_back(value);
|
|
|
- }
|
|
|
- private:
|
|
|
+ /**
|
|
|
+ * @brief 添加排序
|
|
|
+ * @param value
|
|
|
+ */
|
|
|
+ void add_order_by(sql_expression const& value) {
|
|
|
+ where_.push_back(value);
|
|
|
+ }
|
|
|
+ private:
|
|
|
+ /**
|
|
|
+ * @brief 获取值
|
|
|
+ * @param value
|
|
|
+ * @param value_type
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ bool get_value(rttr::variant& result, std::string const& value, rttr::type type) {
|
|
|
+ if (value.empty())
|
|
|
+ return false;
|
|
|
+ if (type == rttr::type::get<int>()) {
|
|
|
+ result = std::atoi(value.c_str());
|
|
|
+ }
|
|
|
+ else if (type == rttr::type::get<bool>()) {
|
|
|
+ result = value == "true" || value == "True" || value == "TRUE";
|
|
|
+ }
|
|
|
+ else if (type == rttr::type::get<double>()) {
|
|
|
+ result = std::atof(value.c_str());
|
|
|
+ }
|
|
|
+ else if (type == rttr::type::get<long>()) {
|
|
|
+ result = std::atol(value.c_str());
|
|
|
+ }
|
|
|
+ else if (type == rttr::type::get<float>()) {
|
|
|
+ result = (float)std::atof(value.c_str());
|
|
|
+ }
|
|
|
+ else if (type == rttr::type::get<std::int64_t>()) {
|
|
|
+ result = (std::int64_t)std::atoll(value.c_str());
|
|
|
+ }
|
|
|
+ else if (type == rttr::type::get<v3::datetime>()) {
|
|
|
+ result = v3::datetime(value);
|
|
|
+ }
|
|
|
+ else if (type == rttr::type::get<std::string>()) {
|
|
|
+ result = value;
|
|
|
+ }
|
|
|
+ else if (type == rttr::type::get<std::vector<int>>()) {
|
|
|
+ result = value;
|
|
|
+ }
|
|
|
+ else if (type == rttr::type::get<std::vector<bool>>()) {
|
|
|
+ result = value;
|
|
|
+ }
|
|
|
+ else if (type == rttr::type::get<std::vector<double>>()) {
|
|
|
+ result = value;
|
|
|
+ }
|
|
|
+ else if (type == rttr::type::get<std::vector<long>>()) {
|
|
|
+ result = value;
|
|
|
+ }
|
|
|
+ else if (type == rttr::type::get<std::vector<float>>()) {
|
|
|
+ result = value;
|
|
|
+ }
|
|
|
+ else if (type == rttr::type::get<std::vector<std::int64_t>>()) {
|
|
|
+ result = value;
|
|
|
+ }
|
|
|
+ else if (type == rttr::type::get<std::vector<std::string>>()) {
|
|
|
+ result = value;
|
|
|
+ }
|
|
|
+ else if (type == rttr::type::get<std::vector<datetime>>()) {
|
|
|
+ result = value;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * @brief 添加子表达式
|
|
|
+ */
|
|
|
+ void insert_child(sql_where_web<_Type>& value) {
|
|
|
+ if (&value != this) {
|
|
|
+ if (value.where_.size() > 1) {
|
|
|
+ value.where_[0].brace = sql_expression::On;
|
|
|
+ value.where_[value.where_.size() - 1].brace = sql_expression::Off;
|
|
|
+ }
|
|
|
+ where_.insert(where_.end(), value.where_.begin(), value.where_.end());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * @brief 添加and连接符
|
|
|
+ */
|
|
|
+ void insert_and() {
|
|
|
+ for (size_t i = where_.size() - 1; i >= 0; --i) {
|
|
|
+ if (i - 1 >= 0) {
|
|
|
+ if (where_[i].symbol > 0 && where_[i].symbol < sql_expression::And && where_[i - 1].symbol > 0 && where_[i - 1].symbol < sql_expression::And) {
|
|
|
+ where_.insert(where_.begin() + i, sql_expression{ "",sql_expression::And,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * @brief 添加or连接符
|
|
|
+ */
|
|
|
+ void insert_or() {
|
|
|
+ for (size_t i = 0; i < where_.size(); ++i) {
|
|
|
+ if (where_.size() > i + 1) {
|
|
|
+ if (where_[i].symbol > 0 && where_[i].symbol < sql_expression::And && where_[i + 1].symbol > 0 && where_[i + 1].symbol < sql_expression::And) {
|
|
|
+ where_.insert(where_.begin() + i + 1, sql_expression{ "",sql_expression::Or,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ private:
|
|
|
+ _Type type_;
|
|
|
+ std::vector<sql_expression> where_;
|
|
|
+ };
|
|
|
/**
|
|
|
- * @brief 获取值
|
|
|
- * @param value
|
|
|
- * @param value_type
|
|
|
- * @return
|
|
|
+ * @brief 条件
|
|
|
+ * @tparam _Type
|
|
|
*/
|
|
|
- bool get_value(rttr::variant& result, std::string const& value, rttr::type type) {
|
|
|
- if (value.empty())
|
|
|
- return false;
|
|
|
- if (type == rttr::type::get<int>()) {
|
|
|
- result = std::atoi(value.c_str());
|
|
|
+ template<typename _Type>
|
|
|
+ class sql_where {
|
|
|
+ public:
|
|
|
+ /**
|
|
|
+ * @brief 重置
|
|
|
+ */
|
|
|
+ void reset() {
|
|
|
+ where_.clear();
|
|
|
}
|
|
|
- else if (type == rttr::type::get<bool>()) {
|
|
|
- result = value == "true" || value == "True" || value == "TRUE";
|
|
|
+ template<typename _Param>
|
|
|
+ sql_where& operator<<(_Param& value) {
|
|
|
+ if (where_.empty() || where_[where_.size() - 1].values.size() == 1) {
|
|
|
+ where_.push_back(sql_expression{ v3::utils::property_sql_name<_Type>(v3::utils::pointer_obj_cast<std::size_t>(value) - v3::utils::pointer_obj_cast<std::size_t>(type_)),sql_expression::Invalid,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ where_[where_.size() - 1].name = v3::utils::property_sql_name<_Type>(v3::utils::pointer_obj_cast<std::size_t>(value) - v3::utils::pointer_obj_cast<std::size_t>(type_));
|
|
|
+ }
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else if (type == rttr::type::get<double>()) {
|
|
|
- result = std::atof(value.c_str());
|
|
|
+ template<typename _Value>
|
|
|
+ sql_where& operator==(_Value const& value) {
|
|
|
+ rttr::variant type = v3::utils::property_type<_Type>(where_[where_.size() - 1].name);
|
|
|
+ if (type.is_sequential_container()) {
|
|
|
+ where_[where_.size() - 1].symbol = sql_expression::Like;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ where_[where_.size() - 1].symbol = sql_expression::EqualEqual;
|
|
|
+ }
|
|
|
+ where_[where_.size() - 1].values.push_back(value);
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else if (type == rttr::type::get<long>()) {
|
|
|
- result = std::atol(value.c_str());
|
|
|
+ template<typename _Value>
|
|
|
+ sql_where& operator!=(_Value const& value) {
|
|
|
+ where_[where_.size() - 1].symbol = sql_expression::NotEqual;
|
|
|
+ where_[where_.size() - 1].values.push_back(value);
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else if (type == rttr::type::get<float>()) {
|
|
|
- result = (float)std::atof(value.c_str());
|
|
|
+ template<typename _Value>
|
|
|
+ sql_where& operator>(_Value const& value) {
|
|
|
+ where_[where_.size() - 1].symbol = sql_expression::Greater;
|
|
|
+ where_[where_.size() - 1].values.push_back(value);
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else if (type == rttr::type::get<std::int64_t>()) {
|
|
|
- result = (std::int64_t)std::atoll(value.c_str());
|
|
|
+ template<typename _Value>
|
|
|
+ sql_where& operator<(_Value const& value) {
|
|
|
+ where_[where_.size() - 1].symbol = sql_expression::Less;
|
|
|
+ where_[where_.size() - 1].values.push_back(value);
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else if (type == rttr::type::get<v3::datetime>()) {
|
|
|
- result = v3::datetime(value);
|
|
|
+ template<typename _Value>
|
|
|
+ sql_where& operator>=(_Value const& value) {
|
|
|
+ where_[where_.size() - 1].symbol = sql_expression::GreaterEqual;
|
|
|
+ where_[where_.size() - 1].values.push_back(value);
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else if (type == rttr::type::get<std::string>()) {
|
|
|
- result = value;
|
|
|
+ template<typename _Value>
|
|
|
+ sql_where& operator<=(_Value const& value) {
|
|
|
+ where_[where_.size() - 1].symbol = sql_expression::LessEqual;
|
|
|
+ where_[where_.size() - 1].values.push_back(value);
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else if (type == rttr::type::get<std::vector<int>>()) {
|
|
|
- result = value;
|
|
|
+ void operator=(sql_where_web<_Type>& value) {
|
|
|
+ where_ = value.get_sql_expression_value();
|
|
|
}
|
|
|
- else if (type == rttr::type::get<std::vector<bool>>()) {
|
|
|
- result = value;
|
|
|
+ template<typename..._Args>
|
|
|
+ sql_where& in(_Args const&...args) {
|
|
|
+ where_.push_back(sql_expression{ "",sql_expression::In,{},sql_expression::OnOff ,std::pair(0, 0),{} });
|
|
|
+ v3::utils::for_each(std::make_tuple(args...), [this](auto it)
|
|
|
+ {
|
|
|
+ where_[where_.size() - 1].values.insert(where_[where_.size() - 1].values.begin(), it);
|
|
|
+ });
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else if (type == rttr::type::get<std::vector<double>>()) {
|
|
|
- result = value;
|
|
|
+ template<typename _Value>
|
|
|
+ sql_where& in(std::vector<_Value> const& values) {
|
|
|
+ where_.push_back(sql_expression{ "",sql_expression::In,{},sql_expression::OnOff,std::pair(0, 0),{} });
|
|
|
+ where_[where_.size() - 1].values.assign(values.begin(), values.end());
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else if (type == rttr::type::get<std::vector<long>>()) {
|
|
|
- result = value;
|
|
|
+ sql_where& operator and(sql_where<_Type>& value) {
|
|
|
+ insert_child(value);
|
|
|
+ insert_and();
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else if (type == rttr::type::get<std::vector<float>>()) {
|
|
|
- result = value;
|
|
|
+ sql_where& operator or(sql_where<_Type>& value) {
|
|
|
+ insert_child(value);
|
|
|
+ insert_or();
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else if (type == rttr::type::get<std::vector<std::int64_t>>()) {
|
|
|
- result = value;
|
|
|
+ _Type* operator->() {
|
|
|
+ return &type_;
|
|
|
}
|
|
|
- else if (type == rttr::type::get<std::vector<std::string>>()) {
|
|
|
- result = value;
|
|
|
+ operator std::vector<sql_expression>() {
|
|
|
+ return where_;
|
|
|
}
|
|
|
- else if (type == rttr::type::get<std::vector<datetime>>()) {
|
|
|
- result = value;
|
|
|
+ /**
|
|
|
+ * @brief 添加分页
|
|
|
+ * @param page
|
|
|
+ * @param page_size
|
|
|
+ */
|
|
|
+ void add_limit(unsigned int page, unsigned int page_size) {
|
|
|
+ where_.push_back(sql_expression{ "",sql_expression::Limit,{},sql_expression::OnOff ,std::pair(page, page_size),{} });
|
|
|
}
|
|
|
- else {
|
|
|
- return false;
|
|
|
+ /**
|
|
|
+ * @brief 添加排序
|
|
|
+ * @param value
|
|
|
+ */
|
|
|
+ void add_order_by(sql_expression const& value) {
|
|
|
+ where_.push_back(value);
|
|
|
}
|
|
|
- return true;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 添加子表达式
|
|
|
- */
|
|
|
- void insert_child(sql_where_web<_Type>& value) {
|
|
|
- if (&value != this) {
|
|
|
- if (value.where_.size() > 1) {
|
|
|
- value.where_[0].brace = sql_expression::On;
|
|
|
- value.where_[value.where_.size() - 1].brace = sql_expression::Off;
|
|
|
+ private:
|
|
|
+ /**
|
|
|
+ * @brief 添加子表达式
|
|
|
+ */
|
|
|
+ void insert_child(sql_where<_Type>& value) {
|
|
|
+ if (&value != this) {
|
|
|
+ if (value.where_.size() > 1) {
|
|
|
+ value.where_[0].brace = sql_expression::On;
|
|
|
+ value.where_[value.where_.size() - 1].brace = sql_expression::Off;
|
|
|
+ }
|
|
|
+ where_.insert(where_.end(), value.where_.begin(), value.where_.end());
|
|
|
}
|
|
|
- where_.insert(where_.end(), value.where_.begin(), value.where_.end());
|
|
|
}
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 添加and连接符
|
|
|
- */
|
|
|
- void insert_and() {
|
|
|
- for (size_t i = where_.size() - 1; i >= 0; --i) {
|
|
|
- if (i - 1 >= 0) {
|
|
|
- if (where_[i].symbol > 0 && where_[i].symbol < sql_expression::And && where_[i - 1].symbol > 0 && where_[i - 1].symbol < sql_expression::And) {
|
|
|
- where_.insert(where_.begin() + i, sql_expression{ "",sql_expression::And,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
- return;
|
|
|
+ /**
|
|
|
+ * @brief 添加and连接符
|
|
|
+ */
|
|
|
+ void insert_and() {
|
|
|
+ for (size_t i = where_.size() - 1; i >= 0; --i) {
|
|
|
+ if (i - 1 >= 0) {
|
|
|
+ if (where_[i].symbol > 0 && where_[i].symbol < sql_expression::And && where_[i - 1].symbol > 0 && where_[i - 1].symbol < sql_expression::And) {
|
|
|
+ where_.insert(where_.begin() + i, sql_expression{ "",sql_expression::And,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
+ return;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 添加or连接符
|
|
|
- */
|
|
|
- void insert_or() {
|
|
|
- for (size_t i = 0; i < where_.size(); ++i) {
|
|
|
- if (where_.size() > i + 1) {
|
|
|
- if (where_[i].symbol > 0 && where_[i].symbol < sql_expression::And && where_[i + 1].symbol > 0 && where_[i + 1].symbol < sql_expression::And) {
|
|
|
- where_.insert(where_.begin() + i + 1, sql_expression{ "",sql_expression::Or,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
- return;
|
|
|
+ /**
|
|
|
+ * @brief 添加or连接符
|
|
|
+ */
|
|
|
+ void insert_or() {
|
|
|
+ for (size_t i = 0; i < where_.size(); ++i) {
|
|
|
+ if (where_.size() > i + 1) {
|
|
|
+ if (where_[i].symbol > 0 && where_[i].symbol < sql_expression::And && where_[i + 1].symbol > 0 && where_[i + 1].symbol < sql_expression::And) {
|
|
|
+ where_.insert(where_.begin() + i + 1, sql_expression{ "",sql_expression::Or,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
+ return;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- private:
|
|
|
- _Type type_;
|
|
|
- std::vector<sql_expression> where_;
|
|
|
- };
|
|
|
- /**
|
|
|
- * @brief 条件
|
|
|
- * @tparam _Type
|
|
|
- */
|
|
|
- template<typename _Type>
|
|
|
- class sql_where {
|
|
|
- public:
|
|
|
+ private:
|
|
|
+ _Type type_;
|
|
|
+ std::vector<sql_expression> where_;
|
|
|
+ };
|
|
|
/**
|
|
|
- * @brief 重置
|
|
|
+ * @brief 排序
|
|
|
+ * @tparam _Type
|
|
|
*/
|
|
|
- void reset() {
|
|
|
- where_.clear();
|
|
|
- }
|
|
|
- template<typename _Param>
|
|
|
- sql_where& operator<<(_Param& value) {
|
|
|
- if (where_.empty() || where_[where_.size() - 1].values.size() == 1) {
|
|
|
- where_.push_back(sql_expression{ v3::utils::property_sql_name<_Type>(v3::utils::pointer_obj_cast<std::size_t>(value) - v3::utils::pointer_obj_cast<std::size_t>(type_)),sql_expression::Invalid,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
+ template<typename _Type>
|
|
|
+ class sql_order_by {
|
|
|
+ public:
|
|
|
+ template<typename _Param>
|
|
|
+ sql_order_by& operator<<(_Param& value) {
|
|
|
+ order_by_.symbol = sql_expression::OrderBy;
|
|
|
+ order_by_.order_by.push_back(std::pair(v3::utils::property_sql_name<_Type>(v3::utils::pointer_obj_cast<std::size_t>(value) - v3::utils::pointer_obj_cast<std::size_t>(type_)), Asc));
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else {
|
|
|
- where_[where_.size() - 1].name = v3::utils::property_sql_name<_Type>(v3::utils::pointer_obj_cast<std::size_t>(value) - v3::utils::pointer_obj_cast<std::size_t>(type_));
|
|
|
+ sql_order_by& operator<<(sql_order_by_type type) {
|
|
|
+ if (!order_by_.order_by.empty()) {
|
|
|
+ order_by_.order_by[order_by_.order_by.size() - 1].second = type;
|
|
|
+ }
|
|
|
+ return*this;
|
|
|
}
|
|
|
- return *this;
|
|
|
- }
|
|
|
- template<typename _Value>
|
|
|
- sql_where& operator==(_Value const& value) {
|
|
|
- rttr::variant type = v3::utils::property_type<_Type>(where_[where_.size() - 1].name);
|
|
|
- if (type.is_sequential_container()) {
|
|
|
- where_[where_.size() - 1].symbol = sql_expression::Like;
|
|
|
+ _Type* operator->() {
|
|
|
+ return &type_;
|
|
|
}
|
|
|
- else {
|
|
|
- where_[where_.size() - 1].symbol = sql_expression::EqualEqual;
|
|
|
+ operator sql_expression() {
|
|
|
+ return order_by_;
|
|
|
}
|
|
|
- where_[where_.size() - 1].values.push_back(value);
|
|
|
- return *this;
|
|
|
- }
|
|
|
- template<typename _Value>
|
|
|
- sql_where& operator!=(_Value const& value) {
|
|
|
- where_[where_.size() - 1].symbol = sql_expression::NotEqual;
|
|
|
- where_[where_.size() - 1].values.push_back(value);
|
|
|
- return *this;
|
|
|
- }
|
|
|
- template<typename _Value>
|
|
|
- sql_where& operator>(_Value const& value) {
|
|
|
- where_[where_.size() - 1].symbol = sql_expression::Greater;
|
|
|
- where_[where_.size() - 1].values.push_back(value);
|
|
|
- return *this;
|
|
|
- }
|
|
|
- template<typename _Value>
|
|
|
- sql_where& operator<(_Value const& value) {
|
|
|
- where_[where_.size() - 1].symbol = sql_expression::Less;
|
|
|
- where_[where_.size() - 1].values.push_back(value);
|
|
|
- return *this;
|
|
|
- }
|
|
|
- template<typename _Value>
|
|
|
- sql_where& operator>=(_Value const& value) {
|
|
|
- where_[where_.size() - 1].symbol = sql_expression::GreaterEqual;
|
|
|
- where_[where_.size() - 1].values.push_back(value);
|
|
|
- return *this;
|
|
|
- }
|
|
|
- template<typename _Value>
|
|
|
- sql_where& operator<=(_Value const& value) {
|
|
|
- where_[where_.size() - 1].symbol = sql_expression::LessEqual;
|
|
|
- where_[where_.size() - 1].values.push_back(value);
|
|
|
- return *this;
|
|
|
- }
|
|
|
- void operator=(sql_where_web<_Type>& value) {
|
|
|
- where_ = value.get_sql_expression_value();
|
|
|
- }
|
|
|
- template<typename..._Args>
|
|
|
- sql_where& in(_Args const&...args) {
|
|
|
- where_.push_back(sql_expression{ "",sql_expression::In,{},sql_expression::OnOff ,std::pair(0, 0),{} });
|
|
|
- v3::utils::for_each(std::make_tuple(args...), [this](auto it)
|
|
|
- {
|
|
|
- where_[where_.size() - 1].values.insert(where_[where_.size() - 1].values.begin(), it);
|
|
|
- });
|
|
|
- return *this;
|
|
|
- }
|
|
|
- template<typename _Value>
|
|
|
- sql_where& in(std::vector<_Value> const& values) {
|
|
|
- where_.push_back(sql_expression{ "",sql_expression::In,{},sql_expression::OnOff,std::pair(0, 0),{} });
|
|
|
- where_[where_.size() - 1].values.assign(values.begin(), values.end());
|
|
|
- return *this;
|
|
|
- }
|
|
|
- sql_where& operator and(sql_where<_Type>& value) {
|
|
|
- insert_child(value);
|
|
|
- insert_and();
|
|
|
- return *this;
|
|
|
- }
|
|
|
- sql_where& operator or(sql_where<_Type>& value) {
|
|
|
- insert_child(value);
|
|
|
- insert_or();
|
|
|
- return *this;
|
|
|
- }
|
|
|
- _Type* operator->() {
|
|
|
- return &type_;
|
|
|
- }
|
|
|
- operator std::vector<sql_expression>() {
|
|
|
- return where_;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 添加分页
|
|
|
- * @param page
|
|
|
- * @param page_size
|
|
|
- */
|
|
|
- void add_limit(unsigned int page, unsigned int page_size) {
|
|
|
- where_.push_back(sql_expression{ "",sql_expression::Limit,{},sql_expression::OnOff ,std::pair(page, page_size),{} });
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 添加排序
|
|
|
- * @param value
|
|
|
- */
|
|
|
- void add_order_by(sql_expression const& value) {
|
|
|
- where_.push_back(value);
|
|
|
- }
|
|
|
- private:
|
|
|
+ private:
|
|
|
+ _Type type_;
|
|
|
+ sql_expression order_by_;
|
|
|
+ };
|
|
|
/**
|
|
|
- * @brief 添加子表达式
|
|
|
+ * @brief 更新
|
|
|
+ * @tparam _Type
|
|
|
*/
|
|
|
- void insert_child(sql_where<_Type>& value) {
|
|
|
- if (&value != this) {
|
|
|
- if (value.where_.size() > 1) {
|
|
|
- value.where_[0].brace = sql_expression::On;
|
|
|
- value.where_[value.where_.size() - 1].brace = sql_expression::Off;
|
|
|
- }
|
|
|
- where_.insert(where_.end(), value.where_.begin(), value.where_.end());
|
|
|
+ template<typename _Type>
|
|
|
+ class sql_update {
|
|
|
+ public:
|
|
|
+ /**
|
|
|
+ * @brief 重置
|
|
|
+ */
|
|
|
+ void reset() {
|
|
|
+ update_.clear();
|
|
|
}
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 添加and连接符
|
|
|
- */
|
|
|
- void insert_and() {
|
|
|
- for (size_t i = where_.size() - 1; i >= 0; --i) {
|
|
|
- if (i - 1 >= 0) {
|
|
|
- if (where_[i].symbol > 0 && where_[i].symbol < sql_expression::And && where_[i - 1].symbol > 0 && where_[i - 1].symbol < sql_expression::And) {
|
|
|
- where_.insert(where_.begin() + i, sql_expression{ "",sql_expression::And,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
+ template<typename _Param>
|
|
|
+ sql_update& operator<<(_Param& value) {
|
|
|
+ update_.push_back(sql_expression{ v3::utils::property_sql_name<_Type>(v3::utils::pointer_obj_cast<std::size_t>(value) - v3::utils::pointer_obj_cast<std::size_t>(type_)),sql_expression::Invalid,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
+ return *this;
|
|
|
}
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 添加or连接符
|
|
|
- */
|
|
|
- void insert_or() {
|
|
|
- for (size_t i = 0; i < where_.size(); ++i) {
|
|
|
- if (where_.size() > i + 1) {
|
|
|
- if (where_[i].symbol > 0 && where_[i].symbol < sql_expression::And && where_[i + 1].symbol > 0 && where_[i + 1].symbol < sql_expression::And) {
|
|
|
- where_.insert(where_.begin() + i + 1, sql_expression{ "",sql_expression::Or,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- private:
|
|
|
- _Type type_;
|
|
|
- std::vector<sql_expression> where_;
|
|
|
- };
|
|
|
- /**
|
|
|
- * @brief 排序
|
|
|
- * @tparam _Type
|
|
|
- */
|
|
|
- template<typename _Type>
|
|
|
- class sql_order_by {
|
|
|
- public:
|
|
|
- template<typename _Param>
|
|
|
- sql_order_by& operator<<(_Param& value) {
|
|
|
- order_by_.symbol = sql_expression::OrderBy;
|
|
|
- order_by_.order_by.push_back(std::pair(v3::utils::property_sql_name<_Type>(v3::utils::pointer_obj_cast<std::size_t>(value) - v3::utils::pointer_obj_cast<std::size_t>(type_)), Asc));
|
|
|
- return *this;
|
|
|
- }
|
|
|
- sql_order_by& operator<<(sql_order_by_type type) {
|
|
|
- if (!order_by_.order_by.empty()) {
|
|
|
- order_by_.order_by[order_by_.order_by.size() - 1].second = type;
|
|
|
- }
|
|
|
- return*this;
|
|
|
- }
|
|
|
- _Type* operator->() {
|
|
|
- return &type_;
|
|
|
- }
|
|
|
- operator sql_expression() {
|
|
|
- return order_by_;
|
|
|
- }
|
|
|
- private:
|
|
|
- _Type type_;
|
|
|
- sql_expression order_by_;
|
|
|
- };
|
|
|
- /**
|
|
|
- * @brief 更新
|
|
|
- * @tparam _Type
|
|
|
- */
|
|
|
- template<typename _Type>
|
|
|
- class sql_update {
|
|
|
- public:
|
|
|
- /**
|
|
|
- * @brief 重置
|
|
|
- */
|
|
|
- void reset() {
|
|
|
- update_.clear();
|
|
|
- }
|
|
|
- template<typename _Param>
|
|
|
- sql_update& operator<<(_Param& value) {
|
|
|
- update_.push_back(sql_expression{ v3::utils::property_sql_name<_Type>(v3::utils::pointer_obj_cast<std::size_t>(value) - v3::utils::pointer_obj_cast<std::size_t>(type_)),sql_expression::Invalid,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
- return *this;
|
|
|
- }
|
|
|
- template<typename _Value>
|
|
|
- sql_update& operator=(_Value const& value) {
|
|
|
- update_[update_.size() - 1].symbol = sql_expression::Equal;
|
|
|
- update_[update_.size() - 1].values.push_back(value);
|
|
|
- return *this;
|
|
|
- }
|
|
|
- template<typename _Param>
|
|
|
- sql_update& operator,(_Param const& param) {
|
|
|
- update_.insert(update_.begin() + (update_.size() - 1), sql_expression{ "",sql_expression::Comma,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
- return *this;
|
|
|
- }
|
|
|
- _Type* operator->() {
|
|
|
- return &type_;
|
|
|
- }
|
|
|
- operator std::vector<sql_expression>() {
|
|
|
- return update_;
|
|
|
- }
|
|
|
- private:
|
|
|
- _Type type_;
|
|
|
- std::vector<sql_expression> update_;
|
|
|
- };
|
|
|
- /**
|
|
|
- * @brief 插入
|
|
|
- * @tparam _Type
|
|
|
- */
|
|
|
- template<typename _Type>
|
|
|
- class sql_insert {
|
|
|
- public:
|
|
|
- /**
|
|
|
- * @brief 重置
|
|
|
- */
|
|
|
- void reset() {
|
|
|
- insert_.clear();
|
|
|
- }
|
|
|
- template<typename _Param>
|
|
|
- sql_insert& operator<<(_Param& value) {
|
|
|
- insert_.push_back(sql_expression{ v3::utils::property_sql_name<_Type>(v3::utils::pointer_obj_cast<std::size_t>(value) - v3::utils::pointer_obj_cast<std::size_t>(type_)),sql_expression::Invalid,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
- return *this;
|
|
|
- }
|
|
|
- template<typename _Value>
|
|
|
- sql_insert& operator=(_Value const& value) {
|
|
|
- insert_[insert_.size() - 1].symbol = sql_expression::Equal;
|
|
|
- insert_[insert_.size() - 1].values.push_back(value);
|
|
|
- return *this;
|
|
|
- }
|
|
|
- template<typename _Param>
|
|
|
- sql_insert& operator,(_Param const& param) {
|
|
|
- insert_.insert(insert_.begin() + (insert_.size() - 1), sql_expression{ "",sql_expression::Comma,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
- return *this;
|
|
|
- }
|
|
|
- _Type* operator->() {
|
|
|
- return &type_;
|
|
|
- }
|
|
|
- operator std::vector<sql_expression>() {
|
|
|
- return insert_;
|
|
|
- }
|
|
|
- void add(_Type const& value) {
|
|
|
- set_sql_expression(value);
|
|
|
- }
|
|
|
- private:
|
|
|
- void set_sql_expression(_Type const& value) {
|
|
|
- rttr::type type = rttr::type::get<_Type>();
|
|
|
- rttr::array_range<rttr::property> props = type.get_properties();
|
|
|
-
|
|
|
- int index = 0;
|
|
|
- for (auto const& it : props) {
|
|
|
- v3::sql_expression item;
|
|
|
- if (it.get_type() == rttr::type::get<int>() ||
|
|
|
- it.get_type() == rttr::type::get<bool>() ||
|
|
|
- it.get_type() == rttr::type::get<double>() ||
|
|
|
- it.get_type() == rttr::type::get<long>() ||
|
|
|
- it.get_type() == rttr::type::get<float>() ||
|
|
|
- it.get_type() == rttr::type::get<std::int64_t>() ||
|
|
|
- it.get_type() == rttr::type::get<v3::datetime>() ||
|
|
|
- it.get_type() == rttr::type::get<std::string>() ||
|
|
|
- it.get_type() == rttr::type::get<std::vector<int>>() ||
|
|
|
- it.get_type() == rttr::type::get<std::vector<bool>>() ||
|
|
|
- it.get_type() == rttr::type::get<std::vector<double>>() ||
|
|
|
- it.get_type() == rttr::type::get<std::vector<long>>() ||
|
|
|
- it.get_type() == rttr::type::get<std::vector<float>>() ||
|
|
|
- it.get_type() == rttr::type::get<std::vector<std::int64_t>>() ||
|
|
|
- it.get_type() == rttr::type::get<std::vector<std::string>>() ||
|
|
|
- it.get_type() == rttr::type::get<std::vector<v3::datetime>>()) {
|
|
|
- item.name = it.get_name().data();
|
|
|
- item.values.push_back(it.get_value(value));
|
|
|
- item.symbol = v3::sql_expression::Equal;
|
|
|
- }
|
|
|
- else {
|
|
|
- ++index;
|
|
|
- continue;
|
|
|
- }
|
|
|
- if (index + 1 == props.size()) {
|
|
|
- insert_.push_back(item);
|
|
|
- }
|
|
|
- else {
|
|
|
- insert_.push_back(item);
|
|
|
- insert_.push_back(v3::sql_expression{ "",v3::sql_expression::Comma,{},v3::sql_expression::Not,std::pair(0, 0),{} });
|
|
|
- }
|
|
|
- ++index;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- private:
|
|
|
- _Type type_;
|
|
|
- std::vector<sql_expression> insert_;
|
|
|
- };
|
|
|
- /**
|
|
|
- * @brief sql执行
|
|
|
- * @param param
|
|
|
- * @return
|
|
|
- */
|
|
|
- template<typename _ConnConfig>
|
|
|
- static rttr::variant on_sql_linq_execute(v3::sql_param& param) {
|
|
|
-#ifdef _DEBUG
|
|
|
- LOG_INFO << "SQL:" << param.sql << " 参数数量:" << param.params.size();
|
|
|
-#endif // !_DEBUG
|
|
|
- cppdb::session session = v3::orm::sql_connect_pool::open<_ConnConfig>();
|
|
|
- cppdb::statement stmt = session << param.sql;
|
|
|
-
|
|
|
- for (auto& it : param.params) {
|
|
|
- if (it.get_type() == rttr::type::get<int>()) {
|
|
|
- stmt << it.get_value<int>();
|
|
|
- }
|
|
|
- else if (it.get_type() == rttr::type::get<bool>()) {
|
|
|
- stmt << (it.get_value<bool>() ? 1 : 0);
|
|
|
- }
|
|
|
- else if (it.get_type() == rttr::type::get<double>()) {
|
|
|
- stmt << it.get_value<double>();
|
|
|
- }
|
|
|
- else if (it.get_type() == rttr::type::get<long>()) {
|
|
|
- stmt << it.get_value<long>();
|
|
|
- }
|
|
|
- else if (it.get_type() == rttr::type::get<float>()) {
|
|
|
- stmt << it.get_value<float>();
|
|
|
- }
|
|
|
- else if (it.get_type() == rttr::type::get<std::int64_t>()) {
|
|
|
- stmt << it.get_value<std::int64_t>();
|
|
|
+ template<typename _Value>
|
|
|
+ sql_update& operator=(_Value const& value) {
|
|
|
+ update_[update_.size() - 1].symbol = sql_expression::Equal;
|
|
|
+ update_[update_.size() - 1].values.push_back(value);
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else if (it.get_type() == rttr::type::get<v3::datetime>()) {
|
|
|
- v3::datetime time = it.get_value<v3::datetime>();
|
|
|
- stmt << (std::tm)time;
|
|
|
+ template<typename _Param>
|
|
|
+ sql_update& operator,(_Param const& param) {
|
|
|
+ update_.insert(update_.begin() + (update_.size() - 1), sql_expression{ "",sql_expression::Comma,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else if (it.get_type() == rttr::type::get<std::string>()) {
|
|
|
- stmt << it.get_value<std::string>();
|
|
|
+ _Type* operator->() {
|
|
|
+ return &type_;
|
|
|
}
|
|
|
- else if (it.get_type() == rttr::type::get<std::vector<int>>()) {
|
|
|
- std::string value = v3::utils::join(it.get_value<std::vector<int>>(), ",");
|
|
|
- it = value;
|
|
|
- stmt << it.get_value<std::string>();
|
|
|
+ operator std::vector<sql_expression>() {
|
|
|
+ return update_;
|
|
|
}
|
|
|
- else if (it.get_type() == rttr::type::get<std::vector<bool>>()) {
|
|
|
- std::string value = v3::utils::join(it.get_value<std::vector<bool>>(), ",");
|
|
|
- it = value;
|
|
|
- stmt << it.get_value<std::string>();
|
|
|
+ private:
|
|
|
+ _Type type_;
|
|
|
+ std::vector<sql_expression> update_;
|
|
|
+ };
|
|
|
+ /**
|
|
|
+ * @brief 插入
|
|
|
+ * @tparam _Type
|
|
|
+ */
|
|
|
+ template<typename _Type>
|
|
|
+ class sql_insert {
|
|
|
+ public:
|
|
|
+ /**
|
|
|
+ * @brief 重置
|
|
|
+ */
|
|
|
+ void reset() {
|
|
|
+ insert_.clear();
|
|
|
}
|
|
|
- else if (it.get_type() == rttr::type::get<std::vector<double>>()) {
|
|
|
- std::string value = v3::utils::join(it.get_value<std::vector<double>>(), ",");
|
|
|
- stmt << value;
|
|
|
+ template<typename _Param>
|
|
|
+ sql_insert& operator<<(_Param& value) {
|
|
|
+ insert_.push_back(sql_expression{ v3::utils::property_sql_name<_Type>(v3::utils::pointer_obj_cast<std::size_t>(value) - v3::utils::pointer_obj_cast<std::size_t>(type_)),sql_expression::Invalid,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else if (it.get_type() == rttr::type::get<std::vector<long>>()) {
|
|
|
- std::string value = v3::utils::join(it.get_value<std::vector<long>>(), ",");
|
|
|
- it = value;
|
|
|
- stmt << it.get_value<std::string>();
|
|
|
+ template<typename _Value>
|
|
|
+ sql_insert& operator=(_Value const& value) {
|
|
|
+ insert_[insert_.size() - 1].symbol = sql_expression::Equal;
|
|
|
+ insert_[insert_.size() - 1].values.push_back(value);
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else if (it.get_type() == rttr::type::get<std::vector<float>>()) {
|
|
|
- std::string value = v3::utils::join(it.get_value<std::vector<float>>(), ",");
|
|
|
- stmt << value;
|
|
|
+ template<typename _Param>
|
|
|
+ sql_insert& operator,(_Param const& param) {
|
|
|
+ insert_.insert(insert_.begin() + (insert_.size() - 1), sql_expression{ "",sql_expression::Comma,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else if (it.get_type() == rttr::type::get<std::vector<std::int64_t>>()) {
|
|
|
- std::string value = v3::utils::join(it.get_value<std::vector<std::int64_t>>(), ",");
|
|
|
- it = value;
|
|
|
- stmt << it.get_value<std::string>();
|
|
|
+ _Type* operator->() {
|
|
|
+ return &type_;
|
|
|
}
|
|
|
- else if (it.get_type() == rttr::type::get<std::vector<std::string>>()) {
|
|
|
- std::string value = v3::utils::join(it.get_value<std::vector<std::string>>(), ",");
|
|
|
- it = value;
|
|
|
- stmt << it.get_value<std::string>();
|
|
|
+ operator std::vector<sql_expression>() {
|
|
|
+ return insert_;
|
|
|
}
|
|
|
- else if (it.get_type() == rttr::type::get<std::vector<v3::datetime>>()) {
|
|
|
- std::string value = v3::utils::join(it.get_value<std::vector<v3::datetime>>(), ",");
|
|
|
- it = value;
|
|
|
- stmt << it.get_value<std::string>();
|
|
|
+ void add(_Type const& value) {
|
|
|
+ set_sql_expression(value);
|
|
|
}
|
|
|
- }
|
|
|
+ private:
|
|
|
+ void set_sql_expression(_Type const& value) {
|
|
|
+ rttr::type type = rttr::type::get<_Type>();
|
|
|
+ rttr::array_range<rttr::property> props = type.get_properties();
|
|
|
|
|
|
- if (v3::sql_event_type::Count == param.event_type) {
|
|
|
- int count = 0;
|
|
|
- cppdb::result res = stmt.query();
|
|
|
- if (res.next()) {
|
|
|
- count = res.get<int>("count");
|
|
|
- }
|
|
|
- return count;
|
|
|
- }
|
|
|
- else if (v3::sql_event_type::Insert == param.event_type) {
|
|
|
- stmt.exec();
|
|
|
- return true;
|
|
|
- }
|
|
|
- else if (v3::sql_event_type::Delete == param.event_type) {
|
|
|
- stmt.exec();
|
|
|
- return true;
|
|
|
- }
|
|
|
- else if (v3::sql_event_type::Update == param.event_type) {
|
|
|
- stmt.exec();
|
|
|
- return true;
|
|
|
- }
|
|
|
- else if (v3::sql_event_type::Select == param.event_type) {
|
|
|
- cppdb::result res = stmt.query();
|
|
|
- auto view = param.result.create_sequential_view();
|
|
|
- rttr::type type = view.get_value_type();
|
|
|
- while (res.next()) {
|
|
|
- rttr::variant item = type.create();
|
|
|
- for (auto const& it : item.get_type().get_properties()) {
|
|
|
- auto noSql = it.get_metadata("NoSql");
|
|
|
- if (noSql.get_type() != rttr::type::get<bool>() || noSql.get_value<bool>()) {
|
|
|
+ int index = 0;
|
|
|
+ for (auto const& it : props) {
|
|
|
+ v3::sql_expression item;
|
|
|
+ if (it.get_type() == rttr::type::get<int>() ||
|
|
|
+ it.get_type() == rttr::type::get<bool>() ||
|
|
|
+ it.get_type() == rttr::type::get<double>() ||
|
|
|
+ it.get_type() == rttr::type::get<long>() ||
|
|
|
+ it.get_type() == rttr::type::get<float>() ||
|
|
|
+ it.get_type() == rttr::type::get<std::int64_t>() ||
|
|
|
+ it.get_type() == rttr::type::get<v3::datetime>() ||
|
|
|
+ it.get_type() == rttr::type::get<std::string>() ||
|
|
|
+ it.get_type() == rttr::type::get<std::vector<int>>() ||
|
|
|
+ it.get_type() == rttr::type::get<std::vector<bool>>() ||
|
|
|
+ it.get_type() == rttr::type::get<std::vector<double>>() ||
|
|
|
+ it.get_type() == rttr::type::get<std::vector<long>>() ||
|
|
|
+ it.get_type() == rttr::type::get<std::vector<float>>() ||
|
|
|
+ it.get_type() == rttr::type::get<std::vector<std::int64_t>>() ||
|
|
|
+ it.get_type() == rttr::type::get<std::vector<std::string>>() ||
|
|
|
+ it.get_type() == rttr::type::get<std::vector<v3::datetime>>()) {
|
|
|
+ item.name = it.get_name().data();
|
|
|
+ item.values.push_back(it.get_value(value));
|
|
|
+ item.symbol = v3::sql_expression::Equal;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ ++index;
|
|
|
continue;
|
|
|
}
|
|
|
- std::string field_name;
|
|
|
- rttr::variant sql_name = it.get_metadata("Sql");
|
|
|
- if (sql_name.is_type<std::string>())
|
|
|
- field_name = sql_name.get_value<std::string>();
|
|
|
- else
|
|
|
- field_name = it.get_name().data();
|
|
|
+ if (index + 1 == props.size()) {
|
|
|
+ insert_.push_back(item);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ insert_.push_back(item);
|
|
|
+ insert_.push_back(v3::sql_expression{ "",v3::sql_expression::Comma,{},v3::sql_expression::Not,std::pair(0, 0),{} });
|
|
|
+ }
|
|
|
+ ++index;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ private:
|
|
|
+ _Type type_;
|
|
|
+ std::vector<sql_expression> insert_;
|
|
|
+ };
|
|
|
+ /**
|
|
|
+ * @brief sql执行
|
|
|
+ * @param param
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ template<typename _ConnConfig>
|
|
|
+ static rttr::variant on_sql_linq_execute(v3::sql_param& param) {
|
|
|
+ #ifdef _DEBUG
|
|
|
+ LOG_INFO << "SQL:" << param.sql << " 参数数量:" << param.params.size();
|
|
|
+ #endif // !_DEBUG
|
|
|
+ cppdb::session session = v3::orm::sql_connect_pool::open<_ConnConfig>();
|
|
|
+ cppdb::statement stmt = session << param.sql;
|
|
|
+
|
|
|
+ for (auto& it : param.params) {
|
|
|
+ if (it.get_type() == rttr::type::get<int>()) {
|
|
|
+ stmt << it.get_value<int>();
|
|
|
+ }
|
|
|
+ else if (it.get_type() == rttr::type::get<bool>()) {
|
|
|
+ stmt << (it.get_value<bool>() ? 1 : 0);
|
|
|
+ }
|
|
|
+ else if (it.get_type() == rttr::type::get<double>()) {
|
|
|
+ stmt << it.get_value<double>();
|
|
|
+ }
|
|
|
+ else if (it.get_type() == rttr::type::get<long>()) {
|
|
|
+ stmt << it.get_value<long>();
|
|
|
+ }
|
|
|
+ else if (it.get_type() == rttr::type::get<float>()) {
|
|
|
+ stmt << it.get_value<float>();
|
|
|
+ }
|
|
|
+ else if (it.get_type() == rttr::type::get<std::int64_t>()) {
|
|
|
+ stmt << it.get_value<std::int64_t>();
|
|
|
+ }
|
|
|
+ else if (it.get_type() == rttr::type::get<v3::datetime>()) {
|
|
|
+ v3::datetime time = it.get_value<v3::datetime>();
|
|
|
+ stmt << (std::tm)time;
|
|
|
+ }
|
|
|
+ else if (it.get_type() == rttr::type::get<std::string>()) {
|
|
|
+ stmt << it.get_value<std::string>();
|
|
|
+ }
|
|
|
+ else if (it.get_type() == rttr::type::get<std::vector<int>>()) {
|
|
|
+ std::string value = v3::utils::join(it.get_value<std::vector<int>>(), ",");
|
|
|
+ it = value;
|
|
|
+ stmt << it.get_value<std::string>();
|
|
|
+ }
|
|
|
+ else if (it.get_type() == rttr::type::get<std::vector<bool>>()) {
|
|
|
+ std::string value = v3::utils::join(it.get_value<std::vector<bool>>(), ",");
|
|
|
+ it = value;
|
|
|
+ stmt << it.get_value<std::string>();
|
|
|
+ }
|
|
|
+ else if (it.get_type() == rttr::type::get<std::vector<double>>()) {
|
|
|
+ std::string value = v3::utils::join(it.get_value<std::vector<double>>(), ",");
|
|
|
+ stmt << value;
|
|
|
+ }
|
|
|
+ else if (it.get_type() == rttr::type::get<std::vector<long>>()) {
|
|
|
+ std::string value = v3::utils::join(it.get_value<std::vector<long>>(), ",");
|
|
|
+ it = value;
|
|
|
+ stmt << it.get_value<std::string>();
|
|
|
+ }
|
|
|
+ else if (it.get_type() == rttr::type::get<std::vector<float>>()) {
|
|
|
+ std::string value = v3::utils::join(it.get_value<std::vector<float>>(), ",");
|
|
|
+ stmt << value;
|
|
|
+ }
|
|
|
+ else if (it.get_type() == rttr::type::get<std::vector<std::int64_t>>()) {
|
|
|
+ std::string value = v3::utils::join(it.get_value<std::vector<std::int64_t>>(), ",");
|
|
|
+ it = value;
|
|
|
+ stmt << it.get_value<std::string>();
|
|
|
+ }
|
|
|
+ else if (it.get_type() == rttr::type::get<std::vector<std::string>>()) {
|
|
|
+ std::string value = v3::utils::join(it.get_value<std::vector<std::string>>(), ",");
|
|
|
+ it = value;
|
|
|
+ stmt << it.get_value<std::string>();
|
|
|
+ }
|
|
|
+ else if (it.get_type() == rttr::type::get<std::vector<v3::datetime>>()) {
|
|
|
+ std::string value = v3::utils::join(it.get_value<std::vector<v3::datetime>>(), ",");
|
|
|
+ it = value;
|
|
|
+ stmt << it.get_value<std::string>();
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- if (it.get_type() == rttr::type::get<int>()) {
|
|
|
- if (!res.is_null(field_name)) {
|
|
|
- it.set_value(item, res.get<int>(field_name));
|
|
|
+ if (v3::sql_event_type::Count == param.event_type) {
|
|
|
+ int count = 0;
|
|
|
+ cppdb::result res = stmt.query();
|
|
|
+ if (res.next()) {
|
|
|
+ count = res.get<int>("count");
|
|
|
+ }
|
|
|
+ return count;
|
|
|
+ }
|
|
|
+ else if (v3::sql_event_type::Insert == param.event_type) {
|
|
|
+ stmt.exec();
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ else if (v3::sql_event_type::Delete == param.event_type) {
|
|
|
+ stmt.exec();
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ else if (v3::sql_event_type::Update == param.event_type) {
|
|
|
+ stmt.exec();
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ else if (v3::sql_event_type::Select == param.event_type) {
|
|
|
+ cppdb::result res = stmt.query();
|
|
|
+ auto view = param.result.create_sequential_view();
|
|
|
+ rttr::type type = view.get_value_type();
|
|
|
+ while (res.next()) {
|
|
|
+ rttr::variant item = type.create();
|
|
|
+ for (auto const& it : item.get_type().get_properties()) {
|
|
|
+ auto noSql = it.get_metadata("NoSql");
|
|
|
+ if (noSql.get_type() != rttr::type::get<bool>() || noSql.get_value<bool>()) {
|
|
|
+ continue;
|
|
|
}
|
|
|
- }
|
|
|
- else if (it.get_type() == rttr::type::get<bool>()) {
|
|
|
- if (!res.is_null(field_name)) {
|
|
|
- it.set_value(item, res.get<int>(field_name) > 0);
|
|
|
+ std::string field_name;
|
|
|
+ rttr::variant sql_name = it.get_metadata("Sql");
|
|
|
+ if (sql_name.is_type<std::string>())
|
|
|
+ field_name = sql_name.get_value<std::string>();
|
|
|
+ else
|
|
|
+ field_name = it.get_name().data();
|
|
|
+
|
|
|
+ if (it.get_type() == rttr::type::get<int>()) {
|
|
|
+ if (!res.is_null(field_name)) {
|
|
|
+ it.set_value(item, res.get<int>(field_name));
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- else if (it.get_type() == rttr::type::get<double>()) {
|
|
|
- if (!res.is_null(field_name)) {
|
|
|
- it.set_value(item, res.get<double>(field_name));
|
|
|
+ else if (it.get_type() == rttr::type::get<bool>()) {
|
|
|
+ if (!res.is_null(field_name)) {
|
|
|
+ it.set_value(item, res.get<int>(field_name) > 0);
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- else if (it.get_type() == rttr::type::get<long>()) {
|
|
|
- if (!res.is_null(field_name)) {
|
|
|
- it.set_value(item, res.get<long>(field_name));
|
|
|
+ else if (it.get_type() == rttr::type::get<double>()) {
|
|
|
+ if (!res.is_null(field_name)) {
|
|
|
+ it.set_value(item, res.get<double>(field_name));
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- else if (it.get_type() == rttr::type::get<float>()) {
|
|
|
- if (!res.is_null(field_name)) {
|
|
|
- it.set_value(item, res.get<float>(field_name));
|
|
|
+ else if (it.get_type() == rttr::type::get<long>()) {
|
|
|
+ if (!res.is_null(field_name)) {
|
|
|
+ it.set_value(item, res.get<long>(field_name));
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- else if (it.get_type() == rttr::type::get<std::int64_t>()) {
|
|
|
- if (!res.is_null(field_name)) {
|
|
|
- it.set_value(item, res.get<std::int64_t>(field_name));
|
|
|
+ else if (it.get_type() == rttr::type::get<float>()) {
|
|
|
+ if (!res.is_null(field_name)) {
|
|
|
+ it.set_value(item, res.get<float>(field_name));
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- else if (it.get_type() == rttr::type::get<v3::datetime>()) {
|
|
|
- if (!res.is_null(field_name)) {
|
|
|
- it.set_value(item, datetime(res.get<std::string>(field_name)));
|
|
|
+ else if (it.get_type() == rttr::type::get<std::int64_t>()) {
|
|
|
+ if (!res.is_null(field_name)) {
|
|
|
+ it.set_value(item, res.get<std::int64_t>(field_name));
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- else if (it.get_type() == rttr::type::get<std::string>()) {
|
|
|
- if (!res.is_null(field_name)) {
|
|
|
- it.set_value(item, res.get<std::string>(field_name));
|
|
|
+ else if (it.get_type() == rttr::type::get<v3::datetime>()) {
|
|
|
+ if (!res.is_null(field_name)) {
|
|
|
+ it.set_value(item, datetime(res.get<std::string>(field_name)));
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- else if (it.get_type() == rttr::type::get<std::vector<int>>()) {
|
|
|
- if (!res.is_null(field_name)) {
|
|
|
- std::vector<int> vec;
|
|
|
- std::vector<std::string> split_value = v3::utils::split_trim(res.get<std::string>(field_name), ",");
|
|
|
- for (auto& it1 : split_value) {
|
|
|
- vec.push_back(std::atoi(it1.c_str()));
|
|
|
+ else if (it.get_type() == rttr::type::get<std::string>()) {
|
|
|
+ if (!res.is_null(field_name)) {
|
|
|
+ it.set_value(item, res.get<std::string>(field_name));
|
|
|
}
|
|
|
- it.set_value(item, vec);
|
|
|
}
|
|
|
- }
|
|
|
- else if (it.get_type() == rttr::type::get<std::vector<bool>>()) {
|
|
|
- if (!res.is_null(field_name)) {
|
|
|
- std::vector<bool> vec;
|
|
|
- std::vector<std::string> split_value = v3::utils::split_trim(res.get<std::string>(field_name), ",");
|
|
|
- for (auto& it1 : split_value) {
|
|
|
- if (it1 == "1" || it1 == "true" || it1 == "True" || it1 == "TRUE")
|
|
|
- vec.push_back(true);
|
|
|
- else
|
|
|
- vec.push_back(false);
|
|
|
+ else if (it.get_type() == rttr::type::get<std::vector<int>>()) {
|
|
|
+ if (!res.is_null(field_name)) {
|
|
|
+ std::vector<int> vec;
|
|
|
+ std::vector<std::string> split_value = v3::utils::split_trim(res.get<std::string>(field_name), ",");
|
|
|
+ for (auto& it1 : split_value) {
|
|
|
+ vec.push_back(std::atoi(it1.c_str()));
|
|
|
+ }
|
|
|
+ it.set_value(item, vec);
|
|
|
}
|
|
|
- it.set_value(item, vec);
|
|
|
}
|
|
|
- }
|
|
|
- else if (it.get_type() == rttr::type::get<std::vector<double>>()) {
|
|
|
- if (!res.is_null(field_name)) {
|
|
|
- std::vector<double> vec;
|
|
|
- std::vector<std::string> split_value = v3::utils::split_trim(res.get<std::string>(field_name), ",");
|
|
|
- for (auto& it1 : split_value) {
|
|
|
- vec.push_back(std::atof(it1.c_str()));
|
|
|
+ else if (it.get_type() == rttr::type::get<std::vector<bool>>()) {
|
|
|
+ if (!res.is_null(field_name)) {
|
|
|
+ std::vector<bool> vec;
|
|
|
+ std::vector<std::string> split_value = v3::utils::split_trim(res.get<std::string>(field_name), ",");
|
|
|
+ for (auto& it1 : split_value) {
|
|
|
+ if (it1 == "1" || it1 == "true" || it1 == "True" || it1 == "TRUE")
|
|
|
+ vec.push_back(true);
|
|
|
+ else
|
|
|
+ vec.push_back(false);
|
|
|
+ }
|
|
|
+ it.set_value(item, vec);
|
|
|
}
|
|
|
- it.set_value(item, vec);
|
|
|
}
|
|
|
- }
|
|
|
- else if (it.get_type() == rttr::type::get<std::vector<long>>()) {
|
|
|
- if (!res.is_null(field_name)) {
|
|
|
- std::vector<long> vec;
|
|
|
- std::vector<std::string> split_value = v3::utils::split_trim(res.get<std::string>(field_name), ",");
|
|
|
- for (auto& it1 : split_value) {
|
|
|
- vec.push_back(std::atol(it1.c_str()));
|
|
|
+ else if (it.get_type() == rttr::type::get<std::vector<double>>()) {
|
|
|
+ if (!res.is_null(field_name)) {
|
|
|
+ std::vector<double> vec;
|
|
|
+ std::vector<std::string> split_value = v3::utils::split_trim(res.get<std::string>(field_name), ",");
|
|
|
+ for (auto& it1 : split_value) {
|
|
|
+ vec.push_back(std::atof(it1.c_str()));
|
|
|
+ }
|
|
|
+ it.set_value(item, vec);
|
|
|
}
|
|
|
- it.set_value(item, vec);
|
|
|
}
|
|
|
- }
|
|
|
- else if (it.get_type() == rttr::type::get<std::vector<float>>()) {
|
|
|
- if (!res.is_null(field_name)) {
|
|
|
- std::vector<float> vec;
|
|
|
- std::vector<std::string> split_value = v3::utils::split_trim(res.get<std::string>(field_name), ",");
|
|
|
- for (auto& it1 : split_value) {
|
|
|
- vec.push_back(std::atol(it1.c_str()));
|
|
|
+ else if (it.get_type() == rttr::type::get<std::vector<long>>()) {
|
|
|
+ if (!res.is_null(field_name)) {
|
|
|
+ std::vector<long> vec;
|
|
|
+ std::vector<std::string> split_value = v3::utils::split_trim(res.get<std::string>(field_name), ",");
|
|
|
+ for (auto& it1 : split_value) {
|
|
|
+ vec.push_back(std::atol(it1.c_str()));
|
|
|
+ }
|
|
|
+ it.set_value(item, vec);
|
|
|
}
|
|
|
- it.set_value(item, vec);
|
|
|
}
|
|
|
- }
|
|
|
- else if (it.get_type() == rttr::type::get<std::vector<std::int64_t>>()) {
|
|
|
- if (!res.is_null(field_name)) {
|
|
|
- std::vector<float> vec;
|
|
|
- std::vector<std::string> split_value = v3::utils::split_trim(res.get<std::string>(field_name), ",");
|
|
|
- for (auto& it1 : split_value) {
|
|
|
- vec.push_back(std::atoll(it1.c_str()));
|
|
|
+ else if (it.get_type() == rttr::type::get<std::vector<float>>()) {
|
|
|
+ if (!res.is_null(field_name)) {
|
|
|
+ std::vector<float> vec;
|
|
|
+ std::vector<std::string> split_value = v3::utils::split_trim(res.get<std::string>(field_name), ",");
|
|
|
+ for (auto& it1 : split_value) {
|
|
|
+ vec.push_back(std::atol(it1.c_str()));
|
|
|
+ }
|
|
|
+ it.set_value(item, vec);
|
|
|
}
|
|
|
- it.set_value(item, vec);
|
|
|
}
|
|
|
- }
|
|
|
- else if (it.get_type() == rttr::type::get<std::vector<std::string>>()) {
|
|
|
- if (!res.is_null(field_name)) {
|
|
|
- std::vector<std::string> vec = v3::utils::split_trim(res.get<std::string>(field_name), ",");
|
|
|
- it.set_value(item, vec);
|
|
|
+ else if (it.get_type() == rttr::type::get<std::vector<std::int64_t>>()) {
|
|
|
+ if (!res.is_null(field_name)) {
|
|
|
+ std::vector<float> vec;
|
|
|
+ std::vector<std::string> split_value = v3::utils::split_trim(res.get<std::string>(field_name), ",");
|
|
|
+ for (auto& it1 : split_value) {
|
|
|
+ vec.push_back(std::atoll(it1.c_str()));
|
|
|
+ }
|
|
|
+ it.set_value(item, vec);
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- else if (it.get_type() == rttr::type::get<std::vector<v3::datetime>>()) {
|
|
|
- if (!res.is_null(field_name)) {
|
|
|
- std::vector<v3::datetime> vec;
|
|
|
- std::vector<std::string> split_value = v3::utils::split_trim(res.get<std::string>(field_name), ",");
|
|
|
- for (auto& it1 : split_value) {
|
|
|
- vec.push_back(v3::datetime(it1));
|
|
|
+ else if (it.get_type() == rttr::type::get<std::vector<std::string>>()) {
|
|
|
+ if (!res.is_null(field_name)) {
|
|
|
+ std::vector<std::string> vec = v3::utils::split_trim(res.get<std::string>(field_name), ",");
|
|
|
+ it.set_value(item, vec);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (it.get_type() == rttr::type::get<std::vector<v3::datetime>>()) {
|
|
|
+ if (!res.is_null(field_name)) {
|
|
|
+ std::vector<v3::datetime> vec;
|
|
|
+ std::vector<std::string> split_value = v3::utils::split_trim(res.get<std::string>(field_name), ",");
|
|
|
+ for (auto& it1 : split_value) {
|
|
|
+ vec.push_back(v3::datetime(it1));
|
|
|
+ }
|
|
|
+ it.set_value(item, vec);
|
|
|
}
|
|
|
- it.set_value(item, vec);
|
|
|
}
|
|
|
}
|
|
|
+ view.insert(view.end(), item);
|
|
|
}
|
|
|
- view.insert(view.end(), item);
|
|
|
- }
|
|
|
- return param.result;
|
|
|
- }
|
|
|
- return false;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief sql连接
|
|
|
- */
|
|
|
- struct sql_connect_config {
|
|
|
- operator std::string() {
|
|
|
- static std::string g_connect_str;
|
|
|
- if (g_connect_str.empty())
|
|
|
- g_connect_str = robotics::v3::config::read<std::string>("SQL", "CONNSTR", "mysql:host=127.0.0.1;database=mvc;user=root;password=123456;");
|
|
|
- return g_connect_str;
|
|
|
- }
|
|
|
- };
|
|
|
- /**
|
|
|
- * @brief mysql
|
|
|
- */
|
|
|
- class mysql_linq {
|
|
|
- public:
|
|
|
- mysql_linq(std::vector<robotics::v3::sql_expression> const& sql_params, std::string const& table_name, robotics::v3::sql_event_type type) :
|
|
|
- sql_params_(sql_params),
|
|
|
- table_name_(table_name),
|
|
|
- type_(type) {
|
|
|
- }
|
|
|
- operator robotics::v3::sql_param() {
|
|
|
- static std::map<robotics::v3::sql_expression::symbol_type, std::string> symbol_list = {
|
|
|
- { robotics::v3::sql_expression::Equal, "=" },
|
|
|
- { robotics::v3::sql_expression::EqualEqual, "=" },
|
|
|
- { robotics::v3::sql_expression::NotEqual, "<>" },
|
|
|
- { robotics::v3::sql_expression::Greater, ">" },
|
|
|
- { robotics::v3::sql_expression::Less, "<" },
|
|
|
- { robotics::v3::sql_expression::GreaterEqual, ">=" },
|
|
|
- { robotics::v3::sql_expression::LessEqual, "<=" },
|
|
|
- { robotics::v3::sql_expression::In, " in" },
|
|
|
- { robotics::v3::sql_expression::Like, " like " },
|
|
|
- { robotics::v3::sql_expression::And, " and " },
|
|
|
- { robotics::v3::sql_expression::Or, " or " },
|
|
|
- { robotics::v3::sql_expression::Comma, "," },
|
|
|
- { robotics::v3::sql_expression::OrderBy, " order by "},
|
|
|
- { robotics::v3::sql_expression::Limit, " limit " }
|
|
|
- };
|
|
|
- if (robotics::v3::sql_event_type::Insert == type_) {
|
|
|
- return insert(symbol_list);
|
|
|
- }
|
|
|
- else if (robotics::v3::sql_event_type::Delete == type_) {
|
|
|
- return remove(symbol_list);
|
|
|
- }
|
|
|
- else if (robotics::v3::sql_event_type::Update == type_) {
|
|
|
- return update(symbol_list);
|
|
|
- }
|
|
|
- else if (robotics::v3::sql_event_type::Select == type_) {
|
|
|
- return select(symbol_list);
|
|
|
+ return param.result;
|
|
|
}
|
|
|
- else if (robotics::v3::sql_event_type::Count == type_) {
|
|
|
- return count(symbol_list);
|
|
|
- }
|
|
|
- return robotics::v3::sql_param{ "",rttr::type::get<void>(), robotics::v3::sql_event_type::Error ,{} };
|
|
|
+ return false;
|
|
|
}
|
|
|
- private:
|
|
|
/**
|
|
|
- * @brief 添加
|
|
|
- * @param symbol_list
|
|
|
- * @return
|
|
|
+ * @brief sql连接
|
|
|
*/
|
|
|
- robotics::v3::sql_param insert(std::map<robotics::v3::sql_expression::symbol_type, std::string>& symbol_list) {
|
|
|
- robotics::v3::sql_param result = { "",true, type_ ,{} };
|
|
|
- std::vector<std::string> field_list;
|
|
|
- for (auto& it : sql_params_) {
|
|
|
- if (it.symbol > 0 && it.symbol < robotics::v3::sql_expression::And) {
|
|
|
- if (it.brace == robotics::v3::sql_expression::brace_type::Not) {
|
|
|
- field_list.push_back(it.name);
|
|
|
- result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
- }
|
|
|
- }
|
|
|
+ struct sql_connect_config {
|
|
|
+ operator std::string() {
|
|
|
+ static std::string g_connect_str;
|
|
|
+ if (g_connect_str.empty())
|
|
|
+ g_connect_str = robotics::v3::config::read<std::string>("SQL", "CONNSTR", "mysql:host=127.0.0.1;database=mvc;user=root;password=123456;");
|
|
|
+ return g_connect_str;
|
|
|
}
|
|
|
- result.sql = fmt::format("insert into {0}({1}) values({2});", table_name_, robotics::v3::utils::join(field_list, ","), robotics::v3::utils::join("?", field_list.size(), ","));
|
|
|
- return result;
|
|
|
- }
|
|
|
+ };
|
|
|
/**
|
|
|
- * @brief 删除
|
|
|
- * @param symbol_list
|
|
|
- * @return
|
|
|
+ * @brief mysql
|
|
|
*/
|
|
|
- robotics::v3::sql_param remove(std::map<robotics::v3::sql_expression::symbol_type, std::string>& symbol_list) {
|
|
|
- robotics::v3::sql_param result = { "",true, type_ ,{} };
|
|
|
- result.sql = fmt::format("delete from {0} where ", table_name_);
|
|
|
- for (auto& it : sql_params_) {
|
|
|
- if (it.symbol > 0 && it.symbol < robotics::v3::sql_expression::And) {
|
|
|
- if (it.brace == robotics::v3::sql_expression::brace_type::Not) {
|
|
|
- result.sql += fmt::format("{0}{1}?", it.name, symbol_list[it.symbol]);
|
|
|
- result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
- }
|
|
|
- else if (it.brace == robotics::v3::sql_expression::brace_type::On) {
|
|
|
- result.sql += fmt::format("({0}{1}?", it.name, symbol_list[it.symbol]);
|
|
|
- result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
- }
|
|
|
- else if (it.brace == robotics::v3::sql_expression::brace_type::Off) {
|
|
|
- result.sql += fmt::format("{0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
- result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
- }
|
|
|
- else if (it.brace == robotics::v3::sql_expression::brace_type::OnOff) {
|
|
|
- result.sql += fmt::format("{0}{1}({2})", it.name, symbol_list[it.symbol], robotics::v3::utils::join("?", it.values.size(), ","));
|
|
|
- result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
- }
|
|
|
+ class mysql_linq {
|
|
|
+ public:
|
|
|
+ mysql_linq(std::vector<robotics::v3::sql_expression> const& sql_params, std::string const& table_name, robotics::v3::sql_event_type type) :
|
|
|
+ sql_params_(sql_params),
|
|
|
+ table_name_(table_name),
|
|
|
+ type_(type) {
|
|
|
+ }
|
|
|
+ operator robotics::v3::sql_param() {
|
|
|
+ static std::map<robotics::v3::sql_expression::symbol_type, std::string> symbol_list = {
|
|
|
+ { robotics::v3::sql_expression::Equal, "=" },
|
|
|
+ { robotics::v3::sql_expression::EqualEqual, "=" },
|
|
|
+ { robotics::v3::sql_expression::NotEqual, "<>" },
|
|
|
+ { robotics::v3::sql_expression::Greater, ">" },
|
|
|
+ { robotics::v3::sql_expression::Less, "<" },
|
|
|
+ { robotics::v3::sql_expression::GreaterEqual, ">=" },
|
|
|
+ { robotics::v3::sql_expression::LessEqual, "<=" },
|
|
|
+ { robotics::v3::sql_expression::In, " in" },
|
|
|
+ { robotics::v3::sql_expression::Like, " like " },
|
|
|
+ { robotics::v3::sql_expression::And, " and " },
|
|
|
+ { robotics::v3::sql_expression::Or, " or " },
|
|
|
+ { robotics::v3::sql_expression::Comma, "," },
|
|
|
+ { robotics::v3::sql_expression::OrderBy, " order by "},
|
|
|
+ { robotics::v3::sql_expression::Limit, " limit " }
|
|
|
+ };
|
|
|
+ if (robotics::v3::sql_event_type::Insert == type_) {
|
|
|
+ return insert(symbol_list);
|
|
|
}
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::And) {
|
|
|
- result.sql += symbol_list[it.symbol];
|
|
|
+ else if (robotics::v3::sql_event_type::Delete == type_) {
|
|
|
+ return remove(symbol_list);
|
|
|
}
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::Or) {
|
|
|
- result.sql += symbol_list[it.symbol];
|
|
|
+ else if (robotics::v3::sql_event_type::Update == type_) {
|
|
|
+ return update(symbol_list);
|
|
|
}
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::Comma) {
|
|
|
- result.sql += symbol_list[it.symbol];
|
|
|
+ else if (robotics::v3::sql_event_type::Select == type_) {
|
|
|
+ return select(symbol_list);
|
|
|
}
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::Limit) {
|
|
|
- if (it.limit.first == 0) {
|
|
|
- result.sql += fmt::format("{0}{1}", symbol_list[it.symbol], it.limit.second);
|
|
|
- }
|
|
|
- else {
|
|
|
- result.sql += fmt::format("{0}{1},{2}", symbol_list[it.symbol], (it.limit.first - 1) * it.limit.second, it.limit.second);
|
|
|
- }
|
|
|
+ else if (robotics::v3::sql_event_type::Count == type_) {
|
|
|
+ return count(symbol_list);
|
|
|
}
|
|
|
+ return robotics::v3::sql_param{ "",rttr::type::get<void>(), robotics::v3::sql_event_type::Error ,{} };
|
|
|
}
|
|
|
- result.sql += ";";
|
|
|
- return result;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 更新
|
|
|
- * @param symbol_list
|
|
|
- * @return
|
|
|
- */
|
|
|
- robotics::v3::sql_param update(std::map<robotics::v3::sql_expression::symbol_type, std::string>& symbol_list) {
|
|
|
- robotics::v3::sql_param result = { "",true, type_ ,{} };
|
|
|
- std::vector<robotics::v3::sql_expression> where_param;
|
|
|
- std::vector<robotics::v3::sql_expression> update_param;
|
|
|
- bool ok = false;
|
|
|
- std::string where_sql, set_sql;
|
|
|
- for (auto const& it : sql_params_) {
|
|
|
- if (it.symbol == robotics::v3::sql_expression::Separator) {
|
|
|
- ok = true;
|
|
|
- continue;
|
|
|
- }
|
|
|
- if (!ok) {
|
|
|
- where_param.push_back(it);
|
|
|
- }
|
|
|
- else {
|
|
|
- update_param.push_back(it);
|
|
|
+ private:
|
|
|
+ /**
|
|
|
+ * @brief 添加
|
|
|
+ * @param symbol_list
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ robotics::v3::sql_param insert(std::map<robotics::v3::sql_expression::symbol_type, std::string>& symbol_list) {
|
|
|
+ robotics::v3::sql_param result = { "",true, type_ ,{} };
|
|
|
+ std::vector<std::string> field_list;
|
|
|
+ for (auto& it : sql_params_) {
|
|
|
+ if (it.symbol > 0 && it.symbol < robotics::v3::sql_expression::And) {
|
|
|
+ if (it.brace == robotics::v3::sql_expression::brace_type::Not) {
|
|
|
+ field_list.push_back(it.name);
|
|
|
+ result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+ result.sql = fmt::format("insert into {0}({1}) values({2});", table_name_, robotics::v3::utils::join(field_list, ","), robotics::v3::utils::join("?", field_list.size(), ","));
|
|
|
+ return result;
|
|
|
}
|
|
|
- //更新
|
|
|
- for (auto& it : update_param) {
|
|
|
- if (it.symbol > 0 && it.symbol < robotics::v3::sql_expression::And) {
|
|
|
- if (it.brace == robotics::v3::sql_expression::brace_type::Not) {
|
|
|
- set_sql += fmt::format("{0}{1}?", it.name, symbol_list[it.symbol]);
|
|
|
- result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ /**
|
|
|
+ * @brief 删除
|
|
|
+ * @param symbol_list
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ robotics::v3::sql_param remove(std::map<robotics::v3::sql_expression::symbol_type, std::string>& symbol_list) {
|
|
|
+ robotics::v3::sql_param result = { "",true, type_ ,{} };
|
|
|
+ result.sql = fmt::format("delete from {0} where ", table_name_);
|
|
|
+ for (auto& it : sql_params_) {
|
|
|
+ if (it.symbol > 0 && it.symbol < robotics::v3::sql_expression::And) {
|
|
|
+ if (it.brace == robotics::v3::sql_expression::brace_type::Not) {
|
|
|
+ result.sql += fmt::format("{0}{1}?", it.name, symbol_list[it.symbol]);
|
|
|
+ result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ }
|
|
|
+ else if (it.brace == robotics::v3::sql_expression::brace_type::On) {
|
|
|
+ result.sql += fmt::format("({0}{1}?", it.name, symbol_list[it.symbol]);
|
|
|
+ result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ }
|
|
|
+ else if (it.brace == robotics::v3::sql_expression::brace_type::Off) {
|
|
|
+ result.sql += fmt::format("{0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
+ result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ }
|
|
|
+ else if (it.brace == robotics::v3::sql_expression::brace_type::OnOff) {
|
|
|
+ result.sql += fmt::format("{0}{1}({2})", it.name, symbol_list[it.symbol], robotics::v3::utils::join("?", it.values.size(), ","));
|
|
|
+ result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ }
|
|
|
}
|
|
|
- else if (it.brace == robotics::v3::sql_expression::brace_type::On) {
|
|
|
- set_sql += fmt::format("({0}{1}?", it.name, symbol_list[it.symbol]);
|
|
|
- result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::And) {
|
|
|
+ result.sql += symbol_list[it.symbol];
|
|
|
}
|
|
|
- else if (it.brace == robotics::v3::sql_expression::brace_type::Off) {
|
|
|
- set_sql += fmt::format("{0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
- result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::Or) {
|
|
|
+ result.sql += symbol_list[it.symbol];
|
|
|
}
|
|
|
- else if (it.brace == robotics::v3::sql_expression::brace_type::OnOff) {
|
|
|
- set_sql += fmt::format("{0}{1}({2})", it.name, symbol_list[it.symbol], robotics::v3::utils::join("?", it.values.size(), ","));
|
|
|
- result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::Comma) {
|
|
|
+ result.sql += symbol_list[it.symbol];
|
|
|
+ }
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::Limit) {
|
|
|
+ if (it.limit.first == 0) {
|
|
|
+ result.sql += fmt::format("{0}{1}", symbol_list[it.symbol], it.limit.second);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ result.sql += fmt::format("{0}{1},{2}", symbol_list[it.symbol], (it.limit.first - 1) * it.limit.second, it.limit.second);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::And) {
|
|
|
- set_sql += symbol_list[it.symbol];
|
|
|
- }
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::Or) {
|
|
|
- set_sql += symbol_list[it.symbol];
|
|
|
- }
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::Comma) {
|
|
|
- set_sql += symbol_list[it.symbol];
|
|
|
- }
|
|
|
+ result.sql += ";";
|
|
|
+ return result;
|
|
|
}
|
|
|
- //条件
|
|
|
- for (auto& it : where_param) {
|
|
|
- if (it.symbol > 0 && it.symbol < robotics::v3::sql_expression::And) {
|
|
|
- if (it.brace == robotics::v3::sql_expression::brace_type::Not) {
|
|
|
- where_sql += fmt::format("{0}{1}?", it.name, symbol_list[it.symbol]);
|
|
|
- result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
- }
|
|
|
- else if (it.brace == robotics::v3::sql_expression::brace_type::On) {
|
|
|
- where_sql += fmt::format("({0}{1}?", it.name, symbol_list[it.symbol]);
|
|
|
- result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
- }
|
|
|
- else if (it.brace == robotics::v3::sql_expression::brace_type::Off) {
|
|
|
- where_sql += fmt::format("{0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
- result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
- }
|
|
|
- else if (it.brace == robotics::v3::sql_expression::brace_type::OnOff) {
|
|
|
- where_sql += fmt::format("{0}{1}({2})", it.name, symbol_list[it.symbol], robotics::v3::utils::join("?", it.values.size(), ","));
|
|
|
- result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ /**
|
|
|
+ * @brief 更新
|
|
|
+ * @param symbol_list
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ robotics::v3::sql_param update(std::map<robotics::v3::sql_expression::symbol_type, std::string>& symbol_list) {
|
|
|
+ robotics::v3::sql_param result = { "",true, type_ ,{} };
|
|
|
+ std::vector<robotics::v3::sql_expression> where_param;
|
|
|
+ std::vector<robotics::v3::sql_expression> update_param;
|
|
|
+ bool ok = false;
|
|
|
+ std::string where_sql, set_sql;
|
|
|
+ for (auto const& it : sql_params_) {
|
|
|
+ if (it.symbol == robotics::v3::sql_expression::Separator) {
|
|
|
+ ok = true;
|
|
|
+ continue;
|
|
|
}
|
|
|
- }
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::And) {
|
|
|
- where_sql += symbol_list[it.symbol];
|
|
|
- }
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::Or) {
|
|
|
- where_sql += symbol_list[it.symbol];
|
|
|
- }
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::Comma) {
|
|
|
- where_sql += symbol_list[it.symbol];
|
|
|
- }
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::OrderBy) {
|
|
|
- where_sql += symbol_list[it.symbol] + order_by_join(it.order_by);
|
|
|
- }
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::Limit) {
|
|
|
- if (it.limit.first == 0) {
|
|
|
- result.sql += fmt::format("{0}{1}", symbol_list[it.symbol], it.limit.second);
|
|
|
+ if (!ok) {
|
|
|
+ where_param.push_back(it);
|
|
|
}
|
|
|
else {
|
|
|
- result.sql += fmt::format("{0}{1},{2}", symbol_list[it.symbol], (it.limit.first - 1) * it.limit.second, it.limit.second);
|
|
|
+ update_param.push_back(it);
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- if (where_sql.empty()) {
|
|
|
- result.sql = fmt::format("update {0} set {1};", table_name_, set_sql);
|
|
|
- }
|
|
|
- else {
|
|
|
- result.sql = fmt::format("update {0} set {1} where {2};", table_name_, set_sql, where_sql);
|
|
|
- }
|
|
|
-
|
|
|
- return result;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 查询
|
|
|
- * @param symbol_list
|
|
|
- * @return
|
|
|
- */
|
|
|
- robotics::v3::sql_param select(std::map<robotics::v3::sql_expression::symbol_type, std::string>& symbol_list) {
|
|
|
- robotics::v3::sql_param result = { "",true, type_ ,{} };
|
|
|
- result.sql = fmt::format("select * from {0} where ", table_name_);
|
|
|
- for (auto& it : sql_params_) {
|
|
|
- if (it.symbol > 0 && it.symbol < robotics::v3::sql_expression::And) {
|
|
|
- if (it.brace == robotics::v3::sql_expression::brace_type::Not) {
|
|
|
- if (it.symbol != v3::sql_expression::Like) {
|
|
|
- result.sql += fmt::format("{0}{1}?", it.name, symbol_list[it.symbol]);
|
|
|
+ //更新
|
|
|
+ for (auto& it : update_param) {
|
|
|
+ if (it.symbol > 0 && it.symbol < robotics::v3::sql_expression::And) {
|
|
|
+ if (it.brace == robotics::v3::sql_expression::brace_type::Not) {
|
|
|
+ set_sql += fmt::format("{0}{1}?", it.name, symbol_list[it.symbol]);
|
|
|
result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
}
|
|
|
- else {
|
|
|
- result.sql += fmt::format("({0}{1}? or {0}{1}? or {0}{1}? or {0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
- if (!it.values.empty()) {
|
|
|
- std::vector<rttr::variant> vec;
|
|
|
- std::string v;
|
|
|
- if (it.values[0].get_type() == rttr::type::get<std::string>()) {
|
|
|
- v = it.values[0].get_value<std::string>();
|
|
|
- }
|
|
|
- else if (it.values[0].get_type() == rttr::type::get<const char*>()) {
|
|
|
- v = it.values[0].get_value<const char*>();
|
|
|
- }
|
|
|
- else if (it.values[0].get_type() == rttr::type::get<char*>()) {
|
|
|
- v = it.values[0].get_value<char*>();
|
|
|
- }
|
|
|
- vec.push_back(v);
|
|
|
- vec.push_back("%," + v);
|
|
|
- vec.push_back(v + ",%");
|
|
|
- vec.push_back("%," + v + ",%");
|
|
|
- result.params.insert(result.params.end(), vec.begin(), vec.end());
|
|
|
- }
|
|
|
+ else if (it.brace == robotics::v3::sql_expression::brace_type::On) {
|
|
|
+ set_sql += fmt::format("({0}{1}?", it.name, symbol_list[it.symbol]);
|
|
|
+ result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
}
|
|
|
- }
|
|
|
- else if (it.brace == robotics::v3::sql_expression::brace_type::On) {
|
|
|
- if (it.symbol != v3::sql_expression::Like) {
|
|
|
- result.sql += fmt::format("({0}{1}?", it.name, symbol_list[it.symbol]);
|
|
|
+ else if (it.brace == robotics::v3::sql_expression::brace_type::Off) {
|
|
|
+ set_sql += fmt::format("{0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
}
|
|
|
- else {
|
|
|
- result.sql += fmt::format("(({0}{1}? or {0}{1}? or {0}{1}? or {0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
- if (!it.values.empty()) {
|
|
|
- std::vector<rttr::variant> vec;
|
|
|
- std::string v;
|
|
|
- if (it.values[0].get_type() == rttr::type::get<std::string>()) {
|
|
|
- v = it.values[0].get_value<std::string>();
|
|
|
- }
|
|
|
- else if (it.values[0].get_type() == rttr::type::get<const char*>()) {
|
|
|
- v = it.values[0].get_value<const char*>();
|
|
|
- }
|
|
|
- else if (it.values[0].get_type() == rttr::type::get<char*>()) {
|
|
|
- v = it.values[0].get_value<char*>();
|
|
|
- }
|
|
|
- vec.push_back(v);
|
|
|
- vec.push_back("%," + v);
|
|
|
- vec.push_back(v + ",%");
|
|
|
- vec.push_back("%," + v + ",%");
|
|
|
- result.params.insert(result.params.end(), vec.begin(), vec.end());
|
|
|
- }
|
|
|
+ else if (it.brace == robotics::v3::sql_expression::brace_type::OnOff) {
|
|
|
+ set_sql += fmt::format("{0}{1}({2})", it.name, symbol_list[it.symbol], robotics::v3::utils::join("?", it.values.size(), ","));
|
|
|
+ result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
}
|
|
|
}
|
|
|
- else if (it.brace == robotics::v3::sql_expression::brace_type::Off) {
|
|
|
- if (it.symbol != v3::sql_expression::Like) {
|
|
|
- result.sql += fmt::format("{0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::And) {
|
|
|
+ set_sql += symbol_list[it.symbol];
|
|
|
+ }
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::Or) {
|
|
|
+ set_sql += symbol_list[it.symbol];
|
|
|
+ }
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::Comma) {
|
|
|
+ set_sql += symbol_list[it.symbol];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //条件
|
|
|
+ for (auto& it : where_param) {
|
|
|
+ if (it.symbol > 0 && it.symbol < robotics::v3::sql_expression::And) {
|
|
|
+ if (it.brace == robotics::v3::sql_expression::brace_type::Not) {
|
|
|
+ where_sql += fmt::format("{0}{1}?", it.name, symbol_list[it.symbol]);
|
|
|
result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
}
|
|
|
- else {
|
|
|
- result.sql += fmt::format("({0}{1}? or {0}{1}? or {0}{1}? or {0}{1}?))", it.name, symbol_list[it.symbol]);
|
|
|
- if (!it.values.empty()) {
|
|
|
- std::vector<rttr::variant> vec;
|
|
|
- std::string v;
|
|
|
- if (it.values[0].get_type() == rttr::type::get<std::string>()) {
|
|
|
- v = it.values[0].get_value<std::string>();
|
|
|
- }
|
|
|
- else if (it.values[0].get_type() == rttr::type::get<const char*>()) {
|
|
|
- v = it.values[0].get_value<const char*>();
|
|
|
- }
|
|
|
- else if (it.values[0].get_type() == rttr::type::get<char*>()) {
|
|
|
- v = it.values[0].get_value<char*>();
|
|
|
- }
|
|
|
- vec.push_back(v);
|
|
|
- vec.push_back("%," + v);
|
|
|
- vec.push_back(v + ",%");
|
|
|
- vec.push_back("%," + v + ",%");
|
|
|
- result.params.insert(result.params.end(), vec.begin(), vec.end());
|
|
|
- }
|
|
|
+ else if (it.brace == robotics::v3::sql_expression::brace_type::On) {
|
|
|
+ where_sql += fmt::format("({0}{1}?", it.name, symbol_list[it.symbol]);
|
|
|
+ result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
}
|
|
|
- }
|
|
|
- else if (it.brace == robotics::v3::sql_expression::brace_type::OnOff) {
|
|
|
- if (it.symbol != v3::sql_expression::Like) {
|
|
|
- result.sql += fmt::format("{0}{1}({2})", it.name, symbol_list[it.symbol], robotics::v3::utils::join("?", it.values.size(), ","));
|
|
|
+ else if (it.brace == robotics::v3::sql_expression::brace_type::Off) {
|
|
|
+ where_sql += fmt::format("{0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
+ result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ }
|
|
|
+ else if (it.brace == robotics::v3::sql_expression::brace_type::OnOff) {
|
|
|
+ where_sql += fmt::format("{0}{1}({2})", it.name, symbol_list[it.symbol], robotics::v3::utils::join("?", it.values.size(), ","));
|
|
|
result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
}
|
|
|
+ }
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::And) {
|
|
|
+ where_sql += symbol_list[it.symbol];
|
|
|
+ }
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::Or) {
|
|
|
+ where_sql += symbol_list[it.symbol];
|
|
|
+ }
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::Comma) {
|
|
|
+ where_sql += symbol_list[it.symbol];
|
|
|
+ }
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::OrderBy) {
|
|
|
+ where_sql += symbol_list[it.symbol] + order_by_join(it.order_by);
|
|
|
+ }
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::Limit) {
|
|
|
+ if (it.limit.first == 0) {
|
|
|
+ result.sql += fmt::format("{0}{1}", symbol_list[it.symbol], it.limit.second);
|
|
|
+ }
|
|
|
else {
|
|
|
- result.sql += fmt::format("({0}{1}? or {0}{1}? or {0}{1}? or {0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
- if (!it.values.empty()) {
|
|
|
- std::vector<rttr::variant> vec;
|
|
|
- std::string v;
|
|
|
- if (it.values[0].get_type() == rttr::type::get<std::string>()) {
|
|
|
- v = it.values[0].get_value<std::string>();
|
|
|
- }
|
|
|
- else if (it.values[0].get_type() == rttr::type::get<const char*>()) {
|
|
|
- v = it.values[0].get_value<const char*>();
|
|
|
- }
|
|
|
- else if (it.values[0].get_type() == rttr::type::get<char*>()) {
|
|
|
- v = it.values[0].get_value<char*>();
|
|
|
- }
|
|
|
- vec.push_back(v);
|
|
|
- vec.push_back("%," + v);
|
|
|
- vec.push_back(v + ",%");
|
|
|
- vec.push_back("%," + v + ",%");
|
|
|
- result.params.insert(result.params.end(), vec.begin(), vec.end());
|
|
|
- }
|
|
|
+ result.sql += fmt::format("{0}{1},{2}", symbol_list[it.symbol], (it.limit.first - 1) * it.limit.second, it.limit.second);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::And) {
|
|
|
- result.sql += symbol_list[it.symbol];
|
|
|
- }
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::Or) {
|
|
|
- result.sql += symbol_list[it.symbol];
|
|
|
- }
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::Comma) {
|
|
|
- result.sql += symbol_list[it.symbol];
|
|
|
- }
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::OrderBy) {
|
|
|
- result.sql += symbol_list[it.symbol] + order_by_join(it.order_by);
|
|
|
+
|
|
|
+ if (where_sql.empty()) {
|
|
|
+ result.sql = fmt::format("update {0} set {1};", table_name_, set_sql);
|
|
|
}
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::Limit) {
|
|
|
- if (it.limit.first == 0) {
|
|
|
- result.sql += fmt::format("{0}{1}", symbol_list[it.symbol], it.limit.second);
|
|
|
- }
|
|
|
- else {
|
|
|
- result.sql += fmt::format("{0}{1},{2}", symbol_list[it.symbol], (it.limit.first - 1) * it.limit.second, it.limit.second);
|
|
|
- }
|
|
|
+ else {
|
|
|
+ result.sql = fmt::format("update {0} set {1} where {2};", table_name_, set_sql, where_sql);
|
|
|
}
|
|
|
+
|
|
|
+ return result;
|
|
|
}
|
|
|
- result.sql += ";";
|
|
|
- return result;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 查询数量
|
|
|
- * @param symbol_list
|
|
|
- * @return
|
|
|
- */
|
|
|
- robotics::v3::sql_param count(std::map<robotics::v3::sql_expression::symbol_type, std::string>& symbol_list) {
|
|
|
- robotics::v3::sql_param result = { "",true, type_ ,{} };
|
|
|
- result.sql = fmt::format("select count(0) as count from {0} where ", table_name_);
|
|
|
- for (auto& it : sql_params_) {
|
|
|
- if (it.symbol > 0 && it.symbol < robotics::v3::sql_expression::And) {
|
|
|
- if (it.brace == robotics::v3::sql_expression::brace_type::Not) {
|
|
|
- if (it.symbol != v3::sql_expression::Like) {
|
|
|
- result.sql += fmt::format("{0}{1}?", it.name, symbol_list[it.symbol]);
|
|
|
- result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
- }
|
|
|
- else {
|
|
|
- result.sql += fmt::format("({0}{1}? or {0}{1}? or {0}{1}? or {0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
- if (!it.values.empty()) {
|
|
|
- std::vector<rttr::variant> vec;
|
|
|
- std::string v;
|
|
|
- if (it.values[0].get_type() == rttr::type::get<std::string>()) {
|
|
|
- v = it.values[0].get_value<std::string>();
|
|
|
- }
|
|
|
- else if (it.values[0].get_type() == rttr::type::get<const char*>()) {
|
|
|
- v = it.values[0].get_value<const char*>();
|
|
|
- }
|
|
|
- else if (it.values[0].get_type() == rttr::type::get<char*>()) {
|
|
|
- v = it.values[0].get_value<char*>();
|
|
|
+ /**
|
|
|
+ * @brief 查询
|
|
|
+ * @param symbol_list
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ robotics::v3::sql_param select(std::map<robotics::v3::sql_expression::symbol_type, std::string>& symbol_list) {
|
|
|
+ robotics::v3::sql_param result = { "",true, type_ ,{} };
|
|
|
+ result.sql = fmt::format("select * from {0} where ", table_name_);
|
|
|
+ for (auto& it : sql_params_) {
|
|
|
+ if (it.symbol > 0 && it.symbol < robotics::v3::sql_expression::And) {
|
|
|
+ if (it.brace == robotics::v3::sql_expression::brace_type::Not) {
|
|
|
+ if (it.symbol != v3::sql_expression::Like) {
|
|
|
+ result.sql += fmt::format("{0}{1}?", it.name, symbol_list[it.symbol]);
|
|
|
+ result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ result.sql += fmt::format("({0}{1}? or {0}{1}? or {0}{1}? or {0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
+ if (!it.values.empty()) {
|
|
|
+ std::vector<rttr::variant> vec;
|
|
|
+ std::string v;
|
|
|
+ if (it.values[0].get_type() == rttr::type::get<std::string>()) {
|
|
|
+ v = it.values[0].get_value<std::string>();
|
|
|
+ }
|
|
|
+ else if (it.values[0].get_type() == rttr::type::get<const char*>()) {
|
|
|
+ v = it.values[0].get_value<const char*>();
|
|
|
+ }
|
|
|
+ else if (it.values[0].get_type() == rttr::type::get<char*>()) {
|
|
|
+ v = it.values[0].get_value<char*>();
|
|
|
+ }
|
|
|
+ vec.push_back(v);
|
|
|
+ vec.push_back("%," + v);
|
|
|
+ vec.push_back(v + ",%");
|
|
|
+ vec.push_back("%," + v + ",%");
|
|
|
+ result.params.insert(result.params.end(), vec.begin(), vec.end());
|
|
|
}
|
|
|
- vec.push_back(v);
|
|
|
- vec.push_back("%," + v);
|
|
|
- vec.push_back(v + ",%");
|
|
|
- vec.push_back("%," + v + ",%");
|
|
|
- result.params.insert(result.params.end(), vec.begin(), vec.end());
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- else if (it.brace == robotics::v3::sql_expression::brace_type::On) {
|
|
|
- if (it.symbol != v3::sql_expression::Like) {
|
|
|
- result.sql += fmt::format("({0}{1}?", it.name, symbol_list[it.symbol]);
|
|
|
- result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
- }
|
|
|
- else {
|
|
|
- result.sql += fmt::format("(({0}{1}? or {0}{1}? or {0}{1}? or {0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
- if (!it.values.empty()) {
|
|
|
- std::vector<rttr::variant> vec;
|
|
|
- std::string v;
|
|
|
- if (it.values[0].get_type() == rttr::type::get<std::string>()) {
|
|
|
- v = it.values[0].get_value<std::string>();
|
|
|
+ else if (it.brace == robotics::v3::sql_expression::brace_type::On) {
|
|
|
+ if (it.symbol != v3::sql_expression::Like) {
|
|
|
+ result.sql += fmt::format("({0}{1}?", it.name, symbol_list[it.symbol]);
|
|
|
+ result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ result.sql += fmt::format("(({0}{1}? or {0}{1}? or {0}{1}? or {0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
+ if (!it.values.empty()) {
|
|
|
+ std::vector<rttr::variant> vec;
|
|
|
+ std::string v;
|
|
|
+ if (it.values[0].get_type() == rttr::type::get<std::string>()) {
|
|
|
+ v = it.values[0].get_value<std::string>();
|
|
|
+ }
|
|
|
+ else if (it.values[0].get_type() == rttr::type::get<const char*>()) {
|
|
|
+ v = it.values[0].get_value<const char*>();
|
|
|
+ }
|
|
|
+ else if (it.values[0].get_type() == rttr::type::get<char*>()) {
|
|
|
+ v = it.values[0].get_value<char*>();
|
|
|
+ }
|
|
|
+ vec.push_back(v);
|
|
|
+ vec.push_back("%," + v);
|
|
|
+ vec.push_back(v + ",%");
|
|
|
+ vec.push_back("%," + v + ",%");
|
|
|
+ result.params.insert(result.params.end(), vec.begin(), vec.end());
|
|
|
}
|
|
|
- else if (it.values[0].get_type() == rttr::type::get<const char*>()) {
|
|
|
- v = it.values[0].get_value<const char*>();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (it.brace == robotics::v3::sql_expression::brace_type::Off) {
|
|
|
+ if (it.symbol != v3::sql_expression::Like) {
|
|
|
+ result.sql += fmt::format("{0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
+ result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ result.sql += fmt::format("({0}{1}? or {0}{1}? or {0}{1}? or {0}{1}?))", it.name, symbol_list[it.symbol]);
|
|
|
+ if (!it.values.empty()) {
|
|
|
+ std::vector<rttr::variant> vec;
|
|
|
+ std::string v;
|
|
|
+ if (it.values[0].get_type() == rttr::type::get<std::string>()) {
|
|
|
+ v = it.values[0].get_value<std::string>();
|
|
|
+ }
|
|
|
+ else if (it.values[0].get_type() == rttr::type::get<const char*>()) {
|
|
|
+ v = it.values[0].get_value<const char*>();
|
|
|
+ }
|
|
|
+ else if (it.values[0].get_type() == rttr::type::get<char*>()) {
|
|
|
+ v = it.values[0].get_value<char*>();
|
|
|
+ }
|
|
|
+ vec.push_back(v);
|
|
|
+ vec.push_back("%," + v);
|
|
|
+ vec.push_back(v + ",%");
|
|
|
+ vec.push_back("%," + v + ",%");
|
|
|
+ result.params.insert(result.params.end(), vec.begin(), vec.end());
|
|
|
}
|
|
|
- else if (it.values[0].get_type() == rttr::type::get<char*>()) {
|
|
|
- v = it.values[0].get_value<char*>();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (it.brace == robotics::v3::sql_expression::brace_type::OnOff) {
|
|
|
+ if (it.symbol != v3::sql_expression::Like) {
|
|
|
+ result.sql += fmt::format("{0}{1}({2})", it.name, symbol_list[it.symbol], robotics::v3::utils::join("?", it.values.size(), ","));
|
|
|
+ result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ result.sql += fmt::format("({0}{1}? or {0}{1}? or {0}{1}? or {0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
+ if (!it.values.empty()) {
|
|
|
+ std::vector<rttr::variant> vec;
|
|
|
+ std::string v;
|
|
|
+ if (it.values[0].get_type() == rttr::type::get<std::string>()) {
|
|
|
+ v = it.values[0].get_value<std::string>();
|
|
|
+ }
|
|
|
+ else if (it.values[0].get_type() == rttr::type::get<const char*>()) {
|
|
|
+ v = it.values[0].get_value<const char*>();
|
|
|
+ }
|
|
|
+ else if (it.values[0].get_type() == rttr::type::get<char*>()) {
|
|
|
+ v = it.values[0].get_value<char*>();
|
|
|
+ }
|
|
|
+ vec.push_back(v);
|
|
|
+ vec.push_back("%," + v);
|
|
|
+ vec.push_back(v + ",%");
|
|
|
+ vec.push_back("%," + v + ",%");
|
|
|
+ result.params.insert(result.params.end(), vec.begin(), vec.end());
|
|
|
}
|
|
|
- vec.push_back(v);
|
|
|
- vec.push_back("%," + v);
|
|
|
- vec.push_back(v + ",%");
|
|
|
- vec.push_back("%," + v + ",%");
|
|
|
- result.params.insert(result.params.end(), vec.begin(), vec.end());
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- else if (it.brace == robotics::v3::sql_expression::brace_type::Off) {
|
|
|
- if (it.symbol != v3::sql_expression::Like) {
|
|
|
- result.sql += fmt::format("{0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
- result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::And) {
|
|
|
+ result.sql += symbol_list[it.symbol];
|
|
|
+ }
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::Or) {
|
|
|
+ result.sql += symbol_list[it.symbol];
|
|
|
+ }
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::Comma) {
|
|
|
+ result.sql += symbol_list[it.symbol];
|
|
|
+ }
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::OrderBy) {
|
|
|
+ result.sql += symbol_list[it.symbol] + order_by_join(it.order_by);
|
|
|
+ }
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::Limit) {
|
|
|
+ if (it.limit.first == 0) {
|
|
|
+ result.sql += fmt::format("{0}{1}", symbol_list[it.symbol], it.limit.second);
|
|
|
}
|
|
|
else {
|
|
|
- result.sql += fmt::format("({0}{1}? or {0}{1}? or {0}{1}? or {0}{1}?))", it.name, symbol_list[it.symbol]);
|
|
|
- if (!it.values.empty()) {
|
|
|
- std::vector<rttr::variant> vec;
|
|
|
- std::string v;
|
|
|
- if (it.values[0].get_type() == rttr::type::get<std::string>()) {
|
|
|
- v = it.values[0].get_value<std::string>();
|
|
|
- }
|
|
|
- else if (it.values[0].get_type() == rttr::type::get<const char*>()) {
|
|
|
- v = it.values[0].get_value<const char*>();
|
|
|
- }
|
|
|
- else if (it.values[0].get_type() == rttr::type::get<char*>()) {
|
|
|
- v = it.values[0].get_value<char*>();
|
|
|
- }
|
|
|
- vec.push_back(v);
|
|
|
- vec.push_back("%," + v);
|
|
|
- vec.push_back(v + ",%");
|
|
|
- vec.push_back("%," + v + ",%");
|
|
|
- result.params.insert(result.params.end(), vec.begin(), vec.end());
|
|
|
- }
|
|
|
+ result.sql += fmt::format("{0}{1},{2}", symbol_list[it.symbol], (it.limit.first - 1) * it.limit.second, it.limit.second);
|
|
|
}
|
|
|
}
|
|
|
- else if (it.brace == robotics::v3::sql_expression::brace_type::OnOff) {
|
|
|
- if (it.symbol != v3::sql_expression::Like) {
|
|
|
- result.sql += fmt::format("{0}{1}({2})", it.name, symbol_list[it.symbol], robotics::v3::utils::join("?", it.values.size(), ","));
|
|
|
- result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ }
|
|
|
+ result.sql += ";";
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * @brief 查询数量
|
|
|
+ * @param symbol_list
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ robotics::v3::sql_param count(std::map<robotics::v3::sql_expression::symbol_type, std::string>& symbol_list) {
|
|
|
+ robotics::v3::sql_param result = { "",true, type_ ,{} };
|
|
|
+ result.sql = fmt::format("select count(0) as count from {0} where ", table_name_);
|
|
|
+ for (auto& it : sql_params_) {
|
|
|
+ if (it.symbol > 0 && it.symbol < robotics::v3::sql_expression::And) {
|
|
|
+ if (it.brace == robotics::v3::sql_expression::brace_type::Not) {
|
|
|
+ if (it.symbol != v3::sql_expression::Like) {
|
|
|
+ result.sql += fmt::format("{0}{1}?", it.name, symbol_list[it.symbol]);
|
|
|
+ result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ result.sql += fmt::format("({0}{1}? or {0}{1}? or {0}{1}? or {0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
+ if (!it.values.empty()) {
|
|
|
+ std::vector<rttr::variant> vec;
|
|
|
+ std::string v;
|
|
|
+ if (it.values[0].get_type() == rttr::type::get<std::string>()) {
|
|
|
+ v = it.values[0].get_value<std::string>();
|
|
|
+ }
|
|
|
+ else if (it.values[0].get_type() == rttr::type::get<const char*>()) {
|
|
|
+ v = it.values[0].get_value<const char*>();
|
|
|
+ }
|
|
|
+ else if (it.values[0].get_type() == rttr::type::get<char*>()) {
|
|
|
+ v = it.values[0].get_value<char*>();
|
|
|
+ }
|
|
|
+ vec.push_back(v);
|
|
|
+ vec.push_back("%," + v);
|
|
|
+ vec.push_back(v + ",%");
|
|
|
+ vec.push_back("%," + v + ",%");
|
|
|
+ result.params.insert(result.params.end(), vec.begin(), vec.end());
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- else {
|
|
|
- result.sql += fmt::format("({0}{1}? or {0}{1}? or {0}{1}? or {0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
- if (!it.values.empty()) {
|
|
|
- std::vector<rttr::variant> vec;
|
|
|
- std::string v;
|
|
|
- if (it.values[0].get_type() == rttr::type::get<std::string>()) {
|
|
|
- v = it.values[0].get_value<std::string>();
|
|
|
+ else if (it.brace == robotics::v3::sql_expression::brace_type::On) {
|
|
|
+ if (it.symbol != v3::sql_expression::Like) {
|
|
|
+ result.sql += fmt::format("({0}{1}?", it.name, symbol_list[it.symbol]);
|
|
|
+ result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ result.sql += fmt::format("(({0}{1}? or {0}{1}? or {0}{1}? or {0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
+ if (!it.values.empty()) {
|
|
|
+ std::vector<rttr::variant> vec;
|
|
|
+ std::string v;
|
|
|
+ if (it.values[0].get_type() == rttr::type::get<std::string>()) {
|
|
|
+ v = it.values[0].get_value<std::string>();
|
|
|
+ }
|
|
|
+ else if (it.values[0].get_type() == rttr::type::get<const char*>()) {
|
|
|
+ v = it.values[0].get_value<const char*>();
|
|
|
+ }
|
|
|
+ else if (it.values[0].get_type() == rttr::type::get<char*>()) {
|
|
|
+ v = it.values[0].get_value<char*>();
|
|
|
+ }
|
|
|
+ vec.push_back(v);
|
|
|
+ vec.push_back("%," + v);
|
|
|
+ vec.push_back(v + ",%");
|
|
|
+ vec.push_back("%," + v + ",%");
|
|
|
+ result.params.insert(result.params.end(), vec.begin(), vec.end());
|
|
|
}
|
|
|
- else if (it.values[0].get_type() == rttr::type::get<const char*>()) {
|
|
|
- v = it.values[0].get_value<const char*>();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (it.brace == robotics::v3::sql_expression::brace_type::Off) {
|
|
|
+ if (it.symbol != v3::sql_expression::Like) {
|
|
|
+ result.sql += fmt::format("{0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
+ result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ result.sql += fmt::format("({0}{1}? or {0}{1}? or {0}{1}? or {0}{1}?))", it.name, symbol_list[it.symbol]);
|
|
|
+ if (!it.values.empty()) {
|
|
|
+ std::vector<rttr::variant> vec;
|
|
|
+ std::string v;
|
|
|
+ if (it.values[0].get_type() == rttr::type::get<std::string>()) {
|
|
|
+ v = it.values[0].get_value<std::string>();
|
|
|
+ }
|
|
|
+ else if (it.values[0].get_type() == rttr::type::get<const char*>()) {
|
|
|
+ v = it.values[0].get_value<const char*>();
|
|
|
+ }
|
|
|
+ else if (it.values[0].get_type() == rttr::type::get<char*>()) {
|
|
|
+ v = it.values[0].get_value<char*>();
|
|
|
+ }
|
|
|
+ vec.push_back(v);
|
|
|
+ vec.push_back("%," + v);
|
|
|
+ vec.push_back(v + ",%");
|
|
|
+ vec.push_back("%," + v + ",%");
|
|
|
+ result.params.insert(result.params.end(), vec.begin(), vec.end());
|
|
|
}
|
|
|
- else if (it.values[0].get_type() == rttr::type::get<char*>()) {
|
|
|
- v = it.values[0].get_value<char*>();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (it.brace == robotics::v3::sql_expression::brace_type::OnOff) {
|
|
|
+ if (it.symbol != v3::sql_expression::Like) {
|
|
|
+ result.sql += fmt::format("{0}{1}({2})", it.name, symbol_list[it.symbol], robotics::v3::utils::join("?", it.values.size(), ","));
|
|
|
+ result.params.insert(result.params.end(), it.values.begin(), it.values.end());
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ result.sql += fmt::format("({0}{1}? or {0}{1}? or {0}{1}? or {0}{1}?)", it.name, symbol_list[it.symbol]);
|
|
|
+ if (!it.values.empty()) {
|
|
|
+ std::vector<rttr::variant> vec;
|
|
|
+ std::string v;
|
|
|
+ if (it.values[0].get_type() == rttr::type::get<std::string>()) {
|
|
|
+ v = it.values[0].get_value<std::string>();
|
|
|
+ }
|
|
|
+ else if (it.values[0].get_type() == rttr::type::get<const char*>()) {
|
|
|
+ v = it.values[0].get_value<const char*>();
|
|
|
+ }
|
|
|
+ else if (it.values[0].get_type() == rttr::type::get<char*>()) {
|
|
|
+ v = it.values[0].get_value<char*>();
|
|
|
+ }
|
|
|
+ vec.push_back(v);
|
|
|
+ vec.push_back("%," + v);
|
|
|
+ vec.push_back(v + ",%");
|
|
|
+ vec.push_back("%," + v + ",%");
|
|
|
+ result.params.insert(result.params.end(), vec.begin(), vec.end());
|
|
|
}
|
|
|
- vec.push_back(v);
|
|
|
- vec.push_back("%," + v);
|
|
|
- vec.push_back(v + ",%");
|
|
|
- vec.push_back("%," + v + ",%");
|
|
|
- result.params.insert(result.params.end(), vec.begin(), vec.end());
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::And) {
|
|
|
+ result.sql += symbol_list[it.symbol];
|
|
|
+ }
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::Or) {
|
|
|
+ result.sql += symbol_list[it.symbol];
|
|
|
+ }
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::Comma) {
|
|
|
+ result.sql += symbol_list[it.symbol];
|
|
|
+ }
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::OrderBy) {
|
|
|
+ result.sql += symbol_list[it.symbol] + order_by_join(it.order_by);
|
|
|
+ }
|
|
|
+ else if (it.symbol == robotics::v3::sql_expression::Limit) {
|
|
|
+ result.sql += fmt::format("{0}{1},{2}", symbol_list[it.symbol], (it.limit.first - 1) * it.limit.second, it.limit.second);
|
|
|
+ }
|
|
|
}
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::And) {
|
|
|
- result.sql += symbol_list[it.symbol];
|
|
|
- }
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::Or) {
|
|
|
- result.sql += symbol_list[it.symbol];
|
|
|
- }
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::Comma) {
|
|
|
- result.sql += symbol_list[it.symbol];
|
|
|
- }
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::OrderBy) {
|
|
|
- result.sql += symbol_list[it.symbol] + order_by_join(it.order_by);
|
|
|
- }
|
|
|
- else if (it.symbol == robotics::v3::sql_expression::Limit) {
|
|
|
- result.sql += fmt::format("{0}{1},{2}", symbol_list[it.symbol], (it.limit.first - 1) * it.limit.second, it.limit.second);
|
|
|
+ result.sql += ";";
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ private:
|
|
|
+ std::string order_by_join(std::vector<std::pair<std::string, robotics::v3::sql_order_by_type>> const& value) {
|
|
|
+ static std::map<robotics::v3::sql_order_by_type, std::string> order_by_list =
|
|
|
+ {
|
|
|
+ {robotics::v3::sql_order_by_type::Asc,"asc"},
|
|
|
+ {robotics::v3::sql_order_by_type::Desc,"desc"}
|
|
|
+ };
|
|
|
+ std::string result;
|
|
|
+ for (auto i = 0; i < value.size(); ++i) {
|
|
|
+ if (value.size() == i + 1) {
|
|
|
+ result += fmt::format("{0} {1}", value[i].first, order_by_list[value[i].second]);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ result += fmt::format("{0} {1},", value[i].first, order_by_list[value[i].second]);
|
|
|
+ }
|
|
|
}
|
|
|
+ return result;
|
|
|
}
|
|
|
- result.sql += ";";
|
|
|
- return result;
|
|
|
- }
|
|
|
- private:
|
|
|
- std::string order_by_join(std::vector<std::pair<std::string, robotics::v3::sql_order_by_type>> const& value) {
|
|
|
- static std::map<robotics::v3::sql_order_by_type, std::string> order_by_list =
|
|
|
- {
|
|
|
- {robotics::v3::sql_order_by_type::Asc,"asc"},
|
|
|
- {robotics::v3::sql_order_by_type::Desc,"desc"}
|
|
|
- };
|
|
|
- std::string result;
|
|
|
- for (auto i = 0; i < value.size(); ++i) {
|
|
|
- if (value.size() == i + 1) {
|
|
|
- result += fmt::format("{0} {1}", value[i].first, order_by_list[value[i].second]);
|
|
|
+ private:
|
|
|
+ robotics::v3::sql_event_type type_ = robotics::v3::sql_event_type::Error;
|
|
|
+ std::string table_name_;
|
|
|
+ std::vector<robotics::v3::sql_expression> sql_params_;
|
|
|
+ };
|
|
|
+ /**
|
|
|
+ * @brief 异常
|
|
|
+ */
|
|
|
+ class sql_linq_category :
|
|
|
+ public boost::system::error_category {
|
|
|
+ public:
|
|
|
+ sql_linq_category(std::string const& err) :
|
|
|
+ err_(err) {
|
|
|
+ }
|
|
|
+ const char* name() const noexcept { return "sql_linq"; }
|
|
|
+ std::string message(int ev) const { return err_; }
|
|
|
+ private:
|
|
|
+ std::string err_;
|
|
|
+ };
|
|
|
+ /**
|
|
|
+ * @brief linq
|
|
|
+ * @tparam _Type
|
|
|
+ */
|
|
|
+ template<typename _Type, typename _SqlType = v3::mysql_linq, typename _ConnConfig = v3::sql_connect_config>
|
|
|
+ class sql_linq {
|
|
|
+ public:
|
|
|
+ sql_linq() {
|
|
|
+ execute_event_ = std::bind_front(v3::on_sql_linq_execute<_ConnConfig>);
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * @brief 重置
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ sql_linq& reset() {
|
|
|
+ if (reset_) {
|
|
|
+ insert_.reset();
|
|
|
+ where_.reset();
|
|
|
+ update_.reset();
|
|
|
}
|
|
|
else {
|
|
|
- result += fmt::format("{0} {1},", value[i].first, order_by_list[value[i].second]);
|
|
|
+ reset_ = true;
|
|
|
}
|
|
|
+ return *this;
|
|
|
}
|
|
|
- return result;
|
|
|
- }
|
|
|
- private:
|
|
|
- robotics::v3::sql_event_type type_ = robotics::v3::sql_event_type::Error;
|
|
|
- std::string table_name_;
|
|
|
- std::vector<robotics::v3::sql_expression> sql_params_;
|
|
|
- };
|
|
|
- /**
|
|
|
- * @brief 异常
|
|
|
- */
|
|
|
- class sql_linq_category :
|
|
|
- public boost::system::error_category {
|
|
|
- public:
|
|
|
- sql_linq_category(std::string const& err) :
|
|
|
- err_(err) {
|
|
|
- }
|
|
|
- const char* name() const noexcept { return "sql_linq"; }
|
|
|
- std::string message(int ev) const { return err_; }
|
|
|
- private:
|
|
|
- std::string err_;
|
|
|
- };
|
|
|
- /**
|
|
|
- * @brief linq
|
|
|
- * @tparam _Type
|
|
|
- */
|
|
|
- template<typename _Type, typename _SqlType = v3::mysql_linq, typename _ConnConfig = v3::sql_connect_config>
|
|
|
- class sql_linq {
|
|
|
- public:
|
|
|
- sql_linq() {
|
|
|
- execute_event_ = std::bind_front(v3::on_sql_linq_execute<_ConnConfig>);
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 重置
|
|
|
- * @return
|
|
|
- */
|
|
|
- sql_linq& reset() {
|
|
|
- if (reset_) {
|
|
|
- insert_.reset();
|
|
|
- where_.reset();
|
|
|
- update_.reset();
|
|
|
+ /**
|
|
|
+ * @brief sql执行回调
|
|
|
+ * @param fn
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ sql_linq& execute_bind(std::function<rttr::variant(sql_param&)> const& fn) {
|
|
|
+ execute_event_ = fn;
|
|
|
+ return *this;
|
|
|
}
|
|
|
- else {
|
|
|
- reset_ = true;
|
|
|
+ /**
|
|
|
+ * @brief 查询
|
|
|
+ * @param fn
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ sql_linq& where(std::function<sql_where<_Type>(sql_where<_Type>)> const& fn) {
|
|
|
+ where_ = fn(where_);
|
|
|
+ sql_event_type_ = sql_event_type::Select;
|
|
|
+ return *this;
|
|
|
}
|
|
|
- return *this;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief sql执行回调
|
|
|
- * @param fn
|
|
|
- * @return
|
|
|
- */
|
|
|
- sql_linq& execute_bind(std::function<rttr::variant(sql_param&)> const& fn) {
|
|
|
- execute_event_ = fn;
|
|
|
- return *this;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 查询
|
|
|
- * @param fn
|
|
|
- * @return
|
|
|
- */
|
|
|
- sql_linq& where(std::function<sql_where<_Type>(sql_where<_Type>)> const& fn) {
|
|
|
- where_ = fn(where_);
|
|
|
- sql_event_type_ = sql_event_type::Select;
|
|
|
- return *this;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 查询
|
|
|
- * @param fn
|
|
|
- * @return
|
|
|
- */
|
|
|
- sql_linq& where_web(std::function<sql_where_web<_Type>(sql_where_web<_Type>)> const& fn) {
|
|
|
- sql_where_web<_Type> ret = fn(sql_where_web<_Type>());
|
|
|
- where_ = ret;
|
|
|
- sql_event_type_ = sql_event_type::Select;
|
|
|
- return *this;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 分页
|
|
|
- * @param page
|
|
|
- * @param page_size
|
|
|
- * @return
|
|
|
- */
|
|
|
- sql_linq& limit(unsigned int page, unsigned int page_size) {
|
|
|
- where_.add_limit(page, page_size);
|
|
|
- sql_event_type_ = sql_event_type::Select;
|
|
|
- return *this;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 排序
|
|
|
- * @param sql_order_by
|
|
|
- * @return
|
|
|
- */
|
|
|
- sql_linq& order_by(std::function<sql_order_by<_Type>(sql_order_by<_Type>)> const& fn) {
|
|
|
- where_.add_order_by(fn(sql_order_by<_Type>()));
|
|
|
- sql_event_type_ = sql_event_type::Select;
|
|
|
- return *this;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 更新
|
|
|
- * @param fn
|
|
|
- * @return
|
|
|
- */
|
|
|
- sql_linq& update(std::function<sql_update<_Type>(sql_update<_Type>)> const& fn) {
|
|
|
- update_ = fn(update_);
|
|
|
- sql_event_type_ = sql_event_type::Update;
|
|
|
- return *this;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 删除
|
|
|
- * @return
|
|
|
- */
|
|
|
- sql_linq& remove() {
|
|
|
- sql_event_type_ = sql_event_type::Delete;
|
|
|
- return *this;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 插入
|
|
|
- * @param fn
|
|
|
- * @return
|
|
|
- */
|
|
|
- sql_linq& insert(std::function<sql_insert<_Type>(sql_insert<_Type>)> const& fn) {
|
|
|
- insert_ = fn(insert_);
|
|
|
- sql_event_type_ = sql_event_type::Insert;
|
|
|
- return *this;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 添加
|
|
|
- * @param value
|
|
|
- * @return
|
|
|
- */
|
|
|
- sql_linq& insert(_Type const& value) {
|
|
|
- insert_.add(value);
|
|
|
- sql_event_type_ = sql_event_type::Insert;
|
|
|
- return *this;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 数量
|
|
|
- * @return
|
|
|
- */
|
|
|
- sql_linq& count() {
|
|
|
- sql_event_type_ = sql_event_type::Count;
|
|
|
- return *this;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 不清空条件语句
|
|
|
- * @return
|
|
|
- */
|
|
|
- sql_linq& count_no_reset() {
|
|
|
- reset_ = false;
|
|
|
- sql_event_type_ = sql_event_type::Count;
|
|
|
- return *this;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 提交
|
|
|
- * @return
|
|
|
- */
|
|
|
- sql_linq& submit(rttr::variant& value) {
|
|
|
- sql_param param = { "",false, sql_event_type_ ,{} };
|
|
|
- //插入
|
|
|
- if (sql_event_type::Insert == sql_event_type_) {
|
|
|
- param = _SqlType(insert_, std::string(rttr::type::get<_Type>().get_name()), sql_event_type_);
|
|
|
- reset();
|
|
|
- }
|
|
|
- //删除
|
|
|
- else if (sql_event_type::Delete == sql_event_type_) {
|
|
|
- param = _SqlType(where_, std::string(rttr::type::get<_Type>().get_name()), sql_event_type_);
|
|
|
- reset();
|
|
|
- }
|
|
|
- //更新
|
|
|
- else if (sql_event_type::Update == sql_event_type_) {
|
|
|
- std::vector<sql_expression> where_param = where_;
|
|
|
- std::vector<sql_expression> update_param = update_;
|
|
|
- where_param.push_back(sql_expression{ "",sql_expression::Separator,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
- where_param.insert(where_param.end(), update_param.begin(), update_param.end());
|
|
|
- param = _SqlType(where_param, std::string(rttr::type::get<_Type>().get_name()), sql_event_type_);
|
|
|
- reset();
|
|
|
- }
|
|
|
- //查询
|
|
|
- else if (sql_event_type::Select == sql_event_type_) {
|
|
|
- param = _SqlType(where_, std::string(rttr::type::get<_Type>().get_name()), sql_event_type_);
|
|
|
- param.result = std::vector<_Type>();
|
|
|
- reset();
|
|
|
- }
|
|
|
- //数量
|
|
|
- else if (sql_event_type::Count == sql_event_type_) {
|
|
|
- param = _SqlType(where_, std::string(rttr::type::get<_Type>().get_name()), sql_event_type_);
|
|
|
- reset();
|
|
|
- }
|
|
|
- else {
|
|
|
+ /**
|
|
|
+ * @brief 查询
|
|
|
+ * @param fn
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ sql_linq& where_web(std::function<sql_where_web<_Type>(sql_where_web<_Type>)> const& fn) {
|
|
|
+ sql_where_web<_Type> ret = fn(sql_where_web<_Type>());
|
|
|
+ where_ = ret;
|
|
|
+ sql_event_type_ = sql_event_type::Select;
|
|
|
return *this;
|
|
|
}
|
|
|
- if (execute_event_) {
|
|
|
- try {
|
|
|
- value = execute_event_(param);
|
|
|
+ /**
|
|
|
+ * @brief 分页
|
|
|
+ * @param page
|
|
|
+ * @param page_size
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ sql_linq& limit(unsigned int page, unsigned int page_size) {
|
|
|
+ where_.add_limit(page, page_size);
|
|
|
+ sql_event_type_ = sql_event_type::Select;
|
|
|
+ return *this;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * @brief 排序
|
|
|
+ * @param sql_order_by
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ sql_linq& order_by(std::function<sql_order_by<_Type>(sql_order_by<_Type>)> const& fn) {
|
|
|
+ where_.add_order_by(fn(sql_order_by<_Type>()));
|
|
|
+ sql_event_type_ = sql_event_type::Select;
|
|
|
+ return *this;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * @brief 更新
|
|
|
+ * @param fn
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ sql_linq& update(std::function<sql_update<_Type>(sql_update<_Type>)> const& fn) {
|
|
|
+ update_ = fn(update_);
|
|
|
+ sql_event_type_ = sql_event_type::Update;
|
|
|
+ return *this;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * @brief 删除
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ sql_linq& remove() {
|
|
|
+ sql_event_type_ = sql_event_type::Delete;
|
|
|
+ return *this;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * @brief 插入
|
|
|
+ * @param fn
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ sql_linq& insert(std::function<sql_insert<_Type>(sql_insert<_Type>)> const& fn) {
|
|
|
+ insert_ = fn(insert_);
|
|
|
+ sql_event_type_ = sql_event_type::Insert;
|
|
|
+ return *this;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * @brief 添加
|
|
|
+ * @param value
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ sql_linq& insert(_Type const& value) {
|
|
|
+ insert_.add(value);
|
|
|
+ sql_event_type_ = sql_event_type::Insert;
|
|
|
+ return *this;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * @brief 数量
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ sql_linq& count() {
|
|
|
+ sql_event_type_ = sql_event_type::Count;
|
|
|
+ return *this;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * @brief 不清空条件语句
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ sql_linq& count_no_reset() {
|
|
|
+ reset_ = false;
|
|
|
+ sql_event_type_ = sql_event_type::Count;
|
|
|
+ return *this;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * @brief 提交
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ sql_linq& submit(rttr::variant& value) {
|
|
|
+ sql_param param = { "",false, sql_event_type_ ,{} };
|
|
|
+ //插入
|
|
|
+ if (sql_event_type::Insert == sql_event_type_) {
|
|
|
+ param = _SqlType(insert_, std::string(rttr::type::get<_Type>().get_name()), sql_event_type_);
|
|
|
+ reset();
|
|
|
}
|
|
|
- catch (std::exception const& ec) {
|
|
|
- error_code_ = -1;
|
|
|
- error_message_ = ec.what();
|
|
|
+ //删除
|
|
|
+ else if (sql_event_type::Delete == sql_event_type_) {
|
|
|
+ param = _SqlType(where_, std::string(rttr::type::get<_Type>().get_name()), sql_event_type_);
|
|
|
+ reset();
|
|
|
}
|
|
|
+ //更新
|
|
|
+ else if (sql_event_type::Update == sql_event_type_) {
|
|
|
+ std::vector<sql_expression> where_param = where_;
|
|
|
+ std::vector<sql_expression> update_param = update_;
|
|
|
+ where_param.push_back(sql_expression{ "",sql_expression::Separator,{},sql_expression::Not,std::pair(0, 0),{} });
|
|
|
+ where_param.insert(where_param.end(), update_param.begin(), update_param.end());
|
|
|
+ param = _SqlType(where_param, std::string(rttr::type::get<_Type>().get_name()), sql_event_type_);
|
|
|
+ reset();
|
|
|
+ }
|
|
|
+ //查询
|
|
|
+ else if (sql_event_type::Select == sql_event_type_) {
|
|
|
+ param = _SqlType(where_, std::string(rttr::type::get<_Type>().get_name()), sql_event_type_);
|
|
|
+ param.result = std::vector<_Type>();
|
|
|
+ reset();
|
|
|
+ }
|
|
|
+ //数量
|
|
|
+ else if (sql_event_type::Count == sql_event_type_) {
|
|
|
+ param = _SqlType(where_, std::string(rttr::type::get<_Type>().get_name()), sql_event_type_);
|
|
|
+ reset();
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return *this;
|
|
|
+ }
|
|
|
+ if (execute_event_) {
|
|
|
+ try {
|
|
|
+ value = execute_event_(param);
|
|
|
+ }
|
|
|
+ catch (std::exception const& ec) {
|
|
|
+ error_code_ = -1;
|
|
|
+ error_message_ = ec.what();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return *this;
|
|
|
}
|
|
|
- return *this;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 提交
|
|
|
- * @return
|
|
|
- */
|
|
|
- sql_linq& submit() {
|
|
|
- submit(value_);
|
|
|
- return *this;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 提交
|
|
|
- * @tparam _Ret
|
|
|
- * @param value
|
|
|
- * @return
|
|
|
- */
|
|
|
- template<typename _Ret>
|
|
|
- sql_linq& submit(_Ret& value) {
|
|
|
- rttr::variant ret;
|
|
|
- submit(ret);
|
|
|
- if (ret.get_type() == rttr::type::get<_Ret>()) {
|
|
|
- value = ret.get_value<_Ret>();
|
|
|
- }
|
|
|
- return *this;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 提交
|
|
|
- * @param value
|
|
|
- * @return
|
|
|
- */
|
|
|
- sql_linq& submit(std::vector<_Type>& value) {
|
|
|
- rttr::variant ret;
|
|
|
- submit(ret);
|
|
|
- if (ret.get_type() == rttr::type::get<std::vector<_Type>>()) {
|
|
|
- value = ret.get_value<std::vector<_Type>>();
|
|
|
+ /**
|
|
|
+ * @brief 提交
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ sql_linq& submit() {
|
|
|
+ submit(value_);
|
|
|
+ return *this;
|
|
|
}
|
|
|
- return *this;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 错误
|
|
|
- * @param message
|
|
|
- * @param code
|
|
|
- * @return
|
|
|
- */
|
|
|
- sql_linq& error(std::string& message, int& code) {
|
|
|
- if (error_code_ != 0) {
|
|
|
- code = error_code_;
|
|
|
- message = error_message_;
|
|
|
+ /**
|
|
|
+ * @brief 提交
|
|
|
+ * @tparam _Ret
|
|
|
+ * @param value
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ template<typename _Ret>
|
|
|
+ sql_linq& submit(_Ret& value) {
|
|
|
+ rttr::variant ret;
|
|
|
+ submit(ret);
|
|
|
+ if (ret.get_type() == rttr::type::get<_Ret>()) {
|
|
|
+ value = ret.get_value<_Ret>();
|
|
|
+ }
|
|
|
+ return *this;
|
|
|
}
|
|
|
- return *this;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 错误
|
|
|
- * @param message
|
|
|
- * @param success
|
|
|
- * @return
|
|
|
- */
|
|
|
- sql_linq& error(std::string& message, bool& success) {
|
|
|
- if (error_code_ != 0) {
|
|
|
- success = false;
|
|
|
- message = error_message_;
|
|
|
+ /**
|
|
|
+ * @brief 提交
|
|
|
+ * @param value
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ sql_linq& submit(std::vector<_Type>& value) {
|
|
|
+ rttr::variant ret;
|
|
|
+ submit(ret);
|
|
|
+ if (ret.get_type() == rttr::type::get<std::vector<_Type>>()) {
|
|
|
+ value = ret.get_value<std::vector<_Type>>();
|
|
|
+ }
|
|
|
+ return *this;
|
|
|
}
|
|
|
- return *this;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 错误
|
|
|
- * @param code
|
|
|
- * @return
|
|
|
- */
|
|
|
- sql_linq& error(int& code) {
|
|
|
- if (error_code_ != 0) {
|
|
|
- code = error_code_;
|
|
|
+ /**
|
|
|
+ * @brief 错误
|
|
|
+ * @param message
|
|
|
+ * @param code
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ sql_linq& error(std::string& message, int& code) {
|
|
|
+ if (error_code_ != 0) {
|
|
|
+ code = error_code_;
|
|
|
+ message = error_message_;
|
|
|
+ }
|
|
|
+ return *this;
|
|
|
}
|
|
|
- return *this;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief 错误
|
|
|
- * @param message
|
|
|
- * @return
|
|
|
- */
|
|
|
- sql_linq& error(std::string& message) {
|
|
|
- if (error_code_ != 0) {
|
|
|
- message = error_message_;
|
|
|
+ /**
|
|
|
+ * @brief 错误
|
|
|
+ * @param message
|
|
|
+ * @param success
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ sql_linq& error(std::string& message, bool& success) {
|
|
|
+ if (error_code_ != 0) {
|
|
|
+ success = false;
|
|
|
+ message = error_message_;
|
|
|
+ }
|
|
|
+ return *this;
|
|
|
}
|
|
|
- return *this;
|
|
|
- }
|
|
|
- /**
|
|
|
- * @brief
|
|
|
- * @return
|
|
|
- */
|
|
|
- std::shared_ptr<_Type> first() {
|
|
|
- std::shared_ptr<_Type> result;
|
|
|
- std::vector<_Type> values = value_.get_value<std::vector<_Type>>();
|
|
|
- if (!values.empty()) {
|
|
|
- result.reset(new _Type(values[0]));
|
|
|
+ /**
|
|
|
+ * @brief 错误
|
|
|
+ * @param code
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ sql_linq& error(int& code) {
|
|
|
+ if (error_code_ != 0) {
|
|
|
+ code = error_code_;
|
|
|
+ }
|
|
|
+ return *this;
|
|
|
}
|
|
|
- return result;
|
|
|
- }
|
|
|
- operator std::shared_ptr<_Type>() {
|
|
|
- return first();
|
|
|
- }
|
|
|
- template<typename _Ret>
|
|
|
- operator _Ret() {
|
|
|
- if constexpr (std::is_same<rttr::variant, _Ret>::value) {
|
|
|
- return value_;
|
|
|
+ /**
|
|
|
+ * @brief 错误
|
|
|
+ * @param message
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ sql_linq& error(std::string& message) {
|
|
|
+ if (error_code_ != 0) {
|
|
|
+ message = error_message_;
|
|
|
+ }
|
|
|
+ return *this;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * @brief
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ std::shared_ptr<_Type> first() {
|
|
|
+ std::shared_ptr<_Type> result;
|
|
|
+ std::vector<_Type> values = value_.get_value<std::vector<_Type>>();
|
|
|
+ if (!values.empty()) {
|
|
|
+ result.reset(new _Type(values[0]));
|
|
|
+ }
|
|
|
+ return result;
|
|
|
}
|
|
|
- else {
|
|
|
- return value_.get_value<_Ret>();
|
|
|
+ operator std::shared_ptr<_Type>() {
|
|
|
+ return first();
|
|
|
}
|
|
|
- }
|
|
|
- private:
|
|
|
- int error_code_ = 0;
|
|
|
- bool reset_ = true;
|
|
|
- rttr::variant value_;
|
|
|
- sql_where<_Type> where_;
|
|
|
- sql_update<_Type> update_;
|
|
|
- sql_insert<_Type> insert_;
|
|
|
- std::string error_message_;
|
|
|
- sql_event_type sql_event_type_ = sql_event_type::Error;
|
|
|
- std::function<rttr::variant(sql_param&)> execute_event_;
|
|
|
- };
|
|
|
+ template<typename _Ret>
|
|
|
+ operator _Ret() {
|
|
|
+ if constexpr (std::is_same<rttr::variant, _Ret>::value) {
|
|
|
+ return value_;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return value_.get_value<_Ret>();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ private:
|
|
|
+ int error_code_ = 0;
|
|
|
+ bool reset_ = true;
|
|
|
+ rttr::variant value_;
|
|
|
+ sql_where<_Type> where_;
|
|
|
+ sql_update<_Type> update_;
|
|
|
+ sql_insert<_Type> insert_;
|
|
|
+ std::string error_message_;
|
|
|
+ sql_event_type sql_event_type_ = sql_event_type::Error;
|
|
|
+ std::function<rttr::variant(sql_param&)> execute_event_;
|
|
|
+ };
|
|
|
+ }
|
|
|
}
|