some work in morm (select statement)
git-svn-id: svn://ttmath.org/publicrep/morm/trunk@1079 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
@@ -67,6 +67,8 @@ void BaseExpression::generate_from_model(PT::TextStream & stream, Model & model)
|
|||||||
before_generate_from_model();
|
before_generate_from_model();
|
||||||
model.map_fields();
|
model.map_fields();
|
||||||
after_generate_from_model();
|
after_generate_from_model();
|
||||||
|
|
||||||
|
this->out_stream = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -60,7 +60,7 @@ public:
|
|||||||
template<typename FieldValue>
|
template<typename FieldValue>
|
||||||
void field(const wchar_t * field_name, const FieldValue & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false)
|
void field(const wchar_t * field_name, const FieldValue & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false)
|
||||||
{
|
{
|
||||||
if( can_field_be_generated(insertable, updatable, is_primary_key) )
|
if( out_stream && can_field_be_generated(insertable, updatable, is_primary_key) )
|
||||||
{
|
{
|
||||||
field_before();
|
field_before();
|
||||||
|
|
||||||
@@ -86,6 +86,40 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename FieldValue>
|
||||||
|
void field(PT::TextStream & stream, const wchar_t * field_name, const FieldValue & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false)
|
||||||
|
{
|
||||||
|
this->out_stream = &stream;
|
||||||
|
field(field_name, field_value, insertable, updatable, is_primary_key);
|
||||||
|
this->out_stream = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
virtual void esc(char val, PT::TextStream & stream);
|
||||||
|
virtual void esc(unsigned char val, PT::TextStream & stream);
|
||||||
|
|
||||||
|
virtual void esc(const std::wstring & val, PT::TextStream & stream);
|
||||||
|
virtual void esc(const wchar_t * val, PT::TextStream & stream);
|
||||||
|
|
||||||
|
virtual void esc(const std::string & val, PT::TextStream & stream);
|
||||||
|
virtual void esc(const char * val, PT::TextStream & stream);
|
||||||
|
|
||||||
|
virtual void esc(bool val, PT::TextStream & stream);
|
||||||
|
virtual void esc(short val, PT::TextStream & stream);
|
||||||
|
virtual void esc(unsigned short val, PT::TextStream & stream);
|
||||||
|
virtual void esc(int val, PT::TextStream & stream);
|
||||||
|
virtual void esc(unsigned int val, PT::TextStream & stream);
|
||||||
|
virtual void esc(long val, PT::TextStream & stream);
|
||||||
|
virtual void esc(unsigned long val, PT::TextStream & stream);
|
||||||
|
virtual void esc(long long val, PT::TextStream & stream);
|
||||||
|
virtual void esc(unsigned long long val, PT::TextStream & stream);
|
||||||
|
virtual void esc(float val, PT::TextStream & stream);
|
||||||
|
virtual void esc(double val, PT::TextStream & stream);
|
||||||
|
virtual void esc(long double val, PT::TextStream & stream);
|
||||||
|
virtual void esc(void* val, PT::TextStream & stream);
|
||||||
|
|
||||||
|
virtual void esc(const PT::Date & date, PT::TextStream & stream);
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -226,31 +260,6 @@ protected:
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
virtual void esc(char val, PT::TextStream & stream);
|
|
||||||
virtual void esc(unsigned char val, PT::TextStream & stream);
|
|
||||||
|
|
||||||
virtual void esc(const std::wstring & val, PT::TextStream & stream);
|
|
||||||
virtual void esc(const wchar_t * val, PT::TextStream & stream);
|
|
||||||
|
|
||||||
virtual void esc(const std::string & val, PT::TextStream & stream);
|
|
||||||
virtual void esc(const char * val, PT::TextStream & stream);
|
|
||||||
|
|
||||||
virtual void esc(bool val, PT::TextStream & stream);
|
|
||||||
virtual void esc(short val, PT::TextStream & stream);
|
|
||||||
virtual void esc(unsigned short val, PT::TextStream & stream);
|
|
||||||
virtual void esc(int val, PT::TextStream & stream);
|
|
||||||
virtual void esc(unsigned int val, PT::TextStream & stream);
|
|
||||||
virtual void esc(long val, PT::TextStream & stream);
|
|
||||||
virtual void esc(unsigned long val, PT::TextStream & stream);
|
|
||||||
virtual void esc(long long val, PT::TextStream & stream);
|
|
||||||
virtual void esc(unsigned long long val, PT::TextStream & stream);
|
|
||||||
virtual void esc(float val, PT::TextStream & stream);
|
|
||||||
virtual void esc(double val, PT::TextStream & stream);
|
|
||||||
virtual void esc(long double val, PT::TextStream & stream);
|
|
||||||
virtual void esc(void* val, PT::TextStream & stream);
|
|
||||||
|
|
||||||
virtual void esc(const PT::Date & date, PT::TextStream & stream);
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -53,31 +53,31 @@ DbConnector::~DbConnector()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool DbConnector::query(PT::TextStream & stream)
|
bool DbConnector::query(const PT::TextStream & stream)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool DbConnector::query(const std::wstring & query)
|
//bool DbConnector::query(const std::wstring & query)
|
||||||
|
//{
|
||||||
|
// return false;
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
bool DbConnector::query(const std::string & query_str)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool DbConnector::query(const std::string & query)
|
//bool DbConnector::query(const wchar_t * query)
|
||||||
{
|
//{
|
||||||
return false;
|
// return false;
|
||||||
}
|
//}
|
||||||
|
|
||||||
|
|
||||||
bool DbConnector::query(const wchar_t * query)
|
bool DbConnector::query(const char * query_str)
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool DbConnector::query(const char * query)
|
|
||||||
{
|
{
|
||||||
// do query
|
// do query
|
||||||
return false;
|
return false;
|
||||||
@@ -85,6 +85,27 @@ bool DbConnector::query(const char * query)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool DbConnector::query_select(const PT::TextStream & stream)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DbConnector::query_update(const PT::TextStream & stream)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DbConnector::query_insert(const PT::TextStream & stream)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual void DbConnector::map_values_from_query(Model & model)
|
||||||
|
{
|
||||||
|
model.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
DbExpression * DbConnector::get_expression()
|
DbExpression * DbConnector::get_expression()
|
||||||
{
|
{
|
||||||
|
@@ -61,11 +61,17 @@ public:
|
|||||||
virtual void insert(PT::TextStream & stream, Model & model);
|
virtual void insert(PT::TextStream & stream, Model & model);
|
||||||
virtual void update(PT::TextStream & stream, Model & model);
|
virtual void update(PT::TextStream & stream, Model & model);
|
||||||
|
|
||||||
virtual bool query(PT::TextStream & stream);
|
virtual bool query(const PT::TextStream & stream);
|
||||||
virtual bool query(const std::wstring & query);
|
//virtual bool query(const std::wstring & query);
|
||||||
virtual bool query(const std::string & query);
|
virtual bool query(const std::string & query_str);
|
||||||
virtual bool query(const wchar_t * query);
|
//virtual bool query(const wchar_t * query);
|
||||||
virtual bool query(const char * query);
|
virtual bool query(const char * query_str);
|
||||||
|
|
||||||
|
virtual bool query_select(const PT::TextStream & stream);
|
||||||
|
virtual bool query_update(const PT::TextStream & stream);
|
||||||
|
virtual bool query_insert(const PT::TextStream & stream);
|
||||||
|
|
||||||
|
virtual void map_values_from_query(Model & model);
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@@ -227,28 +227,34 @@ void DbExpression::prepare_to_where_clause()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DbExpression & DbExpression::group_or()
|
DbExpression & DbExpression::group_or(PT::TextStream & stream)
|
||||||
{
|
{
|
||||||
|
out_stream = &stream;
|
||||||
field_before();
|
field_before();
|
||||||
(*out_stream) << "(";
|
(*out_stream) << "(";
|
||||||
is_first_field = true;
|
is_first_field = true;
|
||||||
conjunctions.push_back(MORM_CONJUNCTION_OR);
|
conjunctions.push_back(MORM_CONJUNCTION_OR);
|
||||||
|
out_stream = nullptr;
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
DbExpression & DbExpression::group_and()
|
DbExpression & DbExpression::group_and(PT::TextStream & stream)
|
||||||
{
|
{
|
||||||
|
out_stream = &stream;
|
||||||
field_before();
|
field_before();
|
||||||
(*out_stream) << "(";
|
(*out_stream) << "(";
|
||||||
is_first_field = true;
|
is_first_field = true;
|
||||||
conjunctions.push_back(MORM_CONJUNCTION_AND);
|
conjunctions.push_back(MORM_CONJUNCTION_AND);
|
||||||
|
out_stream = nullptr;
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
DbExpression & DbExpression::group_end()
|
DbExpression & DbExpression::group_end(PT::TextStream & stream)
|
||||||
{
|
{
|
||||||
|
out_stream = &stream;
|
||||||
|
|
||||||
if( !conjunctions.empty() )
|
if( !conjunctions.empty() )
|
||||||
{
|
{
|
||||||
conjunctions.pop_back();
|
conjunctions.pop_back();
|
||||||
@@ -256,6 +262,7 @@ DbExpression & DbExpression::group_end()
|
|||||||
field_after();
|
field_after();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out_stream = nullptr;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -55,10 +55,9 @@ public:
|
|||||||
|
|
||||||
virtual void prepare_to_where_clause();
|
virtual void prepare_to_where_clause();
|
||||||
|
|
||||||
// may better names?
|
virtual DbExpression & group_or(PT::TextStream & stream);
|
||||||
virtual DbExpression & group_or();
|
virtual DbExpression & group_and(PT::TextStream & stream);
|
||||||
virtual DbExpression & group_and();
|
virtual DbExpression & group_end(PT::TextStream & stream);
|
||||||
virtual DbExpression & group_end();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
98
src/finder.h
98
src/finder.h
@@ -36,6 +36,7 @@
|
|||||||
#define headerfile_morm_finder
|
#define headerfile_morm_finder
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <list>
|
||||||
#include "model.h"
|
#include "model.h"
|
||||||
#include "textstream/textstream.h"
|
#include "textstream/textstream.h"
|
||||||
#include "dbconnector.h"
|
#include "dbconnector.h"
|
||||||
@@ -70,8 +71,8 @@ public:
|
|||||||
|
|
||||||
Finder(PT::TextStream & out_stream, ModelConnector & model_connector)
|
Finder(PT::TextStream & out_stream, ModelConnector & model_connector)
|
||||||
{
|
{
|
||||||
this->model_connector = &model_connector;
|
|
||||||
this->out_stream = &out_stream;
|
this->out_stream = &out_stream;
|
||||||
|
this->model_connector = &model_connector;
|
||||||
db_expression = nullptr;
|
db_expression = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,29 +92,34 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Finder<ModelClass> & find()
|
Finder<ModelClass> & find()
|
||||||
{
|
{
|
||||||
if( model_connector )
|
if( model_connector )
|
||||||
{
|
{
|
||||||
if( out_stream )
|
if( !out_stream )
|
||||||
{
|
|
||||||
model_connector->set_stream(*out_stream);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
out_stream = model_connector->get_stream();
|
out_stream = model_connector->get_stream();
|
||||||
}
|
}
|
||||||
|
|
||||||
set_db_expression();
|
if( out_stream )
|
||||||
|
{
|
||||||
|
set_db_expression();
|
||||||
|
|
||||||
out_stream->clear();
|
out_stream->clear();
|
||||||
model.set_connector(*model_connector);
|
model.set_connector(*model_connector);
|
||||||
model.clear();
|
model.clear();
|
||||||
|
|
||||||
(*out_stream) << "SELECT ";
|
(*out_stream) << "SELECT ";
|
||||||
model_connector->generate_select_columns(*out_stream, model);
|
model_connector->generate_select_columns(*out_stream, model);
|
||||||
(*out_stream) << " FROM ";
|
(*out_stream) << " FROM ";
|
||||||
model.table_name(*out_stream);
|
model.table_name(*out_stream);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
@@ -159,9 +165,9 @@ public:
|
|||||||
// may better names?
|
// may better names?
|
||||||
Finder<ModelClass> & group_or()
|
Finder<ModelClass> & group_or()
|
||||||
{
|
{
|
||||||
if( db_expression )
|
if( db_expression && out_stream )
|
||||||
{
|
{
|
||||||
db_expression->group_or();
|
db_expression->group_or(*out_stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
@@ -170,9 +176,9 @@ public:
|
|||||||
|
|
||||||
Finder<ModelClass> & group_and()
|
Finder<ModelClass> & group_and()
|
||||||
{
|
{
|
||||||
if( db_expression )
|
if( db_expression && out_stream )
|
||||||
{
|
{
|
||||||
db_expression->group_and();
|
db_expression->group_and(*out_stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
@@ -181,9 +187,9 @@ public:
|
|||||||
|
|
||||||
Finder<ModelClass> & group_end()
|
Finder<ModelClass> & group_end()
|
||||||
{
|
{
|
||||||
if( db_expression )
|
if( db_expression && out_stream )
|
||||||
{
|
{
|
||||||
db_expression->group_end();
|
db_expression->group_end(*out_stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
@@ -198,7 +204,7 @@ public:
|
|||||||
if( db_expression )
|
if( db_expression )
|
||||||
{
|
{
|
||||||
db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_EQ);
|
db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_EQ);
|
||||||
db_expression->field(field_name, field_value, false, false, false);
|
db_expression->field(*out_stream, field_name, field_value, false, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
@@ -211,7 +217,7 @@ public:
|
|||||||
if( db_expression )
|
if( db_expression )
|
||||||
{
|
{
|
||||||
db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_LT);
|
db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_LT);
|
||||||
db_expression->field(field_name, field_value, false, false, false);
|
db_expression->field(*out_stream, field_name, field_value, false, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
@@ -224,7 +230,7 @@ public:
|
|||||||
if( db_expression )
|
if( db_expression )
|
||||||
{
|
{
|
||||||
db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_GT);
|
db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_GT);
|
||||||
db_expression->field(field_name, field_value, false, false, false);
|
db_expression->field(*out_stream, field_name, field_value, false, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
@@ -237,7 +243,7 @@ public:
|
|||||||
if( db_expression )
|
if( db_expression )
|
||||||
{
|
{
|
||||||
db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_LE);
|
db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_LE);
|
||||||
db_expression->field(field_name, field_value, false, false, false);
|
db_expression->field(*out_stream, field_name, field_value, false, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
@@ -250,13 +256,55 @@ public:
|
|||||||
if( db_expression )
|
if( db_expression )
|
||||||
{
|
{
|
||||||
db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_GE);
|
db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_GE);
|
||||||
db_expression->field(field_name, field_value, false, false, false);
|
db_expression->field(*out_stream, field_name, field_value, false, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void get_list(std::list<ModelClass> & result, bool clear_list = true)
|
||||||
|
{
|
||||||
|
if( clear_list )
|
||||||
|
{
|
||||||
|
result.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
if( model_connector && out_stream )
|
||||||
|
{
|
||||||
|
DbConnector * db_connector = model_connector->get_db_connector();
|
||||||
|
|
||||||
|
if( db_connector )
|
||||||
|
{
|
||||||
|
bool res = db_connector->query_select(*out_stream);
|
||||||
|
|
||||||
|
if( res )
|
||||||
|
{
|
||||||
|
//ModelClass model;
|
||||||
|
//db_connector->map_values_from_query(model);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !res )
|
||||||
|
{
|
||||||
|
// put some log here?
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::list<ModelClass> get_list()
|
||||||
|
{
|
||||||
|
std::list<ModelClass> result;
|
||||||
|
get_list(result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
||||||
|
@@ -40,6 +40,9 @@
|
|||||||
#define MORM_WORK_MODE_MODEL_VALUES 2
|
#define MORM_WORK_MODE_MODEL_VALUES 2
|
||||||
#define MORM_WORK_MODE_MODEL_FIELDS_VALUES 3
|
#define MORM_WORK_MODE_MODEL_FIELDS_VALUES 3
|
||||||
|
|
||||||
|
// IMPROVE ME give me a better name
|
||||||
|
#define MORM_WORK_MODE_MODEL_SELECT_FROM_DB 3
|
||||||
|
|
||||||
//#define MORM_OUTPUT_TYPE_JSON 1
|
//#define MORM_OUTPUT_TYPE_JSON 1
|
||||||
#define MORM_OUTPUT_TYPE_DB_INSERT 2
|
#define MORM_OUTPUT_TYPE_DB_INSERT 2
|
||||||
#define MORM_OUTPUT_TYPE_DB_UPDATE 3
|
#define MORM_OUTPUT_TYPE_DB_UPDATE 3
|
||||||
|
@@ -32,6 +32,9 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// for sleep()
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "postgresqlconnector.h"
|
#include "postgresqlconnector.h"
|
||||||
#include "utf8/utf8.h"
|
#include "utf8/utf8.h"
|
||||||
#include "postgresqlexpression.h"
|
#include "postgresqlexpression.h"
|
||||||
@@ -73,14 +76,14 @@ bool PostgreSQLConnector::query(const char * query_str)
|
|||||||
// if( log_queries )
|
// if( log_queries )
|
||||||
// log << log1 << "Db: executing query: " << q << logend;
|
// log << log1 << "Db: executing query: " << q << logend;
|
||||||
|
|
||||||
last_status = PGRES_EMPTY_QUERY;
|
last_status = PGRES_EMPTY_QUERY; // or something else?
|
||||||
last_result = PQexec(pg_conn, query_str);
|
last_result = PQexec(pg_conn, query_str);
|
||||||
|
|
||||||
if( !last_result )
|
if( !last_result )
|
||||||
{
|
{
|
||||||
if( PQstatus(pg_conn) != CONNECTION_OK )
|
if( PQstatus(pg_conn) != CONNECTION_OK )
|
||||||
{
|
{
|
||||||
//AssertConnection();
|
assert_connection();
|
||||||
last_result = PQexec(pg_conn, query_str);
|
last_result = PQexec(pg_conn, query_str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -99,6 +102,19 @@ return last_result != nullptr;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool PostgreSQLConnector::query(const PT::TextStream & stream)
|
||||||
|
{
|
||||||
|
stream.to_string(query_str);
|
||||||
|
return query(query_str.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool PostgreSQLConnector::query(const std::string & query_str)
|
||||||
|
{
|
||||||
|
return query(query_str.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PostgreSQLConnector::query_select(const char * query_str)
|
bool PostgreSQLConnector::query_select(const char * query_str)
|
||||||
{
|
{
|
||||||
return (query(query_str) && last_status == PGRES_TUPLES_OK);
|
return (query(query_str) && last_status == PGRES_TUPLES_OK);
|
||||||
@@ -115,6 +131,27 @@ bool PostgreSQLConnector::query_insert(const char * query_str)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool PostgreSQLConnector::query_select(const PT::TextStream & stream)
|
||||||
|
{
|
||||||
|
stream.to_string(query_str);
|
||||||
|
return query_select(query_str.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PostgreSQLConnector::query_update(const PT::TextStream & stream)
|
||||||
|
{
|
||||||
|
stream.to_string(query_str);
|
||||||
|
return query_update(query_str.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PostgreSQLConnector::query_insert(const PT::TextStream & stream)
|
||||||
|
{
|
||||||
|
stream.to_string(query_str);
|
||||||
|
return query_insert(query_str.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Error PostgreSQLConnector::DoCommand(const char * command)
|
//Error PostgreSQLConnector::DoCommand(const char * command)
|
||||||
//{
|
//{
|
||||||
// PGresult * r = 0;
|
// PGresult * r = 0;
|
||||||
@@ -137,7 +174,6 @@ bool PostgreSQLConnector::query_insert(const char * query_str)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool PostgreSQLConnector::is_last_result(ExecStatusType t)
|
bool PostgreSQLConnector::is_last_result(ExecStatusType t)
|
||||||
{
|
{
|
||||||
return (last_result && PQresultStatus(last_result) == t);
|
return (last_result && PQresultStatus(last_result) == t);
|
||||||
@@ -145,6 +181,28 @@ bool PostgreSQLConnector::is_last_result(ExecStatusType t)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void PostgreSQLConnector::map_values_from_query(Model & model)
|
||||||
|
{
|
||||||
|
if( db_expression )
|
||||||
|
{
|
||||||
|
db_expression->set_work_mode(MORM_WORK_MODE_MODEL_SELECT_FROM_DB);
|
||||||
|
//db_expression->set_output_type()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int PostgreSQLConnector::get_column_index(const char * column_name)
|
int PostgreSQLConnector::get_column_index(const char * column_name)
|
||||||
{
|
{
|
||||||
int c = PQfnumber(last_result, column_name);
|
int c = PQfnumber(last_result, column_name);
|
||||||
@@ -580,120 +638,160 @@ size_t i = 0;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
//void PostgreSQLConnector::SetConnParam(const std::wstring & database_name, const std::wstring & user, const std::wstring & pass)
|
void PostgreSQLConnector::set_conn_param(const std::wstring & database_name, const std::wstring & user, const std::wstring & pass)
|
||||||
//{
|
{
|
||||||
// db_database = database_name;
|
db_database = database_name;
|
||||||
// db_user = user;
|
db_user = user;
|
||||||
// db_pass = pass;
|
db_pass = pass;
|
||||||
//}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PostgreSQLConnector::overwrite(PT::TextStream & stream)
|
||||||
|
{
|
||||||
|
PT::TextStream::iterator i = stream.begin();
|
||||||
|
|
||||||
|
for( ; i != stream.end() ; ++i)
|
||||||
|
{
|
||||||
|
*i = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
stream.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void PostgreSQLConnector::connect()
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
|
||||||
|
stream.clear();
|
||||||
|
stream << "dbname='";
|
||||||
|
db_expression->esc(db_database, stream);
|
||||||
|
|
||||||
|
stream << "' user='";
|
||||||
|
db_expression->esc(db_user, stream);
|
||||||
|
|
||||||
|
stream << "' password='";
|
||||||
|
db_expression->esc(db_pass, stream);
|
||||||
|
stream << "'";
|
||||||
|
|
||||||
|
std::string str;
|
||||||
|
stream.to_string(str);
|
||||||
|
pg_conn = PQconnectdb(str.c_str());
|
||||||
|
|
||||||
|
overwrite(stream);
|
||||||
|
|
||||||
|
// warning! pg_conn can be not null but there cannnot be a connection established
|
||||||
|
// use PQstatus(pg_conn) to check whether the connection works fine
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
//void PostgreSQLConnector::Connect()
|
|
||||||
//{
|
void PostgreSQLConnector::log_connection_socket()
|
||||||
// Close();
|
{
|
||||||
//
|
//log << log2 << "Db: connection to the database works fine" << logend;
|
||||||
// conn_info.Clear();
|
//log << log3 << "Db: connection socket: " << PQsocket(pg_conn) << logend;
|
||||||
// conn_info.SetExtented(false);
|
|
||||||
//
|
if( pg_conn )
|
||||||
// conn_info << R("dbname=") << db_database
|
{
|
||||||
// << R(" user=") << db_user
|
std::cout << "Db: connection to the database works fine" << std::endl;
|
||||||
// << R(" password=") << db_pass;
|
std::cout << "Db: connection socket: " << PQsocket(pg_conn) << std::endl;
|
||||||
//
|
}
|
||||||
// pg_conn = PQconnectdb(conn_info.CStr());
|
}
|
||||||
//
|
|
||||||
// // warning! pg_conn can be not null but there cannnot be a connection established
|
void PostgreSQLConnector::wait_for_connection()
|
||||||
// // use PQstatus(pg_conn) to check whether the connection works fine
|
{
|
||||||
//}
|
if( !pg_conn || PQstatus(pg_conn) != CONNECTION_OK )
|
||||||
//
|
{
|
||||||
//
|
//log << log3 << "Db: waiting for the db to be ready...." << logend << logsave;
|
||||||
//
|
std::cout << "Db: waiting for the db to be ready...." << std::endl;
|
||||||
//void PostgreSQLConnector::LogConnectionSocket()
|
|
||||||
//{
|
while( !assert_connection(false, false) )
|
||||||
// log << log2 << "Db: connection to the database works fine" << logend;
|
{
|
||||||
// log << log3 << "Db: connection socket: " << PQsocket(pg_conn) << logend;
|
sleep(5);
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//
|
//LogConnectionSocket();
|
||||||
//
|
}
|
||||||
//void PostgreSQLConnector::WaitForConnection()
|
}
|
||||||
//{
|
|
||||||
// if( !pg_conn || PQstatus(pg_conn) != CONNECTION_OK )
|
|
||||||
// {
|
|
||||||
// log << log3 << "Db: waiting for the db to be ready...." << logend << logsave;
|
void PostgreSQLConnector::close()
|
||||||
//
|
{
|
||||||
// while( !AssertConnection(false, false) )
|
if( pg_conn )
|
||||||
// sleep(5);
|
{
|
||||||
//
|
PQfinish(pg_conn);
|
||||||
// LogConnectionSocket();
|
pg_conn = nullptr;
|
||||||
// }
|
}
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
bool PostgreSQLConnector::assert_connection(bool put_log, bool throw_if_no_connection)
|
||||||
//void PostgreSQLConnector::Close()
|
{
|
||||||
//{
|
bool was_connection = true;
|
||||||
// if( pg_conn )
|
|
||||||
// {
|
|
||||||
// PQfinish(pg_conn);
|
if( !pg_conn )
|
||||||
// pg_conn = 0;
|
{
|
||||||
// }
|
was_connection = false;
|
||||||
//}
|
connect();
|
||||||
//
|
}
|
||||||
//
|
else
|
||||||
//
|
if( PQstatus(pg_conn) != CONNECTION_OK )
|
||||||
//bool PostgreSQLConnector::AssertConnection(bool put_log, bool throw_if_no_connection)
|
{
|
||||||
//{
|
if( put_log )
|
||||||
//bool was_connection = true;
|
{
|
||||||
//
|
//log << log2 << "Db: connection to the database is lost, trying to recover" << logend;
|
||||||
//
|
std::cout << "Db: connection to the database is lost, trying to recover" << std::endl;
|
||||||
// if( !pg_conn )
|
}
|
||||||
// {
|
|
||||||
// was_connection = false;
|
was_connection = false;
|
||||||
// Connect();
|
PQreset(pg_conn);
|
||||||
// }
|
}
|
||||||
// else
|
|
||||||
// if( PQstatus(pg_conn) != CONNECTION_OK )
|
|
||||||
// {
|
if( pg_conn && PQstatus(pg_conn) == CONNECTION_OK )
|
||||||
// if( put_log )
|
{
|
||||||
// log << log2 << "Db: connection to the database is lost, trying to recover" << logend;
|
if( !was_connection )
|
||||||
//
|
{
|
||||||
// was_connection = false;
|
|
||||||
// PQreset(pg_conn);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// if( pg_conn && PQstatus(pg_conn) == CONNECTION_OK )
|
|
||||||
// {
|
|
||||||
// if( !was_connection )
|
|
||||||
// {
|
|
||||||
// if( put_log )
|
// if( put_log )
|
||||||
// LogConnectionSocket();
|
// LogConnectionSocket();
|
||||||
//
|
|
||||||
// SetDbParameters();
|
set_db_parameters();
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// return true;
|
return true;
|
||||||
// }
|
}
|
||||||
// else
|
else
|
||||||
// {
|
{
|
||||||
// if( put_log )
|
if( put_log )
|
||||||
// log << log1 << "Db: connection to db server cannot be established" << logend;
|
{
|
||||||
//
|
//log << log1 << "Db: connection to db server cannot be established" << logend;
|
||||||
// if( throw_if_no_connection )
|
std::cout << "Db: connection to db server cannot be established" << std::endl;
|
||||||
// throw Error(WINIX_ERR_DB_FATAL_ERROR_DURING_CONNECTING);
|
}
|
||||||
//
|
|
||||||
// return false;
|
if( throw_if_no_connection )
|
||||||
// }
|
{
|
||||||
//}
|
//throw Error(WINIX_ERR_DB_FATAL_ERROR_DURING_CONNECTING);
|
||||||
//
|
throw int(10);
|
||||||
//
|
}
|
||||||
//
|
|
||||||
//void PostgreSQLConnector::SetDbParameters()
|
return false;
|
||||||
//{
|
}
|
||||||
// if( PQsetClientEncoding(pg_conn, "UTF8") == -1 )
|
}
|
||||||
// log << log1 << "Db: Can't set the proper client encoding" << logend;
|
|
||||||
//}
|
void PostgreSQLConnector::set_db_parameters()
|
||||||
|
{
|
||||||
|
if( PQsetClientEncoding(pg_conn, "UTF8") == -1 )
|
||||||
|
{
|
||||||
|
//log << log1 << "Db: Can't set the proper client encoding" << logend;
|
||||||
|
std::cout << "Db: Can't set the proper client encoding" << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -52,11 +52,21 @@ public:
|
|||||||
|
|
||||||
void set_log_queries(bool log_queries);
|
void set_log_queries(bool log_queries);
|
||||||
|
|
||||||
|
bool query(const PT::TextStream & stream);
|
||||||
bool query(const char * query_str);
|
bool query(const char * query_str);
|
||||||
|
bool query(const std::string & query_str);
|
||||||
|
|
||||||
bool query_select(const char * query_str);
|
bool query_select(const char * query_str);
|
||||||
bool query_update(const char * query_str);
|
bool query_update(const char * query_str);
|
||||||
bool query_insert(const char * query_str);
|
bool query_insert(const char * query_str);
|
||||||
|
|
||||||
|
bool query_select(const PT::TextStream & stream);
|
||||||
|
bool query_update(const PT::TextStream & stream);
|
||||||
|
bool query_insert(const PT::TextStream & stream);
|
||||||
|
|
||||||
|
void map_values_from_query(Model & model);
|
||||||
|
|
||||||
|
|
||||||
bool is_last_result(ExecStatusType t);
|
bool is_last_result(ExecStatusType t);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -81,12 +91,14 @@ public:
|
|||||||
|
|
||||||
void clear_result();
|
void clear_result();
|
||||||
|
|
||||||
//void SetConnParam(const std::wstring & database, const std::wstring & user, const std::wstring & pass);
|
void set_conn_param(const std::wstring & database, const std::wstring & user, const std::wstring & pass);
|
||||||
//void Connect();
|
void connect();
|
||||||
//void WaitForConnection();
|
void wait_for_connection();
|
||||||
//void Close();
|
void close();
|
||||||
//bool AssertConnection(bool put_log = true, bool throw_if_no_connection = true);
|
bool assert_connection(bool put_log = true, bool throw_if_no_connection = true);
|
||||||
//void SetDbParameters();
|
void set_db_parameters();
|
||||||
|
void log_connection_socket();
|
||||||
|
|
||||||
//PGconn * GetPgConn();
|
//PGconn * GetPgConn();
|
||||||
|
|
||||||
|
|
||||||
@@ -96,6 +108,8 @@ protected:
|
|||||||
PGresult * last_result; // can be null
|
PGresult * last_result; // can be null
|
||||||
ExecStatusType last_status;
|
ExecStatusType last_status;
|
||||||
bool log_queries;
|
bool log_queries;
|
||||||
|
PT::TextStream stream;
|
||||||
|
std::string query_str;
|
||||||
|
|
||||||
std::wstring db_database;
|
std::wstring db_database;
|
||||||
std::wstring db_user;
|
std::wstring db_user;
|
||||||
@@ -104,6 +118,7 @@ protected:
|
|||||||
|
|
||||||
void allocate_default_expression();
|
void allocate_default_expression();
|
||||||
|
|
||||||
|
void overwrite(PT::TextStream & stream);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -43,6 +43,9 @@ namespace morm
|
|||||||
|
|
||||||
class PostgreSQLExpression : public DbExpression
|
class PostgreSQLExpression : public DbExpression
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
void esc(char val, PT::TextStream & stream);
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -65,7 +68,6 @@ private:
|
|||||||
void after_field_value_string();
|
void after_field_value_string();
|
||||||
|
|
||||||
|
|
||||||
void esc(char val, PT::TextStream & stream);
|
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user