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:
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user