added BaseExpression::is_long_field_name()

added BaseExpression::need_to_add_field_prefix()
      now the fields() methods don't take add_column_prefix parameter
      but the field_name (wchar_t*) is tested whether is it a long (with a period) or short name
added BaseExpression::save_foreign_key() (code moved from field())
removed some default method arguments from BaseExpression
added neq() method for Finder
added DbExpression::prepare_short_table_name(const PT::TextStream & table_name, PT::TextStream & short_table_name)




git-svn-id: svn://ttmath.org/publicrep/morm/branches/join_models@1194 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
2019-05-31 18:28:09 +00:00
parent a1d18735b0
commit b6fbe29805
13 changed files with 286 additions and 205 deletions

View File

@@ -60,7 +60,7 @@ public:
virtual void set_work_mode(int work_mode);
virtual int get_work_mode();
virtual void prepare_to_new_expression();
virtual void clear();
virtual void generate_from_model(PT::TextStream & stream, Model & model);
@@ -76,8 +76,7 @@ public:
template<typename FieldValue>
void field(const wchar_t * field_name, const FieldValue & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false,
bool add_column_prefix = true, ModelEnv * model_env = nullptr)
void field(const wchar_t * field_name, const FieldValue & field_value, bool insertable, bool updatable, bool is_primary_key, ModelEnv * model_env)
{
if( out_stream && can_field_be_generated(insertable, updatable, is_primary_key) )
{
@@ -85,24 +84,12 @@ public:
if( work_mode == MORM_WORK_MODE_MODEL_FIELDS )
{
put_field_name(field_name, add_column_prefix, model_env);
put_field_name(field_name, model_env);
}
else
if( work_mode == MORM_WORK_MODE_MODEL_SAVE_FIELDS )
{
PT::TextStream str;
PT::TextStream * old_out_stream = out_stream;
out_stream = &str;
put_field_name(field_name, add_column_prefix, model_env);
out_stream = old_out_stream;
if( model_env && model_env->finder_helper )
{
model_env->finder_helper->morm_foreign_keys.emplace_back();
std::string & key_str = model_env->finder_helper->morm_foreign_keys.back();
str.to_string(key_str, false);
}
save_foreign_key(field_name, model_env);
}
else
if( work_mode == MORM_WORK_MODE_MODEL_VALUES )
@@ -112,7 +99,7 @@ public:
else
if( work_mode == MORM_WORK_MODE_MODEL_FIELDS_VALUES )
{
put_field_name(field_name, add_column_prefix, model_env);
put_field_name(field_name, model_env);
put_name_value_separator();
put_field_value(field_value);
}
@@ -125,16 +112,13 @@ public:
template<typename FieldValue>
void field_doc(Model & model, const wchar_t * field_name, const FieldValue & field_value,
bool insertable = true, bool updatable = true,
bool is_primary_key = false, bool add_column_prefix = true,
ModelEnv * model_env = nullptr)
void field_doc(Model & model, const wchar_t * field_name, const FieldValue & field_value, bool insertable, bool updatable, bool is_primary_key, ModelEnv * model_env)
{
if( out_stream )
{
field_before();
put_field_name(field_name, add_column_prefix, model_env);
put_field_name(field_name, model_env);
put_name_value_separator();
put_field_doc(model, reinterpret_cast<const void*>(&field_value), insertable, updatable, is_primary_key, model_env);
@@ -147,38 +131,30 @@ public:
}
/*
template<typename FieldValue>
void field(const PT::TextStream & field_name, const FieldValue & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false, bool add_column_prefix = true)
void field_in(PT::TextStream & stream, const wchar_t * field_name, const std::set<FieldValue> & container, ModelEnv * model_env)
{
std::wstring field_name_str; // field() methods can be called recursively, so don't make it as class object
field_name.to_string(field_name_str);
return field(field_name_str.c_str(), field_value, insertable, updatable, is_primary_key, add_column_prefix);
}
*/
template<typename FieldValue>
void field_in(PT::TextStream & stream, const wchar_t * field_name, const std::set<FieldValue> & container)
{
field_in_generic<FieldValue, std::set<FieldValue>>(stream, field_name, container);
field_in_generic<FieldValue, std::set<FieldValue>>(stream, field_name, container, model_env);
}
template<typename FieldValue>
void field_in(PT::TextStream & stream, const wchar_t * field_name, const std::list<FieldValue> & container)
{
field_in_generic<FieldValue, std::list<FieldValue>>(stream, field_name, container);
}
template<typename FieldValue>
void field_in(PT::TextStream & stream, const wchar_t * field_name, const std::vector<FieldValue> & container)
void field_in(PT::TextStream & stream, const wchar_t * field_name, const std::list<FieldValue> & container, ModelEnv * model_env)
{
field_in_generic<FieldValue, std::vector<FieldValue>>(stream, field_name, container);
field_in_generic<FieldValue, std::list<FieldValue>>(stream, field_name, container, model_env);
}
template<typename FieldValue>
void field_in(PT::TextStream & stream, const wchar_t * field_name, const std::vector<FieldValue> & container, ModelEnv * model_env)
{
field_in_generic<FieldValue, std::vector<FieldValue>>(stream, field_name, container, model_env);
}
template<typename ModelContainer>
void field_list(const wchar_t * field_name, ModelContainer & field_value, bool insertable, bool updatable, bool is_primary_key,
ModelConnector * model_connector, ModelEnv * model_env)
ModelConnector * model_connector, ModelEnv * model_env)
{
if( out_stream && can_field_be_generated(insertable, updatable, is_primary_key) )
{
@@ -191,7 +167,7 @@ public:
// else
if( work_mode == MORM_WORK_MODE_MODEL_FIELDS_VALUES )
{
put_field_name(field_name); // what about model_env? put it here?
put_field_name(field_name, model_env);
put_name_value_separator();
put_field_value_list(field_value, model_connector, model_env);
}
@@ -201,7 +177,7 @@ public:
}
template<typename ModelClass>
void field_model(const wchar_t * field_name, ModelClass & field_model, bool insertable = true, bool updatable = true, bool is_primary_key = false)
void field_model(const wchar_t * field_name, ModelClass & field_model, bool insertable, bool updatable, bool is_primary_key, ModelEnv * model_env)
{
if( out_stream && can_field_be_generated(insertable, updatable, is_primary_key) )
{
@@ -209,7 +185,7 @@ public:
if( work_mode == MORM_WORK_MODE_MODEL_FIELDS )
{
put_field_name(field_name);
put_field_name(field_name, model_env);
}
else
if( work_mode == MORM_WORK_MODE_MODEL_VALUES )
@@ -219,7 +195,7 @@ public:
else
if( work_mode == MORM_WORK_MODE_MODEL_FIELDS_VALUES )
{
put_field_name(field_name);
put_field_name(field_name, model_env);
put_name_value_separator();
generate_from_model(field_model);
}
@@ -229,11 +205,11 @@ public:
}
template<typename FieldValue>
void field_to_stream(PT::TextStream & stream, const wchar_t * field_name, const FieldValue & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false,
bool add_column_prefix = true, ModelEnv * model_env = nullptr)
void field_to_stream(PT::TextStream & stream, const wchar_t * field_name, const FieldValue & field_value, bool insertable, bool updatable, bool is_primary_key,
ModelEnv * model_env)
{
this->out_stream = &stream;
field(field_name, field_value, insertable, updatable, is_primary_key, add_column_prefix, model_env);
field(field_name, field_value, insertable, updatable, is_primary_key, model_env);
this->out_stream = nullptr;
}
@@ -265,6 +241,11 @@ public:
virtual void esc(const PT::Date & date, PT::TextStream & stream);
virtual void esc(const PT::TextStream & val,PT::TextStream & stream);
virtual bool is_long_field_name(const wchar_t * field_name);
virtual bool is_long_field_name(const PT::TextStream & table_name);
virtual bool is_long_table_name(const wchar_t * field_name);
virtual bool is_long_table_name(const PT::TextStream & table_name);
@@ -287,7 +268,12 @@ protected:
//void field(const wchar_t * field_name, Model & field, bool insertable = true, bool updatable = true);
virtual void put_field_name(const wchar_t * field_name, bool add_column_prefix = true, ModelEnv * model_env = nullptr);
virtual bool need_to_add_field_prefix(const wchar_t * field_name);
virtual void put_field_name(const wchar_t * field_name, ModelEnv * model_env);
virtual void save_foreign_key(const wchar_t * field_name, ModelEnv * model_env);
template<typename FieldValue>
void put_field_value(const FieldValue & field_value)
@@ -316,6 +302,15 @@ protected:
(*out_stream) << ",";
}
virtual void put_statement_in_starts()
{
(*out_stream) << "(";
}
virtual void put_statement_in_ends()
{
(*out_stream) << ") ";
}
// what about lists with a pod types? e.g. list<int>
template<typename ModelContainer>
@@ -350,7 +345,7 @@ protected:
// 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)
void field_in_generic(PT::TextStream & stream, const wchar_t * field_name, const Container & container, ModelEnv * model_env)
{
// IMPROVE ME
// what about if container is empty?
@@ -358,24 +353,24 @@ protected:
this->out_stream = &stream;
field_before();
put_field_name(field_name);
put_field_name(field_name, model_env);
put_name_value_separator();
bool is_first = true;
(*out_stream) << "(";
put_statement_in_starts();
for(const FieldValue & v : container)
{
if( !is_first )
{
(*out_stream) << ",";
field_value_list_separator();
}
put_field_value(v);
is_first = false;
}
(*out_stream) << ") ";
put_statement_in_ends();
field_after();
this->out_stream = nullptr;
}