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: ../../pikotools/log/log.h ../../pikotools/log/filelog.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: ../../pikotools/convert/inttostr.h model.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/log/log.h ../../pikotools/log/filelog.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: ../../pikotools/space/space.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/log/filelog.h queryresult.h dbexpression.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/convert/inttostr.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: clearer.h dbconnector.h ../../pikotools/log/log.h
flatconnector.o: ../../pikotools/log/filelog.h queryresult.h dbexpression.h
flatconnector.o: modeldata.h
flatexpression.o: flatexpression.h baseexpression.h
flatexpression.o: ../../pikotools/textstream/textstream.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: ../../pikotools/log/filelog.h queryresult.h flatconnector.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: ../../pikotools/convert/inttostr.h dbconnector.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.model_data = model_data;
model.map_doc_fields();
model.model_data = nullptr;
model.doc_field_pointer = nullptr;
}

View File

@ -45,6 +45,7 @@
namespace morm
{
class Model;
class ModelData;
class ModelConnector;
@ -65,7 +66,7 @@ public:
// 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>
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 )
{
@ -107,7 +111,7 @@ public:
put_field_name(field_name, add_column_prefix);
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_type(field_value, *out_stream);
@ -148,7 +152,7 @@ public:
template<typename ModelContainer>
void field_list(const wchar_t * field_name, ModelContainer & field_value, bool insertable, bool updatable, bool is_primary_key,
ModelConnector * model_connector, 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) )
{
@ -158,7 +162,7 @@ public:
{
put_field_name(field_name);
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();
@ -271,7 +275,7 @@ protected:
// what about lists with a pod types? e.g. list<int>
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 )
{
@ -293,8 +297,10 @@ protected:
//before_field_value(field_value);
m.set_connector(model_connector);
m.model_connector_mode = model_connector_mode;
m.model_data = model_data;
generate_from_model(m);
m.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
m.model_data = nullptr;
//after_field_value(field_value);
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;
}
@ -257,7 +257,7 @@ public:
protected:
ModelConnector * model_connector;
Model::ModelData * model_data;
ModelData * model_data;
QueryResult * query_result;
bool select_status;

View File

@ -5,7 +5,7 @@
*/
/*
* Copyright (c) 2018, Tomasz Sowa
* Copyright (c) 2018-2019, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -81,6 +81,7 @@ public:
db_expression = nullptr;
was_query_error = false;
model_data = nullptr;
set_out_stream();
}
Finder(ModelConnector * model_connector)
@ -90,6 +91,7 @@ public:
db_expression = nullptr;
was_query_error = false;
model_data = nullptr;
set_out_stream();
}
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()
{
return was_query_error;
@ -138,15 +178,9 @@ public:
if( model_connector )
{
if( !out_stream )
{
out_stream = model_connector->get_stream();
}
if( out_stream )
{
set_db_expression();
out_stream->clear();
model.set_connector(model_connector);
}
@ -216,7 +250,7 @@ public:
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 )
{
@ -227,7 +261,7 @@ public:
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 )
{
@ -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)
{
if( out_stream )
@ -500,7 +551,7 @@ private:
ModelClass model;
bool was_query_error;
std::wstring last_query_error;
Model::ModelData * model_data;
ModelData * model_data;
std::wstring column_prefix;

View File

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

View File

@ -42,6 +42,7 @@
#include "dbexpression.h"
#include "flatexpression.h"
#include "queryresult.h"
#include "modeldata.h"
@ -53,25 +54,6 @@ class Model
{
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
{
DO_INSERT_ON_SAVE,
@ -115,9 +97,14 @@ public:
*/
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(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 std::string to_text();
virtual std::string to_string();
@ -723,6 +710,7 @@ protected:
if( model_connector )
{
field_model.set_connector(model_connector);
field_model.model_data = model_data;
// IMPLEMENTME what about db?
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
// what about model_data and save_mode?
// 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) )
{
// 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