changed: ModelData moved outside Model

added:   using ModelData in BaseExpression so Model::to_text() functions can use a ModelData object now





git-svn-id: svn://ttmath.org/publicrep/morm/trunk@1175 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
Tomasz Sowa 2019-03-07 18:02:29 +00:00
parent 41684eb969
commit cf0a0c96fe
8 changed files with 188 additions and 48 deletions

View File

@ -10,7 +10,7 @@ baseexpression.o: ../../pikotools/textstream/types.h morm_types.h model.h
baseexpression.o: modelconnector.h clearer.h dbconnector.h baseexpression.o: modelconnector.h clearer.h dbconnector.h
baseexpression.o: ../../pikotools/log/log.h ../../pikotools/log/filelog.h baseexpression.o: ../../pikotools/log/log.h ../../pikotools/log/filelog.h
baseexpression.o: queryresult.h flatconnector.h dbexpression.h baseexpression.o: queryresult.h flatconnector.h dbexpression.h
baseexpression.o: flatexpression.h ../../pikotools/utf8/utf8.h baseexpression.o: flatexpression.h modeldata.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 flatexpression.h clearer.o: morm_types.h flatexpression.h modeldata.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
@ -28,7 +28,7 @@ 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 model.h modelconnector.h dbconnector.o: baseexpression.h morm_types.h model.h modelconnector.h
dbconnector.o: clearer.h flatconnector.h flatexpression.h dbconnector.o: clearer.h flatconnector.h flatexpression.h modeldata.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
dbconnector.o: ../../pikotools/convert/patternreplacer.h dbconnector.o: ../../pikotools/convert/patternreplacer.h
@ -69,6 +69,7 @@ flatconnector.o: ../../pikotools/textstream/types.h flatexpression.h
flatconnector.o: baseexpression.h morm_types.h model.h modelconnector.h flatconnector.o: baseexpression.h morm_types.h model.h modelconnector.h
flatconnector.o: clearer.h dbconnector.h ../../pikotools/log/log.h flatconnector.o: clearer.h dbconnector.h ../../pikotools/log/log.h
flatconnector.o: ../../pikotools/log/filelog.h queryresult.h dbexpression.h flatconnector.o: ../../pikotools/log/filelog.h queryresult.h dbexpression.h
flatconnector.o: modeldata.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
@ -102,6 +103,7 @@ 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 flatexpression.h model.o: dbexpression.h baseexpression.h morm_types.h flatexpression.h
model.o: modeldata.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
modelconnector.o: ../../pikotools/textstream/textstream.h modelconnector.o: ../../pikotools/textstream/textstream.h

View File

@ -161,10 +161,12 @@ 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) 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.map_doc_fields(); model.map_doc_fields();
model.model_data = nullptr;
model.doc_field_pointer = nullptr; model.doc_field_pointer = nullptr;
} }

View File

@ -45,6 +45,7 @@
namespace morm namespace morm
{ {
class Model; class Model;
class ModelData;
class ModelConnector; class ModelConnector;
@ -65,7 +66,7 @@ public:
// give me a better name // give me a better name
virtual void put_field_doc(Model & model, const void * field_pointer, bool insertable, bool updatable, bool is_primary_key); virtual void put_field_doc(Model & model, const void * field_pointer, bool insertable, bool updatable, bool is_primary_key, ModelData * model_data);
@ -98,7 +99,10 @@ public:
} }
template<typename FieldValue> 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) 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,
ModelData * model_data = nullptr)
{ {
if( out_stream ) if( out_stream )
{ {
@ -107,7 +111,7 @@ public:
put_field_name(field_name, add_column_prefix); put_field_name(field_name, add_column_prefix);
put_name_value_separator(); put_name_value_separator();
put_field_doc(model, reinterpret_cast<const void*>(&field_value), insertable, updatable, is_primary_key); put_field_doc(model, reinterpret_cast<const void*>(&field_value), insertable, updatable, is_primary_key, model_data);
put_name_value_separator(); put_name_value_separator();
put_type(field_value, *out_stream); put_type(field_value, *out_stream);
@ -148,7 +152,7 @@ public:
template<typename ModelContainer> template<typename ModelContainer>
void field_list(const wchar_t * field_name, ModelContainer & field_value, bool insertable, bool updatable, bool is_primary_key, void field_list(const wchar_t * field_name, ModelContainer & field_value, bool insertable, bool updatable, bool is_primary_key,
ModelConnector * model_connector, int model_connector_mode) ModelConnector * model_connector, int model_connector_mode, ModelData * model_data)
{ {
if( out_stream && can_field_be_generated(insertable, updatable, is_primary_key) ) if( out_stream && can_field_be_generated(insertable, updatable, is_primary_key) )
{ {
@ -158,7 +162,7 @@ public:
{ {
put_field_name(field_name); put_field_name(field_name);
put_name_value_separator(); put_name_value_separator();
put_field_value_list(field_value, model_connector, model_connector_mode); put_field_value_list(field_value, model_connector, model_connector_mode, model_data);
} }
field_after(); field_after();
@ -271,7 +275,7 @@ protected:
// what about lists with a pod types? e.g. list<int> // what about lists with a pod types? e.g. list<int>
template<typename ModelContainer> template<typename ModelContainer>
void put_field_value_list(ModelContainer & field_value, ModelConnector * model_connector, int model_connector_mode) void put_field_value_list(ModelContainer & field_value, ModelConnector * model_connector, int model_connector_mode, ModelData * model_data)
{ {
if( out_stream ) if( out_stream )
{ {
@ -293,8 +297,10 @@ protected:
//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_connector_mode = model_connector_mode;
m.model_data = model_data;
generate_from_model(m); generate_from_model(m);
m.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; m.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
m.model_data = nullptr;
//after_field_value(field_value); //after_field_value(field_value);
is_first = false; is_first = false;
} }

View File

@ -101,7 +101,7 @@ public:
} }
virtual void set_model_data(Model::ModelData * model_data) virtual void set_model_data(ModelData * model_data)
{ {
this->model_data = model_data; this->model_data = model_data;
} }
@ -257,7 +257,7 @@ public:
protected: protected:
ModelConnector * model_connector; ModelConnector * model_connector;
Model::ModelData * model_data; ModelData * model_data;
QueryResult * query_result; QueryResult * query_result;
bool select_status; bool select_status;

View File

@ -5,7 +5,7 @@
*/ */
/* /*
* Copyright (c) 2018, Tomasz Sowa * Copyright (c) 2018-2019, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -81,6 +81,7 @@ public:
db_expression = nullptr; db_expression = nullptr;
was_query_error = false; was_query_error = false;
model_data = nullptr; model_data = nullptr;
set_out_stream();
} }
Finder(ModelConnector * model_connector) Finder(ModelConnector * model_connector)
@ -90,6 +91,7 @@ public:
db_expression = nullptr; db_expression = nullptr;
was_query_error = false; was_query_error = false;
model_data = nullptr; model_data = nullptr;
set_out_stream();
} }
Finder(PT::TextStream & out_stream, ModelConnector & model_connector) Finder(PT::TextStream & out_stream, ModelConnector & model_connector)
@ -111,6 +113,44 @@ public:
} }
protected:
void set_out_stream()
{
if( model_connector )
{
this->out_stream = model_connector->get_stream();
}
else
{
this->out_stream = nullptr;
}
}
public:
Finder<ModelClass> & set_out_stream(PT::TextStream * out_stream)
{
this->out_stream = out_stream;
return *this;
}
Finder<ModelClass> & set_model_data(ModelData * model_data)
{
this->model_data = model_data;
return *this;
}
Finder<ModelClass> & set_model_data(ModelData & model_data)
{
this->model_data = &model_data;
return *this;
}
bool was_error() bool was_error()
{ {
return was_query_error; return was_query_error;
@ -138,15 +178,9 @@ public:
if( model_connector ) if( model_connector )
{ {
if( !out_stream )
{
out_stream = model_connector->get_stream();
}
if( out_stream ) if( out_stream )
{ {
set_db_expression(); set_db_expression();
out_stream->clear(); out_stream->clear();
model.set_connector(model_connector); model.set_connector(model_connector);
} }
@ -216,7 +250,7 @@ public:
return *this; return *this;
} }
Finder<ModelClass> & select(Model::ModelData * model_data, bool call_prepare = true) Finder<ModelClass> & select(ModelData * model_data, bool call_prepare = true)
{ {
if( call_prepare ) if( call_prepare )
{ {
@ -227,7 +261,7 @@ public:
return select(false); return select(false);
} }
Finder<ModelClass> & select(Model::ModelData & model_data, bool call_prepare = true) Finder<ModelClass> & select(ModelData & model_data, bool call_prepare = true)
{ {
if( call_prepare ) if( call_prepare )
{ {
@ -415,6 +449,23 @@ public:
} }
Finder<ModelClass> & raw(PT::TextStream & sql, bool add_spaces = true)
{
if( out_stream )
{
if( add_spaces )
(*out_stream) << ' ';
(*out_stream) << sql;
if( add_spaces )
(*out_stream) << ' ';
}
return *this;
}
Finder<ModelClass> & raw(long val, bool add_spaces = true) Finder<ModelClass> & raw(long val, bool add_spaces = true)
{ {
if( out_stream ) if( out_stream )
@ -500,7 +551,7 @@ private:
ModelClass model; ModelClass model;
bool was_query_error; bool was_query_error;
std::wstring last_query_error; std::wstring last_query_error;
Model::ModelData * model_data; ModelData * model_data;
std::wstring column_prefix; std::wstring column_prefix;

View File

@ -129,8 +129,7 @@ bool Model::found()
} }
void Model::to_text(PT::TextStream & stream, ModelData * model_data, bool clear_stream)
void Model::to_text(PT::TextStream & stream, bool clear_stream)
{ {
if( clear_stream ) if( clear_stream )
{ {
@ -145,7 +144,9 @@ void Model::to_text(PT::TextStream & stream, bool clear_stream)
if( flat_connector ) if( flat_connector )
{ {
this->model_data = model_data;
flat_connector->to_text(stream, *this); flat_connector->to_text(stream, *this);
this->model_data = nullptr;
} }
} }
@ -153,7 +154,20 @@ void Model::to_text(PT::TextStream & stream, bool clear_stream)
} }
void Model::to_text(std::string & str, bool clear_string) void Model::to_text(PT::TextStream & stream, ModelData & model_data, bool clear_stream)
{
to_text(stream, &model_data, clear_stream);
}
void Model::to_text(PT::TextStream & stream, bool clear_stream)
{
to_text(stream, nullptr, clear_stream);
}
void Model::to_text(std::string & str, ModelData * model_data, bool clear_string)
{ {
if( model_connector ) if( model_connector )
{ {
@ -162,13 +176,25 @@ void Model::to_text(std::string & str, bool clear_string)
if( out_stream ) if( out_stream )
{ {
to_text(*out_stream, true); to_text(*out_stream, model_data, true);
out_stream->to_string(str, clear_string); out_stream->to_string(str, clear_string);
} }
} }
} }
void Model::to_text(std::string & str, ModelData & model_data, bool clear_string)
{
to_text(str, &model_data, clear_string);
}
void Model::to_text(std::string & str, bool clear_string)
{
to_text(str, nullptr, clear_string);
}
std::string Model::to_text() std::string Model::to_text()
{ {
std::string str; std::string str;

View File

@ -42,6 +42,7 @@
#include "dbexpression.h" #include "dbexpression.h"
#include "flatexpression.h" #include "flatexpression.h"
#include "queryresult.h" #include "queryresult.h"
#include "modeldata.h"
@ -53,25 +54,6 @@ class Model
{ {
public: public:
class ModelData
{
public:
ModelData() {}
virtual ~ModelData() {}
/*
* may to add:
* std::set<std::wstring> skip_columns;
* and Finder can use this
* also update and insert from Model
* (but what about the same name of columns through the whole objects-tree?
* may we can save the name of the table too?)
*
*
*/
};
enum SaveMode enum SaveMode
{ {
DO_INSERT_ON_SAVE, DO_INSERT_ON_SAVE,
@ -115,9 +97,14 @@ public:
*/ */
virtual void table_name(PT::TextStream & stream); virtual void table_name(PT::TextStream & stream);
virtual void to_text(PT::TextStream & stream, ModelData * model_data = nullptr, 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, bool clear_stream = true);
virtual void to_text(std::string & str, ModelData * model_data = nullptr, 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, bool clear_string = true);
virtual std::string to_text(); virtual std::string to_text();
virtual std::string to_string(); virtual std::string to_string();
@ -723,6 +710,7 @@ protected:
if( model_connector ) if( model_connector )
{ {
field_model.set_connector(model_connector); field_model.set_connector(model_connector);
field_model.model_data = model_data;
// IMPLEMENTME what about db? // IMPLEMENTME what about db?
if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING ) if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING )
@ -768,6 +756,8 @@ protected:
} }
} }
} }
field_model.model_data = nullptr;
} }
} }
@ -791,7 +781,7 @@ 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, is_primary_key, model_connector, model_connector_mode); flat_expression->field_list(flat_field_name, field_container, insertable, updatable, is_primary_key, model_connector, model_connector_mode, model_data);
} }
} }
} }
@ -818,7 +808,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, is_primary_key); doc_expression->field_doc(*this, flat_field_name, field_container, insertable, updatable, is_primary_key, model_data);
} }
} }
} }

63
src/modeldata.h Normal file
View File

@ -0,0 +1,63 @@
/*
* 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_modeldata
#define headerfile_morm_modeldata
namespace morm
{
class ModelData
{
public:
ModelData() {}
virtual ~ModelData() {}
/*
* may to add:
* std::set<std::wstring> skip_columns;
* and Finder can use this
* also update and insert from Model
* (but what about the same name of columns through the whole objects-tree?
* may we can save the name of the table too?)
*
*
*/
};
}
#endif