//this file is generated by program(drogon_ctl) automatically,don't modify it!
#include "model_cc.h"
#include <drogon/utils/OStringStream.h>
#include <drogon/utils/Utilities.h>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <iostream>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <list>
#include <deque>
#include <queue>
#include "create_model.h"
using namespace drogon_ctl;

using namespace drogon;
std::string model_cc::genText(const DrTemplateData& model_cc_view_data)
{
	drogon::OStringStream model_cc_tmp_stream;
	std::string layoutName{""};
	model_cc_tmp_stream << "/**\n";
	model_cc_tmp_stream << " *\n";
	model_cc_tmp_stream << " *  ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << ".cc\n";
	model_cc_tmp_stream << " *  DO NOT EDIT. This file is generated by drogon_ctl\n";
	model_cc_tmp_stream << " *\n";
	model_cc_tmp_stream << " */\n";
model_cc_tmp_stream<<"\n";
	model_cc_tmp_stream << "#include \"";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << ".h\"\n";
std::vector<std::string> relationshipClassNames;
auto &relationships=model_cc_view_data.get<std::vector<Relationship>>("relationships");
auto rdbms=model_cc_view_data.get<std::string>("rdbms");
for(auto &relationship : relationships)
{
    if(relationship.type() == Relationship::Type::HasOne ||
       relationship.type() == Relationship::Type::HasMany ||
       relationship.type() == Relationship::Type::ManyToMany)
    {
        auto &name=relationship.targetTableName();
        auto relationshipClassName=nameTransform(name, true);
        auto originalClassName=nameTransform(relationship.originalTableName(),true);
        if(relationshipClassName!=originalClassName)
        {
            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_cc_tmp_stream << "#include \"";
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << ".h\"\n";
}
	model_cc_tmp_stream << "#include <drogon/utils/Utilities.h>\n";
auto &convertMethods=model_cc_view_data.get<std::vector<ConvertMethod>>("convertMethods");
for(auto convertMethod : convertMethods ) {
    for(auto i : convertMethod.includeFiles()) { 
 model_cc_tmp_stream<<"#include "<<i<<"\n";
	} //for
} //for
	model_cc_tmp_stream << "#include <string>\n";
    const auto &cols=model_cc_view_data.get<std::vector<ColumnInfo>>("columns");
    auto className=model_cc_view_data.get<std::string>("className");
    std::string indentStr(model_cc_view_data.get<std::string>("className").length(), ' ');
model_cc_tmp_stream<<"\n";
	model_cc_tmp_stream << "using namespace drogon;\n";
	model_cc_tmp_stream << "using namespace drogon::orm;\n";
	model_cc_tmp_stream << "using namespace drogon_model::";
{
    auto & val=model_cc_view_data["dbName"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
auto &schema=model_cc_view_data.get<std::string>("schema");
if(!schema.empty())
{
    model_cc_tmp_stream<<"::"<<schema<<";\n";
}
else
{
    model_cc_tmp_stream<<";\n";
}
model_cc_tmp_stream<<"\n";
for(auto col:cols){
	model_cc_tmp_stream << "const std::string ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::Cols::_";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << " = \"";
model_cc_tmp_stream<<escapeIdentifier(col.colName_, rdbms);
	model_cc_tmp_stream << "\";\n";
}
if(model_cc_view_data.get<int>("hasPrimaryKey")<=1){
	model_cc_tmp_stream << "const std::string ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::primaryKeyName = \"";
{
    auto & val=model_cc_view_data["primaryKeyName"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "\";\n";
}else{
	model_cc_tmp_stream << "const std::vector<std::string> ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::primaryKeyName = {";
auto pkName=model_cc_view_data.get<std::vector<std::string>>("primaryKeyName");
for(size_t i=0;i<pkName.size();i++)
{
    model_cc_tmp_stream<<"\""<<pkName[i]<<"\"";
    if(i<(pkName.size()-1))
        model_cc_tmp_stream<<",";
}
	model_cc_tmp_stream << "};\n";
}
 if(model_cc_view_data.get<int>("hasPrimaryKey")>0){
	model_cc_tmp_stream << "const bool ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::hasPrimaryKey = true;\n";
 }else{
	model_cc_tmp_stream << "const bool ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::hasPrimaryKey = false;\n";
}
	model_cc_tmp_stream << "const std::string ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::tableName = \"";
if(!schema.empty())
{
    model_cc_tmp_stream<<schema<<".";
}
model_cc_tmp_stream<<escapeIdentifier(model_cc_view_data.get<std::string>("tableName"), rdbms);
	model_cc_tmp_stream << "\";\n";
model_cc_tmp_stream<<"\n";
	model_cc_tmp_stream << "const std::vector<typename ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::MetaData> ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::metaData_={\n";
for(size_t i=0;i<cols.size();i++){
    auto &col=cols[i];
model_cc_tmp_stream<<"{\""<<col.colName_<<"\",\""<<col.colType_<<"\",\""<<col.colDatabaseType_<<"\","<<col.colLength_<<","<<col.isAutoVal_<<","<<col.isPrimaryKey_<<","<<col.notNull_<<"}";
if(i<(cols.size()-1))
model_cc_tmp_stream<<",\n";
else
model_cc_tmp_stream<<"\n";
}
	model_cc_tmp_stream << "};\n";
	model_cc_tmp_stream << "const std::string &";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::getColumnName(size_t index) noexcept(false)\n";
	model_cc_tmp_stream << "{\n";
	model_cc_tmp_stream << "    assert(index < metaData_.size());\n";
	model_cc_tmp_stream << "    return metaData_[index].colName_;\n";
	model_cc_tmp_stream << "}\n";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "(const Row &r, const ssize_t indexOffset) noexcept\n";
	model_cc_tmp_stream << "{\n";
	model_cc_tmp_stream << "    if(indexOffset < 0)\n";
	model_cc_tmp_stream << "    {\n";
    for(size_t i = 0; i <cols.size(); ++i)
    {
        auto &col = cols[i];
        if(col.colType_.empty())
            continue;
	model_cc_tmp_stream << "        if(!r[\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"].isNull())\n";
	model_cc_tmp_stream << "        {\n";
            if(col.colDatabaseType_=="date")
            {
                model_cc_tmp_stream<<"            auto daysStr = r[\""<<col.colName_<<"\"].as<std::string>();\n";
                model_cc_tmp_stream<<"            struct tm stm;\n";
                model_cc_tmp_stream<<"            memset(&stm,0,sizeof(stm));\n";
                model_cc_tmp_stream<<"            strptime(daysStr.c_str(),\"%Y-%m-%d\",&stm);\n";
                model_cc_tmp_stream<<"            time_t t = mktime(&stm);\n";
//                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(::trantor::Date(946656000000000).after(daysNum*86400));\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(t*1000000);\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodAfterDbRead() != "" ) {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodAfterDbRead() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                continue;
            }
            else if(col.colDatabaseType_.find("timestamp")!=std::string::npos||col.colDatabaseType_.find("datetime")!=std::string::npos)
            {
                model_cc_tmp_stream<<"            auto timeStr = r[\""<<col.colName_<<"\"].as<std::string>();\n";
                model_cc_tmp_stream<<"            struct tm stm;\n";
                model_cc_tmp_stream<<"            memset(&stm,0,sizeof(stm));\n";
                model_cc_tmp_stream<<"            auto p = strptime(timeStr.c_str(),\"%Y-%m-%d %H:%M:%S\",&stm);\n";
                model_cc_tmp_stream<<"            time_t t = mktime(&stm);\n";
                model_cc_tmp_stream<<"            size_t decimalNum = 0;\n";
                model_cc_tmp_stream<<"            if(p)\n";
                model_cc_tmp_stream<<"            {\n";
                model_cc_tmp_stream<<"                if(*p=='.')\n";
                model_cc_tmp_stream<<"                {\n";
                model_cc_tmp_stream<<"                    std::string decimals(p+1,&timeStr[timeStr.length()]);\n";
                model_cc_tmp_stream<<"                    while(decimals.length()<6)\n";
                model_cc_tmp_stream<<"                    {\n";
                model_cc_tmp_stream<<"                        decimals += \"0\";\n";
                model_cc_tmp_stream<<"                    }\n";
                model_cc_tmp_stream<<"                    decimalNum = (size_t)atol(decimals.c_str());\n";
                model_cc_tmp_stream<<"                }\n";
 //               model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(::trantor::Date(946656000000000).after(daysNum*86400));\n";
                model_cc_tmp_stream<<"                "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(t*1000000+decimalNum);\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodAfterDbRead() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodAfterDbRead() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"            }\n";
                model_cc_tmp_stream<<"        }\n";
                continue;
            }
            else if(col.colDatabaseType_=="bytea")
            {
                model_cc_tmp_stream<<"            auto str = r[\""<<col.colName_<<"\"].as<std::string_view>();\n";
                model_cc_tmp_stream<<"            if(str.length()>=2&&\n";
                model_cc_tmp_stream<<"                str[0]=='\\\\'&&str[1]=='x')\n";
                model_cc_tmp_stream<<"            {\n";
                model_cc_tmp_stream<<"                "<<col.colValName_<<"_=std::make_shared<std::vector<char>>(drogon::utils::hexToBinaryVector(str.data()+2,str.length()-2));\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodAfterDbRead() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodAfterDbRead() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"            }\n";
                model_cc_tmp_stream<<"        }\n";
                continue;
            }
	model_cc_tmp_stream << "            ";
model_cc_tmp_stream<<col.colValName_;
	model_cc_tmp_stream << "_=std::make_shared<";
model_cc_tmp_stream<<col.colType_;
	model_cc_tmp_stream << ">(r[\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"].as<";
model_cc_tmp_stream<<col.colType_;
	model_cc_tmp_stream << ">());\n";
            auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
            if (convertMethod != convertMethods.end() && convertMethod->methodAfterDbRead() != "") {
                model_cc_tmp_stream<<"            "<< convertMethod->methodAfterDbRead() << "(" << col.colValName_ << "_);\n";
            } //endif 
	model_cc_tmp_stream << "        }\n";
}
	model_cc_tmp_stream << "    }\n";
	model_cc_tmp_stream << "    else\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        size_t offset = (size_t)indexOffset;\n";
	model_cc_tmp_stream << "        if(offset + ";
model_cc_tmp_stream<<cols.size();
	model_cc_tmp_stream << " > r.size())\n";
	model_cc_tmp_stream << "        {\n";
	model_cc_tmp_stream << "            LOG_FATAL << \"Invalid SQL result for this model\";\n";
	model_cc_tmp_stream << "            return;\n";
	model_cc_tmp_stream << "        }\n";
	model_cc_tmp_stream << "        size_t index;\n";
    for(size_t i = 0; i <cols.size(); ++i)
    {
        auto &col = cols[i];
        if(col.colType_.empty())
            continue;
	model_cc_tmp_stream << "        index = offset + ";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << ";\n";
	model_cc_tmp_stream << "        if(!r[index].isNull())\n";
	model_cc_tmp_stream << "        {\n";
            if(col.colDatabaseType_=="date")
            {
                model_cc_tmp_stream<<"            auto daysStr = r[index].as<std::string>();\n";
                model_cc_tmp_stream<<"            struct tm stm;\n";
                model_cc_tmp_stream<<"            memset(&stm,0,sizeof(stm));\n";
                model_cc_tmp_stream<<"            strptime(daysStr.c_str(),\"%Y-%m-%d\",&stm);\n";
                model_cc_tmp_stream<<"            time_t t = mktime(&stm);\n";
 //               model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(::trantor::Date(946656000000000).after(daysNum*86400));\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(t*1000000);\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodAfterDbRead() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodAfterDbRead() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                continue;
            }
            else if(col.colDatabaseType_.find("timestamp")!=std::string::npos||col.colDatabaseType_.find("datetime")!=std::string::npos)
            {
                model_cc_tmp_stream<<"            auto timeStr = r[index].as<std::string>();\n";
                model_cc_tmp_stream<<"            struct tm stm;\n";
                model_cc_tmp_stream<<"            memset(&stm,0,sizeof(stm));\n";
                model_cc_tmp_stream<<"            auto p = strptime(timeStr.c_str(),\"%Y-%m-%d %H:%M:%S\",&stm);\n";
                model_cc_tmp_stream<<"            time_t t = mktime(&stm);\n";
                model_cc_tmp_stream<<"            size_t decimalNum = 0;\n";
                model_cc_tmp_stream<<"            if(p)\n";
                model_cc_tmp_stream<<"            {\n";
                model_cc_tmp_stream<<"                if(*p=='.')\n";
                model_cc_tmp_stream<<"                {\n";
                model_cc_tmp_stream<<"                    std::string decimals(p+1,&timeStr[timeStr.length()]);\n";
                model_cc_tmp_stream<<"                    while(decimals.length()<6)\n";
                model_cc_tmp_stream<<"                    {\n";
                model_cc_tmp_stream<<"                        decimals += \"0\";\n";
                model_cc_tmp_stream<<"                    }\n";
                model_cc_tmp_stream<<"                    decimalNum = (size_t)atol(decimals.c_str());\n";
                model_cc_tmp_stream<<"                }\n";
 //               model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(::trantor::Date(946656000000000).after(daysNum*86400));\n";
                model_cc_tmp_stream<<"                "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(t*1000000+decimalNum);\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodAfterDbRead() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodAfterDbRead() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"            }\n";
                model_cc_tmp_stream<<"        }\n";
                continue;
            }
            else if(col.colDatabaseType_=="bytea")
            {
                model_cc_tmp_stream<<"            auto str = r[index].as<std::string_view>();\n";
                model_cc_tmp_stream<<"            if(str.length()>=2&&\n";
                model_cc_tmp_stream<<"                str[0]=='\\\\'&&str[1]=='x')\n";
                model_cc_tmp_stream<<"            {\n";
                model_cc_tmp_stream<<"                "<<col.colValName_<<"_=std::make_shared<std::vector<char>>(drogon::utils::hexToBinaryVector(str.data()+2,str.length()-2));\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodAfterDbRead() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodAfterDbRead() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"            }\n";
                model_cc_tmp_stream<<"        }\n";
                continue;
            }
	model_cc_tmp_stream << "            ";
model_cc_tmp_stream<<col.colValName_;
	model_cc_tmp_stream << "_=std::make_shared<";
model_cc_tmp_stream<<col.colType_;
	model_cc_tmp_stream << ">(r[index].as<";
model_cc_tmp_stream<<col.colType_;
	model_cc_tmp_stream << ">());\n";
            auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
            if (convertMethod != convertMethods.end() && convertMethod->methodAfterDbRead() != "") {
                model_cc_tmp_stream<<"            "<< convertMethod->methodAfterDbRead() << "(" << col.colValName_ << "_);\n";
            } //endif 
	model_cc_tmp_stream << "        }\n";
}
	model_cc_tmp_stream << "    }\n";
model_cc_tmp_stream<<"\n";
	model_cc_tmp_stream << "}\n";
model_cc_tmp_stream<<"\n";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "(const Json::Value &pJson, const std::vector<std::string> &pMasqueradingVector) noexcept(false)\n";
	model_cc_tmp_stream << "{\n";
	model_cc_tmp_stream << "    if(pMasqueradingVector.size() != ";
model_cc_tmp_stream<<cols.size();
	model_cc_tmp_stream << ")\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        LOG_ERROR << \"Bad masquerading vector\";\n";
	model_cc_tmp_stream << "        return;\n";
	model_cc_tmp_stream << "    }\n";
    for(size_t i=0; i<cols.size(); ++i)
    {
        auto &col = cols[i];
        if(col.colType_.empty())
            continue;
	model_cc_tmp_stream << "    if(!pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "].empty() && pJson.isMember(pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "]))\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        dirtyFlag_[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "] = true;\n";
            if(col.colType_ == "std::string")
            {
                model_cc_tmp_stream<<"        if(!pJson[pMasqueradingVector["<<i<<"]].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<std::string>(pJson[pMasqueradingVector["<<i<<"]].asString());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colDatabaseType_=="date")
            {
                model_cc_tmp_stream<<"        if(!pJson[pMasqueradingVector["<<i<<"]].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            auto daysStr = pJson[pMasqueradingVector["<<i<<"]].asString();\n";
                model_cc_tmp_stream<<"            struct tm stm;\n";
                model_cc_tmp_stream<<"            memset(&stm,0,sizeof(stm));\n";
                model_cc_tmp_stream<<"            strptime(daysStr.c_str(),\"%Y-%m-%d\",&stm);\n";
                model_cc_tmp_stream<<"            time_t t = mktime(&stm);\n";
 //               model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(::trantor::Date(946656000000000).after(daysNum*86400));\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(t*1000000);\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colDatabaseType_.find("timestamp")!=std::string::npos||col.colDatabaseType_.find("datetime")!=std::string::npos)
            {
                model_cc_tmp_stream<<"        if(!pJson[pMasqueradingVector["<<i<<"]].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            auto timeStr = pJson[pMasqueradingVector["<<i<<"]].asString();\n";
                model_cc_tmp_stream<<"            struct tm stm;\n";
                model_cc_tmp_stream<<"            memset(&stm,0,sizeof(stm));\n";
                model_cc_tmp_stream<<"            auto p = strptime(timeStr.c_str(),\"%Y-%m-%d %H:%M:%S\",&stm);\n";
                model_cc_tmp_stream<<"            time_t t = mktime(&stm);\n";
                model_cc_tmp_stream<<"            size_t decimalNum = 0;\n";
                model_cc_tmp_stream<<"            if(p)\n";
                model_cc_tmp_stream<<"            {\n";
                model_cc_tmp_stream<<"                if(*p=='.')\n";
                model_cc_tmp_stream<<"                {\n";
                model_cc_tmp_stream<<"                    std::string decimals(p+1,&timeStr[timeStr.length()]);\n";
                model_cc_tmp_stream<<"                    while(decimals.length()<6)\n";
                model_cc_tmp_stream<<"                    {\n";
                model_cc_tmp_stream<<"                        decimals += \"0\";\n";
                model_cc_tmp_stream<<"                    }\n";
                model_cc_tmp_stream<<"                    decimalNum = (size_t)atol(decimals.c_str());\n";
                model_cc_tmp_stream<<"                }\n";
 //               model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(::trantor::Date(946656000000000).after(daysNum*86400));\n";
                model_cc_tmp_stream<<"                "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(t*1000000+decimalNum);\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"            }\n";
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colDatabaseType_=="bytea" || col.colDatabaseType_.find("blob") != std::string::npos)
            {
                model_cc_tmp_stream<<"        if(!pJson[pMasqueradingVector["<<i<<"]].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            auto str = pJson[pMasqueradingVector["<<i<<"]].asString();\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<std::vector<char>>(drogon::utils::base64DecodeToVector(str));\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colType_.find("uint") == 0 || col.colType_ == "unsigned short")
            {
                model_cc_tmp_stream<<"        if(!pJson[pMasqueradingVector["<<i<<"]].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<"<<col.colType_<<">(("<<col.colType_<<")pJson[pMasqueradingVector["<<i<<"]].asUInt64());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colType_.find("int") == 0 || col.colType_ == "short")
            {
                model_cc_tmp_stream<<"        if(!pJson[pMasqueradingVector["<<i<<"]].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<"<<col.colType_<<">(("<<col.colType_<<")pJson[pMasqueradingVector["<<i<<"]].asInt64());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colType_ == "float")
            {
                model_cc_tmp_stream<<"        if(!pJson[pMasqueradingVector["<<i<<"]].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<float>(pJson[pMasqueradingVector["<<i<<"]].asFloat());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"     }\n";
                continue;
            }
            else if(col.colType_ == "double")
            {
                model_cc_tmp_stream<<"        if(!pJson[pMasqueradingVector["<<i<<"]].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<double>(pJson[pMasqueradingVector["<<i<<"]].asDouble());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colType_ == "bool")
            {
                model_cc_tmp_stream<<"        if(!pJson[pMasqueradingVector["<<i<<"]].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<bool>(pJson[pMasqueradingVector["<<i<<"]].asBool());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
	model_cc_tmp_stream << "        }\n";
    }
	model_cc_tmp_stream << "}\n";
model_cc_tmp_stream<<"\n";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "(const Json::Value &pJson) noexcept(false)\n";
	model_cc_tmp_stream << "{\n";
    for(size_t i=0;i<cols.size();i++)
    {
        auto &col = cols[i];
        if(col.colType_.empty())
            continue;
	model_cc_tmp_stream << "    if(pJson.isMember(\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"))\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        dirtyFlag_[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "]=true;\n";
            if(col.colType_ == "std::string")
            {
                model_cc_tmp_stream<<"        if(!pJson[\""<<col.colName_<<"\"].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<std::string>(pJson[\""<<col.colName_<<"\"].asString());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colDatabaseType_=="date")
            {
                model_cc_tmp_stream<<"        if(!pJson[\""<<col.colName_<<"\"].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            auto daysStr = pJson[\""<<col.colName_<<"\"].asString();\n";
                model_cc_tmp_stream<<"            struct tm stm;\n";
                model_cc_tmp_stream<<"            memset(&stm,0,sizeof(stm));\n";
                model_cc_tmp_stream<<"            strptime(daysStr.c_str(),\"%Y-%m-%d\",&stm);\n";
                model_cc_tmp_stream<<"            time_t t = mktime(&stm);\n";
 //               model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(::trantor::Date(946656000000000).after(daysNum*86400));\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(t*1000000);\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colDatabaseType_.find("timestamp")!=std::string::npos||col.colDatabaseType_.find("datetime")!=std::string::npos)
            {
                model_cc_tmp_stream<<"        if(!pJson[\""<<col.colName_<<"\"].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            auto timeStr = pJson[\""<<col.colName_<<"\"].asString();\n";
                model_cc_tmp_stream<<"            struct tm stm;\n";
                model_cc_tmp_stream<<"            memset(&stm,0,sizeof(stm));\n";
                model_cc_tmp_stream<<"            auto p = strptime(timeStr.c_str(),\"%Y-%m-%d %H:%M:%S\",&stm);\n";
                model_cc_tmp_stream<<"            time_t t = mktime(&stm);\n";
                model_cc_tmp_stream<<"            size_t decimalNum = 0;\n";
                model_cc_tmp_stream<<"            if(p)\n";
                model_cc_tmp_stream<<"            {\n";
                model_cc_tmp_stream<<"                if(*p=='.')\n";
                model_cc_tmp_stream<<"                {\n";
                model_cc_tmp_stream<<"                    std::string decimals(p+1,&timeStr[timeStr.length()]);\n";
                model_cc_tmp_stream<<"                    while(decimals.length()<6)\n";
                model_cc_tmp_stream<<"                    {\n";
                model_cc_tmp_stream<<"                        decimals += \"0\";\n";
                model_cc_tmp_stream<<"                    }\n";
                model_cc_tmp_stream<<"                    decimalNum = (size_t)atol(decimals.c_str());\n";
                model_cc_tmp_stream<<"                }\n";
 //               model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(::trantor::Date(946656000000000).after(daysNum*86400));\n";
                model_cc_tmp_stream<<"                "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(t*1000000+decimalNum);\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"            }\n";
                 model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colDatabaseType_=="bytea" || col.colDatabaseType_.find("blob") != std::string::npos)
            {
                model_cc_tmp_stream<<"        if(!pJson[\""<<col.colName_<<"\"].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            auto str = pJson[\""<<col.colName_<<"\"].asString();\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<std::vector<char>>(drogon::utils::base64DecodeToVector(str));\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colType_.find("uint") == 0 || col.colType_ == "unsigned short")
            {
                model_cc_tmp_stream<<"        if(!pJson[\""<<col.colName_<<"\"].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<"<<col.colType_<<">(("<<col.colType_<<")pJson[\""<<col.colName_<<"\"].asUInt64());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colType_.find("int") == 0 || col.colType_ == "short")
            {
                model_cc_tmp_stream<<"        if(!pJson[\""<<col.colName_<<"\"].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<"<<col.colType_<<">(("<<col.colType_<<")pJson[\""<<col.colName_<<"\"].asInt64());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colType_ == "float")
            {
                model_cc_tmp_stream<<"        if(!pJson[\""<<col.colName_<<"\"].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<float>(pJson[\""<<col.colName_<<"\"].asFloat());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"     }\n";
                continue;
            }
            else if(col.colType_ == "double")
            {
                model_cc_tmp_stream<<"        if(!pJson[\""<<col.colName_<<"\"].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<double>(pJson[\""<<col.colName_<<"\"].asDouble());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colType_ == "bool")
            {
                model_cc_tmp_stream<<"        if(!pJson[\""<<col.colName_<<"\"].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<bool>(pJson[\""<<col.colName_<<"\"].asBool());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
	model_cc_tmp_stream << "    }\n";
    }
    
	model_cc_tmp_stream << "}\n";
model_cc_tmp_stream<<"\n";
	model_cc_tmp_stream << "void ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::updateByMasqueradedJson(const Json::Value &pJson,\n";
	model_cc_tmp_stream << "                                            const std::vector<std::string> &pMasqueradingVector) noexcept(false)\n";
	model_cc_tmp_stream << "{\n";
	model_cc_tmp_stream << "    if(pMasqueradingVector.size() != ";
model_cc_tmp_stream<<cols.size();
	model_cc_tmp_stream << ")\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        LOG_ERROR << \"Bad masquerading vector\";\n";
	model_cc_tmp_stream << "        return;\n";
	model_cc_tmp_stream << "    }\n";
    for(size_t i=0;i<cols.size();i++)
    {
        auto &col = cols[i];
        if(col.colType_.empty())
            continue;
	model_cc_tmp_stream << "    if(!pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "].empty() && pJson.isMember(pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "]))\n";
	model_cc_tmp_stream << "    {\n";
            if(!col.isAutoVal_ && !col.isPrimaryKey_)
            {
                model_cc_tmp_stream<<"        dirtyFlag_["<<i<<"] = true;\n";
            }
            if(col.colType_ == "std::string")
            {
                model_cc_tmp_stream<<"        if(!pJson[pMasqueradingVector["<<i<<"]].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<std::string>(pJson[pMasqueradingVector["<<i<<"]].asString());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colDatabaseType_=="date")
            {
                model_cc_tmp_stream<<"        if(!pJson[pMasqueradingVector["<<i<<"]].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            auto daysStr = pJson[pMasqueradingVector["<<i<<"]].asString();\n";
                model_cc_tmp_stream<<"            struct tm stm;\n";
                model_cc_tmp_stream<<"            memset(&stm,0,sizeof(stm));\n";
                model_cc_tmp_stream<<"            strptime(daysStr.c_str(),\"%Y-%m-%d\",&stm);\n";
                model_cc_tmp_stream<<"            time_t t = mktime(&stm);\n";
 //               model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(::trantor::Date(946656000000000).after(daysNum*86400));\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(t*1000000);\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colDatabaseType_.find("timestamp")!=std::string::npos||col.colDatabaseType_.find("datetime")!=std::string::npos)
            {
                model_cc_tmp_stream<<"        if(!pJson[pMasqueradingVector["<<i<<"]].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            auto timeStr = pJson[pMasqueradingVector["<<i<<"]].asString();\n";
                model_cc_tmp_stream<<"            struct tm stm;\n";
                model_cc_tmp_stream<<"            memset(&stm,0,sizeof(stm));\n";
                model_cc_tmp_stream<<"            auto p = strptime(timeStr.c_str(),\"%Y-%m-%d %H:%M:%S\",&stm);\n";
                model_cc_tmp_stream<<"            time_t t = mktime(&stm);\n";
                model_cc_tmp_stream<<"            size_t decimalNum = 0;\n";
                model_cc_tmp_stream<<"            if(p)\n";
                model_cc_tmp_stream<<"            {\n";
                model_cc_tmp_stream<<"                if(*p=='.')\n";
                model_cc_tmp_stream<<"                {\n";
                model_cc_tmp_stream<<"                    std::string decimals(p+1,&timeStr[timeStr.length()]);\n";
                model_cc_tmp_stream<<"                    while(decimals.length()<6)\n";
                model_cc_tmp_stream<<"                    {\n";
                model_cc_tmp_stream<<"                        decimals += \"0\";\n";
                model_cc_tmp_stream<<"                    }\n";
                model_cc_tmp_stream<<"                    decimalNum = (size_t)atol(decimals.c_str());\n";
                model_cc_tmp_stream<<"                }\n";
 //               model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(::trantor::Date(946656000000000).after(daysNum*86400));\n";
                model_cc_tmp_stream<<"                "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(t*1000000+decimalNum);\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"            }\n";
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colDatabaseType_=="bytea" || col.colDatabaseType_.find("blob") != std::string::npos)
            {
                model_cc_tmp_stream<<"        if(!pJson[pMasqueradingVector["<<i<<"]].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            auto str = pJson[pMasqueradingVector["<<i<<"]].asString();\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<std::vector<char>>(drogon::utils::base64DecodeToVector(str));\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colType_.find("uint") == 0 || col.colType_ == "unsigned short")
            {
                model_cc_tmp_stream<<"        if(!pJson[pMasqueradingVector["<<i<<"]].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<"<<col.colType_<<">(("<<col.colType_<<")pJson[pMasqueradingVector["<<i<<"]].asUInt64());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colType_.find("int") == 0 || col.colType_ == "short")
            {
                model_cc_tmp_stream<<"        if(!pJson[pMasqueradingVector["<<i<<"]].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<"<<col.colType_<<">(("<<col.colType_<<")pJson[pMasqueradingVector["<<i<<"]].asInt64());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colType_ == "float")
            {
                model_cc_tmp_stream<<"        if(!pJson[pMasqueradingVector["<<i<<"]].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<float>(pJson[pMasqueradingVector["<<i<<"]].asFloat());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colType_ == "double")
            {
                model_cc_tmp_stream<<"        if(!pJson[pMasqueradingVector["<<i<<"]].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<double>(pJson[pMasqueradingVector["<<i<<"]].asDouble());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colType_ == "bool")
            {
                model_cc_tmp_stream<<"        if(!pJson[pMasqueradingVector["<<i<<"]].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<bool>(pJson[pMasqueradingVector["<<i<<"]].asBool());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
	model_cc_tmp_stream << "        }\n";
    }
    
	model_cc_tmp_stream << "}\n";
model_cc_tmp_stream<<"\n";
	model_cc_tmp_stream << "void ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::updateByJson(const Json::Value &pJson) noexcept(false)\n";
	model_cc_tmp_stream << "{\n";
    for(size_t i=0;i<cols.size();i++)
    {
        auto &col = cols[i];
        if(col.colType_.empty())
            continue;
        
	model_cc_tmp_stream << "    if(pJson.isMember(\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"))\n";
	model_cc_tmp_stream << "    {\n";
            if(!col.isAutoVal_ && !col.isPrimaryKey_)
            {
                model_cc_tmp_stream<<"        dirtyFlag_["<<i<<"] = true;\n";
            }
            if(col.colType_ == "std::string")
            {
                model_cc_tmp_stream<<"        if(!pJson[\""<<col.colName_<<"\"].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<std::string>(pJson[\""<<col.colName_<<"\"].asString());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colDatabaseType_=="date")
            {
                model_cc_tmp_stream<<"        if(!pJson[\""<<col.colName_<<"\"].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            auto daysStr = pJson[\""<<col.colName_<<"\"].asString();\n";
                model_cc_tmp_stream<<"            struct tm stm;\n";
                model_cc_tmp_stream<<"            memset(&stm,0,sizeof(stm));\n";
                model_cc_tmp_stream<<"            strptime(daysStr.c_str(),\"%Y-%m-%d\",&stm);\n";
                model_cc_tmp_stream<<"            time_t t = mktime(&stm);\n";
 //               model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(::trantor::Date(946656000000000).after(daysNum*86400));\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(t*1000000);\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colDatabaseType_.find("timestamp")!=std::string::npos||col.colDatabaseType_.find("datetime")!=std::string::npos)
            {
                model_cc_tmp_stream<<"        if(!pJson[\""<<col.colName_<<"\"].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            auto timeStr = pJson[\""<<col.colName_<<"\"].asString();\n";
                model_cc_tmp_stream<<"            struct tm stm;\n";
                model_cc_tmp_stream<<"            memset(&stm,0,sizeof(stm));\n";
                model_cc_tmp_stream<<"            auto p = strptime(timeStr.c_str(),\"%Y-%m-%d %H:%M:%S\",&stm);\n";
                model_cc_tmp_stream<<"            time_t t = mktime(&stm);\n";
                model_cc_tmp_stream<<"            size_t decimalNum = 0;\n";
                model_cc_tmp_stream<<"            if(p)\n";
                model_cc_tmp_stream<<"            {\n";
                model_cc_tmp_stream<<"                if(*p=='.')\n";
                model_cc_tmp_stream<<"                {\n";
                model_cc_tmp_stream<<"                    std::string decimals(p+1,&timeStr[timeStr.length()]);\n";
                model_cc_tmp_stream<<"                    while(decimals.length()<6)\n";
                model_cc_tmp_stream<<"                    {\n";
                model_cc_tmp_stream<<"                        decimals += \"0\";\n";
                model_cc_tmp_stream<<"                    }\n";
                model_cc_tmp_stream<<"                    decimalNum = (size_t)atol(decimals.c_str());\n";
                model_cc_tmp_stream<<"                }\n";
 //               model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(::trantor::Date(946656000000000).after(daysNum*86400));\n";
                model_cc_tmp_stream<<"                "<<col.colValName_<<"_=std::make_shared<::trantor::Date>(t*1000000+decimalNum);\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"            }\n";
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colDatabaseType_=="bytea" || col.colDatabaseType_.find("blob") != std::string::npos)
            {
                model_cc_tmp_stream<<"        if(!pJson[\""<<col.colName_<<"\"].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            auto str = pJson[\""<<col.colName_<<"\"].asString();\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<std::vector<char>>(drogon::utils::base64DecodeToVector(str));\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colType_.find("uint") == 0 || col.colType_ == "unsigned short")
            {
                model_cc_tmp_stream<<"        if(!pJson[\""<<col.colName_<<"\"].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<"<<col.colType_<<">(("<<col.colType_<<")pJson[\""<<col.colName_<<"\"].asUInt64());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colType_.find("int") == 0 || col.colType_ == "short")
            {
                model_cc_tmp_stream<<"        if(!pJson[\""<<col.colName_<<"\"].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<"<<col.colType_<<">(("<<col.colType_<<")pJson[\""<<col.colName_<<"\"].asInt64());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colType_ == "float")
            {
                model_cc_tmp_stream<<"        if(!pJson[\""<<col.colName_<<"\"].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<float>(pJson[\""<<col.colName_<<"\"].asFloat());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colType_ == "double")
            {
                model_cc_tmp_stream<<"        if(!pJson[\""<<col.colName_<<"\"].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<double>(pJson[\""<<col.colName_<<"\"].asDouble());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
            else if(col.colType_ == "bool")
            {
                model_cc_tmp_stream<<"        if(!pJson[\""<<col.colName_<<"\"].isNull())\n";
                model_cc_tmp_stream<<"        {\n";
                model_cc_tmp_stream<<"            "<<col.colValName_<<"_=std::make_shared<bool>(pJson[\""<<col.colName_<<"\"].asBool());\n";
                auto convertMethod=std::find_if(convertMethods.begin(),convertMethods.end(),[col](const ConvertMethod& c){ return c.shouldConvert("*", col.colName_); });
                if (convertMethod != convertMethods.end() && convertMethod->methodBeforeDbWrite() != "") {
                    model_cc_tmp_stream<<"            "<< convertMethod->methodBeforeDbWrite() << "(" << col.colValName_ << "_);\n";
                } //endif
                model_cc_tmp_stream<<"        }\n";
                model_cc_tmp_stream<<"    }\n";
                continue;
            }
	model_cc_tmp_stream << "        }\n";
    }
    
	model_cc_tmp_stream << "}\n";
model_cc_tmp_stream<<"\n";
    for(size_t i=0;i<cols.size();i++)
    {
        auto &col = cols[i];
        if(!col.colType_.empty())
        {
            model_cc_tmp_stream<<"const "<<col.colType_<<" &"<<className<<"::getValueOf"<<col.colTypeName_<<"() const noexcept\n";
            model_cc_tmp_stream<<"{\n";
            model_cc_tmp_stream<<"    static const "<<col.colType_<<" defaultValue = "<<col.colType_<<"();\n";
            model_cc_tmp_stream<<"    if("<<col.colValName_<<"_)\n";
            model_cc_tmp_stream<<"        return *"<<col.colValName_<<"_;\n";
            model_cc_tmp_stream<<"    return defaultValue;\n";
            model_cc_tmp_stream<<"}\n";
            if(col.colType_=="std::vector<char>")
            {
                model_cc_tmp_stream<<"std::string "<<className<<"::getValueOf"<<col.colTypeName_<<"AsString() const noexcept\n";
                model_cc_tmp_stream<<"{\n";
                model_cc_tmp_stream<<"    static const std::string defaultValue = std::string();\n";
                model_cc_tmp_stream<<"    if("<<col.colValName_<<"_)\n";
                model_cc_tmp_stream<<"        return std::string("<<col.colValName_<<"_->data(),"<<col.colValName_<<"_->size());\n";
                model_cc_tmp_stream<<"    return defaultValue;\n";
                model_cc_tmp_stream<<"}\n";
            }
            model_cc_tmp_stream<<"const std::shared_ptr<"<<col.colType_<<"> &"<<className<<"::get"<<col.colTypeName_<<"() const noexcept\n";
            model_cc_tmp_stream<<"{\n";
            model_cc_tmp_stream<<"    return "<<col.colValName_<<"_;\n";
            model_cc_tmp_stream<<"}\n";
                model_cc_tmp_stream<<"void "<<className<<"::set"<<col.colTypeName_<<"(const "<<col.colType_<<" &p"<<col.colTypeName_<<") noexcept\n";
                model_cc_tmp_stream<<"{\n";
                if(col.colDatabaseType_=="date")
                {
                    model_cc_tmp_stream<<"    "<<col.colValName_<<"_ = std::make_shared<"<<col.colType_<<">(p"<<col.colTypeName_<<".roundDay());\n";
                }
                else
                {
                    model_cc_tmp_stream<<"    "<<col.colValName_<<"_ = std::make_shared<"<<col.colType_<<">(p"<<col.colTypeName_<<");\n";
                }
                model_cc_tmp_stream<<"    dirtyFlag_["<<i<<"] = true;\n";
                model_cc_tmp_stream<<"}\n";
                if(col.colType_=="std::string")
                {
                    model_cc_tmp_stream<<"void "<<className<<"::set"<<col.colTypeName_<<"("<<col.colType_<<" &&p"<<col.colTypeName_<<") noexcept\n";
                    model_cc_tmp_stream<<"{\n";
                    model_cc_tmp_stream<<"    "<<col.colValName_<<"_ = std::make_shared<"<<col.colType_<<">(std::move(p"<<col.colTypeName_<<"));\n";
                    model_cc_tmp_stream<<"    dirtyFlag_["<<i<<"] = true;\n";
                    model_cc_tmp_stream<<"}\n";
                }
                if(col.colType_=="std::vector<char>")
                {
                    model_cc_tmp_stream<<"void "<<className<<"::set"<<col.colTypeName_<<"(const std::string &p"<<col.colTypeName_<<") noexcept\n";
                    model_cc_tmp_stream<<"{\n";
                    model_cc_tmp_stream<<"    "<<col.colValName_<<"_ = std::make_shared<std::vector<char>>(p"<<col.colTypeName_<<".c_str(),p"<<col.colTypeName_<<".c_str()+p"<<col.colTypeName_<<".length());\n";
                    model_cc_tmp_stream<<"    dirtyFlag_["<<i<<"] = true;\n";
                    model_cc_tmp_stream<<"}\n";
                }
                if(!col.notNull_)
                {
                    model_cc_tmp_stream<<"void "<<className<<"::set"<<col.colTypeName_<<"ToNull() noexcept\n";
                    model_cc_tmp_stream<<"{\n";
                    model_cc_tmp_stream<<"    "<<col.colValName_<<"_.reset();\n";
                    model_cc_tmp_stream<<"    dirtyFlag_["<<i<<"] = true;\n";
                    model_cc_tmp_stream<<"}\n";
                }
            if(col.isPrimaryKey_&&model_cc_view_data.get<int>("hasPrimaryKey")==1)
            {
                model_cc_tmp_stream<<"const typename "<<className<<"::PrimaryKeyType & "<<className<<"::getPrimaryKey() const\n";
                model_cc_tmp_stream<<"{\n";
                model_cc_tmp_stream<<"    assert("<<col.colValName_<<"_);\n";
                model_cc_tmp_stream<<"    return *"<<col.colValName_<<"_;\n";
                model_cc_tmp_stream<<"}\n";
            }
        }
        model_cc_tmp_stream<<"\n";
    }
    if(model_cc_view_data.get<std::string>("rdbms")=="postgresql"||model_cc_view_data.get<int>("hasPrimaryKey")!=1)
    {
        model_cc_tmp_stream<<"void "<<className<<"::updateId(const uint64_t id)\n";
        model_cc_tmp_stream<<"{\n";
        model_cc_tmp_stream<<"}\n";
    }
    else if(model_cc_view_data.get<std::string>("rdbms")=="mysql"||model_cc_view_data.get<std::string>("rdbms")=="sqlite3")
    {
        auto primaryKeyTypeString=model_cc_view_data.get<std::string>("primaryKeyType");
        model_cc_tmp_stream<<"void "<<className<<"::updateId(const uint64_t id)\n";
        model_cc_tmp_stream<<"{\n";
        for(auto col:cols)
        {
            if(col.isAutoVal_)
            {
                if(primaryKeyTypeString!="uint64_t")
                {
                    model_cc_tmp_stream<<"    "<<col.colValName_<<"_ = std::make_shared<"<<primaryKeyTypeString<<">(static_cast<"<<primaryKeyTypeString<<">(id));\n";
                }
                else
                {
                    model_cc_tmp_stream<<"    "<<col.colValName_<<"_ = std::make_shared<uint64_t>(id);\n";
                }
                break;
            }
        }
        model_cc_tmp_stream<<"}\n";
    }
    if(model_cc_view_data.get<int>("hasPrimaryKey")>1)
    {
        model_cc_tmp_stream<<"typename "<<className<<"::PrimaryKeyType "<<className<<"::getPrimaryKey() const\n";
        model_cc_tmp_stream<<"{\n";
        model_cc_tmp_stream<<"    return std::make_tuple(";
        int count=0;
        auto pkNames=model_cc_view_data.get<std::vector<std::string>>("primaryKeyValNames");
        for(auto pkName:pkNames)
        {
            ++count;
            model_cc_tmp_stream<<"*"<<pkName<<"_";
            if(count<model_cc_view_data.get<int>("hasPrimaryKey"))
                model_cc_tmp_stream<<",";
        }
        model_cc_tmp_stream<<");\n";
        model_cc_tmp_stream<<"}\n";
    }
model_cc_tmp_stream<<"\n";
	model_cc_tmp_stream << "const std::vector<std::string> &";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::insertColumns() noexcept\n";
	model_cc_tmp_stream << "{\n";
	model_cc_tmp_stream << "    static const std::vector<std::string> inCols={\n";
for(size_t i=0;i<cols.size();i++){
    auto col=cols[i];
    if(!col.isAutoVal_&&!col.colType_.empty())
    {
        model_cc_tmp_stream<<"        \""<<col.colName_<<"\"";
        if(i<(cols.size()-1))
            model_cc_tmp_stream<<",\n";
        else
            model_cc_tmp_stream<<"\n";
    }
}
	model_cc_tmp_stream << "    };\n";
	model_cc_tmp_stream << "    return inCols;\n";
	model_cc_tmp_stream << "}\n";
model_cc_tmp_stream<<"\n";
	model_cc_tmp_stream << "void ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::outputArgs(drogon::orm::internal::SqlBinder &binder) const\n";
	model_cc_tmp_stream << "{\n";
for(size_t i = 0; i < cols.size(); ++i){
    auto &col = cols[i];
    if(!col.isAutoVal_&&!col.colType_.empty())
    {
	model_cc_tmp_stream << "    if(dirtyFlag_[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "])\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        if(get";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "())\n";
	model_cc_tmp_stream << "        {\n";
	model_cc_tmp_stream << "            binder << getValueOf";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "();\n";
	model_cc_tmp_stream << "        }\n";
	model_cc_tmp_stream << "        else\n";
	model_cc_tmp_stream << "        {\n";
	model_cc_tmp_stream << "            binder << nullptr;\n";
	model_cc_tmp_stream << "        }\n";
	model_cc_tmp_stream << "    }\n";
    }
}
	model_cc_tmp_stream << "}\n";
model_cc_tmp_stream<<"\n";
	model_cc_tmp_stream << "const std::vector<std::string> ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::updateColumns() const\n";
	model_cc_tmp_stream << "{\n";
	model_cc_tmp_stream << "    std::vector<std::string> ret;\n";
    for(size_t i=0;i<cols.size();i++)
    {
        auto & col=cols[i];
        if(col.colType_.empty()||col.isAutoVal_)
            continue;
	model_cc_tmp_stream << "    if(dirtyFlag_[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "])\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        ret.push_back(getColumnName(";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "));\n";
	model_cc_tmp_stream << "    }\n";
    }
	model_cc_tmp_stream << "    return ret;\n";
	model_cc_tmp_stream << "}\n";
model_cc_tmp_stream<<"\n";
	model_cc_tmp_stream << "void ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::updateArgs(drogon::orm::internal::SqlBinder &binder) const\n";
	model_cc_tmp_stream << "{\n";
    for(size_t i=0;i<cols.size();i++)
    {
        auto & col=cols[i];
        if(col.colType_.empty()||col.isAutoVal_)
            continue;
	model_cc_tmp_stream << "    if(dirtyFlag_[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "])\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        if(get";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "())\n";
	model_cc_tmp_stream << "        {\n";
	model_cc_tmp_stream << "            binder << getValueOf";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "();\n";
	model_cc_tmp_stream << "        }\n";
	model_cc_tmp_stream << "        else\n";
	model_cc_tmp_stream << "        {\n";
	model_cc_tmp_stream << "            binder << nullptr;\n";
	model_cc_tmp_stream << "        }\n";
	model_cc_tmp_stream << "    }\n";
    }
	model_cc_tmp_stream << "}\n";
	model_cc_tmp_stream << "Json::Value ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::toJson() const\n";
	model_cc_tmp_stream << "{\n";
	model_cc_tmp_stream << "    Json::Value ret;\n";
for(auto col:cols){
	model_cc_tmp_stream << "    if(get";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "())\n";
	model_cc_tmp_stream << "    {\n";
if(col.colDatabaseType_=="date"){
	model_cc_tmp_stream << "        ret[\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"]=get";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "()->toDbStringLocal();\n";
}else if(col.colDatabaseType_.find("timestamp")!=std::string::npos||col.colDatabaseType_.find("datetime")!=std::string::npos){
	model_cc_tmp_stream << "        ret[\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"]=get";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "()->toDbStringLocal();\n";
}else if(col.colDatabaseType_=="bytea"||col.colDatabaseType_.find("blob")!=std::string::npos){
	model_cc_tmp_stream << "        ret[\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"]=drogon::utils::base64Encode((const unsigned char *)get";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "()->data(),get";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "()->size());\n";
}else if(col.colType_=="int64_t"){
	model_cc_tmp_stream << "        ret[\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"]=(Json::Int64)getValueOf";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "();\n";
}else if(col.colType_=="uint64_t"){
	model_cc_tmp_stream << "        ret[\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"]=(Json::UInt64)getValueOf";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "();\n";
}else{
	model_cc_tmp_stream << "        ret[\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"]=getValueOf";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "();\n";
}
	model_cc_tmp_stream << "    }\n";
	model_cc_tmp_stream << "    else\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        ret[\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"]=Json::Value();\n";
	model_cc_tmp_stream << "    }\n";
}
	model_cc_tmp_stream << "    return ret;\n";
	model_cc_tmp_stream << "}\n";
model_cc_tmp_stream<<"\n";
	model_cc_tmp_stream << "std::string ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::toString() const\n";
	model_cc_tmp_stream << "{\n";
	model_cc_tmp_stream << "    return toJson().toStyledString();\n";
	model_cc_tmp_stream << "}\n";
model_cc_tmp_stream<<"\n";
	model_cc_tmp_stream << "Json::Value ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::toMasqueradedJson(\n";
	model_cc_tmp_stream << "    const std::vector<std::string> &pMasqueradingVector) const\n";
	model_cc_tmp_stream << "{\n";
	model_cc_tmp_stream << "    Json::Value ret;\n";
	model_cc_tmp_stream << "    if(pMasqueradingVector.size() == ";
model_cc_tmp_stream<<cols.size();
	model_cc_tmp_stream << ")\n";
	model_cc_tmp_stream << "    {\n";
for(size_t i = 0; i < cols.size(); ++i){
    auto &col = cols[i];
    
	model_cc_tmp_stream << "        if(!pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "].empty())\n";
	model_cc_tmp_stream << "        {\n";
	model_cc_tmp_stream << "            if(get";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "())\n";
	model_cc_tmp_stream << "            {\n";
if(col.colDatabaseType_=="date"){
	model_cc_tmp_stream << "                ret[pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "]]=get";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "()->toDbStringLocal();\n";
}else if(col.colDatabaseType_.find("timestamp")!=std::string::npos||col.colDatabaseType_.find("datetime")!=std::string::npos){
	model_cc_tmp_stream << "                ret[pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "]]=get";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "()->toDbStringLocal();\n";
}else if(col.colDatabaseType_=="bytea"||col.colDatabaseType_.find("blob")!=std::string::npos){
	model_cc_tmp_stream << "                ret[pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "]]=drogon::utils::base64Encode((const unsigned char *)get";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "()->data(),get";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "()->size());\n";
}else if(col.colType_=="int64_t"){
	model_cc_tmp_stream << "                ret[pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "]]=(Json::Int64)getValueOf";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "();\n";
}else if(col.colType_=="uint64_t"){
	model_cc_tmp_stream << "                ret[pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "]]=(Json::UInt64)getValueOf";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "();\n";
}else{
	model_cc_tmp_stream << "                ret[pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "]]=getValueOf";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "();\n";
}
	model_cc_tmp_stream << "            }\n";
	model_cc_tmp_stream << "            else\n";
	model_cc_tmp_stream << "            {\n";
	model_cc_tmp_stream << "                ret[pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "]]=Json::Value();\n";
	model_cc_tmp_stream << "            }\n";
	model_cc_tmp_stream << "        }\n";
}
	model_cc_tmp_stream << "        return ret;\n";
	model_cc_tmp_stream << "    }\n";
	model_cc_tmp_stream << "    LOG_ERROR << \"Masquerade failed\";\n";
for(auto col:cols){
	model_cc_tmp_stream << "    if(get";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "())\n";
	model_cc_tmp_stream << "    {\n";
if(col.colDatabaseType_=="date"){
	model_cc_tmp_stream << "        ret[\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"]=get";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "()->toDbStringLocal();\n";
}else if(col.colDatabaseType_.find("timestamp")!=std::string::npos||col.colDatabaseType_.find("datetime")!=std::string::npos){
	model_cc_tmp_stream << "        ret[\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"]=get";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "()->toDbStringLocal();\n";
}else if(col.colDatabaseType_=="bytea"||col.colDatabaseType_.find("blob")!=std::string::npos){
	model_cc_tmp_stream << "        ret[\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"]=drogon::utils::base64Encode((const unsigned char *)get";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "()->data(),get";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "()->size());\n";
}else if(col.colType_=="int64_t"){
	model_cc_tmp_stream << "        ret[\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"]=(Json::Int64)getValueOf";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "();\n";
}else if(col.colType_=="uint64_t"){
	model_cc_tmp_stream << "        ret[\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"]=(Json::UInt64)getValueOf";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "();\n";
}else{
	model_cc_tmp_stream << "        ret[\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"]=getValueOf";
model_cc_tmp_stream<<col.colTypeName_;
	model_cc_tmp_stream << "();\n";
}
	model_cc_tmp_stream << "    }\n";
	model_cc_tmp_stream << "    else\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        ret[\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"]=Json::Value();\n";
	model_cc_tmp_stream << "    }\n";
}
	model_cc_tmp_stream << "    return ret;\n";
	model_cc_tmp_stream << "}\n";
model_cc_tmp_stream<<"\n";
	model_cc_tmp_stream << "bool ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::validateJsonForCreation(const Json::Value &pJson, std::string &err)\n";
	model_cc_tmp_stream << "{\n";
    for(size_t i=0;i<cols.size();i++)
    {
        auto &col = cols[i];
        if(col.colType_.empty())
            continue;
	model_cc_tmp_stream << "    if(pJson.isMember(\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"))\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        if(!validJsonOfField(";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << ", \"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\", pJson[\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"], err, true))\n";
	model_cc_tmp_stream << "            return false;\n";
	model_cc_tmp_stream << "    }\n";
if(col.notNull_ && !col.isAutoVal_ && !col.hasDefaultVal_){
	model_cc_tmp_stream << "    else\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        err=\"The ";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << " column cannot be null\";\n";
	model_cc_tmp_stream << "        return false;\n";
	model_cc_tmp_stream << "    }\n";
}
}
	model_cc_tmp_stream << "    return true;\n";
	model_cc_tmp_stream << "}\n";
	model_cc_tmp_stream << "bool ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::validateMasqueradedJsonForCreation(const Json::Value &pJson,\n";
	model_cc_tmp_stream << "     ";
model_cc_tmp_stream<<indentStr;
	model_cc_tmp_stream << "                                     const std::vector<std::string> &pMasqueradingVector,\n";
	model_cc_tmp_stream << "     ";
model_cc_tmp_stream<<indentStr;
	model_cc_tmp_stream << "                                     std::string &err)\n";
	model_cc_tmp_stream << "{\n";
	model_cc_tmp_stream << "    if(pMasqueradingVector.size() != ";
model_cc_tmp_stream<<cols.size();
	model_cc_tmp_stream << ")\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        err = \"Bad masquerading vector\";\n";
	model_cc_tmp_stream << "        return false;\n";
	model_cc_tmp_stream << "    }\n";
	model_cc_tmp_stream << "    try {\n";
    for(size_t i=0;i<cols.size();i++)
    {
        auto &col = cols[i];
        if(col.colType_.empty())
            continue;
	model_cc_tmp_stream << "      if(!pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "].empty())\n";
	model_cc_tmp_stream << "      {\n";
	model_cc_tmp_stream << "          if(pJson.isMember(pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "]))\n";
	model_cc_tmp_stream << "          {\n";
	model_cc_tmp_stream << "              if(!validJsonOfField(";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << ", pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "], pJson[pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "]], err, true))\n";
	model_cc_tmp_stream << "                  return false;\n";
	model_cc_tmp_stream << "          }\n";
if(col.notNull_ && !col.isAutoVal_ && !col.hasDefaultVal_){
	model_cc_tmp_stream << "        else\n";
	model_cc_tmp_stream << "        {\n";
	model_cc_tmp_stream << "            err=\"The \" + pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "] + \" column cannot be null\";\n";
	model_cc_tmp_stream << "            return false;\n";
	model_cc_tmp_stream << "        }\n";
}
	model_cc_tmp_stream << "      }\n";
}
	model_cc_tmp_stream << "    }\n";
	model_cc_tmp_stream << "    catch(const Json::LogicError &e)\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "      err = e.what();\n";
	model_cc_tmp_stream << "      return false;\n";
	model_cc_tmp_stream << "    }\n";
	model_cc_tmp_stream << "    return true;\n";
	model_cc_tmp_stream << "}\n";
	model_cc_tmp_stream << "bool ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::validateJsonForUpdate(const Json::Value &pJson, std::string &err)\n";
	model_cc_tmp_stream << "{\n";
    for(size_t i=0;i<cols.size();i++)
    {
        auto &col = cols[i];
        if(col.colType_.empty())
            continue;
	model_cc_tmp_stream << "    if(pJson.isMember(\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"))\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        if(!validJsonOfField(";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << ", \"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\", pJson[\"";
model_cc_tmp_stream<<col.colName_;
	model_cc_tmp_stream << "\"], err, false))\n";
	model_cc_tmp_stream << "            return false;\n";
	model_cc_tmp_stream << "    }\n";
    if(col.isPrimaryKey_)
    {
	model_cc_tmp_stream << "    else\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        err = \"The value of primary key must be set in the json object for update\";\n";
	model_cc_tmp_stream << "        return false;\n";
	model_cc_tmp_stream << "    }\n";
    }
}
	model_cc_tmp_stream << "    return true;\n";
	model_cc_tmp_stream << "}\n";
	model_cc_tmp_stream << "bool ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::validateMasqueradedJsonForUpdate(const Json::Value &pJson,\n";
	model_cc_tmp_stream << "     ";
model_cc_tmp_stream<<indentStr;
	model_cc_tmp_stream << "                                   const std::vector<std::string> &pMasqueradingVector,\n";
	model_cc_tmp_stream << "     ";
model_cc_tmp_stream<<indentStr;
	model_cc_tmp_stream << "                                   std::string &err)\n";
	model_cc_tmp_stream << "{\n";
	model_cc_tmp_stream << "    if(pMasqueradingVector.size() != ";
model_cc_tmp_stream<<cols.size();
	model_cc_tmp_stream << ")\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        err = \"Bad masquerading vector\";\n";
	model_cc_tmp_stream << "        return false;\n";
	model_cc_tmp_stream << "    }\n";
	model_cc_tmp_stream << "    try {\n";
    for(size_t i=0;i<cols.size();i++)
    {
        auto &col = cols[i];
        if(col.colType_.empty())
            continue;
	model_cc_tmp_stream << "      if(!pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "].empty() && pJson.isMember(pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "]))\n";
	model_cc_tmp_stream << "      {\n";
	model_cc_tmp_stream << "          if(!validJsonOfField(";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << ", pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "], pJson[pMasqueradingVector[";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << "]], err, false))\n";
	model_cc_tmp_stream << "              return false;\n";
	model_cc_tmp_stream << "      }\n";
    if(col.isPrimaryKey_)
    {
	model_cc_tmp_stream << "    else\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        err = \"The value of primary key must be set in the json object for update\";\n";
	model_cc_tmp_stream << "        return false;\n";
	model_cc_tmp_stream << "    }\n";
    }
}
	model_cc_tmp_stream << "    }\n";
	model_cc_tmp_stream << "    catch(const Json::LogicError &e)\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "      err = e.what();\n";
	model_cc_tmp_stream << "      return false;\n";
	model_cc_tmp_stream << "    }\n";
	model_cc_tmp_stream << "    return true;\n";
	model_cc_tmp_stream << "}\n";
	model_cc_tmp_stream << "bool ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::validJsonOfField(size_t index,\n";
	model_cc_tmp_stream << "     ";
model_cc_tmp_stream<<indentStr;
	model_cc_tmp_stream << "                   const std::string &fieldName,\n";
	model_cc_tmp_stream << "     ";
model_cc_tmp_stream<<indentStr;
	model_cc_tmp_stream << "                   const Json::Value &pJson,\n";
	model_cc_tmp_stream << "     ";
model_cc_tmp_stream<<indentStr;
	model_cc_tmp_stream << "                   std::string &err,\n";
	model_cc_tmp_stream << "     ";
model_cc_tmp_stream<<indentStr;
	model_cc_tmp_stream << "                   bool isForCreation)\n";
	model_cc_tmp_stream << "{\n";
	model_cc_tmp_stream << "    switch(index)\n";
	model_cc_tmp_stream << "    {\n";
    for(size_t i=0;i<cols.size();i++)
    {
        auto &col = cols[i];
        if(col.colType_.empty())
            continue;
	model_cc_tmp_stream << "        case ";
model_cc_tmp_stream<<i;
	model_cc_tmp_stream << ":\n";
if(col.notNull_){
	model_cc_tmp_stream << "            if(pJson.isNull())\n";
	model_cc_tmp_stream << "            {\n";
	model_cc_tmp_stream << "                err=\"The \" + fieldName + \" column cannot be null\";\n";
	model_cc_tmp_stream << "                return false;\n";
	model_cc_tmp_stream << "            }\n";
}
            if(col.isAutoVal_)
            {
                if(col.isPrimaryKey_)
                {
	model_cc_tmp_stream << "            if(isForCreation)\n";
	model_cc_tmp_stream << "            {\n";
	model_cc_tmp_stream << "                err=\"The automatic primary key cannot be set\";\n";
	model_cc_tmp_stream << "                return false;\n";
	model_cc_tmp_stream << "            }\n";
                }else
                {
	model_cc_tmp_stream << "            if(isForCreation)\n";
	model_cc_tmp_stream << "            {\n";
	model_cc_tmp_stream << "                err=\"The automatic primary key cannot be set\";\n";
	model_cc_tmp_stream << "                return false;\n";
	model_cc_tmp_stream << "            }\n";
	model_cc_tmp_stream << "            else\n";
	model_cc_tmp_stream << "            {\n";
	model_cc_tmp_stream << "                err=\"The automatic primary key cannot be update\";\n";
	model_cc_tmp_stream << "                return false;\n";
	model_cc_tmp_stream << "            }\n";
                }
            }
if(!col.notNull_){
	model_cc_tmp_stream << "            if(pJson.isNull())\n";
	model_cc_tmp_stream << "            {\n";
	model_cc_tmp_stream << "                return true;\n";
	model_cc_tmp_stream << "            }\n";
}
            if(col.colType_ == "uint64_t")
            {
	model_cc_tmp_stream << "            if(!pJson.isUInt64())\n";
	model_cc_tmp_stream << "            {\n";
	model_cc_tmp_stream << "                err=\"Type error in the \"+fieldName+\" field\";\n";
	model_cc_tmp_stream << "                return false;\n";
	model_cc_tmp_stream << "            }\n";
            }
            else if(col.colType_ == "int64_t")
            {
	model_cc_tmp_stream << "            if(!pJson.isInt64())\n";
	model_cc_tmp_stream << "            {\n";
	model_cc_tmp_stream << "                err=\"Type error in the \"+fieldName+\" field\";\n";
	model_cc_tmp_stream << "                return false;\n";
	model_cc_tmp_stream << "            }\n";
            }
            else if(col.colType_.find("uint") == 0)
            {
	model_cc_tmp_stream << "            if(!pJson.isUInt())\n";
	model_cc_tmp_stream << "            {\n";
	model_cc_tmp_stream << "                err=\"Type error in the \"+fieldName+\" field\";\n";
	model_cc_tmp_stream << "                return false;\n";
	model_cc_tmp_stream << "            }\n";
            }
            else if(col.colType_.find("int") == 0 || col.colType_ == "short")
            {
	model_cc_tmp_stream << "            if(!pJson.isInt())\n";
	model_cc_tmp_stream << "            {\n";
	model_cc_tmp_stream << "                err=\"Type error in the \"+fieldName+\" field\";\n";
	model_cc_tmp_stream << "                return false;\n";
	model_cc_tmp_stream << "            }\n";
            }
            else if(col.colType_ == "float" || col.colType_ == "double")
            {
	model_cc_tmp_stream << "            if(!pJson.isNumeric())\n";
	model_cc_tmp_stream << "            {\n";
	model_cc_tmp_stream << "                err=\"Type error in the \"+fieldName+\" field\";\n";
	model_cc_tmp_stream << "                return false;\n";
	model_cc_tmp_stream << "            }\n";
            }
            else if(col.colType_ == "bool")
            {
	model_cc_tmp_stream << "            if(!pJson.isBool())\n";
	model_cc_tmp_stream << "            {\n";
	model_cc_tmp_stream << "                err=\"Type error in the \"+fieldName+\" field\";\n";
	model_cc_tmp_stream << "                return false;\n";
	model_cc_tmp_stream << "            }\n";
            }
            else
            {
	model_cc_tmp_stream << "            if(!pJson.isString())\n";
	model_cc_tmp_stream << "            {\n";
	model_cc_tmp_stream << "                err=\"Type error in the \"+fieldName+\" field\";\n";
	model_cc_tmp_stream << "                return false;\n";
	model_cc_tmp_stream << "            }\n";
                if(col.colType_ == "std::string" && col.colLength_>0)
                {
	model_cc_tmp_stream << "            if(pJson.isString() && std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t>{}\n";
	model_cc_tmp_stream << "                .from_bytes(pJson.asCString()).size() > ";
model_cc_tmp_stream<<col.colLength_;
	model_cc_tmp_stream << ")\n";
	model_cc_tmp_stream << "            {\n";
	model_cc_tmp_stream << "                err=\"String length exceeds limit for the \" +\n";
	model_cc_tmp_stream << "                    fieldName +\n";
	model_cc_tmp_stream << "                    \" field (the maximum value is ";
model_cc_tmp_stream<<col.colLength_;
	model_cc_tmp_stream << ")\";\n";
	model_cc_tmp_stream << "                return false;\n";
	model_cc_tmp_stream << "            }\n";
                }
            }
	model_cc_tmp_stream << "            break;\n";
}
	model_cc_tmp_stream << "        default:\n";
	model_cc_tmp_stream << "            err=\"Internal error in the server\";\n";
	model_cc_tmp_stream << "            return false;\n";
	model_cc_tmp_stream << "    }\n";
	model_cc_tmp_stream << "    return true;\n";
	model_cc_tmp_stream << "}\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(!alias.empty())
        {
            if(alias[0] <= 'z' && alias[0] >= 'a')
            {
                alias[0] += ('A' - 'a');
            }
        }
        else
        {
            alias = relationshipClassName;
        }
		std::string alind(alias.length(), ' ');
        if(relationship.type() == Relationship::Type::HasOne)
        {
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << " ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::get";
model_cc_tmp_stream<<alias;
	model_cc_tmp_stream << "(const DbClientPtr &clientPtr) const {\n";
	model_cc_tmp_stream << "    static const std::string sql = \"select * from ";
model_cc_tmp_stream<<name;
	model_cc_tmp_stream << " where ";
model_cc_tmp_stream<<relationship.targetKey();
	model_cc_tmp_stream << " = ";
            if(rdbms=="postgresql")
            {
                model_cc_tmp_stream<<"$1";
            }
            else
            {
                model_cc_tmp_stream<<"?";
            }
	model_cc_tmp_stream << "\";\n";
	model_cc_tmp_stream << "    Result r(nullptr);\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        auto binder = *clientPtr << sql;\n";
	model_cc_tmp_stream << "        binder << *";
model_cc_tmp_stream<<nameTransform(relationship.originalKey(), false);
	model_cc_tmp_stream << "_ << Mode::Blocking >>\n";
	model_cc_tmp_stream << "            [&r](const Result &result) { r = result; };\n";
	model_cc_tmp_stream << "        binder.exec();\n";
	model_cc_tmp_stream << "    }\n";
	model_cc_tmp_stream << "    if (r.size() == 0)\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        throw UnexpectedRows(\"0 rows found\");\n";
	model_cc_tmp_stream << "    }\n";
	model_cc_tmp_stream << "    else if (r.size() > 1)\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        throw UnexpectedRows(\"Found more than one row\");\n";
	model_cc_tmp_stream << "    }\n";
	model_cc_tmp_stream << "    return ";
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << "(r[0]);\n";
	model_cc_tmp_stream << "}\n";
model_cc_tmp_stream<<"\n";
	model_cc_tmp_stream << "void ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::get";
model_cc_tmp_stream<<alias;
	model_cc_tmp_stream << "(const DbClientPtr &clientPtr,\n";
	model_cc_tmp_stream << "     ";
model_cc_tmp_stream<<indentStr;
	model_cc_tmp_stream << "     ";
model_cc_tmp_stream<<alind;
	model_cc_tmp_stream << " const std::function<void(";
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << ")> &rcb,\n";
	model_cc_tmp_stream << "     ";
model_cc_tmp_stream<<indentStr;
	model_cc_tmp_stream << "     ";
model_cc_tmp_stream<<alind;
	model_cc_tmp_stream << " const ExceptionCallback &ecb) const\n";
	model_cc_tmp_stream << "{\n";
	model_cc_tmp_stream << "    static const std::string sql = \"select * from ";
model_cc_tmp_stream<<name;
	model_cc_tmp_stream << " where ";
model_cc_tmp_stream<<relationship.targetKey();
	model_cc_tmp_stream << " = ";
            if(rdbms=="postgresql")
            {
                model_cc_tmp_stream<<"$1";
            }
            else
            {
                model_cc_tmp_stream<<"?";
            }
	model_cc_tmp_stream << "\";\n";
	model_cc_tmp_stream << "    *clientPtr << sql\n";
	model_cc_tmp_stream << "               << *";
model_cc_tmp_stream<<nameTransform(relationship.originalKey(), false);
	model_cc_tmp_stream << "_\n";
	model_cc_tmp_stream << "               >> [rcb = std::move(rcb), ecb](const Result &r){\n";
	model_cc_tmp_stream << "                    if (r.size() == 0)\n";
	model_cc_tmp_stream << "                    {\n";
	model_cc_tmp_stream << "                        ecb(UnexpectedRows(\"0 rows found\"));\n";
	model_cc_tmp_stream << "                    }\n";
	model_cc_tmp_stream << "                    else if (r.size() > 1)\n";
	model_cc_tmp_stream << "                    {\n";
	model_cc_tmp_stream << "                        ecb(UnexpectedRows(\"Found more than one row\"));\n";
	model_cc_tmp_stream << "                    }\n";
	model_cc_tmp_stream << "                    else\n";
	model_cc_tmp_stream << "                    {\n";
	model_cc_tmp_stream << "                        rcb(";
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << "(r[0]));\n";
	model_cc_tmp_stream << "                    }\n";
	model_cc_tmp_stream << "               }\n";
	model_cc_tmp_stream << "               >> ecb;\n";
	model_cc_tmp_stream << "}\n";
        }
        else if(relationship.type() == Relationship::Type::HasMany)
        {
	model_cc_tmp_stream << "std::vector<";
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << "> ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::get";
model_cc_tmp_stream<<alias;
	model_cc_tmp_stream << "(const DbClientPtr &clientPtr) const {\n";
	model_cc_tmp_stream << "    static const std::string sql = \"select * from ";
model_cc_tmp_stream<<name;
	model_cc_tmp_stream << " where ";
model_cc_tmp_stream<<relationship.targetKey();
	model_cc_tmp_stream << " = ";
            if(rdbms=="postgresql")
            {
                model_cc_tmp_stream<<"$1";
            }
            else
            {
                model_cc_tmp_stream<<"?";
            }
	model_cc_tmp_stream << "\";\n";
	model_cc_tmp_stream << "    Result r(nullptr);\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        auto binder = *clientPtr << sql;\n";
	model_cc_tmp_stream << "        binder << *";
model_cc_tmp_stream<<nameTransform(relationship.originalKey(), false);
	model_cc_tmp_stream << "_ << Mode::Blocking >>\n";
	model_cc_tmp_stream << "            [&r](const Result &result) { r = result; };\n";
	model_cc_tmp_stream << "        binder.exec();\n";
	model_cc_tmp_stream << "    }\n";
	model_cc_tmp_stream << "    std::vector<";
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << "> ret;\n";
	model_cc_tmp_stream << "    ret.reserve(r.size());\n";
	model_cc_tmp_stream << "    for (auto const &row : r)\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        ret.emplace_back(";
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << "(row));\n";
	model_cc_tmp_stream << "    }\n";
	model_cc_tmp_stream << "    return ret;\n";
	model_cc_tmp_stream << "}\n";
model_cc_tmp_stream<<"\n";
	model_cc_tmp_stream << "void ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::get";
model_cc_tmp_stream<<alias;
	model_cc_tmp_stream << "(const DbClientPtr &clientPtr,\n";
	model_cc_tmp_stream << "     ";
model_cc_tmp_stream<<indentStr;
	model_cc_tmp_stream << "     ";
model_cc_tmp_stream<<alind;
	model_cc_tmp_stream << " const std::function<void(std::vector<";
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << ">)> &rcb,\n";
	model_cc_tmp_stream << "     ";
model_cc_tmp_stream<<indentStr;
	model_cc_tmp_stream << "     ";
model_cc_tmp_stream<<alind;
	model_cc_tmp_stream << " const ExceptionCallback &ecb) const\n";
	model_cc_tmp_stream << "{\n";
	model_cc_tmp_stream << "    static const std::string sql = \"select * from ";
model_cc_tmp_stream<<name;
	model_cc_tmp_stream << " where ";
model_cc_tmp_stream<<relationship.targetKey();
	model_cc_tmp_stream << " = ";
            if(rdbms=="postgresql")
            {
                model_cc_tmp_stream<<"$1";
            }
            else
            {
                model_cc_tmp_stream<<"?";
            }
	model_cc_tmp_stream << "\";\n";
	model_cc_tmp_stream << "    *clientPtr << sql\n";
	model_cc_tmp_stream << "               << *";
model_cc_tmp_stream<<nameTransform(relationship.originalKey(), false);
	model_cc_tmp_stream << "_\n";
	model_cc_tmp_stream << "               >> [rcb = std::move(rcb)](const Result &r){\n";
	model_cc_tmp_stream << "                   std::vector<";
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << "> ret;\n";
	model_cc_tmp_stream << "                   ret.reserve(r.size());\n";
	model_cc_tmp_stream << "                   for (auto const &row : r)\n";
	model_cc_tmp_stream << "                   {\n";
	model_cc_tmp_stream << "                       ret.emplace_back(";
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << "(row));\n";
	model_cc_tmp_stream << "                   }\n";
	model_cc_tmp_stream << "                   rcb(ret);\n";
	model_cc_tmp_stream << "               }\n";
	model_cc_tmp_stream << "               >> ecb;\n";
	model_cc_tmp_stream << "}\n";
        }
        else if(relationship.type() == Relationship::Type::ManyToMany)
        {
            auto &pivotTableName=relationship.pivotTable().tableName();
            auto pivotTableClassName=nameTransform(pivotTableName, true);
            auto &pivotOriginalKey=relationship.pivotTable().originalKey();
            auto &pivotTargetKey=relationship.pivotTable().targetKey();
	model_cc_tmp_stream << "std::vector<std::pair<";
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << ",";
model_cc_tmp_stream<<pivotTableClassName;
	model_cc_tmp_stream << ">> ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::get";
model_cc_tmp_stream<<alias;
	model_cc_tmp_stream << "(const DbClientPtr &clientPtr) const {\n";
	model_cc_tmp_stream << "    static const std::string sql = \"select * from ";
model_cc_tmp_stream<<name;
	model_cc_tmp_stream << ",";
model_cc_tmp_stream<<pivotTableName;
	model_cc_tmp_stream << " where ";
model_cc_tmp_stream<<pivotTableName;
	model_cc_tmp_stream << ".";
model_cc_tmp_stream<<pivotOriginalKey;
	model_cc_tmp_stream << " = ";
            if(rdbms=="postgresql")
            {
                model_cc_tmp_stream<<"$1";
            }
            else
            {
                model_cc_tmp_stream<<"?";
            }
	model_cc_tmp_stream << " and ";
model_cc_tmp_stream<<pivotTableName;
	model_cc_tmp_stream << ".";
model_cc_tmp_stream<<pivotTargetKey;
	model_cc_tmp_stream << " = ";
model_cc_tmp_stream<<name;
	model_cc_tmp_stream << ".";
model_cc_tmp_stream<<relationship.targetKey();
	model_cc_tmp_stream << "\";\n";
	model_cc_tmp_stream << "    Result r(nullptr);\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        auto binder = *clientPtr << sql;\n";
	model_cc_tmp_stream << "        binder << *";
model_cc_tmp_stream<<nameTransform(relationship.originalKey(), false);
	model_cc_tmp_stream << "_ << Mode::Blocking >>\n";
	model_cc_tmp_stream << "            [&r](const Result &result) { r = result; };\n";
	model_cc_tmp_stream << "        binder.exec();\n";
	model_cc_tmp_stream << "    }\n";
	model_cc_tmp_stream << "    std::vector<std::pair<";
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << ",";
model_cc_tmp_stream<<pivotTableClassName;
	model_cc_tmp_stream << ">> ret;\n";
	model_cc_tmp_stream << "    ret.reserve(r.size());\n";
	model_cc_tmp_stream << "    for (auto const &row : r)\n";
	model_cc_tmp_stream << "    {\n";
	model_cc_tmp_stream << "        ret.emplace_back(std::pair<";
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << ",";
model_cc_tmp_stream<<pivotTableClassName;
	model_cc_tmp_stream << ">(\n";
	model_cc_tmp_stream << "            ";
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << "(row),";
model_cc_tmp_stream<<pivotTableClassName;
	model_cc_tmp_stream << "(row,";
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << "::getColumnNumber())));\n";
	model_cc_tmp_stream << "    }\n";
	model_cc_tmp_stream << "    return ret;\n";
	model_cc_tmp_stream << "}\n";
model_cc_tmp_stream<<"\n";
	model_cc_tmp_stream << "void ";
{
    auto & val=model_cc_view_data["className"];
    if(val.type()==typeid(const char *)){
        model_cc_tmp_stream<<*(std::any_cast<const char *>(&val));
    }else if(val.type()==typeid(std::string)||val.type()==typeid(const std::string)){
        model_cc_tmp_stream<<*(std::any_cast<const std::string>(&val));
    }
}
	model_cc_tmp_stream << "::get";
model_cc_tmp_stream<<alias;
	model_cc_tmp_stream << "(const DbClientPtr &clientPtr,\n";
	model_cc_tmp_stream << "     ";
model_cc_tmp_stream<<indentStr;
	model_cc_tmp_stream << "     ";
model_cc_tmp_stream<<alind;
	model_cc_tmp_stream << " const std::function<void(std::vector<std::pair<";
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << ",";
model_cc_tmp_stream<<pivotTableClassName;
	model_cc_tmp_stream << ">>)> &rcb,\n";
	model_cc_tmp_stream << "     ";
model_cc_tmp_stream<<indentStr;
	model_cc_tmp_stream << "     ";
model_cc_tmp_stream<<alind;
	model_cc_tmp_stream << " const ExceptionCallback &ecb) const\n";
	model_cc_tmp_stream << "{\n";
	model_cc_tmp_stream << "    static const std::string sql = \"select * from ";
model_cc_tmp_stream<<name;
	model_cc_tmp_stream << ",";
model_cc_tmp_stream<<pivotTableName;
	model_cc_tmp_stream << " where ";
model_cc_tmp_stream<<pivotTableName;
	model_cc_tmp_stream << ".";
model_cc_tmp_stream<<pivotOriginalKey;
	model_cc_tmp_stream << " = ";
            if(rdbms=="postgresql")
            {
                model_cc_tmp_stream<<"$1";
            }
            else
            {
                model_cc_tmp_stream<<"?";
            }
	model_cc_tmp_stream << " and ";
model_cc_tmp_stream<<pivotTableName;
	model_cc_tmp_stream << ".";
model_cc_tmp_stream<<pivotTargetKey;
	model_cc_tmp_stream << " = ";
model_cc_tmp_stream<<name;
	model_cc_tmp_stream << ".";
model_cc_tmp_stream<<relationship.targetKey();
	model_cc_tmp_stream << "\";\n";
	model_cc_tmp_stream << "    *clientPtr << sql\n";
	model_cc_tmp_stream << "               << *";
model_cc_tmp_stream<<nameTransform(relationship.originalKey(), false);
	model_cc_tmp_stream << "_\n";
	model_cc_tmp_stream << "               >> [rcb = std::move(rcb)](const Result &r){\n";
	model_cc_tmp_stream << "                   std::vector<std::pair<";
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << ",";
model_cc_tmp_stream<<pivotTableClassName;
	model_cc_tmp_stream << ">> ret;\n";
	model_cc_tmp_stream << "                   ret.reserve(r.size());\n";
	model_cc_tmp_stream << "                   for (auto const &row : r)\n";
	model_cc_tmp_stream << "                   {\n";
	model_cc_tmp_stream << "                       ret.emplace_back(std::pair<";
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << ",";
model_cc_tmp_stream<<pivotTableClassName;
	model_cc_tmp_stream << ">(\n";
	model_cc_tmp_stream << "                           ";
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << "(row),";
model_cc_tmp_stream<<pivotTableClassName;
	model_cc_tmp_stream << "(row,";
model_cc_tmp_stream<<relationshipClassName;
	model_cc_tmp_stream << "::getColumnNumber())));\n";
	model_cc_tmp_stream << "                   }\n";
	model_cc_tmp_stream << "                   rcb(ret);\n";
	model_cc_tmp_stream << "               }\n";
	model_cc_tmp_stream << "               >> ecb;\n";
	model_cc_tmp_stream << "}\n";
        }
    }
if(layoutName.empty())
{
std::string ret{std::move(model_cc_tmp_stream.str())};
return ret;
}else
{
auto templ = DrTemplateBase::newTemplate(layoutName);
if(!templ) return "";
HttpViewData data = model_cc_view_data;
auto str = std::move(model_cc_tmp_stream.str());
if(!str.empty() && str[str.length()-1] == '\n') str.resize(str.length()-1);
data[""] = std::move(str);
return templ->genText(data);
}
}
