//this file is generated by program(drogon_ctl) automatically,don't modify it! #include "model_h.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "create_model.h" using namespace drogon_ctl; using namespace drogon; std::string model_h::genText(const DrTemplateData& model_h_view_data) { drogon::OStringStream model_h_tmp_stream; std::string layoutName{""}; model_h_tmp_stream << "/**\n"; model_h_tmp_stream << " *\n"; model_h_tmp_stream << " * "; { auto & val=model_h_view_data["className"]; if(val.type()==typeid(const char *)){ model_h_tmp_stream<<*any_cast(&val); }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){ model_h_tmp_stream<<*any_cast(&val); } } model_h_tmp_stream << ".h\n"; model_h_tmp_stream << " * DO NOT EDIT. This file is generated by drogon_ctl\n"; model_h_tmp_stream << " *\n"; model_h_tmp_stream << " */\n"; model_h_tmp_stream<<"\n"; model_h_tmp_stream << "#pragma once\n"; model_h_tmp_stream << "#include \n"; model_h_tmp_stream << "#include \n"; model_h_tmp_stream << "#include \n"; model_h_tmp_stream << "#include \n"; model_h_tmp_stream << "#include \n"; model_h_tmp_stream << "#ifdef __cpp_impl_coroutine\n"; model_h_tmp_stream << "#include \n"; model_h_tmp_stream << "#endif\n"; model_h_tmp_stream << "#include \n"; model_h_tmp_stream << "#include \n"; model_h_tmp_stream << "#include \n"; model_h_tmp_stream << "#include \n"; model_h_tmp_stream << "#include \n"; model_h_tmp_stream << "#include \n"; model_h_tmp_stream << "#include \n"; model_h_tmp_stream << "#include \n"; model_h_tmp_stream << "#include \n"; model_h_tmp_stream<<"\n"; model_h_tmp_stream << "namespace drogon\n"; model_h_tmp_stream << "{\n"; model_h_tmp_stream << "namespace orm\n"; model_h_tmp_stream << "{\n"; model_h_tmp_stream << "class DbClient;\n"; model_h_tmp_stream << "using DbClientPtr = std::shared_ptr;\n"; model_h_tmp_stream << "}\n"; model_h_tmp_stream << "}\n"; model_h_tmp_stream << "namespace drogon_model\n"; model_h_tmp_stream << "{\n"; model_h_tmp_stream << "namespace "; { auto & val=model_h_view_data["dbName"]; if(val.type()==typeid(const char *)){ model_h_tmp_stream<<*any_cast(&val); }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){ model_h_tmp_stream<<*any_cast(&val); } } model_h_tmp_stream<<"\n"; model_h_tmp_stream << "{\n"; auto &schema=model_h_view_data.get("schema"); if(!schema.empty()) { model_h_tmp_stream<<"namespace "< relationshipClassNames; auto &relationships=model_h_view_data.get>("relationships"); for(auto &relationship : relationships) { auto &name = relationship.targetTableName(); auto relationshipClassName = nameTransform(name, true); relationshipClassNames.push_back(relationshipClassName); if(relationship.type() == Relationship::Type::ManyToMany) { auto &pivotTableName = relationship.pivotTable().tableName(); auto pivotTableClassName = nameTransform(pivotTableName, true); relationshipClassNames.push_back(pivotTableClassName); } } std::sort(relationshipClassNames.begin(), relationshipClassNames.end()); relationshipClassNames.erase(std::unique(relationshipClassNames.begin(), relationshipClassNames.end()), relationshipClassNames.end()); for(std::string &relationshipClassName : relationshipClassNames) { model_h_tmp_stream << "class "; model_h_tmp_stream<(&val); }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){ model_h_tmp_stream<<*any_cast(&val); } } model_h_tmp_stream<<"\n"; model_h_tmp_stream << "{\n"; model_h_tmp_stream << " public:\n"; model_h_tmp_stream << " struct Cols\n"; model_h_tmp_stream << " {\n"; auto cols=model_h_view_data.get>("columns"); for(size_t i=0;i("hasPrimaryKey")<=1){ model_h_tmp_stream << " const static std::string primaryKeyName;\n"; if(!model_h_view_data.get("primaryKeyType").empty()){ model_h_tmp_stream << " using PrimaryKeyType = "; { auto & val=model_h_view_data["primaryKeyType"]; if(val.type()==typeid(const char *)){ model_h_tmp_stream<<*any_cast(&val); }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){ model_h_tmp_stream<<*any_cast(&val); } } model_h_tmp_stream << ";\n"; model_h_tmp_stream << " const PrimaryKeyType &getPrimaryKey() const;\n"; }else{ model_h_tmp_stream << " using PrimaryKeyType = void;\n"; model_h_tmp_stream << " int getPrimaryKey() const { assert(false); return 0; }\n"; } }else{ auto pkTypes=model_h_view_data.get>("primaryKeyType"); std::string typelist; for(size_t i=0;i primaryKeyName;\n"; model_h_tmp_stream << " using PrimaryKeyType = std::tuple<"; model_h_tmp_stream<;//"; auto pkName=model_h_view_data.get>("primaryKeyName"); for(size_t i=0;i(&val); }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){ model_h_tmp_stream<<*any_cast(&val); } } model_h_tmp_stream << "(const drogon::orm::Row &r, const ssize_t indexOffset = 0) noexcept;\n"; model_h_tmp_stream<<"\n"; model_h_tmp_stream << " /**\n"; model_h_tmp_stream << " * @brief constructor\n"; model_h_tmp_stream << " * @param pJson The json object to construct a new instance.\n"; model_h_tmp_stream << " */\n"; model_h_tmp_stream << " explicit "; { auto & val=model_h_view_data["className"]; if(val.type()==typeid(const char *)){ model_h_tmp_stream<<*any_cast(&val); }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){ model_h_tmp_stream<<*any_cast(&val); } } model_h_tmp_stream << "(const Json::Value &pJson) noexcept(false);\n"; model_h_tmp_stream<<"\n"; model_h_tmp_stream << " /**\n"; model_h_tmp_stream << " * @brief constructor\n"; model_h_tmp_stream << " * @param pJson The json object to construct a new instance.\n"; model_h_tmp_stream << " * @param pMasqueradingVector The aliases of table columns.\n"; model_h_tmp_stream << " */\n"; model_h_tmp_stream << " "; { auto & val=model_h_view_data["className"]; if(val.type()==typeid(const char *)){ model_h_tmp_stream<<*any_cast(&val); }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){ model_h_tmp_stream<<*any_cast(&val); } } model_h_tmp_stream << "(const Json::Value &pJson, const std::vector &pMasqueradingVector) noexcept(false);\n"; model_h_tmp_stream<<"\n"; model_h_tmp_stream << " "; { auto & val=model_h_view_data["className"]; if(val.type()==typeid(const char *)){ model_h_tmp_stream<<*any_cast(&val); }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){ model_h_tmp_stream<<*any_cast(&val); } } model_h_tmp_stream << "() = default;\n"; model_h_tmp_stream<<"\n"; model_h_tmp_stream << " void updateByJson(const Json::Value &pJson) noexcept(false);\n"; model_h_tmp_stream << " void updateByMasqueradedJson(const Json::Value &pJson,\n"; model_h_tmp_stream << " const std::vector &pMasqueradingVector) noexcept(false);\n"; model_h_tmp_stream << " static bool validateJsonForCreation(const Json::Value &pJson, std::string &err);\n"; model_h_tmp_stream << " static bool validateMasqueradedJsonForCreation(const Json::Value &,\n"; model_h_tmp_stream << " const std::vector &pMasqueradingVector,\n"; model_h_tmp_stream << " std::string &err);\n"; model_h_tmp_stream << " static bool validateJsonForUpdate(const Json::Value &pJson, std::string &err);\n"; model_h_tmp_stream << " static bool validateMasqueradedJsonForUpdate(const Json::Value &,\n"; model_h_tmp_stream << " const std::vector &pMasqueradingVector,\n"; model_h_tmp_stream << " std::string &err);\n"; model_h_tmp_stream << " static bool validJsonOfField(size_t index,\n"; model_h_tmp_stream << " const std::string &fieldName,\n"; model_h_tmp_stream << " const Json::Value &pJson,\n"; model_h_tmp_stream << " std::string &err,\n"; model_h_tmp_stream << " bool isForCreation);\n"; model_h_tmp_stream<<"\n"; for(const auto &col:cols) { model_h_tmp_stream<<" /** For column "<") { model_h_tmp_stream<<" ///Return the column value by std::string with binary data\n"; model_h_tmp_stream<<" std::string getValueOf"< &get"<") { model_h_tmp_stream<<" void set"< &pMasqueradingVector) const;\n"; model_h_tmp_stream << " /// Relationship interfaces\n"; for(auto &relationship : relationships) { if(relationship.targetKey().empty() || relationship.originalKey().empty()) { continue; } auto &name=relationship.targetTableName(); auto relationshipClassName=nameTransform(name, true); auto relationshipValName=nameTransform(name, false); auto alias=relationship.targetTableAlias(); auto aliasValName=nameTransform(alias, false); if(relationship.type() == Relationship::Type::HasOne) { if(!alias.empty()) { if(alias[0] <= 'z' && alias[0] >= 'a') { alias[0] += ('A' - 'a'); } std::string alind(alias.length(), ' '); model_h_tmp_stream << " void get"; model_h_tmp_stream< &rcb,\n"; model_h_tmp_stream << " "; model_h_tmp_stream< &rcb,\n"; model_h_tmp_stream << " "; model_h_tmp_stream<= 'a') { alias[0] += ('A' - 'a'); } std::string alind(alias.length(), ' '); model_h_tmp_stream << " void get"; model_h_tmp_stream<)> &rcb,\n"; model_h_tmp_stream << " "; model_h_tmp_stream<)> &rcb,\n"; model_h_tmp_stream << " "; model_h_tmp_stream<= 'a') { alias[0] += ('A' - 'a'); } std::string alind(alias.length(), ' '); model_h_tmp_stream << " void get"; model_h_tmp_stream<>)> &rcb,\n"; model_h_tmp_stream << " "; model_h_tmp_stream<>)> &rcb,\n"; model_h_tmp_stream << " "; model_h_tmp_stream<(&val); }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){ model_h_tmp_stream<<*any_cast(&val); } } model_h_tmp_stream << ">;\n"; model_h_tmp_stream << "#ifdef __cpp_impl_coroutine\n"; model_h_tmp_stream << " friend drogon::orm::CoroMapper<"; { auto & val=model_h_view_data["className"]; if(val.type()==typeid(const char *)){ model_h_tmp_stream<<*any_cast(&val); }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){ model_h_tmp_stream<<*any_cast(&val); } } model_h_tmp_stream << ">;\n"; model_h_tmp_stream << "#endif\n"; model_h_tmp_stream << " static const std::vector &insertColumns() noexcept;\n"; model_h_tmp_stream << " void outputArgs(drogon::orm::internal::SqlBinder &binder) const;\n"; model_h_tmp_stream << " const std::vector updateColumns() const;\n"; model_h_tmp_stream << " void updateArgs(drogon::orm::internal::SqlBinder &binder) const;\n"; model_h_tmp_stream << " ///For mysql or sqlite3\n"; model_h_tmp_stream << " void updateId(const uint64_t id);\n"; for(auto col:cols) { if(!col.colType_.empty()) model_h_tmp_stream<<" std::shared_ptr<"< "< metaData_;\n"; model_h_tmp_stream << " bool dirtyFlag_["; model_h_tmp_stream<("rdbms"); if(model_h_view_data.get("hasPrimaryKey")<=1){ if(!model_h_view_data.get("primaryKeyType").empty()){ model_h_tmp_stream << " static const std::string sql=\"select * from \" + tableName + \" where "; { auto & val=model_h_view_data["primaryKeyName"]; if(val.type()==typeid(const char *)){ model_h_tmp_stream<<*any_cast(&val); }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){ model_h_tmp_stream<<*any_cast(&val); } } model_h_tmp_stream << " = "; model_h_tmp_stream<<(rdbms=="postgresql"?"$1":"?"); model_h_tmp_stream << "\";\n"; }else{ model_h_tmp_stream << " static const std::string sql=\"\";\n"; } }else{ auto pkName=model_h_view_data.get>("primaryKeyName"); model_h_tmp_stream << " static const std::string sql=\"select * from \" + tableName + \" where "; for(size_t i=0;i("hasPrimaryKey")<=1){ if(!model_h_view_data.get("primaryKeyType").empty()){ model_h_tmp_stream << " static const std::string sql=\"delete from \" + tableName + \" where "; { auto & val=model_h_view_data["primaryKeyName"]; if(val.type()==typeid(const char *)){ model_h_tmp_stream<<*any_cast(&val); }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){ model_h_tmp_stream<<*any_cast(&val); } } model_h_tmp_stream << " = "; model_h_tmp_stream<<(rdbms=="postgresql"?"$1":"?"); model_h_tmp_stream << "\";\n"; }else{ model_h_tmp_stream << " static const std::string sql=\"\";\n"; } }else{ auto pkName=model_h_view_data.get>("primaryKeyName"); model_h_tmp_stream << " static const std::string sql=\"delete from \" + tableName + \" where "; for(size_t i=0;i("rdbms")=="sqlite3") { continue; } if(model_h_view_data.get("hasPrimaryKey")>0) { selFlag = true; } model_h_tmp_stream<<" sql += \""<("rdbms")!="sqlite3") { model_h_tmp_stream<<" sql += \""<("hasPrimaryKey")>0||model_h_view_data.get("rdbms")=="postgresql") { model_h_tmp_stream << " if(!dirtyFlag_["; model_h_tmp_stream< 0)\n"; model_h_tmp_stream << " {\n"; model_h_tmp_stream << " sql[sql.length()-1]=')';\n"; model_h_tmp_stream << " sql += \" values (\";\n"; model_h_tmp_stream << " }\n"; model_h_tmp_stream << " else\n"; model_h_tmp_stream << " sql += \") values (\";\n"; model_h_tmp_stream<<"\n"; if(model_h_view_data.get("rdbms")=="postgresql") { model_h_tmp_stream << " int placeholder=1;\n"; model_h_tmp_stream << " char placeholderStr[64];\n"; model_h_tmp_stream << " size_t n=0;\n"; } for(size_t i=0;i("rdbms")!="sqlite3") { model_h_tmp_stream << " sql +=\"default,\";\n"; } continue; } if(cols[i].colType_.empty()) continue; model_h_tmp_stream << " if(dirtyFlag_["; model_h_tmp_stream<("rdbms")=="postgresql") { model_h_tmp_stream << " n = sprintf(placeholderStr,\"$%d,\",placeholder++);\n"; model_h_tmp_stream << " sql.append(placeholderStr, n);\n"; }else { model_h_tmp_stream << " sql.append(\"?,\");\n"; model_h_tmp_stream<<"\n"; } model_h_tmp_stream << " }\n"; if(cols[i].hasDefaultVal_&&model_h_view_data.get("rdbms")!="sqlite3") { model_h_tmp_stream << " else\n"; model_h_tmp_stream << " {\n"; model_h_tmp_stream << " sql +=\"default,\";\n"; model_h_tmp_stream << " }\n"; } } model_h_tmp_stream << " if(parametersCount > 0)\n"; model_h_tmp_stream << " {\n"; model_h_tmp_stream << " sql.resize(sql.length() - 1);\n"; model_h_tmp_stream << " }\n"; if(rdbms=="postgresql") { model_h_tmp_stream << " if(needSelection)\n"; model_h_tmp_stream << " {\n"; model_h_tmp_stream << " sql.append(\") returning *\");\n"; model_h_tmp_stream << " }\n"; model_h_tmp_stream << " else\n"; model_h_tmp_stream << " {\n"; model_h_tmp_stream << " sql.append(1, ')');\n"; model_h_tmp_stream << " }\n"; } else { model_h_tmp_stream<<" sql.append(1, ')');\n"; } model_h_tmp_stream << " LOG_TRACE << sql;\n"; model_h_tmp_stream << " return sql;\n"; model_h_tmp_stream << " }\n"; model_h_tmp_stream << "};\n"; if(!schema.empty()) { model_h_tmp_stream<<"} // namespace "<(&val); }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){ model_h_tmp_stream<<*any_cast(&val); } } model_h_tmp_stream<<"\n"; model_h_tmp_stream << "} // namespace drogon_model\n"; if(layoutName.empty()) { std::string ret{std::move(model_h_tmp_stream.str())}; return ret; }else { auto templ = DrTemplateBase::newTemplate(layoutName); if(!templ) return ""; HttpViewData data = model_h_view_data; auto str = std::move(model_h_tmp_stream.str()); if(!str.empty() && str[str.length()-1] == '\n') str.resize(str.length()-1); data[""] = std::move(str); return templ->genText(data); } }