some work in branches/join_models
added: ModelEnv class - now Model has a pointer to ModelEnv and ModelEnv has a pointer to ModelData, model_connector_mode, table_index and doc_field_pointer git-svn-id: svn://ttmath.org/publicrep/morm/branches/join_models@1191 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
parent
34ddf11351
commit
b37a577713
|
@ -6,11 +6,11 @@ baseexpression.o: ../../pikotools/textstream/types.h
|
||||||
baseexpression.o: ../../pikotools/date/date.h
|
baseexpression.o: ../../pikotools/date/date.h
|
||||||
baseexpression.o: ../../pikotools/convert/inttostr.h
|
baseexpression.o: ../../pikotools/convert/inttostr.h
|
||||||
baseexpression.o: ../../pikotools/membuffer/membuffer.h
|
baseexpression.o: ../../pikotools/membuffer/membuffer.h
|
||||||
baseexpression.o: ../../pikotools/textstream/types.h morm_types.h modeldata.h
|
baseexpression.o: ../../pikotools/textstream/types.h morm_types.h modelenv.h
|
||||||
baseexpression.o: model.h modelconnector.h clearer.h dbconnector.h
|
baseexpression.o: modeldata.h queryresult.h model.h modelconnector.h
|
||||||
baseexpression.o: ../../pikotools/log/log.h ../../pikotools/log/filelog.h
|
baseexpression.o: clearer.h dbconnector.h ../../pikotools/log/log.h
|
||||||
baseexpression.o: queryresult.h flatconnector.h dbexpression.h
|
baseexpression.o: ../../pikotools/log/filelog.h flatconnector.h
|
||||||
baseexpression.o: flatexpression.h ../../pikotools/utf8/utf8.h
|
baseexpression.o: dbexpression.h flatexpression.h ../../pikotools/utf8/utf8.h
|
||||||
clearer.o: clearer.h ../../pikotools/date/date.h
|
clearer.o: clearer.h ../../pikotools/date/date.h
|
||||||
clearer.o: ../../pikotools/convert/inttostr.h model.h
|
clearer.o: ../../pikotools/convert/inttostr.h model.h
|
||||||
clearer.o: ../../pikotools/textstream/textstream.h
|
clearer.o: ../../pikotools/textstream/textstream.h
|
||||||
|
@ -19,7 +19,7 @@ clearer.o: ../../pikotools/membuffer/membuffer.h
|
||||||
clearer.o: ../../pikotools/textstream/types.h modelconnector.h dbconnector.h
|
clearer.o: ../../pikotools/textstream/types.h modelconnector.h dbconnector.h
|
||||||
clearer.o: ../../pikotools/log/log.h ../../pikotools/log/filelog.h
|
clearer.o: ../../pikotools/log/log.h ../../pikotools/log/filelog.h
|
||||||
clearer.o: queryresult.h flatconnector.h dbexpression.h baseexpression.h
|
clearer.o: queryresult.h flatconnector.h dbexpression.h baseexpression.h
|
||||||
clearer.o: morm_types.h modeldata.h flatexpression.h
|
clearer.o: morm_types.h modelenv.h modeldata.h flatexpression.h
|
||||||
dbconnector.o: dbconnector.h ../../pikotools/textstream/textstream.h
|
dbconnector.o: dbconnector.h ../../pikotools/textstream/textstream.h
|
||||||
dbconnector.o: ../../pikotools/space/space.h
|
dbconnector.o: ../../pikotools/space/space.h
|
||||||
dbconnector.o: ../../pikotools/textstream/types.h ../../pikotools/date/date.h
|
dbconnector.o: ../../pikotools/textstream/types.h ../../pikotools/date/date.h
|
||||||
|
@ -27,7 +27,7 @@ dbconnector.o: ../../pikotools/convert/inttostr.h
|
||||||
dbconnector.o: ../../pikotools/membuffer/membuffer.h
|
dbconnector.o: ../../pikotools/membuffer/membuffer.h
|
||||||
dbconnector.o: ../../pikotools/textstream/types.h ../../pikotools/log/log.h
|
dbconnector.o: ../../pikotools/textstream/types.h ../../pikotools/log/log.h
|
||||||
dbconnector.o: ../../pikotools/log/filelog.h queryresult.h dbexpression.h
|
dbconnector.o: ../../pikotools/log/filelog.h queryresult.h dbexpression.h
|
||||||
dbconnector.o: baseexpression.h morm_types.h modeldata.h model.h
|
dbconnector.o: baseexpression.h morm_types.h modelenv.h modeldata.h model.h
|
||||||
dbconnector.o: modelconnector.h clearer.h flatconnector.h flatexpression.h
|
dbconnector.o: modelconnector.h clearer.h flatconnector.h flatexpression.h
|
||||||
dbconnector.o: ../../pikotools/utf8/utf8.h ../../pikotools/convert/convert.h
|
dbconnector.o: ../../pikotools/utf8/utf8.h ../../pikotools/convert/convert.h
|
||||||
dbconnector.o: ../../pikotools/convert/inttostr.h
|
dbconnector.o: ../../pikotools/convert/inttostr.h
|
||||||
|
@ -41,7 +41,8 @@ dbexpression.o: ../../pikotools/textstream/types.h
|
||||||
dbexpression.o: ../../pikotools/date/date.h
|
dbexpression.o: ../../pikotools/date/date.h
|
||||||
dbexpression.o: ../../pikotools/convert/inttostr.h
|
dbexpression.o: ../../pikotools/convert/inttostr.h
|
||||||
dbexpression.o: ../../pikotools/membuffer/membuffer.h
|
dbexpression.o: ../../pikotools/membuffer/membuffer.h
|
||||||
dbexpression.o: ../../pikotools/textstream/types.h morm_types.h modeldata.h
|
dbexpression.o: ../../pikotools/textstream/types.h morm_types.h modelenv.h
|
||||||
|
dbexpression.o: modeldata.h queryresult.h
|
||||||
dochtmlconnector.o: dochtmlconnector.h flatconnector.h
|
dochtmlconnector.o: dochtmlconnector.h flatconnector.h
|
||||||
dochtmlconnector.o: ../../pikotools/textstream/textstream.h
|
dochtmlconnector.o: ../../pikotools/textstream/textstream.h
|
||||||
dochtmlconnector.o: ../../pikotools/space/space.h
|
dochtmlconnector.o: ../../pikotools/space/space.h
|
||||||
|
@ -50,8 +51,8 @@ dochtmlconnector.o: ../../pikotools/date/date.h
|
||||||
dochtmlconnector.o: ../../pikotools/convert/inttostr.h
|
dochtmlconnector.o: ../../pikotools/convert/inttostr.h
|
||||||
dochtmlconnector.o: ../../pikotools/membuffer/membuffer.h
|
dochtmlconnector.o: ../../pikotools/membuffer/membuffer.h
|
||||||
dochtmlconnector.o: ../../pikotools/textstream/types.h dochtmlexpression.h
|
dochtmlconnector.o: ../../pikotools/textstream/types.h dochtmlexpression.h
|
||||||
dochtmlconnector.o: flatexpression.h baseexpression.h morm_types.h
|
dochtmlconnector.o: flatexpression.h baseexpression.h morm_types.h modelenv.h
|
||||||
dochtmlconnector.o: modeldata.h
|
dochtmlconnector.o: modeldata.h queryresult.h
|
||||||
dochtmlexpression.o: dochtmlexpression.h flatexpression.h baseexpression.h
|
dochtmlexpression.o: dochtmlexpression.h flatexpression.h baseexpression.h
|
||||||
dochtmlexpression.o: ../../pikotools/textstream/textstream.h
|
dochtmlexpression.o: ../../pikotools/textstream/textstream.h
|
||||||
dochtmlexpression.o: ../../pikotools/space/space.h
|
dochtmlexpression.o: ../../pikotools/space/space.h
|
||||||
|
@ -60,7 +61,7 @@ dochtmlexpression.o: ../../pikotools/date/date.h
|
||||||
dochtmlexpression.o: ../../pikotools/convert/inttostr.h
|
dochtmlexpression.o: ../../pikotools/convert/inttostr.h
|
||||||
dochtmlexpression.o: ../../pikotools/membuffer/membuffer.h
|
dochtmlexpression.o: ../../pikotools/membuffer/membuffer.h
|
||||||
dochtmlexpression.o: ../../pikotools/textstream/types.h morm_types.h
|
dochtmlexpression.o: ../../pikotools/textstream/types.h morm_types.h
|
||||||
dochtmlexpression.o: modeldata.h
|
dochtmlexpression.o: modelenv.h modeldata.h queryresult.h
|
||||||
flatconnector.o: flatconnector.h ../../pikotools/textstream/textstream.h
|
flatconnector.o: flatconnector.h ../../pikotools/textstream/textstream.h
|
||||||
flatconnector.o: ../../pikotools/space/space.h
|
flatconnector.o: ../../pikotools/space/space.h
|
||||||
flatconnector.o: ../../pikotools/textstream/types.h
|
flatconnector.o: ../../pikotools/textstream/types.h
|
||||||
|
@ -68,10 +69,10 @@ flatconnector.o: ../../pikotools/date/date.h
|
||||||
flatconnector.o: ../../pikotools/convert/inttostr.h
|
flatconnector.o: ../../pikotools/convert/inttostr.h
|
||||||
flatconnector.o: ../../pikotools/membuffer/membuffer.h
|
flatconnector.o: ../../pikotools/membuffer/membuffer.h
|
||||||
flatconnector.o: ../../pikotools/textstream/types.h flatexpression.h
|
flatconnector.o: ../../pikotools/textstream/types.h flatexpression.h
|
||||||
flatconnector.o: baseexpression.h morm_types.h modeldata.h model.h
|
flatconnector.o: baseexpression.h morm_types.h modelenv.h modeldata.h
|
||||||
flatconnector.o: modelconnector.h clearer.h dbconnector.h
|
flatconnector.o: queryresult.h model.h modelconnector.h clearer.h
|
||||||
flatconnector.o: ../../pikotools/log/log.h ../../pikotools/log/filelog.h
|
flatconnector.o: dbconnector.h ../../pikotools/log/log.h
|
||||||
flatconnector.o: queryresult.h dbexpression.h
|
flatconnector.o: ../../pikotools/log/filelog.h dbexpression.h
|
||||||
flatexpression.o: flatexpression.h baseexpression.h
|
flatexpression.o: flatexpression.h baseexpression.h
|
||||||
flatexpression.o: ../../pikotools/textstream/textstream.h
|
flatexpression.o: ../../pikotools/textstream/textstream.h
|
||||||
flatexpression.o: ../../pikotools/space/space.h
|
flatexpression.o: ../../pikotools/space/space.h
|
||||||
|
@ -79,7 +80,8 @@ flatexpression.o: ../../pikotools/textstream/types.h
|
||||||
flatexpression.o: ../../pikotools/date/date.h
|
flatexpression.o: ../../pikotools/date/date.h
|
||||||
flatexpression.o: ../../pikotools/convert/inttostr.h
|
flatexpression.o: ../../pikotools/convert/inttostr.h
|
||||||
flatexpression.o: ../../pikotools/membuffer/membuffer.h
|
flatexpression.o: ../../pikotools/membuffer/membuffer.h
|
||||||
flatexpression.o: ../../pikotools/textstream/types.h morm_types.h modeldata.h
|
flatexpression.o: ../../pikotools/textstream/types.h morm_types.h modelenv.h
|
||||||
|
flatexpression.o: modeldata.h queryresult.h
|
||||||
jsonconnector.o: jsonconnector.h flatconnector.h
|
jsonconnector.o: jsonconnector.h flatconnector.h
|
||||||
jsonconnector.o: ../../pikotools/textstream/textstream.h
|
jsonconnector.o: ../../pikotools/textstream/textstream.h
|
||||||
jsonconnector.o: ../../pikotools/space/space.h
|
jsonconnector.o: ../../pikotools/space/space.h
|
||||||
|
@ -88,7 +90,8 @@ jsonconnector.o: ../../pikotools/date/date.h
|
||||||
jsonconnector.o: ../../pikotools/convert/inttostr.h
|
jsonconnector.o: ../../pikotools/convert/inttostr.h
|
||||||
jsonconnector.o: ../../pikotools/membuffer/membuffer.h
|
jsonconnector.o: ../../pikotools/membuffer/membuffer.h
|
||||||
jsonconnector.o: ../../pikotools/textstream/types.h jsonexpression.h
|
jsonconnector.o: ../../pikotools/textstream/types.h jsonexpression.h
|
||||||
jsonconnector.o: flatexpression.h baseexpression.h morm_types.h modeldata.h
|
jsonconnector.o: flatexpression.h baseexpression.h morm_types.h modelenv.h
|
||||||
|
jsonconnector.o: modeldata.h queryresult.h
|
||||||
jsonexpression.o: jsonexpression.h flatexpression.h baseexpression.h
|
jsonexpression.o: jsonexpression.h flatexpression.h baseexpression.h
|
||||||
jsonexpression.o: ../../pikotools/textstream/textstream.h
|
jsonexpression.o: ../../pikotools/textstream/textstream.h
|
||||||
jsonexpression.o: ../../pikotools/space/space.h
|
jsonexpression.o: ../../pikotools/space/space.h
|
||||||
|
@ -96,7 +99,8 @@ jsonexpression.o: ../../pikotools/textstream/types.h
|
||||||
jsonexpression.o: ../../pikotools/date/date.h
|
jsonexpression.o: ../../pikotools/date/date.h
|
||||||
jsonexpression.o: ../../pikotools/convert/inttostr.h
|
jsonexpression.o: ../../pikotools/convert/inttostr.h
|
||||||
jsonexpression.o: ../../pikotools/membuffer/membuffer.h
|
jsonexpression.o: ../../pikotools/membuffer/membuffer.h
|
||||||
jsonexpression.o: ../../pikotools/textstream/types.h morm_types.h modeldata.h
|
jsonexpression.o: ../../pikotools/textstream/types.h morm_types.h modelenv.h
|
||||||
|
jsonexpression.o: modeldata.h queryresult.h
|
||||||
model.o: model.h ../../pikotools/textstream/textstream.h
|
model.o: model.h ../../pikotools/textstream/textstream.h
|
||||||
model.o: ../../pikotools/space/space.h ../../pikotools/textstream/types.h
|
model.o: ../../pikotools/space/space.h ../../pikotools/textstream/types.h
|
||||||
model.o: ../../pikotools/date/date.h ../../pikotools/convert/inttostr.h
|
model.o: ../../pikotools/date/date.h ../../pikotools/convert/inttostr.h
|
||||||
|
@ -104,7 +108,7 @@ model.o: ../../pikotools/membuffer/membuffer.h
|
||||||
model.o: ../../pikotools/textstream/types.h modelconnector.h clearer.h
|
model.o: ../../pikotools/textstream/types.h modelconnector.h clearer.h
|
||||||
model.o: dbconnector.h ../../pikotools/log/log.h
|
model.o: dbconnector.h ../../pikotools/log/log.h
|
||||||
model.o: ../../pikotools/log/filelog.h queryresult.h flatconnector.h
|
model.o: ../../pikotools/log/filelog.h queryresult.h flatconnector.h
|
||||||
model.o: dbexpression.h baseexpression.h morm_types.h modeldata.h
|
model.o: dbexpression.h baseexpression.h morm_types.h modelenv.h modeldata.h
|
||||||
model.o: flatexpression.h
|
model.o: flatexpression.h
|
||||||
modelconnector.o: modelconnector.h clearer.h ../../pikotools/date/date.h
|
modelconnector.o: modelconnector.h clearer.h ../../pikotools/date/date.h
|
||||||
modelconnector.o: ../../pikotools/convert/inttostr.h dbconnector.h
|
modelconnector.o: ../../pikotools/convert/inttostr.h dbconnector.h
|
||||||
|
@ -127,7 +131,7 @@ postgresqlconnector.o: ../../pikotools/log/log.h
|
||||||
postgresqlconnector.o: ../../pikotools/log/filelog.h queryresult.h
|
postgresqlconnector.o: ../../pikotools/log/filelog.h queryresult.h
|
||||||
postgresqlconnector.o: postgresqlqueryresult.h ../../pikotools/utf8/utf8.h
|
postgresqlconnector.o: postgresqlqueryresult.h ../../pikotools/utf8/utf8.h
|
||||||
postgresqlconnector.o: postgresqlexpression.h dbexpression.h baseexpression.h
|
postgresqlconnector.o: postgresqlexpression.h dbexpression.h baseexpression.h
|
||||||
postgresqlconnector.o: morm_types.h modeldata.h
|
postgresqlconnector.o: morm_types.h modelenv.h modeldata.h
|
||||||
postgresqlconnector.o: ../../pikotools/convert/strtoint.h
|
postgresqlconnector.o: ../../pikotools/convert/strtoint.h
|
||||||
postgresqlconnector.o: ../../pikotools/convert/text.h
|
postgresqlconnector.o: ../../pikotools/convert/text.h
|
||||||
postgresqlconnector.o: ../../pikotools/convert/misc.h
|
postgresqlconnector.o: ../../pikotools/convert/misc.h
|
||||||
|
@ -140,7 +144,7 @@ postgresqlexpression.o: ../../pikotools/date/date.h
|
||||||
postgresqlexpression.o: ../../pikotools/convert/inttostr.h
|
postgresqlexpression.o: ../../pikotools/convert/inttostr.h
|
||||||
postgresqlexpression.o: ../../pikotools/membuffer/membuffer.h
|
postgresqlexpression.o: ../../pikotools/membuffer/membuffer.h
|
||||||
postgresqlexpression.o: ../../pikotools/textstream/types.h morm_types.h
|
postgresqlexpression.o: ../../pikotools/textstream/types.h morm_types.h
|
||||||
postgresqlexpression.o: modeldata.h
|
postgresqlexpression.o: modelenv.h modeldata.h queryresult.h
|
||||||
postgresqlqueryresult.o: postgresqlqueryresult.h queryresult.h
|
postgresqlqueryresult.o: postgresqlqueryresult.h queryresult.h
|
||||||
queryresult.o: queryresult.h ../../pikotools/utf8/utf8.h
|
queryresult.o: queryresult.h ../../pikotools/utf8/utf8.h
|
||||||
queryresult.o: ../../pikotools/textstream/textstream.h
|
queryresult.o: ../../pikotools/textstream/textstream.h
|
||||||
|
|
|
@ -199,11 +199,13 @@ void BaseExpression::put_field_name(const wchar_t * field_name, bool add_column_
|
||||||
|
|
||||||
void BaseExpression::put_field_doc(Model & model, const void * field_pointer, bool insertable, bool updatable, bool is_primary_key, ModelData * model_data)
|
void BaseExpression::put_field_doc(Model & model, const void * field_pointer, bool insertable, bool updatable, bool is_primary_key, ModelData * model_data)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
model.doc_field_pointer = field_pointer;
|
model.doc_field_pointer = field_pointer;
|
||||||
model.model_data = model_data;
|
model.model_data = model_data;
|
||||||
model.map_doc_fields();
|
model.map_doc_fields();
|
||||||
model.model_data = nullptr;
|
model.model_data = nullptr;
|
||||||
model.doc_field_pointer = nullptr;
|
model.doc_field_pointer = nullptr;
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaseExpression::before_field_name()
|
void BaseExpression::before_field_name()
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
#include "textstream/textstream.h"
|
#include "textstream/textstream.h"
|
||||||
#include "date/date.h"
|
#include "date/date.h"
|
||||||
#include "morm_types.h"
|
#include "morm_types.h"
|
||||||
#include "modeldata.h"
|
#include "modelenv.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -330,13 +330,15 @@ protected:
|
||||||
(*out_stream) << ","; // make a virtual method
|
(*out_stream) << ","; // make a virtual method
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ModelEnv model_env_local;
|
||||||
|
m.model_env = &model_env_local;
|
||||||
|
|
||||||
//before_field_value(field_value);
|
//before_field_value(field_value);
|
||||||
m.set_connector(model_connector);
|
m.set_connector(model_connector);
|
||||||
m.model_connector_mode = model_connector_mode;
|
m.model_env->model_connector_mode = model_connector_mode;
|
||||||
m.model_data = model_data;
|
m.model_env->model_data = model_data;
|
||||||
generate_from_model(m);
|
generate_from_model(m);
|
||||||
m.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
m.model_env = nullptr;
|
||||||
m.model_data = nullptr;
|
|
||||||
//after_field_value(field_value);
|
//after_field_value(field_value);
|
||||||
is_first = false;
|
is_first = false;
|
||||||
}
|
}
|
||||||
|
|
32
src/cursor.h
32
src/cursor.h
|
@ -144,18 +144,21 @@ public:
|
||||||
result.set_connector(model_connector);
|
result.set_connector(model_connector);
|
||||||
result.clear();
|
result.clear();
|
||||||
|
|
||||||
if( model_connector && query_result && query_result->has_db_result() )
|
if( model_connector && query_result && query_result->has_db_result() && model_data )
|
||||||
{
|
{
|
||||||
DbConnector * db_connector = model_connector->get_db_connector();
|
DbConnector * db_connector = model_connector->get_db_connector();
|
||||||
|
|
||||||
if( db_connector )
|
if( db_connector )
|
||||||
{
|
{
|
||||||
|
ModelEnv model_env_local;
|
||||||
|
result.model_env = &model_env_local;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if( model_data )
|
model_data->current_column = 0;
|
||||||
model_data->current_column = 0;
|
model_data->query_result = query_result;
|
||||||
|
|
||||||
result.model_data = model_data;
|
result.model_env->model_data = model_data;
|
||||||
result.before_select();
|
result.before_select();
|
||||||
res = select_status;
|
res = select_status;
|
||||||
|
|
||||||
|
@ -164,7 +167,7 @@ public:
|
||||||
if( query_result->cur_row < query_result->result_rows )
|
if( query_result->cur_row < query_result->result_rows )
|
||||||
{
|
{
|
||||||
result.set_save_mode(Model::DO_UPDATE_ON_SAVE); // IMPROVE ME check if there is a primary key
|
result.set_save_mode(Model::DO_UPDATE_ON_SAVE); // IMPROVE ME check if there is a primary key
|
||||||
result.map_values_from_query(query_result);
|
result.map_values_from_query();
|
||||||
result.after_select();
|
result.after_select();
|
||||||
query_result->cur_row += 1;
|
query_result->cur_row += 1;
|
||||||
}
|
}
|
||||||
|
@ -185,7 +188,7 @@ public:
|
||||||
// throw something?
|
// throw something?
|
||||||
}
|
}
|
||||||
|
|
||||||
result.model_data = nullptr;
|
result.model_env = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,7 +201,7 @@ public:
|
||||||
ModelClass model;
|
ModelClass model;
|
||||||
|
|
||||||
get(model);
|
get(model);
|
||||||
return std::move(model);
|
return model;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -211,7 +214,7 @@ public:
|
||||||
result.clear();
|
result.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
if( model_connector && query_result && query_result->has_db_result() )
|
if( model_connector && query_result && query_result->has_db_result() && model_data )
|
||||||
{
|
{
|
||||||
DbConnector * db_connector = model_connector->get_db_connector();
|
DbConnector * db_connector = model_connector->get_db_connector();
|
||||||
|
|
||||||
|
@ -284,17 +287,20 @@ protected:
|
||||||
result.emplace_back(); // it returns a reference from c++17
|
result.emplace_back(); // it returns a reference from c++17
|
||||||
ModelClass & added_model = result.back();
|
ModelClass & added_model = result.back();
|
||||||
|
|
||||||
|
ModelEnv model_env_local;
|
||||||
|
added_model.model_env = &model_env_local;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if( model_data )
|
model_data->current_column = 0;
|
||||||
model_data->current_column = 0;
|
model_data->query_result = query_result;
|
||||||
|
|
||||||
added_model.set_connector(model_connector);
|
added_model.set_connector(model_connector);
|
||||||
added_model.clear();
|
added_model.clear();
|
||||||
added_model.set_save_mode(Model::DO_UPDATE_ON_SAVE); // IMPROVE ME check if there is a primary key
|
added_model.set_save_mode(Model::DO_UPDATE_ON_SAVE); // IMPROVE ME check if there is a primary key
|
||||||
added_model.model_data = model_data;
|
added_model.model_env->model_data = model_data;
|
||||||
added_model.before_select();
|
added_model.before_select();
|
||||||
added_model.map_values_from_query(query_result);
|
added_model.map_values_from_query();
|
||||||
added_model.after_select();
|
added_model.after_select();
|
||||||
}
|
}
|
||||||
catch(...)
|
catch(...)
|
||||||
|
@ -303,7 +309,7 @@ protected:
|
||||||
// throw or something?
|
// throw or something?
|
||||||
}
|
}
|
||||||
|
|
||||||
added_model.model_data = nullptr;
|
added_model.model_env = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
|
|
28
src/finder.h
28
src/finder.h
|
@ -174,8 +174,13 @@ public:
|
||||||
{
|
{
|
||||||
was_query_error = false;
|
was_query_error = false;
|
||||||
last_query_error.clear();
|
last_query_error.clear();
|
||||||
model_data = nullptr;
|
|
||||||
column_prefix.clear();
|
column_prefix.clear();
|
||||||
|
|
||||||
|
model.model_env = &model_env;
|
||||||
|
model.model_env->clear();
|
||||||
|
|
||||||
|
//model.model_data = nullptr;
|
||||||
|
// what about model_data in model here?
|
||||||
model.prepare_to_select();
|
model.prepare_to_select();
|
||||||
|
|
||||||
if( model_connector )
|
if( model_connector )
|
||||||
|
@ -198,6 +203,11 @@ public:
|
||||||
last_query_error = L"model connector object is required";
|
last_query_error = L"model connector object is required";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( !model_data )
|
||||||
|
{
|
||||||
|
model_data = &model_data_generic;
|
||||||
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -244,11 +254,19 @@ public:
|
||||||
prepare_to_select();
|
prepare_to_select();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( !model.model_env )
|
||||||
|
{
|
||||||
|
model.model_env = &model_env;
|
||||||
|
model.model_env->clear();
|
||||||
|
}
|
||||||
|
|
||||||
if( !model_data )
|
if( !model_data )
|
||||||
{
|
{
|
||||||
model_data = &model_data_generic;
|
model_data = &model_data_generic;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
model.model_env->model_data = model_data;
|
||||||
|
|
||||||
model_data->prepare_to_new_select();
|
model_data->prepare_to_new_select();
|
||||||
model_data->has_autogenerated_select = true;
|
model_data->has_autogenerated_select = true;
|
||||||
|
|
||||||
|
@ -265,7 +283,7 @@ public:
|
||||||
model_data->add_join_table(column_prefix);
|
model_data->add_join_table(column_prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
model.generate_select_columns(*out_stream, column_prefix, model_data);
|
model.generate_select_columns(*out_stream, column_prefix);
|
||||||
(*out_stream) << " FROM ";
|
(*out_stream) << " FROM ";
|
||||||
model.table_name(*out_stream);
|
model.table_name(*out_stream);
|
||||||
|
|
||||||
|
@ -293,6 +311,7 @@ public:
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Finder<ModelClass> & select(ModelData * model_data, bool call_prepare = true)
|
Finder<ModelClass> & select(ModelData * model_data, bool call_prepare = true)
|
||||||
{
|
{
|
||||||
if( call_prepare )
|
if( call_prepare )
|
||||||
|
@ -304,6 +323,7 @@ public:
|
||||||
return select(false);
|
return select(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Finder<ModelClass> & select(ModelData & model_data, bool call_prepare = true)
|
Finder<ModelClass> & select(ModelData & model_data, bool call_prepare = true)
|
||||||
{
|
{
|
||||||
if( call_prepare )
|
if( call_prepare )
|
||||||
|
@ -315,6 +335,7 @@ public:
|
||||||
return select(false);
|
return select(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Finder<ModelClass> & where()
|
Finder<ModelClass> & where()
|
||||||
{
|
{
|
||||||
if( out_stream && db_expression )
|
if( out_stream && db_expression )
|
||||||
|
@ -579,7 +600,7 @@ public:
|
||||||
std::list<ModelClass> result;
|
std::list<ModelClass> result;
|
||||||
|
|
||||||
get_list(result, false);
|
get_list(result, false);
|
||||||
return std::move(result);
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -597,6 +618,7 @@ private:
|
||||||
std::wstring last_query_error;
|
std::wstring last_query_error;
|
||||||
ModelData * model_data;
|
ModelData * model_data;
|
||||||
std::string column_prefix;
|
std::string column_prefix;
|
||||||
|
ModelEnv model_env;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
130
src/model.cpp
130
src/model.cpp
|
@ -41,11 +41,8 @@ namespace morm
|
||||||
Model::Model()
|
Model::Model()
|
||||||
{
|
{
|
||||||
model_connector = nullptr;
|
model_connector = nullptr;
|
||||||
model_data = nullptr;
|
model_env = nullptr;
|
||||||
doc_field_pointer = nullptr;
|
|
||||||
save_mode = DO_INSERT_ON_SAVE;
|
save_mode = DO_INSERT_ON_SAVE;
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
|
||||||
query_result = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -53,11 +50,7 @@ Model::Model(const Model & m)
|
||||||
{
|
{
|
||||||
model_connector = m.model_connector;
|
model_connector = m.model_connector;
|
||||||
save_mode = m.save_mode;
|
save_mode = m.save_mode;
|
||||||
|
model_env = m.model_env; // or just set to null?
|
||||||
model_data = nullptr;
|
|
||||||
doc_field_pointer = nullptr; // does it need to be copied?
|
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
|
||||||
query_result = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -65,6 +58,7 @@ Model::~Model()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Model::set_save_mode(SaveMode save_mode)
|
void Model::set_save_mode(SaveMode save_mode)
|
||||||
{
|
{
|
||||||
this->save_mode = save_mode;
|
this->save_mode = save_mode;
|
||||||
|
@ -170,7 +164,10 @@ void Model::to_text(PT::TextStream & stream, ModelData * model_data, bool clear_
|
||||||
stream.clear();
|
stream.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING;
|
ModelEnv model_env_local;
|
||||||
|
model_env = &model_env_local;
|
||||||
|
|
||||||
|
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING;
|
||||||
|
|
||||||
if( model_connector )
|
if( model_connector )
|
||||||
{
|
{
|
||||||
|
@ -178,13 +175,14 @@ void Model::to_text(PT::TextStream & stream, ModelData * model_data, bool clear_
|
||||||
|
|
||||||
if( flat_connector )
|
if( flat_connector )
|
||||||
{
|
{
|
||||||
this->model_data = model_data;
|
this->model_env->model_data = model_data;
|
||||||
flat_connector->to_text(stream, *this);
|
flat_connector->to_text(stream, *this);
|
||||||
this->model_data = nullptr;
|
this->model_env->model_data = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
// what about if an exception was thrown? this pointer will not be null
|
||||||
|
model_env = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -247,7 +245,7 @@ std::string Model::to_string()
|
||||||
|
|
||||||
void Model::generate_insert_query(PT::TextStream & stream)
|
void Model::generate_insert_query(PT::TextStream & stream)
|
||||||
{
|
{
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
|
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
|
||||||
|
|
||||||
if( model_connector )
|
if( model_connector )
|
||||||
{
|
{
|
||||||
|
@ -259,7 +257,7 @@ void Model::generate_insert_query(PT::TextStream & stream)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -270,8 +268,11 @@ bool Model::insert(ModelData * model_data)
|
||||||
|
|
||||||
if( model_connector )
|
if( model_connector )
|
||||||
{
|
{
|
||||||
this->model_data = model_data;
|
ModelEnv model_env_local;
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
|
model_env = &model_env_local;
|
||||||
|
|
||||||
|
model_env->model_data = model_data;
|
||||||
|
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
|
||||||
DbConnector * db_connector = model_connector->get_db_connector();
|
DbConnector * db_connector = model_connector->get_db_connector();
|
||||||
|
|
||||||
// CHECK ME what if the stream is being used by something other?
|
// CHECK ME what if the stream is being used by something other?
|
||||||
|
@ -294,8 +295,8 @@ bool Model::insert(ModelData * model_data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this->model_data = nullptr;
|
// what about if an exception was thrown? this pointer will not be null
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
model_env = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -311,7 +312,7 @@ bool Model::insert(ModelData & model_data)
|
||||||
|
|
||||||
void Model::generate_update_query(PT::TextStream & stream)
|
void Model::generate_update_query(PT::TextStream & stream)
|
||||||
{
|
{
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
|
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
|
||||||
|
|
||||||
if( model_connector )
|
if( model_connector )
|
||||||
{
|
{
|
||||||
|
@ -323,7 +324,7 @@ void Model::generate_update_query(PT::TextStream & stream)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -333,8 +334,11 @@ bool Model::update(ModelData * model_data)
|
||||||
|
|
||||||
if( model_connector )
|
if( model_connector )
|
||||||
{
|
{
|
||||||
this->model_data = model_data;
|
ModelEnv model_env_local;
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
|
model_env = &model_env_local;
|
||||||
|
|
||||||
|
model_env->model_data = model_data;
|
||||||
|
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
|
||||||
DbConnector * db_connector = model_connector->get_db_connector();
|
DbConnector * db_connector = model_connector->get_db_connector();
|
||||||
|
|
||||||
// CHECK ME what if the stream is being used by something other?
|
// CHECK ME what if the stream is being used by something other?
|
||||||
|
@ -352,8 +356,8 @@ bool Model::update(ModelData * model_data)
|
||||||
after_update_failure();
|
after_update_failure();
|
||||||
}
|
}
|
||||||
|
|
||||||
this->model_data = nullptr;
|
// what about if an exception was thrown? this pointer will not be null
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
model_env = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -371,14 +375,14 @@ void Model::generate_remove_query(PT::TextStream & stream)
|
||||||
if( model_connector )
|
if( model_connector )
|
||||||
{
|
{
|
||||||
DbConnector * db_connector = model_connector->get_db_connector();
|
DbConnector * db_connector = model_connector->get_db_connector();
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
|
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
|
||||||
|
|
||||||
if( db_connector )
|
if( db_connector )
|
||||||
{
|
{
|
||||||
db_connector->generate_remove_query(stream, *this);
|
db_connector->generate_remove_query(stream, *this);
|
||||||
}
|
}
|
||||||
|
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -389,8 +393,11 @@ bool Model::remove(ModelData * model_data)
|
||||||
|
|
||||||
if( model_connector )
|
if( model_connector )
|
||||||
{
|
{
|
||||||
this->model_data = model_data;
|
ModelEnv model_env_local;
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
|
model_env = &model_env_local;
|
||||||
|
|
||||||
|
model_env->model_data = model_data;
|
||||||
|
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
|
||||||
DbConnector * db_connector = model_connector->get_db_connector();
|
DbConnector * db_connector = model_connector->get_db_connector();
|
||||||
|
|
||||||
// CHECK ME what if the stream is being used by something other?
|
// CHECK ME what if the stream is being used by something other?
|
||||||
|
@ -413,8 +420,8 @@ bool Model::remove(ModelData * model_data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this->model_data = nullptr;
|
// what about if an exception was thrown? this pointer will not be null
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
model_env = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -460,21 +467,17 @@ bool Model::save(ModelData & model_data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Model::generate_select_columns(PT::TextStream & stream, const std::string & column_prefix, ModelData * model_data)
|
void Model::generate_select_columns(PT::TextStream & stream, const std::string & column_prefix)
|
||||||
{
|
{
|
||||||
if( model_connector )
|
if( model_connector && model_env )
|
||||||
{
|
{
|
||||||
this->model_data = model_data;
|
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
|
|
||||||
DbConnector * db_connector = model_connector->get_db_connector();
|
DbConnector * db_connector = model_connector->get_db_connector();
|
||||||
|
|
||||||
if( db_connector )
|
if( db_connector )
|
||||||
{
|
{
|
||||||
db_connector->generate_select_columns(stream, *this, column_prefix);
|
db_connector->generate_select_columns(stream, *this, column_prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
|
||||||
this->model_data = nullptr;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -487,7 +490,7 @@ void Model::generate_doc_for_flat(PT::TextStream & stream, bool clear_stream)
|
||||||
stream.clear();
|
stream.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_FLAT;
|
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_FLAT;
|
||||||
|
|
||||||
if( model_connector )
|
if( model_connector )
|
||||||
{
|
{
|
||||||
|
@ -499,7 +502,7 @@ void Model::generate_doc_for_flat(PT::TextStream & stream, bool clear_stream)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -510,7 +513,7 @@ void Model::generate_doc_for_db(PT::TextStream & stream, bool clear_stream)
|
||||||
stream.clear();
|
stream.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_DB;
|
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_DB;
|
||||||
|
|
||||||
if( model_connector )
|
if( model_connector )
|
||||||
{
|
{
|
||||||
|
@ -522,37 +525,35 @@ void Model::generate_doc_for_db(PT::TextStream & stream, bool clear_stream)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Model::map_values_from_query(QueryResult * query_result)
|
void Model::map_values_from_query()
|
||||||
{
|
{
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_READING_VALUE_FROM_DB_RESULTSET;
|
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_READING_VALUE_FROM_DB_RESULTSET;
|
||||||
this->query_result = query_result;
|
|
||||||
|
|
||||||
map_fields();
|
map_fields();
|
||||||
|
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
|
||||||
this->query_result = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Model::clear()
|
void Model::clear()
|
||||||
{
|
{
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE;
|
ModelEnv model_env_local;
|
||||||
|
model_env = &model_env_local;
|
||||||
|
|
||||||
|
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE;
|
||||||
map_fields();
|
map_fields();
|
||||||
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
model_env = nullptr;
|
||||||
|
|
||||||
save_mode = DO_INSERT_ON_SAVE;
|
save_mode = DO_INSERT_ON_SAVE;
|
||||||
model_data = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Model::prepare_to_select()
|
void Model::prepare_to_select()
|
||||||
{
|
{
|
||||||
table_index = 1;
|
model_env->table_index = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -610,9 +611,30 @@ void Model::after_remove_failure()
|
||||||
|
|
||||||
int Model::get_connector_mode()
|
int Model::get_connector_mode()
|
||||||
{
|
{
|
||||||
return model_connector_mode;
|
if( model_env )
|
||||||
|
{
|
||||||
|
return model_env->model_connector_mode;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return MORM_MODEL_CONNECTOR_MODE_NONE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ModelData * Model::get_model_data()
|
||||||
|
{
|
||||||
|
if( model_env )
|
||||||
|
{
|
||||||
|
return model_env->model_data;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Model::is_empty_field(const wchar_t * value)
|
bool Model::is_empty_field(const wchar_t * value)
|
||||||
{
|
{
|
||||||
return (!value || *value == '\0');
|
return (!value || *value == '\0');
|
||||||
|
|
327
src/model.h
327
src/model.h
|
@ -41,8 +41,7 @@
|
||||||
#include "modelconnector.h"
|
#include "modelconnector.h"
|
||||||
#include "dbexpression.h"
|
#include "dbexpression.h"
|
||||||
#include "flatexpression.h"
|
#include "flatexpression.h"
|
||||||
#include "queryresult.h"
|
#include "modelenv.h"
|
||||||
#include "modeldata.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -124,7 +123,7 @@ public:
|
||||||
virtual bool save(ModelData * model_data = nullptr);
|
virtual bool save(ModelData * model_data = nullptr);
|
||||||
virtual bool save(ModelData & model_data);
|
virtual bool save(ModelData & model_data);
|
||||||
|
|
||||||
virtual void generate_select_columns(PT::TextStream & stream, const std::string & column_prefix, ModelData * model_data);
|
virtual void generate_select_columns(PT::TextStream & stream, const std::string & column_prefix);
|
||||||
|
|
||||||
virtual void generate_doc_for_flat(PT::TextStream & stream, bool clear_stream = true);
|
virtual void generate_doc_for_flat(PT::TextStream & stream, bool clear_stream = true);
|
||||||
virtual void generate_doc_for_db(PT::TextStream & stream, bool clear_stream = true);
|
virtual void generate_doc_for_db(PT::TextStream & stream, bool clear_stream = true);
|
||||||
|
@ -132,6 +131,7 @@ public:
|
||||||
// set object to default values
|
// set object to default values
|
||||||
virtual void clear();
|
virtual void clear();
|
||||||
|
|
||||||
|
// we need a pointer to ModelData here?
|
||||||
virtual void prepare_to_select();
|
virtual void prepare_to_select();
|
||||||
|
|
||||||
|
|
||||||
|
@ -139,11 +139,8 @@ protected:
|
||||||
|
|
||||||
ModelConnector * model_connector;
|
ModelConnector * model_connector;
|
||||||
SaveMode save_mode;
|
SaveMode save_mode;
|
||||||
ModelData * model_data;
|
ModelEnv * model_env;
|
||||||
const void * doc_field_pointer;
|
|
||||||
int model_connector_mode;
|
|
||||||
QueryResult * query_result;
|
|
||||||
int table_index;
|
|
||||||
|
|
||||||
|
|
||||||
Model();
|
Model();
|
||||||
|
@ -167,8 +164,10 @@ protected:
|
||||||
|
|
||||||
virtual int get_connector_mode();
|
virtual int get_connector_mode();
|
||||||
|
|
||||||
|
virtual ModelData * get_model_data();
|
||||||
|
|
||||||
// used by Cursor
|
// used by Cursor
|
||||||
virtual void map_values_from_query(QueryResult * query_result);
|
virtual void map_values_from_query();
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////
|
/////////////////////////////////
|
||||||
|
@ -639,7 +638,7 @@ protected:
|
||||||
{
|
{
|
||||||
if( model_connector )
|
if( model_connector )
|
||||||
{
|
{
|
||||||
if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING )
|
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING )
|
||||||
{
|
{
|
||||||
FlatConnector * flat_connector = model_connector->get_flat_connector();
|
FlatConnector * flat_connector = model_connector->get_flat_connector();
|
||||||
|
|
||||||
|
@ -650,12 +649,12 @@ protected:
|
||||||
if( flat_expression && !is_empty_field(flat_field_name) )
|
if( flat_expression && !is_empty_field(flat_field_name) )
|
||||||
{
|
{
|
||||||
// insertable, updatable and is_primary_key are ignored here
|
// insertable, updatable and is_primary_key are ignored here
|
||||||
flat_expression->field(flat_field_name, field_value, insertable, updatable, is_primary_key, true, model_data);
|
flat_expression->field(flat_field_name, field_value, insertable, updatable, is_primary_key, true, model_env->model_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL )
|
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL )
|
||||||
{
|
{
|
||||||
DbConnector * db_connector = model_connector->get_db_connector();
|
DbConnector * db_connector = model_connector->get_db_connector();
|
||||||
|
|
||||||
|
@ -665,17 +664,17 @@ protected:
|
||||||
|
|
||||||
if( db_expression && !is_empty_field(db_field_name) )
|
if( db_expression && !is_empty_field(db_field_name) )
|
||||||
{
|
{
|
||||||
db_expression->field(db_field_name, field_value, insertable, updatable, is_primary_key, true, model_data);
|
db_expression->field(db_field_name, field_value, insertable, updatable, is_primary_key, true, model_env->model_data);
|
||||||
|
|
||||||
if( model_data )
|
if( model_env->model_data )
|
||||||
{
|
{
|
||||||
model_data->current_column += 1;
|
model_env->model_data->current_column += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_READING_VALUE_FROM_DB_RESULTSET )
|
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_READING_VALUE_FROM_DB_RESULTSET )
|
||||||
{
|
{
|
||||||
DbConnector * db_connector = model_connector->get_db_connector();
|
DbConnector * db_connector = model_connector->get_db_connector();
|
||||||
|
|
||||||
|
@ -683,10 +682,10 @@ protected:
|
||||||
{
|
{
|
||||||
if( !is_empty_field(db_field_name) )
|
if( !is_empty_field(db_field_name) )
|
||||||
{
|
{
|
||||||
if( model_data && model_data->has_autogenerated_select )
|
if( model_env->model_data && model_env->model_data->has_autogenerated_select )
|
||||||
{
|
{
|
||||||
get_value_by_field_index(model_data->current_column, field_value);
|
get_value_by_field_index(model_env->model_data->current_column, field_value);
|
||||||
model_data->current_column += 1;
|
model_env->model_data->current_column += 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -696,7 +695,7 @@ protected:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE )
|
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE )
|
||||||
{
|
{
|
||||||
Clearer * clearer = model_connector->get_clearer();
|
Clearer * clearer = model_connector->get_clearer();
|
||||||
|
|
||||||
|
@ -706,7 +705,7 @@ protected:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_FLAT )
|
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_FLAT )
|
||||||
{
|
{
|
||||||
FlatConnector * doc_connector = model_connector->get_doc_connector(); // different connector will be here (doc, flat)
|
FlatConnector * doc_connector = model_connector->get_doc_connector(); // different connector will be here (doc, flat)
|
||||||
|
|
||||||
|
@ -728,36 +727,36 @@ protected:
|
||||||
|
|
||||||
void field_model_left_join(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, bool insertable, bool updatable, bool has_foreign_key, DbExpression * db_expression)
|
void field_model_left_join(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, bool insertable, bool updatable, bool has_foreign_key, DbExpression * db_expression)
|
||||||
{
|
{
|
||||||
if( model_data )
|
if( model_env->model_data )
|
||||||
{
|
{
|
||||||
model_data->morm_current_max_column += 1;
|
model_env->model_data->morm_current_max_column += 1;
|
||||||
model_data->morm_foreign_keys.clear();
|
model_env->model_data->morm_foreign_keys.clear();
|
||||||
|
|
||||||
model_data->morm_finder_join_tables << "LEFT JOIN ";
|
model_env->model_data->morm_finder_join_tables << "LEFT JOIN ";
|
||||||
field_model.table_name(model_data->morm_finder_join_tables);
|
field_model.table_name(model_env->model_data->morm_finder_join_tables);
|
||||||
model_data->morm_finder_join_tables << " AS ";
|
model_env->model_data->morm_finder_join_tables << " AS ";
|
||||||
|
|
||||||
|
|
||||||
//////////////
|
//////////////
|
||||||
PT::TextStream join_table_name_this;
|
PT::TextStream join_table_name_this;
|
||||||
table_name_for_join_as(join_table_name_this);
|
table_name_for_join_as(join_table_name_this);
|
||||||
|
|
||||||
if( table_index > 1 )
|
if( model_env->table_index > 1 )
|
||||||
join_table_name_this << table_index;
|
join_table_name_this << model_env->table_index;
|
||||||
|
|
||||||
///////////
|
///////////
|
||||||
|
|
||||||
PT::TextStream join_table_name;
|
PT::TextStream join_table_name;
|
||||||
field_model.table_name_for_join_as(join_table_name);
|
field_model.table_name_for_join_as(join_table_name);
|
||||||
|
|
||||||
field_model.table_index = model_data->add_join_table(join_table_name);
|
field_model.model_env->table_index = model_env->model_data->add_join_table(join_table_name);
|
||||||
|
|
||||||
if( field_model.table_index > 1 )
|
if( field_model.model_env->table_index > 1 )
|
||||||
join_table_name << field_model.table_index;
|
join_table_name << field_model.model_env->table_index;
|
||||||
//////////
|
//////////
|
||||||
|
|
||||||
|
|
||||||
model_data->morm_finder_join_tables << join_table_name;
|
model_env->model_data->morm_finder_join_tables << join_table_name;
|
||||||
|
|
||||||
int expr_work_mode = db_expression->get_work_mode();
|
int expr_work_mode = db_expression->get_work_mode();
|
||||||
int expr_output_type = db_expression->get_output_type();
|
int expr_output_type = db_expression->get_output_type();
|
||||||
|
@ -771,29 +770,29 @@ protected:
|
||||||
{
|
{
|
||||||
field_model.map_fields();
|
field_model.map_fields();
|
||||||
|
|
||||||
model_data->morm_finder_join_tables << " ON " << join_table_name_this << '.' << db_field_name; // escape?
|
model_env->model_data->morm_finder_join_tables << " ON " << join_table_name_this << '.' << db_field_name; // escape?
|
||||||
model_data->morm_finder_join_tables << " = " << join_table_name << '.';
|
model_env->model_data->morm_finder_join_tables << " = " << join_table_name << '.';
|
||||||
|
|
||||||
if( !model_data->morm_foreign_keys.empty() )
|
if( !model_env->model_data->morm_foreign_keys.empty() )
|
||||||
{
|
{
|
||||||
model_data->morm_finder_join_tables << model_data->morm_foreign_keys.front();
|
model_env->model_data->morm_finder_join_tables << model_env->model_data->morm_foreign_keys.front();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
map_fields();
|
map_fields();
|
||||||
|
|
||||||
model_data->morm_finder_join_tables << " ON " << join_table_name_this << '.';
|
model_env->model_data->morm_finder_join_tables << " ON " << join_table_name_this << '.';
|
||||||
|
|
||||||
if( !model_data->morm_foreign_keys.empty() )
|
if( !model_env->model_data->morm_foreign_keys.empty() )
|
||||||
{
|
{
|
||||||
model_data->morm_finder_join_tables << model_data->morm_foreign_keys.front();
|
model_env->model_data->morm_finder_join_tables << model_env->model_data->morm_foreign_keys.front();
|
||||||
}
|
}
|
||||||
|
|
||||||
model_data->morm_finder_join_tables << " = " << (join_table_name) << '.' << db_field_name;
|
model_env->model_data->morm_finder_join_tables << " = " << (join_table_name) << '.' << db_field_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
model_data->morm_finder_join_tables << ' ';
|
model_env->model_data->morm_finder_join_tables << ' ';
|
||||||
|
|
||||||
db_expression->set_work_mode(expr_work_mode);
|
db_expression->set_work_mode(expr_work_mode);
|
||||||
db_expression->set_output_type(expr_output_type);
|
db_expression->set_output_type(expr_output_type);
|
||||||
|
@ -804,108 +803,155 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void field_model_generate_flat_string(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, bool insertable, bool updatable, bool has_foreign_key)
|
||||||
|
{
|
||||||
|
FlatConnector * flat_connector = model_connector->get_flat_connector();
|
||||||
|
|
||||||
|
if( flat_connector )
|
||||||
|
{
|
||||||
|
FlatExpression * flat_expression = flat_connector->get_expression();
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void field_model_generate_db_sql(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, bool insertable, bool updatable, bool has_foreign_key)
|
||||||
|
{
|
||||||
|
DbConnector * db_connector = model_connector->get_db_connector();
|
||||||
|
|
||||||
|
if( db_connector )
|
||||||
|
{
|
||||||
|
DbExpression * db_expression = db_connector->get_expression();
|
||||||
|
|
||||||
|
if( db_expression && !is_empty_field(db_field_name) )
|
||||||
|
{
|
||||||
|
field_model.model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
|
||||||
|
|
||||||
|
if( db_expression->get_output_type() == MORM_OUTPUT_TYPE_SELECT_COLUMNS )
|
||||||
|
{
|
||||||
|
field_model_left_join(db_field_name, flat_field_name, field_model, insertable, updatable, has_foreign_key, db_expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
if( db_expression->get_output_type() != MORM_OUTPUT_TYPE_JOIN_TABLES )
|
||||||
|
{
|
||||||
|
// they dont have to be copied out, this is the same as current table name and table_index
|
||||||
|
std::string current_prefix = db_expression->get_column_prefix();
|
||||||
|
int current_table_index = db_expression->get_column_prefix_index();
|
||||||
|
|
||||||
|
///////////
|
||||||
|
PT::TextStream join_table_name;
|
||||||
|
field_model.table_name_for_join_as(join_table_name); // RENAME this method
|
||||||
|
|
||||||
|
std::string sss; // improve me
|
||||||
|
join_table_name.to_string(sss);
|
||||||
|
|
||||||
|
// now we dont need set_column_prefix()?, we can pass ModelEnv there somewhat?
|
||||||
|
db_expression->set_column_prefix(sss, field_model.model_env->table_index);
|
||||||
|
|
||||||
|
field_model.map_fields();
|
||||||
|
|
||||||
|
db_expression->set_column_prefix(current_prefix, current_table_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
field_model.model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
||||||
|
|
||||||
|
if( model_env->model_data )
|
||||||
|
{
|
||||||
|
model_env->model_data->current_column += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void field_model_clear_values(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, bool insertable, bool updatable, bool has_foreign_key)
|
||||||
|
{
|
||||||
|
Clearer * clearer = model_connector->get_clearer();
|
||||||
|
|
||||||
|
if( clearer )
|
||||||
|
{
|
||||||
|
clearer->clear_model(field_model);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void field_model_generate_doc_flat(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, bool insertable, bool updatable, bool has_foreign_key)
|
||||||
|
{
|
||||||
|
FlatConnector * doc_connector = model_connector->get_doc_connector(); // different connector will be here (doc, flat)
|
||||||
|
|
||||||
|
if( doc_connector )
|
||||||
|
{
|
||||||
|
FlatExpression * doc_expression = doc_connector->get_expression();
|
||||||
|
|
||||||
|
// potrzebujemy dwa rozne doce, jeden dla flat drugi dla bazy danych
|
||||||
|
if( doc_expression && !is_empty_field(flat_field_name) )
|
||||||
|
{
|
||||||
|
// insertable, updatable and is_primary_key are ignored here
|
||||||
|
doc_expression->field_doc(*this, flat_field_name, field_model, insertable, updatable, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void field_model_read_values_from_queryresult(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, bool insertable, bool updatable, bool has_foreign_key)
|
||||||
|
{
|
||||||
|
DbConnector * db_connector = model_connector->get_db_connector();
|
||||||
|
|
||||||
|
if( db_connector )
|
||||||
|
{
|
||||||
|
if( !is_empty_field(db_field_name) )
|
||||||
|
{
|
||||||
|
// we need to test if the object is actually defined, test nulls on primary key?
|
||||||
|
|
||||||
|
field_model.before_select();
|
||||||
|
field_model.set_save_mode(Model::DO_UPDATE_ON_SAVE); // IMPROVE ME check if there is a primary key
|
||||||
|
field_model.map_values_from_query();
|
||||||
|
field_model.after_select();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void field_model(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, bool insertable, bool updatable, bool has_foreign_key)
|
void field_model(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, bool insertable, bool updatable, bool has_foreign_key)
|
||||||
{
|
{
|
||||||
if( model_connector )
|
if( model_connector )
|
||||||
{
|
{
|
||||||
|
ModelEnv model_env_local(*model_env);
|
||||||
|
field_model.model_env = &model_env_local;
|
||||||
field_model.set_connector(model_connector);
|
field_model.set_connector(model_connector);
|
||||||
field_model.model_data = model_data;
|
|
||||||
|
|
||||||
if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING )
|
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING )
|
||||||
{
|
{
|
||||||
FlatConnector * flat_connector = model_connector->get_flat_connector();
|
field_model_generate_flat_string(db_field_name, flat_field_name, field_model, insertable, updatable, has_foreign_key);
|
||||||
|
|
||||||
if( flat_connector )
|
|
||||||
{
|
|
||||||
FlatExpression * flat_expression = flat_connector->get_expression();
|
|
||||||
|
|
||||||
if( flat_expression && !is_empty_field(flat_field_name) )
|
|
||||||
{
|
|
||||||
field_model.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING;
|
|
||||||
flat_expression->field_model(flat_field_name, field_model, insertable, updatable, false);
|
|
||||||
field_model.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL )
|
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL )
|
||||||
{
|
{
|
||||||
DbConnector * db_connector = model_connector->get_db_connector();
|
field_model_generate_db_sql(db_field_name, flat_field_name, field_model, insertable, updatable, has_foreign_key);
|
||||||
|
|
||||||
if( db_connector )
|
|
||||||
{
|
|
||||||
DbExpression * db_expression = db_connector->get_expression();
|
|
||||||
|
|
||||||
if( db_expression && !is_empty_field(db_field_name) )
|
|
||||||
{
|
|
||||||
field_model.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
|
|
||||||
|
|
||||||
if( db_expression->get_output_type() == MORM_OUTPUT_TYPE_SELECT_COLUMNS )
|
|
||||||
{
|
|
||||||
field_model_left_join(db_field_name, flat_field_name, field_model, insertable, updatable, has_foreign_key, db_expression);
|
|
||||||
}
|
|
||||||
|
|
||||||
if( db_expression->get_output_type() != MORM_OUTPUT_TYPE_JOIN_TABLES )
|
|
||||||
{
|
|
||||||
field_model.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
|
|
||||||
|
|
||||||
// they dont have to be copied out, this is the same as current table name and table_index
|
|
||||||
std::string current_prefix = db_expression->get_column_prefix();
|
|
||||||
int current_table_index = db_expression->get_column_prefix_index();
|
|
||||||
|
|
||||||
///////////
|
|
||||||
PT::TextStream join_table_name;
|
|
||||||
field_model.table_name_for_join_as(join_table_name); // RENAME this method
|
|
||||||
|
|
||||||
std::string sss; // improve me
|
|
||||||
join_table_name.to_string(sss);
|
|
||||||
|
|
||||||
db_expression->set_column_prefix(sss, field_model.table_index);
|
|
||||||
|
|
||||||
field_model.map_fields();
|
|
||||||
|
|
||||||
db_expression->set_column_prefix(current_prefix, current_table_index);
|
|
||||||
field_model.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
field_model.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
|
||||||
|
|
||||||
if( model_data )
|
|
||||||
{
|
|
||||||
model_data->current_column += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE )
|
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE )
|
||||||
{
|
{
|
||||||
Clearer * clearer = model_connector->get_clearer();
|
field_model_clear_values(db_field_name, flat_field_name, field_model, insertable, updatable, has_foreign_key);
|
||||||
|
|
||||||
if( clearer )
|
|
||||||
{
|
|
||||||
clearer->clear_model(field_model);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_FLAT )
|
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_FLAT )
|
||||||
{
|
{
|
||||||
FlatConnector * doc_connector = model_connector->get_doc_connector(); // different connector will be here (doc, flat)
|
field_model_generate_doc_flat(db_field_name, flat_field_name, field_model, insertable, updatable, has_foreign_key);
|
||||||
|
|
||||||
if( doc_connector )
|
|
||||||
{
|
|
||||||
FlatExpression * doc_expression = doc_connector->get_expression();
|
|
||||||
|
|
||||||
// potrzebujemy dwa rozne doce, jeden dla flat drugi dla bazy danych
|
|
||||||
if( doc_expression && !is_empty_field(flat_field_name) )
|
|
||||||
{
|
|
||||||
// insertable, updatable and is_primary_key are ignored here
|
|
||||||
doc_expression->field_doc(*this, flat_field_name, field_model, insertable, updatable, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
field_model.model_data = nullptr;
|
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_READING_VALUE_FROM_DB_RESULTSET )
|
||||||
|
{
|
||||||
|
field_model_read_values_from_queryresult(db_field_name, flat_field_name, field_model, insertable, updatable, has_foreign_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
field_model.model_env = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -915,7 +961,7 @@ protected:
|
||||||
{
|
{
|
||||||
if( model_connector )
|
if( model_connector )
|
||||||
{
|
{
|
||||||
if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING )
|
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING )
|
||||||
{
|
{
|
||||||
FlatConnector * flat_connector = model_connector->get_flat_connector();
|
FlatConnector * flat_connector = model_connector->get_flat_connector();
|
||||||
|
|
||||||
|
@ -928,12 +974,12 @@ protected:
|
||||||
// IMPROVE ME
|
// IMPROVE ME
|
||||||
// what about model_data and save_mode?
|
// what about model_data and save_mode?
|
||||||
// may it should be placed inside some structure?
|
// may it should be placed inside some structure?
|
||||||
flat_expression->field_list(flat_field_name, field_container, insertable, updatable, false, model_connector, model_connector_mode, model_data);
|
flat_expression->field_list(flat_field_name, field_container, insertable, updatable, false, model_connector, model_env->model_connector_mode, model_env->model_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL )
|
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL )
|
||||||
{
|
{
|
||||||
DbConnector * db_connector = model_connector->get_db_connector();
|
DbConnector * db_connector = model_connector->get_db_connector();
|
||||||
|
|
||||||
|
@ -951,7 +997,7 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE )
|
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE )
|
||||||
{
|
{
|
||||||
Clearer * clearer = model_connector->get_clearer();
|
Clearer * clearer = model_connector->get_clearer();
|
||||||
|
|
||||||
|
@ -961,7 +1007,7 @@ protected:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_FLAT )
|
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_FLAT )
|
||||||
{
|
{
|
||||||
FlatConnector * doc_connector = model_connector->get_doc_connector(); // different connector will be here (doc, flat)
|
FlatConnector * doc_connector = model_connector->get_doc_connector(); // different connector will be here (doc, flat)
|
||||||
|
|
||||||
|
@ -973,7 +1019,7 @@ protected:
|
||||||
if( doc_expression && !is_empty_field(flat_field_name) )
|
if( doc_expression && !is_empty_field(flat_field_name) )
|
||||||
{
|
{
|
||||||
// insertable, updatable and is_primary_key are ignored here
|
// insertable, updatable and is_primary_key are ignored here
|
||||||
doc_expression->field_doc(*this, flat_field_name, field_container, insertable, updatable, false, model_data);
|
doc_expression->field_doc(*this, flat_field_name, field_container, insertable, updatable, false, model_env->model_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -984,9 +1030,9 @@ protected:
|
||||||
template<typename FieldValue>
|
template<typename FieldValue>
|
||||||
void get_value_by_field_index(int field_index, FieldValue & field_value)
|
void get_value_by_field_index(int field_index, FieldValue & field_value)
|
||||||
{
|
{
|
||||||
if( query_result )
|
if( model_env->model_data && model_env->model_data->query_result )
|
||||||
{
|
{
|
||||||
const char * val_str = query_result->get_field_string_value(field_index);
|
const char * val_str = model_env->model_data->query_result->get_field_string_value(field_index);
|
||||||
|
|
||||||
if( val_str )
|
if( val_str )
|
||||||
{
|
{
|
||||||
|
@ -1004,9 +1050,9 @@ protected:
|
||||||
template<typename FieldValue>
|
template<typename FieldValue>
|
||||||
void get_value_by_field_name(const wchar_t * field_name, FieldValue & field_value)
|
void get_value_by_field_name(const wchar_t * field_name, FieldValue & field_value)
|
||||||
{
|
{
|
||||||
if( query_result )
|
if( model_env->model_data && model_env->model_data->query_result )
|
||||||
{
|
{
|
||||||
const char * val_str = query_result->get_field_string_value(field_name);
|
const char * val_str = model_env->model_data->query_result->get_field_string_value(field_name);
|
||||||
|
|
||||||
if( val_str )
|
if( val_str )
|
||||||
{
|
{
|
||||||
|
@ -1025,7 +1071,7 @@ protected:
|
||||||
template<typename FieldValue>
|
template<typename FieldValue>
|
||||||
void doc_field_generic(const wchar_t * db_field_name, const wchar_t * flat_field_name, FieldValue & field_value)
|
void doc_field_generic(const wchar_t * db_field_name, const wchar_t * flat_field_name, FieldValue & field_value)
|
||||||
{
|
{
|
||||||
if( reinterpret_cast<const void*>(&field_value) == doc_field_pointer && model_connector )
|
if( reinterpret_cast<const void*>(&field_value) == model_env->doc_field_pointer && model_connector )
|
||||||
{
|
{
|
||||||
FlatConnector * doc_connector = model_connector->get_doc_connector();
|
FlatConnector * doc_connector = model_connector->get_doc_connector();
|
||||||
|
|
||||||
|
@ -1049,7 +1095,7 @@ protected:
|
||||||
|
|
||||||
void doc_field_model(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model)
|
void doc_field_model(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model)
|
||||||
{
|
{
|
||||||
if( reinterpret_cast<const void*>(&field_model) == doc_field_pointer && model_connector )
|
if( reinterpret_cast<const void*>(&field_model) == model_env->doc_field_pointer && model_connector )
|
||||||
{
|
{
|
||||||
FlatConnector * doc_connector = model_connector->get_doc_connector();
|
FlatConnector * doc_connector = model_connector->get_doc_connector();
|
||||||
|
|
||||||
|
@ -1074,7 +1120,7 @@ protected:
|
||||||
template<typename ModelContainer>
|
template<typename ModelContainer>
|
||||||
void doc_field_list(const wchar_t * db_field_name, const wchar_t * flat_field_name, ModelContainer & field_container)
|
void doc_field_list(const wchar_t * db_field_name, const wchar_t * flat_field_name, ModelContainer & field_container)
|
||||||
{
|
{
|
||||||
if( reinterpret_cast<const void*>(&field_container) == doc_field_pointer && model_connector )
|
if( reinterpret_cast<const void*>(&field_container) == model_env->doc_field_pointer && model_connector )
|
||||||
{
|
{
|
||||||
FlatConnector * doc_connector = model_connector->get_doc_connector();
|
FlatConnector * doc_connector = model_connector->get_doc_connector();
|
||||||
|
|
||||||
|
@ -1161,8 +1207,7 @@ protected:
|
||||||
|
|
||||||
virtual bool is_empty_field(const wchar_t * value);
|
virtual bool is_empty_field(const wchar_t * value);
|
||||||
|
|
||||||
|
template<typename ModelClass> friend class Finder;
|
||||||
//template<typename ModelClass> friend class Finder;
|
|
||||||
template<typename ModelClass> friend class Cursor;
|
template<typename ModelClass> friend class Cursor;
|
||||||
friend class BaseExpression;
|
friend class BaseExpression;
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,8 @@
|
||||||
#ifndef headerfile_morm_modeldata
|
#ifndef headerfile_morm_modeldata
|
||||||
#define headerfile_morm_modeldata
|
#define headerfile_morm_modeldata
|
||||||
|
|
||||||
|
#include "queryresult.h"
|
||||||
|
|
||||||
|
|
||||||
namespace morm
|
namespace morm
|
||||||
{
|
{
|
||||||
|
@ -47,6 +49,7 @@ public:
|
||||||
{
|
{
|
||||||
morm_current_max_column = 1;
|
morm_current_max_column = 1;
|
||||||
current_column = 1;
|
current_column = 1;
|
||||||
|
query_result = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~ModelData()
|
virtual ~ModelData()
|
||||||
|
@ -55,7 +58,12 @@ public:
|
||||||
|
|
||||||
bool has_autogenerated_select;
|
bool has_autogenerated_select;
|
||||||
|
|
||||||
|
QueryResult * query_result;
|
||||||
|
// int table_index;
|
||||||
|
|
||||||
|
|
||||||
|
// can be moved to another struct?
|
||||||
|
// let ModelData be only for user stuff
|
||||||
PT::TextStream morm_finder_join_tables;
|
PT::TextStream morm_finder_join_tables;
|
||||||
std::list<std::string> morm_foreign_keys;
|
std::list<std::string> morm_foreign_keys;
|
||||||
int morm_current_max_column;
|
int morm_current_max_column;
|
||||||
|
@ -69,6 +77,9 @@ public:
|
||||||
virtual void prepare_to_new_select()
|
virtual void prepare_to_new_select()
|
||||||
{
|
{
|
||||||
has_autogenerated_select = false;
|
has_autogenerated_select = false;
|
||||||
|
query_result = nullptr;
|
||||||
|
|
||||||
|
// table_index = 1;
|
||||||
|
|
||||||
morm_current_max_column = 1;
|
morm_current_max_column = 1;
|
||||||
morm_finder_join_tables.clear();
|
morm_finder_join_tables.clear();
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
/*
|
||||||
|
* This file is a part of morm
|
||||||
|
* and is distributed under the 2-Clause BSD licence.
|
||||||
|
* Author: Tomasz Sowa <t.sowa@ttmath.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019, Tomasz Sowa
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef headerfile_morm_modelenv
|
||||||
|
#define headerfile_morm_modelenv
|
||||||
|
|
||||||
|
#include "modeldata.h"
|
||||||
|
#include "morm_types.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace morm
|
||||||
|
{
|
||||||
|
|
||||||
|
// rename me?
|
||||||
|
class ModelEnv
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
ModelData * model_data;
|
||||||
|
int model_connector_mode;
|
||||||
|
int table_index;
|
||||||
|
const void * doc_field_pointer;
|
||||||
|
|
||||||
|
|
||||||
|
ModelEnv()
|
||||||
|
{
|
||||||
|
clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
~ModelEnv()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ModelEnv(const ModelEnv & e)
|
||||||
|
{
|
||||||
|
model_data = e.model_data;
|
||||||
|
model_connector_mode = e.model_connector_mode;
|
||||||
|
table_index = e.table_index;
|
||||||
|
doc_field_pointer = e.doc_field_pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void clear()
|
||||||
|
{
|
||||||
|
model_data = nullptr;
|
||||||
|
model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
|
||||||
|
table_index = 0;
|
||||||
|
doc_field_pointer = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue