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:
parent
41684eb969
commit
cf0a0c96fe
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
71
src/finder.h
71
src/finder.h
|
@ -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;
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
34
src/model.h
34
src/model.h
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue