morm/src/baseexpression.cpp

1247 lines
28 KiB
C++

/*
* 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) 2018-2023, 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.
*
*/
#include "baseexpression.h"
#include "morm_types.h"
#include "model.h"
#include "utf8/utf8.h"
namespace morm
{
BaseExpression::BaseExpression()
{
/*
* may it would be better for the ModelConnector/JSONConnector/PostgreSQLConnector to provide one scratch buffer?
*/
scratch_buffer = &scratch_buffer_local;
clear();
}
BaseExpression::~BaseExpression()
{
}
void BaseExpression::clear()
{
out_stream = nullptr;
is_first_field = false;
work_mode = 0;
output_type = 0;
use_prefix = false;
}
void BaseExpression::set_work_mode(int work_mode)
{
this->work_mode = work_mode;
}
int BaseExpression::get_work_mode()
{
return work_mode;
}
void BaseExpression::set_output_type(int output_type)
{
this->output_type = output_type;
}
int BaseExpression::get_output_type()
{
return output_type;
}
pt::TextStream * BaseExpression::get_text_stream()
{
return out_stream;
}
void BaseExpression::set_text_stream(pt::TextStream * out_stream)
{
this->out_stream = out_stream;
}
pt::TextStream * BaseExpression::get_current_stream()
{
return out_stream;
}
void BaseExpression::allow_to_use_prefix(bool use_prefix)
{
this->use_prefix = use_prefix;
}
bool BaseExpression::get_allow_to_use_prefix()
{
return use_prefix;
}
void BaseExpression::generate_from_model(pt::TextStream & stream, Model & model)
{
FT field_type = FT::default_type;
generate_from_model(stream, model, field_type);
}
void BaseExpression::generate_from_model(pt::TextStream & stream, Model & model, const FT & field_type)
{
this->out_stream = &stream;
generate_from_model(model, field_type);
this->out_stream = nullptr;
}
void BaseExpression::generate_from_model(Model & model, const FT & field_type)
{
if( out_stream )
{
if( should_field_model_be_generated_as_null(model.get_has_primary_key_set(), field_type) )
{
put_null_value();
}
else
{
before_generate_from_model();
dump_additional_info(model);
model.fields();
add_additional_columns(model);
after_generate_from_model();
}
}
}
void BaseExpression::dump_additional_info(Model & model)
{
if( model.model_env && model.model_env->dump_mode )
{
field(L"model_save_mode", model.save_mode, FT::no_insertable | FT::no_updatable | FT::no_fetchable, model.model_env);
field(L"has_primary_key_set", model.has_primary_key_set, FT::no_insertable | FT::no_updatable | FT::no_fetchable, model.model_env);
}
}
void BaseExpression::add_additional_columns(Model & model)
{
}
void BaseExpression::before_generate_from_model()
{
is_first_field = true;
}
void BaseExpression::after_generate_from_model()
{
}
bool BaseExpression::can_field_be_generated(const FT &)
{
return true;
}
bool BaseExpression::can_field_model_be_generated(bool has_model_primary_key, const FT & field_type)
{
return true;
}
bool BaseExpression::can_field_list_be_generated(const FT &)
{
return true;
}
bool BaseExpression::should_field_model_be_generated_as_null(bool has_model_primary_key, const FT & field_type)
{
return false;
}
void BaseExpression::field_before()
{
if( !is_first_field )
{
// put a separator between fields
}
}
void BaseExpression::field_after()
{
is_first_field = false;
}
void BaseExpression::put_field_name_and_table_if_needed(const wchar_t * field_name, const FT & field_type, ModelEnv * model_env)
{
if( !field_type.is_raw_field_name() && use_prefix && model_env )
{
if( !is_empty_field(model_env->table2_name) )
{
put_table_with_index_and_field(model_env->table2_name, model_env->table2_index, field_name, field_type);
}
else
{
put_table_with_index_and_field(model_env->table_name, model_env->table_index, field_name, field_type);
}
}
else
{
put_field_name(field_name, field_type, model_env);
}
}
void BaseExpression::put_field_name(const wchar_t * field_name, const FT & field_type, ModelEnv * model_env)
{
if( field_type.is_raw_field_name() )
{
(*out_stream) << field_name;
}
else
{
before_field_name();
esc(field_name, *out_stream, FT::default_type, nullptr); /* do not use provided field_type here - it would use e.g. binary mode if it was set, similar don't use model_env */
after_field_name();
}
}
void BaseExpression::put_field_closing_name(const wchar_t * field_name, const FT & field_type, ModelEnv * model_env)
{
put_field_name(field_name, field_type, model_env);
}
void BaseExpression::put_value_list_opening_index(size_t index, const FT & field_type)
{
}
void BaseExpression::put_value_list_closing_index(size_t index, const FT & field_type)
{
}
void BaseExpression::save_foreign_key(const wchar_t * field_name, const FT & field_type, ModelEnv * model_env)
{
pt::TextStream str;
pt::TextStream * old_out_stream = out_stream;
out_stream = &str;
put_field_name(field_name, field_type, model_env);
out_stream = old_out_stream;
if( model_env && model_env->finder_helper )
{
model_env->finder_helper->foreign_keys.emplace_back();
std::string & key_str = model_env->finder_helper->foreign_keys.back();
str.to_str(key_str, false);
}
}
void BaseExpression::schema_table_separator()
{
}
void BaseExpression::table_field_separator()
{
}
void BaseExpression::alias_names_separator()
{
}
void BaseExpression::before_schema_name()
{
}
void BaseExpression::after_schema_name()
{
}
void BaseExpression::before_table_name()
{
}
void BaseExpression::after_table_name()
{
}
void BaseExpression::before_field_name()
{
}
void BaseExpression::after_field_name()
{
}
void BaseExpression::before_alias_name()
{
}
void BaseExpression::after_alias_name()
{
}
void BaseExpression::before_field_value(const std::wstring &, const FT & field_type, ModelEnv * model_env)
{
before_field_value_string(field_type, model_env);
}
void BaseExpression::before_field_value(const std::string &, const FT & field_type, ModelEnv * model_env)
{
before_field_value_string(field_type, model_env);
}
void BaseExpression::after_field_value(const std::wstring &, const FT & field_type, ModelEnv * model_env)
{
after_field_value_string(field_type, model_env);
}
void BaseExpression::after_field_value(const std::string &, const FT & field_type, ModelEnv * model_env)
{
after_field_value_string(field_type, model_env);
}
void BaseExpression::before_field_value(const wchar_t *, const FT & field_type, ModelEnv * model_env)
{
before_field_value_string(field_type, model_env);
}
void BaseExpression::after_field_value(const wchar_t *, const FT & field_type, ModelEnv * model_env)
{
after_field_value_string(field_type, model_env);
}
void BaseExpression::before_field_value(const char *, const FT & field_type, ModelEnv * model_env)
{
before_field_value_string(field_type, model_env);
}
void BaseExpression::after_field_value(const char *, const FT & field_type, ModelEnv * model_env)
{
after_field_value_string(field_type, model_env);
}
void BaseExpression::before_field_value(wchar_t, const FT & field_type, ModelEnv * model_env)
{
before_field_value_string(field_type, model_env);
}
void BaseExpression::after_field_value(wchar_t, const FT & field_type, ModelEnv * model_env)
{
after_field_value_string(field_type, model_env);
}
void BaseExpression::before_field_value(char, const FT & field_type, ModelEnv * model_env)
{
before_field_value_string(field_type, model_env);
}
void BaseExpression::after_field_value(char, const FT & field_type, ModelEnv * model_env)
{
after_field_value_string(field_type, model_env);
}
void BaseExpression::before_field_value(const pt::Date &, const FT & field_type, ModelEnv * model_env)
{
before_field_value_string(field_type, model_env);
}
void BaseExpression::after_field_value(const pt::Date &, const FT & field_type, ModelEnv * model_env)
{
after_field_value_string(field_type, model_env);
}
void BaseExpression::before_field_value(const pt::Space &, const FT & field_type, ModelEnv * model_env)
{
before_field_value_string(field_type, model_env);
}
void BaseExpression::after_field_value(const pt::Space &, const FT & field_type, ModelEnv * model_env)
{
after_field_value_string(field_type, model_env);
}
void BaseExpression::put_name_value_separator()
{
(*out_stream) << ',';
}
char BaseExpression::char_to_hex_part(char c)
{
if( c < 10 )
return c + '0';
return c - 10 + 'A';
}
void BaseExpression::char_to_hex(char c, pt::TextStream & stream)
{
stream << char_to_hex_part(((unsigned char)c) >> 4);
stream << char_to_hex_part(((unsigned char)c) & 0x0f);
}
void BaseExpression::char_to_hex(wchar_t c, pt::TextStream & stream)
{
unsigned int z = static_cast<unsigned int>(c);
char_to_hex((char)(unsigned char)(z >> 24), stream);
char_to_hex((char)(unsigned char)(z >> 16), stream);
char_to_hex((char)(unsigned char)(z >> 8), stream);
char_to_hex((char)(unsigned char)(z), stream);
}
/*
* return true if the val character was escaped and put (or ignored) to the stream
*
*/
bool BaseExpression::esc_char(char val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
return esc_char((wchar_t)(unsigned char)val, stream, field_type, model_env);
}
/*
* return true if the val character was escaped and put (or ignored) to the stream
*
* in most caces you have to provide your own esc_char(wchar_t val, pt::TextStream & stream) method
*
*/
bool BaseExpression::esc_char(wchar_t val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
return false;
}
void BaseExpression::esc(char val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
if( field_type.is_binary() || field_type.is_hexadecimal() )
{
char_to_hex(val, stream);
}
else
{
if( !esc_char(val, stream, field_type, model_env) )
{
stream << val;
}
}
}
void BaseExpression::esc(unsigned char val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
esc(static_cast<char>(val), stream, field_type, model_env);
}
void BaseExpression::esc(wchar_t val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
if( field_type.is_binary() || field_type.is_hexadecimal() )
{
char_to_hex(val, stream);
}
else
{
if( field_type.use_utf8() )
{
if( !esc_char(val, stream, field_type, model_env) )
{
stream << val;
}
}
else
{
char val_char = (char)(unsigned char)val;
if( !esc_char(val_char, stream, field_type, model_env) )
{
stream << val_char;
}
}
}
}
void BaseExpression::esc(const wchar_t * val, bool has_known_length, size_t len, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
if( field_type.is_numeric() )
{
esc_numeric_string(val, has_known_length, len, stream, field_type, model_env);
}
else
{
esc_normal_string(val, has_known_length, len, stream, field_type, model_env);
}
}
void BaseExpression::esc(const char * val, bool has_known_length, size_t len, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
if( field_type.is_numeric() )
{
esc_numeric_string(val, has_known_length, len, stream, field_type, model_env);
}
else
{
esc_normal_string(val, has_known_length, len, stream, field_type, model_env);
}
}
void BaseExpression::esc(const std::wstring & val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
esc(val.c_str(), true, val.size(), stream, field_type, model_env);
}
void BaseExpression::esc(const wchar_t * val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
esc(val, false, 0, stream, field_type, model_env);
}
void BaseExpression::esc(const std::string & val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
esc(val.c_str(), true, val.size(), stream, field_type, model_env);
}
void BaseExpression::esc(const char * val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
esc(val, false, 0, stream, field_type, model_env);
}
void BaseExpression::esc(bool val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
if( val )
stream << "true";
else
stream << "false";
}
void BaseExpression::esc(short val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
stream << val;
}
void BaseExpression::esc(unsigned short val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
stream << val;
}
void BaseExpression::esc(int val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
stream << val;
}
void BaseExpression::esc(unsigned int val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
stream << val;
}
void BaseExpression::esc(long val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
stream << val;
}
void BaseExpression::esc(unsigned long val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
stream << val;
}
void BaseExpression::esc(long long val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
stream << val;
}
void BaseExpression::esc(unsigned long long val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
stream << val;
}
void BaseExpression::esc(float val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
stream << val;
}
void BaseExpression::esc(double val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
stream << val;
}
void BaseExpression::esc(long double val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
stream << val;
}
void BaseExpression::esc(const pt::Date & date, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
if( field_type.is_date_only() )
{
date.SerializeYearMonthDay(stream, false);
}
else
if( field_type.is_time_only() )
{
date.SerializeHourMinSec(stream);
}
else
{
if( field_type.is_no_time_zone() )
{
date.Serialize(stream);
}
else
{
date.SerializeISO(stream);
}
}
}
void BaseExpression::esc(const pt::TextStream & val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
pt::TextStream::const_iterator i = val.begin();
for(; i != val.end() ; ++i)
{
esc(*i, stream, field_type, model_env);
}
}
void BaseExpression::esc(const pt::WTextStream & val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
pt::WTextStream::const_iterator i = val.begin();
for(; i != val.end() ; ++i)
{
esc(*i, stream, field_type, model_env);
}
}
void BaseExpression::esc(const pt::Space & space, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env)
{
pt::WTextStream tmp_stream;
bool pretty_print = field_type.is_pretty_print();
if( field_type.is_space() )
space.serialize_to_space_stream(tmp_stream, pretty_print);
else
space.serialize_to_json_stream(tmp_stream, pretty_print);
esc(tmp_stream, stream, field_type, model_env);
}
//void BaseExpression::put_type(char val, pt::TextStream & stream)
//{
// stream << "char";
//}
//
//void BaseExpression::put_type(unsigned char val, pt::TextStream & stream)
//{
// stream << "unsigned char";
//}
//
//
//void BaseExpression::put_type(const std::wstring & val, pt::TextStream & stream)
//{
// stream << "text";
//}
//
//void BaseExpression::put_type(const wchar_t * val, pt::TextStream & stream)
//{
// stream << "text";
//}
//
//
//void BaseExpression::put_type(const std::string & val, pt::TextStream & stream)
//{
// stream << "text";
//}
//
//void BaseExpression::put_type(const char * val, pt::TextStream & stream)
//{
// stream << "text";
//}
//
//
//void BaseExpression::put_type(bool val, pt::TextStream & stream)
//{
// stream << "boolean";
//}
//
//void BaseExpression::put_type(short val, pt::TextStream & stream)
//{
// stream << "short integer";
//}
//
//void BaseExpression::put_type(unsigned short val, pt::TextStream & stream)
//{
// stream << "unsigned short integer";
//}
//
//void BaseExpression::put_type(int val, pt::TextStream & stream)
//{
// stream << "integer";
//}
//
//void BaseExpression::put_type(unsigned int val, pt::TextStream & stream)
//{
// stream << "unsigned integer";
//}
//
//void BaseExpression::put_type(long val, pt::TextStream & stream)
//{
// stream << "long integer";
//}
//
//void BaseExpression::put_type(unsigned long val, pt::TextStream & stream)
//{
// stream << "unsigned long integer";
//}
//
//void BaseExpression::put_type(long long val, pt::TextStream & stream)
//{
// stream << "very long integer";
//}
//
//void BaseExpression::put_type(unsigned long long val, pt::TextStream & stream)
//{
// stream << "unsigned very long integer";
//}
//
//void BaseExpression::put_type(float val, pt::TextStream & stream)
//{
// stream << "float";
//}
//
//void BaseExpression::put_type(double val, pt::TextStream & stream)
//{
// stream << "double";
//}
//
//void BaseExpression::put_type(long double val, pt::TextStream & stream)
//{
// stream << "long double";
//}
//
////void BaseExpression::put_type(void* val, pt::TextStream & stream)
////{
////}
//
//
//void BaseExpression::put_type(const pt::Date & date, pt::TextStream & stream)
//{
// stream << "date";
//}
//
//void BaseExpression::put_type(const Model & model, pt::TextStream & stream)
//{
// stream << "object";
//}
void BaseExpression::before_field_value_string(const FT & field_type, ModelEnv * model_env)
{
}
void BaseExpression::after_field_value_string(const FT & field_type, ModelEnv * model_env)
{
}
/*
* schema_name can be a null pointer or just pointing to an empty string
* in such a case we do not put the schema name
*/
void BaseExpression::put_schema_table(const wchar_t * schema_name, const wchar_t * table_name)
{
if( out_stream )
{
bool has_schema = false;
if( !is_empty_field(schema_name) )
{
has_schema = true;
before_schema_name();
esc(schema_name, *out_stream);
after_schema_name();
}
if( !is_empty_field(table_name) )
{
if( has_schema )
schema_table_separator();
before_table_name();
esc(table_name, *out_stream);
after_table_name();
}
}
}
/*
* schema_name can be empty - in such a case we do not put the schema name
*/
void BaseExpression::put_schema_table(const pt::WTextStream & schema_name, const pt::WTextStream & table_name)
{
if( out_stream )
{
bool has_schema = false;
if( !schema_name.empty() )
{
has_schema = true;
before_schema_name();
esc(schema_name, *out_stream);
after_schema_name();
}
if( !table_name.empty() )
{
if( has_schema )
schema_table_separator();
before_table_name();
esc(table_name, *out_stream);
after_table_name();
}
}
}
void BaseExpression::put_table(const wchar_t * table_name)
{
if( out_stream )
{
before_table_name();
esc(table_name, *out_stream);
after_table_name();
}
}
void BaseExpression::put_table(const pt::WTextStream & table_name)
{
if( out_stream )
{
before_table_name();
esc(table_name, *out_stream);
after_table_name();
}
}
void BaseExpression::put_table_with_index(const wchar_t * table_name, int index)
{
if( out_stream )
{
before_table_name();
esc(table_name, *out_stream);
if( index > 1 )
{
(*out_stream) << index;
}
after_table_name();
}
}
void BaseExpression::put_table_with_index(const pt::WTextStream & table_name, int index)
{
if( out_stream )
{
before_table_name();
esc(table_name, *out_stream);
if( index > 1 )
{
(*out_stream) << index;
}
after_table_name();
}
}
void BaseExpression::put_table_with_index_and_field(const wchar_t * table_name, int index, const wchar_t * field_name, const FT & field_type)
{
if( out_stream )
{
put_table_with_index(table_name, index);
table_field_separator();
put_field_name(field_name, field_type, nullptr);
}
}
void BaseExpression::put_table_with_index_and_field(const pt::WTextStream & table_name, int index, const wchar_t * field_name, const FT & field_type)
{
if( out_stream )
{
put_table_with_index(table_name, index);
table_field_separator();
put_field_name(field_name, field_type, nullptr);
}
}
void BaseExpression::put_table_and_field(const wchar_t * table_name, const wchar_t * field_name, const FT & field_type)
{
if( out_stream )
{
put_table(table_name);
table_field_separator();
put_field_name(field_name, field_type, nullptr);
}
}
void BaseExpression::put_table_and_field(const pt::WTextStream & table_name, const wchar_t * field_name, const FT & field_type)
{
if( out_stream )
{
put_table(table_name);
table_field_separator();
put_field_name(field_name, field_type, nullptr);
}
}
void BaseExpression::put_alias(const pt::WTextStream & alias_name, int index)
{
if( out_stream )
{
before_alias_name();
esc(alias_name, *out_stream);
if( index > 1 )
{
(*out_stream) << index;
}
after_alias_name();
}
}
void BaseExpression::put_alias(const pt::WTextStream & alias_name_prefix, int index, const wchar_t * alias_name_postfix)
{
if( out_stream )
{
before_alias_name();
esc(alias_name_prefix, *out_stream);
if( index > 1 )
{
(*out_stream) << index;
}
alias_names_separator();
esc(alias_name_postfix, *out_stream);
after_alias_name();
}
}
void BaseExpression::put_string(const char * str, const FT & field_type, bool add_quotes, ModelEnv * model_env)
{
put_string_generic(str, field_type, add_quotes, model_env);
}
void BaseExpression::put_string(const wchar_t * str, const FT & field_type, bool add_quotes, ModelEnv * model_env)
{
put_string_generic(str, field_type, add_quotes, model_env);
}
void BaseExpression::put_string(const std::string & str, const FT & field_type, bool add_quotes, ModelEnv * model_env)
{
put_string_generic(str, field_type, add_quotes, model_env);
}
void BaseExpression::put_string(const std::wstring & str, const FT & field_type, bool add_quotes, ModelEnv * model_env)
{
put_string_generic(str, field_type, add_quotes, model_env);
}
void BaseExpression::put_stream(const pt::TextStream & str, const FT & field_type, bool add_quotes, ModelEnv * model_env)
{
put_string_generic(str, field_type, add_quotes, model_env);
}
void BaseExpression::put_stream(const pt::WTextStream & str, const FT & field_type, bool add_quotes, ModelEnv * model_env)
{
put_string_generic(str, field_type, add_quotes, model_env);
}
void BaseExpression::schema_table_to_stream(pt::TextStream & stream, const wchar_t * schema_name, const wchar_t * table_name)
{
this->out_stream = &stream;
put_schema_table(schema_name, table_name);
this->out_stream = nullptr;
}
void BaseExpression::schema_table_to_stream(pt::TextStream & stream, const pt::WTextStream & schema_name, const pt::WTextStream & table_name)
{
this->out_stream = &stream;
put_schema_table(schema_name, table_name);
this->out_stream = nullptr;
}
void BaseExpression::table_to_stream(pt::TextStream & stream, const wchar_t * table_name)
{
this->out_stream = &stream;
put_table(table_name);
this->out_stream = nullptr;
}
void BaseExpression::table_to_stream(pt::TextStream & stream, const pt::WTextStream & table_name)
{
this->out_stream = &stream;
put_table(table_name);
this->out_stream = nullptr;
}
void BaseExpression::table_with_index_to_stream(pt::TextStream & stream, const wchar_t * table_name, int index)
{
this->out_stream = &stream;
put_table_with_index(table_name, index);
this->out_stream = nullptr;
}
void BaseExpression::table_with_index_to_stream(pt::TextStream & stream, const pt::WTextStream & table_name, int index)
{
this->out_stream = &stream;
put_table_with_index(table_name, index);
this->out_stream = nullptr;
}
void BaseExpression::table_with_index_and_field_to_stream(pt::TextStream & stream, const wchar_t * table_name, int index, const wchar_t * field_name, const FT & field_type)
{
this->out_stream = &stream;
put_table_with_index_and_field(table_name, index, field_name, field_type);
this->out_stream = nullptr;
}
void BaseExpression::table_with_index_and_field_to_stream(pt::TextStream & stream, const pt::WTextStream & table_name, int index, const wchar_t * field_name, const FT & field_type)
{
this->out_stream = &stream;
put_table_with_index_and_field(table_name, index, field_name, field_type);
this->out_stream = nullptr;
}
void BaseExpression::table_and_field_to_stream(pt::TextStream & stream, const wchar_t * table_name, const wchar_t * field_name, const FT & field_type)
{
this->out_stream = &stream;
put_table_and_field(table_name, field_name, field_type);
this->out_stream = nullptr;
}
void BaseExpression::table_and_field_to_stream(pt::TextStream & stream, const pt::WTextStream & table_name, const wchar_t * field_name, const FT & field_type)
{
this->out_stream = &stream;
put_table_and_field(table_name, field_name, field_type);
this->out_stream = nullptr;
}
void BaseExpression::alias_to_stream(pt::TextStream & stream, const pt::WTextStream & alias_name, int index)
{
this->out_stream = &stream;
put_alias(alias_name, index);
this->out_stream = nullptr;
}
void BaseExpression::alias_to_stream(pt::TextStream & stream, const pt::WTextStream & alias_name_prefix, int index, const wchar_t * alias_name_postfix)
{
this->out_stream = &stream;
put_alias(alias_name_prefix, index, alias_name_postfix);
this->out_stream = nullptr;
}
void BaseExpression::string_to_stream(pt::TextStream & stream, const char * str, const FT & field_type, bool add_quotes, ModelEnv * model_env)
{
this->out_stream = &stream;
put_string(str, field_type, add_quotes, model_env);
this->out_stream = nullptr;
}
void BaseExpression::string_to_stream(pt::TextStream & stream, const wchar_t * str, const FT & field_type, bool add_quotes, ModelEnv * model_env)
{
this->out_stream = &stream;
put_string(str, field_type, add_quotes, model_env);
this->out_stream = nullptr;
}
void BaseExpression::string_to_stream(pt::TextStream & stream, const std::string & str, const FT & field_type, bool add_quotes, ModelEnv * model_env)
{
this->out_stream = &stream;
put_string(str, field_type, add_quotes, model_env);
this->out_stream = nullptr;
}
void BaseExpression::string_to_stream(pt::TextStream & stream, const std::wstring & str, const FT & field_type, bool add_quotes, ModelEnv * model_env)
{
this->out_stream = &stream;
put_string(str, field_type, add_quotes, model_env);
this->out_stream = nullptr;
}
void BaseExpression::stream_to_stream(pt::TextStream & stream_out, const pt::TextStream & stream_in, const FT & field_type, bool add_quotes, ModelEnv * model_env)
{
this->out_stream = &stream_out;
put_stream(stream_in, field_type, add_quotes, model_env);
this->out_stream = nullptr;
}
void BaseExpression::stream_to_stream(pt::TextStream & stream_out, const pt::WTextStream & stream_in, const FT & field_type, bool add_quotes, ModelEnv * model_env)
{
this->out_stream = &stream_out;
put_stream(stream_in, field_type, add_quotes, model_env);
this->out_stream = nullptr;
}
bool BaseExpression::is_empty_field(const wchar_t * value)
{
return (!value || *value == '\0');
}
}