3 Star 3 Fork 1

Gitee 极速下载/sql-builder

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
此仓库是为了提升国内下载速度的镜像仓库,每日同步一次。 原始仓库: https://github.com/six-ddc/sql-builder
克隆/下载
sql.h 17.24 KB
一键复制 编辑 原始数据 按行查看 历史
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727
#pragma once
#include <vector>
#include <string>
namespace sql {
class column;
class Param
{
public:
Param (const std::string &param) : _param(param) {}
Param (const char *param) : _param(param) {}
public:
std::string operator()() const { return param(); }
inline std::string param() const { return _param; }
private:
const std::string _param;
};
template <typename T>
inline std::string to_value(const T& data) {
return std::to_string(data);
}
template <size_t N>
inline std::string to_value(char const(&data)[N]) {
std::string str("'");
str.append(data);
str.append("'");
return str;
}
template <>
inline std::string to_value<std::string>(const std::string& data) {
std::string str("'");
str.append(data);
str.append("'");
return str;
}
template <>
inline std::string to_value<const char*>(const char* const& data) {
std::string str("'");
str.append(data);
str.append("'");
return str;
}
template <>
inline std::string to_value<Param>(const Param& data) {
return data();
}
template <>
inline std::string to_value<column>(const column& data);
/*
template <>
static std::string sql::to_value<time_t>(const time_t& data) {
char buff[128] = {0};
struct tm* ttime = localtime(&data);
strftime(buff, sizeof(buff), "%Y-%m-%d %H:%M:%S", ttime);
std::string str("'");
str.append(buff);
str.append("'");
return str;
}
*/
template <typename T>
void join_vector(std::string& result, const std::vector<T>& vec, const char* sep) {
size_t size = vec.size();
for(size_t i = 0; i < size; ++i) {
if(i < size - 1) {
result.append(vec[i]);
result.append(sep);
} else {
result.append(vec[i]);
}
}
}
class column
{
public:
column(const std::string& column) {
_cond = column;
}
virtual ~column() {}
column& as(const std::string& s) {
_cond.append(" as ");
_cond.append(s);
return *this;
}
column& is_null() {
_cond.append(" is null");
return *this;
}
column& is_not_null() {
_cond.append(" is not null");
return *this;
}
template <typename T>
column& in(const std::vector<T>& args) {
size_t size = args.size();
if(size == 1) {
_cond.append(" = ");
_cond.append(to_value(args[0]));
} else {
_cond.append(" in (");
for(size_t i = 0; i < size; ++i) {
if(i < size - 1) {
_cond.append(to_value(args[i]));
_cond.append(", ");
} else {
_cond.append(to_value(args[i]));
}
}
_cond.append(")");
}
return *this;
}
template <typename T>
column& not_in(const std::vector<T>& args) {
size_t size = args.size();
if(size == 1) {
_cond.append(" != ");
_cond.append(to_value(args[0]));
} else {
_cond.append(" not in (");
for(size_t i = 0; i < size; ++i) {
if(i < size - 1) {
_cond.append(to_value(args[i]));
_cond.append(", ");
} else {
_cond.append(to_value(args[i]));
}
}
_cond.append(")");
}
return *this;
}
column& operator &&(column& condition) {
std::string str("(");
str.append(_cond);
str.append(") and (");
str.append(condition._cond);
str.append(")");
condition._cond = str;
return condition;
}
column& operator ||(column& condition) {
std::string str("(");
str.append(_cond);
str.append(") or (");
str.append(condition._cond);
str.append(")");
condition._cond = str;
return condition;
}
column& operator &&(const std::string& condition) {
_cond.append(" and ");
_cond.append(condition);
return *this;
}
column& operator ||(const std::string& condition) {
_cond.append(" or ");
_cond.append(condition);
return *this;
}
column& operator &&(const char* condition) {
_cond.append(" and ");
_cond.append(condition);
return *this;
}
column& operator ||(const char* condition) {
_cond.append(" or ");
_cond.append(condition);
return *this;
}
template <typename T>
column& operator ==(const T& data) {
_cond.append(" = ");
_cond.append(to_value(data));
return *this;
}
template <typename T>
column& operator !=(const T& data) {
_cond.append(" != ");
_cond.append(to_value(data));
return *this;
}
template <typename T>
column& operator >=(const T& data) {
_cond.append(" >= ");
_cond.append(to_value(data));
return *this;
}
template <typename T>
column& operator <=(const T& data) {
_cond.append(" <= ");
_cond.append(to_value(data));
return *this;
}
template <typename T>
column& operator >(const T& data) {
_cond.append(" > ");
_cond.append(to_value(data));
return *this;
}
template <typename T>
column& operator <(const T& data) {
_cond.append(" < ");
_cond.append(to_value(data));
return *this;
}
const std::string& str() const {
return _cond;
}
operator bool() {
return true;
}
private:
std::string _cond;
};
template <>
inline std::string to_value<column>(const column& data) {
return data.str();
}
class SqlModel
{
public:
SqlModel() {}
virtual ~SqlModel() {}
virtual const std::string& str() = 0;
const std::string& last_sql() {
return _sql;
}
private:
SqlModel(const SqlModel& m) = delete;
SqlModel& operator =(const SqlModel& data) = delete;
protected:
std::string _sql;
};
class SelectModel : public SqlModel
{
public:
SelectModel() : _distinct(false) {}
virtual ~SelectModel() {}
template <typename... Args>
SelectModel& select(const std::string& str, Args&&... columns) {
_select_columns.push_back(str);
select(columns...);
return *this;
}
// for recursion
SelectModel& select() {
return *this;
}
SelectModel& distinct() {
_distinct = true;
return *this;
}
template <typename... Args>
SelectModel& from(const std::string& table_name, Args&&... tables) {
if(_table_name.empty()) {
_table_name = table_name;
} else {
_table_name.append(", ");
_table_name.append(table_name);
}
from(tables...);
return *this;
}
// for recursion
SelectModel& from() {
return *this;
}
SelectModel& join(const std::string& table_name) {
_join_type = "join";
_join_table = table_name;
return *this;
}
SelectModel& left_join(const std::string& table_name) {
_join_type = "left join";
_join_table = table_name;
return *this;
}
SelectModel& left_outer_join(const std::string& table_name) {
_join_type = "left outer join";
_join_table = table_name;
return *this;
}
SelectModel& right_join(const std::string& table_name) {
_join_type = "right join";
_join_table = table_name;
return *this;
}
SelectModel& right_outer_join(const std::string& table_name) {
_join_type = "right outer join";
_join_table = table_name;
return *this;
}
SelectModel& full_join(const std::string& table_name) {
_join_type = "full join";
_join_table = table_name;
return *this;
}
SelectModel& full_outer_join(const std::string& table_name) {
_join_type = "full outer join";
_join_table = table_name;
return *this;
}
SelectModel& on(const std::string& condition) {
_join_on_condition.push_back(condition);
return *this;
}
SelectModel& on(const column& condition) {
_join_on_condition.push_back(condition.str());
return *this;
}
SelectModel& where(const std::string& condition) {
_where_condition.push_back(condition);
return *this;
}
SelectModel& where(const column& condition) {
_where_condition.push_back(condition.str());
return *this;
}
template <typename... Args>
SelectModel& group_by(const std::string& str, Args&&...columns) {
_groupby_columns.push_back(str);
group_by(columns...);
return *this;
}
// for recursion
SelectModel& group_by() {
return *this;
}
SelectModel& having(const std::string& condition) {
_having_condition.push_back(condition);
return *this;
}
SelectModel& having(const column& condition) {
_having_condition.push_back(condition.str());
return *this;
}
SelectModel& order_by(const std::string& order_by) {
_order_by = order_by;
return *this;
}
template <typename T>
SelectModel& limit(const T& limit) {
_limit = std::to_string(limit);
return *this;
}
template <typename T>
SelectModel& limit(const T& offset, const T& limit) {
_offset = std::to_string(offset);
_limit = std::to_string(limit);
return *this;
}
template <typename T>
SelectModel& offset(const T& offset) {
_offset = std::to_string(offset);
return *this;
}
virtual const std::string& str() override {
_sql.clear();
_sql.append("select ");
if(_distinct) {
_sql.append("distinct ");
}
join_vector(_sql, _select_columns, ", ");
_sql.append(" from ");
_sql.append(_table_name);
if(!_join_type.empty()) {
_sql.append(" ");
_sql.append(_join_type);
_sql.append(" ");
_sql.append(_join_table);
}
if(!_join_on_condition.empty()) {
_sql.append(" on ");
join_vector(_sql, _join_on_condition, " and ");
}
if(!_where_condition.empty()) {
_sql.append(" where ");
join_vector(_sql, _where_condition, " and ");
}
if(!_groupby_columns.empty()) {
_sql.append(" group by ");
join_vector(_sql, _groupby_columns, ", ");
}
if(!_having_condition.empty()) {
_sql.append(" having ");
join_vector(_sql, _having_condition, " and ");
}
if(!_order_by.empty()) {
_sql.append(" order by ");
_sql.append(_order_by);
}
if(!_limit.empty()) {
_sql.append(" limit ");
_sql.append(_limit);
}
if(!_offset.empty()) {
_sql.append(" offset ");
_sql.append(_offset);
}
return _sql;
}
SelectModel& reset() {
_select_columns.clear();
_distinct = false;
_groupby_columns.clear();
_table_name.clear();
_join_type.clear();
_join_table.clear();
_join_on_condition.clear();
_where_condition.clear();
_having_condition.clear();
_order_by.clear();
_limit.clear();
_offset.clear();
return *this;
}
friend inline std::ostream& operator<< (std::ostream& out, SelectModel& mod) {
out<<mod.str();
return out;
}
protected:
std::vector<std::string> _select_columns;
bool _distinct;
std::vector<std::string> _groupby_columns;
std::string _table_name;
std::string _join_type;
std::string _join_table;
std::vector<std::string> _join_on_condition;
std::vector<std::string> _where_condition;
std::vector<std::string> _having_condition;
std::string _order_by;
std::string _limit;
std::string _offset;
};
class InsertModel : public SqlModel
{
public:
InsertModel() {}
virtual ~InsertModel() {}
template <typename T>
InsertModel& insert(const std::string& c, const T& data) {
_columns.push_back(c);
_values.push_back(to_value(data));
return *this;
}
template <typename T>
InsertModel& operator()(const std::string& c, const T& data) {
return insert(c, data);
}
InsertModel& into(const std::string& table_name) {
_table_name = table_name;
return *this;
}
InsertModel& replace(bool var) {
_replace = var;
return *this;
}
virtual const std::string& str() override {
_sql.clear();
std::string v_ss;
if (_replace) {
_sql.append("insert or replace into ");
}else {
_sql.append("insert into ");
}
_sql.append(_table_name);
_sql.append("(");
v_ss.append(" values(");
size_t size = _columns.size();
for(size_t i = 0; i < size; ++i) {
if(i < size - 1) {
_sql.append(_columns[i]);
_sql.append(", ");
v_ss.append(_values[i]);
v_ss.append(", ");
} else {
_sql.append(_columns[i]);
_sql.append(")");
v_ss.append(_values[i]);
v_ss.append(")");
}
}
_sql.append(v_ss);
return _sql;
}
InsertModel& reset() {
_table_name.clear();
_columns.clear();
_values.clear();
return *this;
}
friend inline std::ostream& operator<< (std::ostream& out, InsertModel& mod) {
out<<mod.str();
return out;
}
protected:
bool _replace = false;
std::string _table_name;
std::vector<std::string> _columns;
std::vector<std::string> _values;
};
template <>
inline InsertModel& InsertModel::insert(const std::string& c, const std::nullptr_t&) {
_columns.push_back(c);
_values.push_back("null");
return *this;
}
class UpdateModel : public SqlModel
{
public:
UpdateModel() {}
virtual ~UpdateModel() {}
UpdateModel& update(const std::string& table_name) {
_table_name = table_name;
return *this;
}
template <typename T>
UpdateModel& set(const std::string& c, const T& data) {
std::string str(c);
str.append(" = ");
str.append(to_value(data));
_set_columns.push_back(str);
return *this;
}
template <typename T>
UpdateModel& operator()(const std::string& c, const T& data) {
return set(c, data);
}
UpdateModel& where(const std::string& condition) {
_where_condition.push_back(condition);
return *this;
}
UpdateModel& where(const column& condition) {
_where_condition.push_back(condition.str());
return *this;
}
virtual const std::string& str() override {
_sql.clear();
_sql.append("update ");
_sql.append(_table_name);
_sql.append(" set ");
join_vector(_sql, _set_columns, ", ");
size_t size = _where_condition.size();
if(size > 0) {
_sql.append(" where ");
join_vector(_sql, _where_condition, " and ");
}
return _sql;
}
UpdateModel& reset() {
_table_name.clear();
_set_columns.clear();
_where_condition.clear();
return *this;
}
friend inline std::ostream& operator<< (std::ostream& out, UpdateModel& mod) {
out<<mod.str();
return out;
}
protected:
std::vector<std::string> _set_columns;
std::string _table_name;
std::vector<std::string> _where_condition;
};
template <>
inline UpdateModel& UpdateModel::set(const std::string& c, const std::nullptr_t&) {
std::string str(c);
str.append(" = null");
_set_columns.push_back(str);
return *this;
}
class DeleteModel : public SqlModel
{
public:
DeleteModel() {}
virtual ~DeleteModel() {}
DeleteModel& _delete() {
return *this;
}
template <typename... Args>
DeleteModel& from(const std::string& table_name, Args&&... tables) {
if(_table_name.empty()) {
_table_name = table_name;
} else {
_table_name.append(", ");
_table_name.append(table_name);
}
from(tables...);
return *this;
}
// for recursion
DeleteModel& from() {
return *this;
}
DeleteModel& where(const std::string& condition) {
_where_condition.push_back(condition);
return *this;
}
DeleteModel& where(const column& condition) {
_where_condition.push_back(condition.str());
return *this;
}
virtual const std::string& str() override {
_sql.clear();
_sql.append("delete from ");
_sql.append(_table_name);
size_t size = _where_condition.size();
if(size > 0) {
_sql.append(" where ");
join_vector(_sql, _where_condition, " and ");
}
return _sql;
}
DeleteModel& reset() {
_table_name.clear();
_where_condition.clear();
return *this;
}
friend inline std::ostream& operator<< (std::ostream& out, DeleteModel& mod) {
out<<mod.str();
return out;
}
protected:
std::string _table_name;
std::vector<std::string> _where_condition;
};
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C/C++
1
https://gitee.com/mirrors/sql-builder.git
git@gitee.com:mirrors/sql-builder.git
mirrors
sql-builder
sql-builder
master

搜索帮助