#At bzr+ssh://ahristov@stripped/bzrroot/public/connector-cpp-bzr/trunk/
199 andrey.hristov@stripped 2008-11-03
Move usage of mysql_util to the source files.
Hide logger member variables from the public, therefore pass them to the constructors
modified:
driver/mysql_connection.cpp
driver/mysql_connection.h
driver/mysql_constructed_resultset.cpp
driver/mysql_constructed_resultset.h
driver/mysql_cset_metadata.cpp
driver/mysql_cset_metadata.h
driver/mysql_debug.cpp
driver/mysql_debug.h
driver/mysql_metadata.cpp
driver/mysql_metadata.h
driver/mysql_prepared_statement.cpp
driver/mysql_prepared_statement.h
driver/mysql_ps_resultset.cpp
driver/mysql_ps_resultset.h
driver/mysql_ps_resultset_metadata.cpp
driver/mysql_ps_resultset_metadata.h
driver/mysql_resultset.cpp
driver/mysql_resultset.h
driver/mysql_resultset_metadata.cpp
driver/mysql_resultset_metadata.h
driver/mysql_statement.cpp
driver/mysql_statement.h
=== modified file 'driver/mysql_connection.cpp'
--- a/driver/mysql_connection.cpp 2008-11-03 16:22:53 +0000
+++ b/driver/mysql_connection.cpp 2008-11-03 17:38:56 +0000
@@ -38,6 +38,7 @@
#include "common/ccppTypes.h"
#include "mysql_debug.h"
+#include "mysql_util.h"
namespace sql
{
@@ -82,9 +83,8 @@ MySQL_Connection::MySQL_Connection(const
std::string socket;
uint port = 3306;
-// logger = new MySQL_DebugLogger(); /* should be before CPP_ENTER */
+ logger = new sql::mysql::util::my_shared_ptr< MySQL_DebugLogger >(new MySQL_DebugLogger()); /* should be before CPP_ENTER */
-// ppp = new MySQL_DebugLogger();
CPP_ENTER("MySQL_Connection::MySQL_Connection");
if (!(mysql = mysql_init(NULL))) {
@@ -132,7 +132,7 @@ MySQL_Connection::MySQL_Connection(const
sql_mode = getSessionVariable("SQL_MODE");
- metadata = new MySQL_ConnectionMetaData(this);
+ metadata = new MySQL_ConnectionMetaData(this, this->logger);
}
/* }}} */
@@ -209,7 +209,7 @@ sql::Statement * MySQL_Connection::creat
{
CPP_ENTER("MySQL_Connection::createStatement");
checkClosed();
- return new MySQL_Statement(this);
+ return new MySQL_Statement(this, logger->getReference());
}
/* }}} */
=== modified file 'driver/mysql_connection.h'
--- a/driver/mysql_connection.h 2008-11-03 16:22:53 +0000
+++ b/driver/mysql_connection.h 2008-11-03 17:38:56 +0000
@@ -24,7 +24,6 @@
#include <cppconn/connection.h>
#include <list>
-#include "mysql_util.h"
struct st_mysql;
@@ -34,6 +33,8 @@ namespace sql
namespace mysql
{
+namespace util {template<class T> class my_shared_ptr; }; // forward declaration.
+
class MySQL_Savepoint : public sql::Savepoint
{
std::string name;
@@ -129,10 +130,9 @@ public:
std::string getSessionVariable(const std::string & varname);
+protected:
sql::mysql::util::my_shared_ptr< MySQL_DebugLogger > * logger;
- std::auto_ptr <int *> test;
- std::auto_ptr< MySQL_DebugLogger > ppp;
-private:
+
sql::DatabaseMetaData * metadata;
bool closed;
=== modified file 'driver/mysql_constructed_resultset.cpp'
--- a/driver/mysql_constructed_resultset.cpp 2008-11-03 16:22:53 +0000
+++ b/driver/mysql_constructed_resultset.cpp 2008-11-03 17:38:56 +0000
@@ -72,7 +72,7 @@ MySQL_ConstructedResultSet::MySQL_Constr
field_index_to_name_map[idx] = std::string(tmp);
free(tmp);
}
- metadata = new MySQL_ConstructedResultSetMetaData(this);
+ metadata = new MySQL_ConstructedResultSetMetaData(this, logger);
}
/* }}} */
=== modified file 'driver/mysql_constructed_resultset.h'
--- a/driver/mysql_constructed_resultset.h 2008-11-03 16:22:53 +0000
+++ b/driver/mysql_constructed_resultset.h 2008-11-03 17:38:56 +0000
@@ -26,12 +26,13 @@
#include "mysql_res_wrapper.h"
#include "mysql_private_iface.h"
-#include "mysql_util.h"
namespace sql
{
namespace mysql
{
+namespace util {template<class T> class my_shared_ptr; }; // forward declaration.
+
class MySQL_ConstructedResultSetMetaData;
class MySQL_DebugLogger;
@@ -167,7 +168,7 @@ public:
bool is_closed;
MySQL_ConstructedResultSetMetaData * metadata;
-public:
+protected:
sql::mysql::util::my_shared_ptr< MySQL_DebugLogger > * logger;
private:
=== modified file 'driver/mysql_cset_metadata.cpp'
--- a/driver/mysql_cset_metadata.cpp 2008-10-28 20:04:19 +0000
+++ b/driver/mysql_cset_metadata.cpp 2008-11-03 17:38:56 +0000
@@ -27,6 +27,7 @@
#include "mysql_cset_metadata.h"
#include "mysql_debug.h"
+#include "mysql_util.h"
namespace sql
{
@@ -34,10 +35,10 @@ namespace mysql
{
/* {{{ MySQL_ConstructedResultSetMetaData::MySQL_ConstructedResultSetMetaData() -I- */
-MySQL_ConstructedResultSetMetaData::MySQL_ConstructedResultSetMetaData(const MySQL_ConstructedResultSet * p)
- : parent(p), logger(p->logger->getReference())
+MySQL_ConstructedResultSetMetaData::MySQL_ConstructedResultSetMetaData(const MySQL_ConstructedResultSet * p,
+ sql::mysql::util::my_shared_ptr< MySQL_DebugLogger > * l)
+ : parent(p), logger(l->getReference())
{
-
}
/* }}} */
=== modified file 'driver/mysql_cset_metadata.h'
--- a/driver/mysql_cset_metadata.h 2008-11-03 16:22:53 +0000
+++ b/driver/mysql_cset_metadata.h 2008-11-03 17:38:56 +0000
@@ -25,13 +25,12 @@
#include <cppconn/resultset.h>
#include <cppconn/resultset_metadata.h>
#include "mysql_private_iface.h"
-#include "mysql_util.h"
namespace sql
{
namespace mysql
{
-
+namespace util {template<class T> class my_shared_ptr; }; // forward declaration.
class MySQL_DebugLogger;
class MySQL_ConstructedResultSetMetaData : public sql::ResultSetMetaData
@@ -39,7 +38,7 @@ class MySQL_ConstructedResultSetMetaData
const MySQL_ConstructedResultSet * parent;
sql::mysql::util::my_shared_ptr< MySQL_DebugLogger > * logger;
public:
- MySQL_ConstructedResultSetMetaData(const MySQL_ConstructedResultSet * p);
+ MySQL_ConstructedResultSetMetaData(const MySQL_ConstructedResultSet * p, sql::mysql::util::my_shared_ptr< MySQL_DebugLogger > * l);
virtual ~MySQL_ConstructedResultSetMetaData();
std::string getCatalogName(unsigned int columnIndex) const;
=== modified file 'driver/mysql_debug.cpp'
--- a/driver/mysql_debug.cpp 2008-11-03 16:22:53 +0000
+++ b/driver/mysql_debug.cpp 2008-11-03 17:38:56 +0000
@@ -33,7 +33,8 @@ namespace mysql
/* {{{ MySQL_DebugEnterEvent::MySQL_DebugEnterEvent() -I- */
MySQL_DebugEnterEvent::MySQL_DebugEnterEvent(unsigned int l, const char * const f,
- const char * const func_name, sql::mysql::util::my_shared_ptr< MySQL_DebugLogger > * logger_object)
+ const char * const func_name,
+ sql::mysql::util::my_shared_ptr< MySQL_DebugLogger > * logger_object)
: line(l), file(f), func(func_name), logger(logger_object->getReference())
{
logger->get()->enter(this);
=== modified file 'driver/mysql_debug.h'
--- a/driver/mysql_debug.h 2008-11-03 16:22:53 +0000
+++ b/driver/mysql_debug.h 2008-11-03 17:38:56 +0000
@@ -23,7 +23,7 @@
#define _MYSQL_DEBUG_H_
#if CPPCONN_TRACE_ENABLED
-#define CPP_ENTER(msg) MySQL_DebugEnterEvent __this_func(__LINE__, __FILE__, msg, logger->getReference())
+#define CPP_ENTER(msg) MySQL_DebugEnterEvent __this_func(__LINE__, __FILE__, msg, logger)
#define CPP_INFO(msg) this->logger->get()->log("INF", msg)
#define CPP_INFO_FMT(...) this->logger->get()->log_va("INF", __VA_ARGS__)
#define CPP_ERR(msg) this->logger->get()->log("ERR", msg)
=== modified file 'driver/mysql_metadata.cpp'
--- a/driver/mysql_metadata.cpp 2008-10-28 20:04:19 +0000
+++ b/driver/mysql_metadata.cpp 2008-11-03 17:38:56 +0000
@@ -35,6 +35,7 @@
#endif // _WIN32
#include "mysql_debug.h"
+#include "mysql_util.h"
namespace sql
{
@@ -853,8 +854,8 @@ static inline char * my_i_to_a(char * bu
/* {{{ MySQL_ConnectionMetaData::MySQL_ConnectionMetaData() -I- */
-MySQL_ConnectionMetaData::MySQL_ConnectionMetaData(MySQL_Connection *conn)
- : connection(conn), logger(conn->logger->getReference())
+MySQL_ConnectionMetaData::MySQL_ConnectionMetaData(MySQL_Connection * conn, sql::mysql::util::my_shared_ptr< MySQL_DebugLogger > * l)
+ : connection(conn), logger(l->getReference())
{
CPP_ENTER("MySQL_ConnectionMetaData::MySQL_ConnectionMetaData");
server_version = mysql_get_server_version(connection->getMySQLHandle());
@@ -956,7 +957,8 @@ MySQL_ConnectionMetaData::getSchemaObjec
}
// XXX:
- std::auto_ptr<sql::ResultSet> native_rs(std::auto_ptr<sql::Statement>(new MySQL_Statement(connection))->executeQuery(query));
+ std::auto_ptr<sql::Statement> stmt1(connection->createStatement());
+ std::auto_ptr<sql::ResultSet> native_rs(stmt1->executeQuery(query));
int objtype_field_index = native_rs->findColumn("OBJECT_TYPE");
int catalog_field_index = native_rs->findColumn("CATALOG");
@@ -977,8 +979,8 @@ MySQL_ConnectionMetaData::getSchemaObjec
" FROM information_schema.triggers ")
.append(triggers_where_clause);
- std::auto_ptr<sql::ResultSet> trigger_ddl_rs(std::auto_ptr<sql::Statement>(
- new MySQL_Statement(connection))->executeQuery(trigger_ddl_query));
+ std::auto_ptr<sql::Statement> stmt2(connection->createStatement());
+ std::auto_ptr<sql::ResultSet> trigger_ddl_rs(stmt2->executeQuery(trigger_ddl_query));
// trigger specific fields: exclusion from the rule - 'show create trigger' is not supported by verions below 5.1.21
// reproducing ddl based on metadata
@@ -1061,7 +1063,8 @@ MySQL_ConnectionMetaData::getSchemaObjec
ddl.append(it->second);
}
} else {
- std::auto_ptr<sql::ResultSet> sql_rs(std::auto_ptr<sql::Statement>(new MySQL_Statement(connection))->executeQuery(ddl_query));
+ std::auto_ptr<sql::Statement> stmt3(connection->createStatement());
+ std::auto_ptr<sql::ResultSet> sql_rs(stmt3->executeQuery(ddl_query));
sql_rs->next();
=== modified file 'driver/mysql_metadata.h'
--- a/driver/mysql_metadata.h 2008-11-03 16:22:53 +0000
+++ b/driver/mysql_metadata.h 2008-11-03 17:38:56 +0000
@@ -23,7 +23,6 @@
#define _MYSQL_METADATA_H_
#include <cppconn/metadata.h>
-#include "mysql_util.h"
namespace sql
{
@@ -34,17 +33,17 @@ namespace mysql
class MySQL_Connection;
class MySQL_DebugLogger;
-template<typename T> class my_shared_ptr; /* forward declaration */
+namespace util {template<class T> class my_shared_ptr; }; // forward declaration.
class MySQL_ConnectionMetaData : public sql::DatabaseMetaData
{
- MySQL_Connection *connection;
+ MySQL_Connection * connection;
unsigned long server_version;
sql::mysql::util::my_shared_ptr< MySQL_DebugLogger > * logger;
std::string lower_case_table_names;
public:
- MySQL_ConnectionMetaData(MySQL_Connection * conn);
+ MySQL_ConnectionMetaData(MySQL_Connection * conn, sql::mysql::util::my_shared_ptr< MySQL_DebugLogger > * l);
virtual ~MySQL_ConnectionMetaData();
=== modified file 'driver/mysql_prepared_statement.cpp'
--- a/driver/mysql_prepared_statement.cpp 2008-11-03 16:22:53 +0000
+++ b/driver/mysql_prepared_statement.cpp 2008-11-03 17:38:56 +0000
@@ -33,6 +33,7 @@
#define mysql_stmt_conn(s) (s)->mysql
#include "mysql_debug.h"
+#include "mysql_util.h"
namespace sql
=== modified file 'driver/mysql_prepared_statement.h'
--- a/driver/mysql_prepared_statement.h 2008-11-03 16:22:53 +0000
+++ b/driver/mysql_prepared_statement.h 2008-11-03 17:38:56 +0000
@@ -26,13 +26,13 @@
#include <cppconn/parameter_metadata.h>
#include "mysql_private_iface.h"
-//#include "mysql_util.h"
namespace sql
{
namespace mysql
{
+namespace util {template<class T> class my_shared_ptr; }; // forward declaration.
class MySQL_DebugLogger;
class MySQL_Prepared_Statement : public sql::PreparedStatement
=== modified file 'driver/mysql_ps_resultset.cpp'
--- a/driver/mysql_ps_resultset.cpp 2008-11-03 16:22:53 +0000
+++ b/driver/mysql_ps_resultset.cpp 2008-11-03 17:38:56 +0000
@@ -30,6 +30,7 @@
#endif // _WIN32
#include "mysql_debug.h"
+#include "mysql_util.h"
namespace sql
{
=== modified file 'driver/mysql_ps_resultset.h'
--- a/driver/mysql_ps_resultset.h 2008-11-03 16:22:53 +0000
+++ b/driver/mysql_ps_resultset.h 2008-11-03 17:38:56 +0000
@@ -25,13 +25,12 @@
#include <cppconn/resultset.h>
#include "mysql_private_iface.h"
-#include "mysql_util.h"
namespace sql
{
namespace mysql
{
-
+namespace util {template<class T> class my_shared_ptr; }; // forward declaration.
class MySQL_Prepared_Statement;
class MySQL_DebugLogger;
class MySQL_Prepared_ResultSetMetaData;
@@ -60,6 +59,8 @@ private:
MySQL_Prepared_ResultSetMetaData * metadata;
+ sql::mysql::util::my_shared_ptr< MySQL_DebugLogger > * logger;
+
protected:
void checkValid() const;
void closeIntern();
@@ -161,8 +162,6 @@ public:
void setFetchSize(size_t rows);
bool wasNull() const;
-
- sql::mysql::util::my_shared_ptr< MySQL_DebugLogger > * logger;
};
}; /* namespace mysql*/
=== modified file 'driver/mysql_ps_resultset_metadata.cpp'
--- a/driver/mysql_ps_resultset_metadata.cpp 2008-11-03 16:22:53 +0000
+++ b/driver/mysql_ps_resultset_metadata.cpp 2008-11-03 17:38:56 +0000
@@ -27,6 +27,7 @@
#include "mysql_ps_resultset_metadata.h"
#include "mysql_debug.h"
+#include "mysql_util.h"
namespace sql
{
=== modified file 'driver/mysql_ps_resultset_metadata.h'
--- a/driver/mysql_ps_resultset_metadata.h 2008-11-03 16:22:53 +0000
+++ b/driver/mysql_ps_resultset_metadata.h 2008-11-03 17:38:56 +0000
@@ -25,13 +25,12 @@
#include <cppconn/resultset.h>
#include <cppconn/resultset_metadata.h>
#include "mysql_private_iface.h"
-#include "mysql_util.h"
namespace sql
{
namespace mysql
{
-
+namespace util {template<class T> class my_shared_ptr; }; // forward declaration.
class MySQL_DebugLogger;
class MySQL_Prepared_ResultSetMetaData : public sql::ResultSetMetaData
@@ -40,7 +39,6 @@ class MySQL_Prepared_ResultSetMetaData :
sql::mysql::util::my_shared_ptr< MySQL_DebugLogger> * logger;
unsigned int num_fields;
-
public:
MySQL_Prepared_ResultSetMetaData(MYSQL_STMT * s, sql::mysql::util::my_shared_ptr< MySQL_DebugLogger> * l);
virtual ~MySQL_Prepared_ResultSetMetaData();
=== modified file 'driver/mysql_resultset.cpp'
--- a/driver/mysql_resultset.cpp 2008-10-28 20:04:19 +0000
+++ b/driver/mysql_resultset.cpp 2008-11-03 17:38:56 +0000
@@ -35,6 +35,7 @@
#endif // _WIN32
#include "mysql_debug.h"
+#include "mysql_util.h"
namespace sql
{
@@ -45,8 +46,8 @@ extern char * cppmysql_utf8_strup(const
/* {{{ MySQL_ResultSet::MySQL_ResultSet() -I- */
-MySQL_ResultSet::MySQL_ResultSet(MYSQL_RES_Wrapper * res, MySQL_Statement * par)
- : row(NULL), result(res), row_position(0), was_null(false), parent(par), logger(par->logger->getReference())
+MySQL_ResultSet::MySQL_ResultSet(MYSQL_RES_Wrapper * res, MySQL_Statement * par, sql::mysql::util::my_shared_ptr< MySQL_DebugLogger > * l)
+ : row(NULL), result(res), row_position(0), was_null(false), parent(par), logger(l->getReference())
{
CPP_ENTER("MySQL_ResultSet::MySQL_ResultSet");
num_rows = mysql_num_rows(result->get());
=== modified file 'driver/mysql_resultset.h'
--- a/driver/mysql_resultset.h 2008-11-03 16:22:53 +0000
+++ b/driver/mysql_resultset.h 2008-11-03 17:38:56 +0000
@@ -26,13 +26,12 @@
#include "mysql_res_wrapper.h"
#include "mysql_private_iface.h"
-#include "mysql_util.h"
namespace sql
{
namespace mysql
{
-
+namespace util {template<class T> class my_shared_ptr; }; // forward declaration.
class MySQL_Statement;
class MySQL_ResultSetMetaData;
class MySQL_DebugLogger;
@@ -55,12 +54,14 @@ class MySQL_ResultSet : public sql::Resu
const MySQL_Statement * parent;
const MySQL_ResultSetMetaData *metadata;
+
+ sql::mysql::util::my_shared_ptr< MySQL_DebugLogger > * logger;
protected:
void checkValid() const;
void seek();
public:
- MySQL_ResultSet(MYSQL_RES_Wrapper * res, MySQL_Statement * par);
+ MySQL_ResultSet(MYSQL_RES_Wrapper * res, MySQL_Statement * par, sql::mysql::util::my_shared_ptr< MySQL_DebugLogger > * l);
virtual ~MySQL_ResultSet();
@@ -157,9 +158,6 @@ public:
void setFetchSize(size_t rows);
bool wasNull() const;
-
- sql::mysql::util::my_shared_ptr< MySQL_DebugLogger > * logger;
-
private:
/* Prevent use of these */
MySQL_ResultSet(const MySQL_ResultSet &);
=== modified file 'driver/mysql_resultset_metadata.cpp'
--- a/driver/mysql_resultset_metadata.cpp 2008-11-03 16:22:53 +0000
+++ b/driver/mysql_resultset_metadata.cpp 2008-11-03 17:38:56 +0000
@@ -27,10 +27,10 @@
#include "mysql_resultset_metadata.h"
#include "mysql_debug.h"
+#include "mysql_util.h"
namespace sql
{
-
namespace mysql
{
=== modified file 'driver/mysql_resultset_metadata.h'
--- a/driver/mysql_resultset_metadata.h 2008-11-03 16:22:53 +0000
+++ b/driver/mysql_resultset_metadata.h 2008-11-03 17:38:56 +0000
@@ -24,13 +24,12 @@
#include <cppconn/resultset_metadata.h>
#include "mysql_res_wrapper.h"
-#include "mysql_util.h"
namespace sql
{
namespace mysql
{
-
+namespace util {template<class T> class my_shared_ptr; }; // forward declaration.
class MySQL_DebugLogger;
class MySQL_ResultSetMetaData : public sql::ResultSetMetaData
=== modified file 'driver/mysql_statement.cpp'
--- a/driver/mysql_statement.cpp 2008-10-30 13:29:42 +0000
+++ b/driver/mysql_statement.cpp 2008-11-03 17:38:56 +0000
@@ -27,6 +27,7 @@
#include "mysql_resultset.h"
#include "mysql_debug.h"
+#include "mysql_util.h"
namespace sql
{
@@ -34,8 +35,8 @@ namespace mysql
{
/* {{{ MySQL_Statement::MySQL_Statement() -I- */
-MySQL_Statement::MySQL_Statement(MySQL_Connection * conn)
- : connection(conn), isClosed(false), last_update_count(-1), logger(conn->logger->getReference())
+MySQL_Statement::MySQL_Statement(MySQL_Connection * conn, sql::mysql::util::my_shared_ptr< MySQL_DebugLogger > * l)
+ : connection(conn), isClosed(false), last_update_count(-1), logger(l->getReference())
{
CPP_ENTER("MySQL_Statement::MySQL_Statement");
CPP_INFO_FMT("this=%p", this);
@@ -131,7 +132,7 @@ MySQL_Statement::executeQuery(const std:
checkClosed();
last_update_count = -1;
do_query(sql.c_str(), static_cast<int>(sql.length()));
- sql::ResultSet *tmp = new MySQL_ResultSet(get_resultset(), this);
+ sql::ResultSet *tmp = new MySQL_ResultSet(get_resultset(), this, logger);
CPP_INFO_FMT("rset=%p", tmp);
return tmp;
}
@@ -196,7 +197,7 @@ MySQL_Statement::getResultSet()
return NULL;
}
- sql::ResultSet * ret = new MySQL_ResultSet(new MYSQL_RES_Wrapper(result), this);
+ sql::ResultSet * ret = new MySQL_ResultSet(new MYSQL_RES_Wrapper(result), this, logger);
CPP_INFO_FMT("res=%p", ret);
return ret;
}
=== modified file 'driver/mysql_statement.h'
--- a/driver/mysql_statement.h 2008-11-03 16:22:53 +0000
+++ b/driver/mysql_statement.h 2008-11-03 17:38:56 +0000
@@ -29,7 +29,7 @@ namespace sql
{
namespace mysql
{
-
+namespace util {template<class T> class my_shared_ptr; }; // forward declaration.
class MySQL_Connection;
class MYSQL_RES_Wrapper;
class MySQL_DebugLogger;
@@ -45,11 +45,13 @@ protected:
unsigned long long last_update_count;
+ sql::mysql::util::my_shared_ptr< MySQL_DebugLogger > * logger;
+
virtual MYSQL_RES_Wrapper * get_resultset();
virtual void checkClosed();
public:
- MySQL_Statement(MySQL_Connection * conn);
+ MySQL_Statement(MySQL_Connection * conn, sql::mysql::util::my_shared_ptr< MySQL_DebugLogger > * l);
~MySQL_Statement();
sql::Connection *getConnection();
@@ -62,7 +64,7 @@ public:
bool execute(const std::string& sql);
- sql::ResultSet *executeQuery(const std::string& sql);
+ sql::ResultSet * executeQuery(const std::string& sql);
int executeUpdate(const std::string& sql);
@@ -76,7 +78,7 @@ public:
unsigned int getQueryTimeout();
- sql::ResultSet *getResultSet();
+ sql::ResultSet * getResultSet();
long long getUpdateCount();
@@ -94,7 +96,6 @@ public:
void setQueryTimeout(unsigned int seconds);
- sql::mysql::util::my_shared_ptr< MySQL_DebugLogger > * logger;
private:
/* Prevent use of these */
MySQL_Statement(const MySQL_Statement &);
| Thread |
|---|
| • bzr commit into connector-cpp-bzr branch (andrey.hristov:199) | andrey.hristov | 3 Nov |