added: to Model::to_text() methods added dump_mode (bool) parameter

an additional field (model_save_mode) is printed
changed: if there is no an object the Cursor returns a Model with DO_NOTHING_ON_SAVE flag now
         (DO_INSERT_ON_SAVE was beforehand)
fixed:   when reading a result from db: for auto generated select there should be used
         get_value_by_field_index() method instead of get_value_by_field_name() 
changed: flat string (json) is generated only if a model has DO_INSERT_ON_SAVE
         or DO_UPDATE_ON_SAVE or is dump_mode turn on
         




git-svn-id: svn://ttmath.org/publicrep/morm/trunk@1208 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
Tomasz Sowa 2019-09-13 18:17:02 +00:00
parent c133e949ce
commit 057d879b4c
9 changed files with 81 additions and 31 deletions

View File

@ -76,10 +76,10 @@ public:
field(L"id", id, false, false, true);
field(L"person_id", person_id);
field(L"name", name);
field(L"language_id", language);
field(L"content", content);
field(L"some_flags", some_flags);
field(L"created_date", created_date);
field(L"language_id", L"language", language);
}

View File

@ -79,9 +79,9 @@ public:
field(L"first_name", first_name);
field(L"last_name", last_name);
field(L"email", email);
field(L"language_id", language);
field(L"language_id", L"language", language);
field(L"person_id", attachment, true, true, false);
field(L"person_id", L"attachment", attachment, true, true, false);
//field(L"person_id", attachment, f::insertable | f::updatable | f::foreign_key);
//field(L"person_id", attachment, f::insertable, f::updatable, f::foreign_key);
}

View File

@ -52,16 +52,25 @@ public:
void make()
{
person.set_connector(model_connector);
load_defaults(person);
//load_defaults(person);
std::wstring sss = L"cosik";
person.set_field_value_generic(L"email", L"email", sss);
//std::wstring sss = L"cosik";
//person.set_field_value_generic(L"email", L"email", sss);
person.insert();
//person.insert();
//person.update();
//person.save();
//person.remove();
morm::Finder<Person> finder(model_connector);
Person p = finder.select().where().eq(L"id", 110).get();
std::string str;
p.to_text(str, true, true);
std::cout << str << std::endl;
}

View File

@ -106,12 +106,22 @@ void BaseExpression::generate_from_model(Model & model)
if( out_stream )
{
before_generate_from_model();
dump_additional_info(model);
model.map_fields();
after_generate_from_model();
}
}
void BaseExpression::dump_additional_info(Model & model)
{
if( model.model_env && model.model_env->dump_mode )
{
field(L"model_save_mode", model.save_mode, false, false, false, model.model_env);
}
}
/*
void BaseExpression::put_field_doc(void * pointer)
{

View File

@ -288,6 +288,7 @@ protected:
virtual void save_foreign_key(const wchar_t * field_name, ModelEnv * model_env);
virtual void dump_additional_info(Model & model);
template<typename FieldValue>
void put_field_value(const FieldValue & field_value)

View File

@ -160,6 +160,7 @@ public:
bool res = false;
result.set_connector(model_connector);
result.clear();
result.save_mode = Model::DO_NOTHING_ON_SAVE;
if( model_connector && query_result && query_result->has_db_result() )
{

View File

@ -124,7 +124,7 @@ bool Model::found()
}
void Model::to_text(PT::TextStream & stream, ModelData * model_data, bool clear_stream)
void Model::to_text(PT::TextStream & stream, ModelData * model_data, bool clear_stream, bool dump_mode)
{
if( clear_stream )
{
@ -135,6 +135,7 @@ void Model::to_text(PT::TextStream & stream, ModelData * model_data, bool clear_
model_env = &model_env_local;
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING;
model_env->dump_mode = dump_mode;
if( model_connector )
{
@ -153,20 +154,20 @@ void Model::to_text(PT::TextStream & stream, ModelData * model_data, bool clear_
}
void Model::to_text(PT::TextStream & stream, ModelData & model_data, bool clear_stream)
void Model::to_text(PT::TextStream & stream, ModelData & model_data, bool clear_stream, bool dump_mode)
{
to_text(stream, &model_data, clear_stream);
to_text(stream, &model_data, clear_stream, dump_mode);
}
void Model::to_text(PT::TextStream & stream, bool clear_stream)
void Model::to_text(PT::TextStream & stream, bool clear_stream, bool dump_mode)
{
to_text(stream, nullptr, clear_stream);
to_text(stream, nullptr, clear_stream, dump_mode);
}
void Model::to_text(std::string & str, ModelData * model_data, bool clear_string)
void Model::to_text(std::string & str, ModelData * model_data, bool clear_string, bool dump_mode)
{
if( model_connector )
{
@ -175,22 +176,22 @@ void Model::to_text(std::string & str, ModelData * model_data, bool clear_string
if( out_stream )
{
to_text(*out_stream, model_data, true);
to_text(*out_stream, model_data, true, dump_mode);
out_stream->to_string(str, clear_string);
}
}
}
void Model::to_text(std::string & str, ModelData & model_data, bool clear_string)
void Model::to_text(std::string & str, ModelData & model_data, bool clear_string, bool dump_mode)
{
to_text(str, &model_data, clear_string);
to_text(str, &model_data, clear_string, dump_mode);
}
void Model::to_text(std::string & str, bool clear_string)
void Model::to_text(std::string & str, bool clear_string, bool dump_mode)
{
to_text(str, nullptr, clear_string);
to_text(str, nullptr, clear_string, dump_mode);
}

View File

@ -58,7 +58,7 @@ public:
enum SaveMode
{
DO_INSERT_ON_SAVE,
DO_INSERT_ON_SAVE = 0,
DO_UPDATE_ON_SAVE,
DO_DELETE_ON_SAVE,
DO_NOTHING_ON_SAVE,
@ -99,13 +99,13 @@ public:
*/
virtual void table_name(PT::TextStream & stream);
virtual void to_text(PT::TextStream & stream, ModelData * model_data, bool clear_stream = true);
virtual void to_text(PT::TextStream & stream, ModelData & model_data, bool clear_stream = true);
virtual void to_text(PT::TextStream & stream, bool clear_stream = true);
virtual void to_text(PT::TextStream & stream, ModelData * model_data, bool clear_stream = true, bool dump_mode = false);
virtual void to_text(PT::TextStream & stream, ModelData & model_data, bool clear_stream = true, bool dump_mode = false);
virtual void to_text(PT::TextStream & stream, bool clear_stream = true, bool dump_mode = false);
virtual void to_text(std::string & str, ModelData * model_data, bool clear_string = true);
virtual void to_text(std::string & str, ModelData & model_data, bool clear_string = true);
virtual void to_text(std::string & str, bool clear_string = true);
virtual void to_text(std::string & str, ModelData * model_data, bool clear_string = true, bool dump_mode = false);
virtual void to_text(std::string & str, ModelData & model_data, bool clear_string = true, bool dump_mode = false);
virtual void to_text(std::string & str, bool clear_string = true, bool dump_mode = false);
virtual std::string to_text();
virtual std::string to_string();
@ -775,7 +775,7 @@ protected:
{
if( !is_empty_field(db_field_name) )
{
if( model_env->model_data && model_env->cursor_helper && model_env->cursor_helper->has_autogenerated_select )
if( model_env->cursor_helper && model_env->cursor_helper->has_autogenerated_select )
{
get_value_by_field_index(model_env->cursor_helper->current_column, field_value);
model_env->cursor_helper->current_column += 1;
@ -853,7 +853,9 @@ protected:
}
else
{
map_fields();
ModelEnv * old_model_env = field_model.model_env;
map_fields(); // map_fields() will set field_model.model_env to null
field_model.model_env = old_model_env;
model_env->finder_helper->join_tables_str << " ON " << model_env->table_name_short << '.';
@ -885,8 +887,11 @@ protected:
if( flat_expression && !is_empty_field(flat_field_name) )
{
field_model.model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING;
flat_expression->field_model(flat_field_name, field_model, insertable, updatable, false, model_env);
if( model_env->dump_mode || field_model.save_mode == DO_INSERT_ON_SAVE || field_model.save_mode == DO_UPDATE_ON_SAVE )
{
field_model.model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING;
flat_expression->field_model(flat_field_name, field_model, insertable, updatable, false, model_env);
}
}
}
}
@ -1268,6 +1273,21 @@ protected:
{
if( model_env->cursor_helper && model_env->cursor_helper->query_result )
{
// std::wstring table_field_name;
// CHECK what about escaping field names here?
/*
* FIX ME
* we need the table name with correct prefix (index)
*
*/
// model_env->table_name.to_string(table_field_name);
//
//
// table_field_name += '.';
// table_field_name += field_name;
const char * val_str = model_env->cursor_helper->query_result->get_field_string_value(field_name);
if( val_str )

View File

@ -50,14 +50,19 @@ class ModelEnv
{
public:
// global objects to the whole models tree
// (values are copied to child models)
ModelData * model_data;
FinderHelper * finder_helper;
CursorHelper * cursor_helper;
int model_connector_mode;
bool dump_mode;
// local objects
// (for only one model)
const void * doc_field_pointer;
PT::TextStream table_name;
PT::TextStream table_name; // CHECK ME may it should be PT::WTextStream?
PT::TextStream table_name_short;
int table_index;
int field_index;
@ -83,6 +88,7 @@ public:
finder_helper = e.finder_helper;
cursor_helper = e.cursor_helper;
model_connector_mode = e.model_connector_mode;
dump_mode = e.dump_mode;
table_index = e.table_index;
doc_field_pointer = e.doc_field_pointer;
set_field_name_helper = e.set_field_name_helper;
@ -100,6 +106,7 @@ public:
cursor_helper = e.cursor_helper;
model_connector_mode = e.model_connector_mode;
dump_mode = e.dump_mode;
// what about doc_field_pointer?
}
@ -110,6 +117,7 @@ public:
finder_helper = nullptr;
cursor_helper = nullptr;
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
dump_mode = false;
doc_field_pointer = nullptr;
table_name.clear();
table_name_short.clear();