fixed: in Model::generate_insert_query there was not ModelEnv set (was a null pointer)

similarly in generate_update_query and generate_remove_query
added: support std::vector<> in Model::field() methods
added: serializing std::vector and std::list for non-model classes in BaseExpression




git-svn-id: svn://ttmath.org/publicrep/morm/trunk@1200 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
Tomasz Sowa 2019-08-20 15:49:37 +00:00
parent 0a324a38ce
commit f8d88d1459
3 changed files with 262 additions and 14 deletions

View File

@ -312,7 +312,40 @@ protected:
(*out_stream) << ") ";
}
// what about lists with a pod types? e.g. list<int>
template<typename ModelContainer>
void put_field_value_list_non_model(ModelContainer & field_value, ModelConnector * model_connector)
{
if( model_connector && out_stream )
{
bool is_first = true;
before_field_value_list();
for(const auto & m : field_value)
{
if( !is_first )
{
field_value_list_separator();
}
//ModelEnv model_env_local(*model_env);
//m.model_env = &model_env_local;
//before_field_value(field_value);
//m.set_connector(model_connector);
put_field_value(m);
//generate_from_model(m);
//m.model_env = nullptr;
//after_field_value(field_value);
is_first = false;
}
after_field_value_list();
}
}
template<typename ModelContainer>
void put_field_value_list(ModelContainer & field_value, ModelConnector * model_connector, ModelEnv * model_env)
{
@ -343,6 +376,182 @@ protected:
}
void put_field_value_list(std::vector<char> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::vector<unsigned char> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::vector<std::wstring> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::vector<std::string> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::vector<bool> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::vector<short> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::vector<unsigned short> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::vector<int> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::vector<unsigned int> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::vector<long> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::vector<unsigned long> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::vector<long long> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::vector<unsigned long long> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::vector<float> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::vector<double> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::vector<long double> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::vector<PT::Date> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::list<char> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::list<unsigned char> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::list<std::wstring> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::list<std::string> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::list<bool> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::list<short> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::list<unsigned short> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::list<int> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::list<unsigned int> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::list<long> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::list<unsigned long> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::list<long long> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::list<unsigned long long> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::list<float> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::list<double> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::list<long double> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
void put_field_value_list(std::list<PT::Date> & field_value, ModelConnector * model_connector, ModelEnv *)
{
put_field_value_list_non_model(field_value, model_connector);
}
// used in 'in()' statements, may should be renamed?
template<typename FieldValue, typename Container>
void field_in_generic(PT::TextStream & stream, const wchar_t * field_name, const Container & container, ModelEnv * model_env)
@ -437,7 +646,13 @@ protected:
template<typename ListType>
void put_type(const std::list<ListType> & model, PT::TextStream & stream)
{
stream << "table";
stream << "table"; // may just use std::list?
}
template<typename ListType>
void put_type(const std::vector<ListType> & model, PT::TextStream & stream)
{
stream << "table"; // may just just std::vector?
}
};

View File

@ -210,8 +210,11 @@ std::string Model::to_string()
void Model::generate_insert_query(PT::TextStream & stream)
void Model::generate_insert_query(PT::TextStream & stream, ModelData * model_data)
{
ModelEnv model_env_local;
model_env = &model_env_local;
model_env->model_data = model_data;
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
if( model_connector )
@ -224,7 +227,8 @@ void Model::generate_insert_query(PT::TextStream & stream)
}
}
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
// what about if an exception was thrown? this pointer will not be null
model_env = nullptr;
}
@ -277,8 +281,11 @@ bool Model::insert(ModelData & model_data)
}
void Model::generate_update_query(PT::TextStream & stream)
void Model::generate_update_query(PT::TextStream & stream, ModelData * model_data)
{
ModelEnv model_env_local;
model_env = &model_env_local;
model_env->model_data = model_data;
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
if( model_connector )
@ -291,7 +298,8 @@ void Model::generate_update_query(PT::TextStream & stream)
}
}
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
// what about if an exception was thrown? this pointer will not be null
model_env = nullptr;
}
@ -337,20 +345,25 @@ bool Model::update(ModelData & model_data)
}
void Model::generate_remove_query(PT::TextStream & stream)
void Model::generate_remove_query(PT::TextStream & stream, ModelData * model_data)
{
ModelEnv model_env_local;
model_env = &model_env_local;
model_env->model_data = model_data;
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
if( model_connector )
{
DbConnector * db_connector = model_connector->get_db_connector();
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
if( db_connector )
{
db_connector->generate_remove_query(stream, *this);
}
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
}
// what about if an exception was thrown? this pointer will not be null
model_env = nullptr;
}

View File

@ -36,6 +36,8 @@
#define headerfile_morm_model
#include <string>
#include <list>
#include <vector>
#include "textstream/textstream.h"
#include "modelconnector.h"
@ -107,15 +109,15 @@ public:
virtual std::string to_text();
virtual std::string to_string();
virtual void generate_insert_query(PT::TextStream & stream); // FIX ME needed model_data
virtual void generate_insert_query(PT::TextStream & stream, ModelData * model_data = nullptr);
virtual bool insert(ModelData * model_data = nullptr);
virtual bool insert(ModelData & model_data);
virtual void generate_update_query(PT::TextStream & stream); // FIX ME needed model_data
virtual void generate_update_query(PT::TextStream & stream, ModelData * model_data = nullptr);
virtual bool update(ModelData * model_data = nullptr);
virtual bool update(ModelData & model_data);
virtual void generate_remove_query(PT::TextStream & stream); // FIX ME needed model_data
virtual void generate_remove_query(PT::TextStream & stream, ModelData * model_data = nullptr);
virtual bool remove(ModelData * model_data = nullptr);
virtual bool remove(ModelData & model_data);
@ -281,6 +283,12 @@ protected:
field_list(field_name, field_name, field_value, list_model_null_pointer, insertable, updatable);
}
template<typename ModelClass>
void field(const wchar_t * field_name, std::vector<ModelClass> & field_value, bool insertable = true, bool updatable = true)
{
ModelClass * list_model_null_pointer = nullptr;
field_list(field_name, field_name, field_value, list_model_null_pointer, insertable, updatable);
}
//////////////////////
@ -397,7 +405,14 @@ protected:
field_list(db_field_name, flat_field_name, field_value, list_model_null_pointer, insertable, updatable);
}
//////////////////////
template<typename ModelClass>
void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::vector<ModelClass> & field_value, bool insertable = true, bool updatable = true)
{
ModelClass * list_model_null_pointer = nullptr;
field_list(db_field_name, flat_field_name, field_value, list_model_null_pointer, insertable, updatable);
}
//////////////////////
void doc(const wchar_t * field_name, char & field_value)
{
doc_field_generic(field_name, field_name, field_value);
@ -813,6 +828,8 @@ protected:
if( db_expression->get_output_type() != MORM_OUTPUT_TYPE_JOIN_TABLES )
{
// FIX ME
// UPDATE, INSERT, REMOVE for models
field_model.map_fields();
}
@ -946,6 +963,9 @@ protected:
// another select will be used (from another Finder)
// we need only columns name
// but columns are defined in the other model
// FIX ME
// UPDATE, INSERT, REMOVE for lists
}
}
}