mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-10 09:32:06 +00:00
Better code
This commit is contained in:
parent
eeaab4ba11
commit
715b6f3617
@ -11,29 +11,23 @@
|
|||||||
namespace mysqlxx
|
namespace mysqlxx
|
||||||
{
|
{
|
||||||
|
|
||||||
Query::Query(Connection * conn_, const std::string & query_string) : std::ostream(nullptr), conn(conn_)
|
Query::Query(Connection * conn_, const std::string & query_string) : conn(conn_)
|
||||||
{
|
{
|
||||||
/// Важно в случае, если Query используется не из того же потока, что Connection.
|
/// Важно в случае, если Query используется не из того же потока, что Connection.
|
||||||
mysql_thread_init();
|
mysql_thread_init();
|
||||||
|
|
||||||
init(&query_buf);
|
|
||||||
|
|
||||||
if (!query_string.empty())
|
if (!query_string.empty())
|
||||||
{
|
query_buf << query_string;
|
||||||
query_buf.str(query_string);
|
|
||||||
seekp(0, std::ios::end);
|
|
||||||
}
|
|
||||||
|
|
||||||
imbue(std::locale::classic());
|
query_buf.imbue(std::locale::classic());
|
||||||
}
|
}
|
||||||
|
|
||||||
Query::Query(const Query & other) : std::ostream(nullptr), conn(other.conn)
|
Query::Query(const Query & other) : conn(other.conn)
|
||||||
{
|
{
|
||||||
/// Важно в случае, если Query используется не из того же потока, что Connection.
|
/// Важно в случае, если Query используется не из того же потока, что Connection.
|
||||||
mysql_thread_init();
|
mysql_thread_init();
|
||||||
|
|
||||||
init(&query_buf);
|
query_buf.imbue(std::locale::classic());
|
||||||
imbue(std::locale::classic());
|
|
||||||
|
|
||||||
*this << other.str();
|
*this << other.str();
|
||||||
}
|
}
|
||||||
@ -45,9 +39,7 @@ Query & Query::operator= (const Query & other)
|
|||||||
|
|
||||||
conn = other.conn;
|
conn = other.conn;
|
||||||
|
|
||||||
seekp(0);
|
query_buf.str(other.str());
|
||||||
clear();
|
|
||||||
*this << other.str();
|
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@ -59,9 +51,7 @@ Query::~Query()
|
|||||||
|
|
||||||
void Query::reset()
|
void Query::reset()
|
||||||
{
|
{
|
||||||
seekp(0);
|
query_buf.str({});
|
||||||
clear();
|
|
||||||
query_buf.str("");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Query::executeImpl()
|
void Query::executeImpl()
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <ostream>
|
|
||||||
|
|
||||||
#include <mysqlxx/UseQueryResult.h>
|
#include <mysqlxx/UseQueryResult.h>
|
||||||
#include <mysqlxx/StoreQueryResult.h>
|
#include <mysqlxx/StoreQueryResult.h>
|
||||||
@ -28,7 +27,7 @@ namespace mysqlxx
|
|||||||
*
|
*
|
||||||
* Внимание! Один объект запроса можно использовать только из одного потока.
|
* Внимание! Один объект запроса можно использовать только из одного потока.
|
||||||
*/
|
*/
|
||||||
class Query : public std::ostream
|
class Query
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Query(Connection * conn_, const std::string & query_string = "");
|
Query(Connection * conn_, const std::string & query_string = "");
|
||||||
@ -64,9 +63,21 @@ public:
|
|||||||
return query_buf.str();
|
return query_buf.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto rdbuf() const
|
||||||
|
{
|
||||||
|
return query_buf.rdbuf();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline Query & operator<< (T && x)
|
||||||
|
{
|
||||||
|
query_buf << std::forward<T>(x);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Connection * conn;
|
Connection * conn;
|
||||||
std::stringbuf query_buf;
|
std::ostringstream query_buf;
|
||||||
|
|
||||||
void executeImpl();
|
void executeImpl();
|
||||||
};
|
};
|
||||||
|
@ -22,11 +22,11 @@ class ResultBase
|
|||||||
public:
|
public:
|
||||||
ResultBase(MYSQL_RES * res_, Connection * conn_, const Query * query_);
|
ResultBase(MYSQL_RES * res_, Connection * conn_, const Query * query_);
|
||||||
|
|
||||||
Connection * getConnection() { return conn; }
|
Connection * getConnection() { return conn; }
|
||||||
MYSQL_FIELDS getFields() { return fields; }
|
MYSQL_FIELDS getFields() { return fields; }
|
||||||
unsigned getNumFields() { return num_fields; }
|
unsigned getNumFields() { return num_fields; }
|
||||||
MYSQL_RES * getRes() { return res; }
|
MYSQL_RES * getRes() { return res; }
|
||||||
const Query * getQuery() const { return query; }
|
const Query * getQuery() const { return query; }
|
||||||
|
|
||||||
virtual ~ResultBase();
|
virtual ~ResultBase();
|
||||||
|
|
||||||
|
@ -14,16 +14,16 @@ namespace mysqlxx
|
|||||||
StoreQueryResult::StoreQueryResult(MYSQL_RES * res_, Connection * conn_, const Query * query_) : ResultBase(res_, conn_, query_)
|
StoreQueryResult::StoreQueryResult(MYSQL_RES * res_, Connection * conn_, const Query * query_) : ResultBase(res_, conn_, query_)
|
||||||
{
|
{
|
||||||
UInt64 rows = mysql_num_rows(res);
|
UInt64 rows = mysql_num_rows(res);
|
||||||
UInt32 fields = getNumFields();
|
UInt32 num_fields = getNumFields();
|
||||||
reserve(rows);
|
reserve(rows);
|
||||||
lengths.resize(rows * fields);
|
lengths.resize(rows * num_fields);
|
||||||
|
|
||||||
for (UInt64 i = 0; MYSQL_ROW row = mysql_fetch_row(res); ++i)
|
for (UInt64 i = 0; MYSQL_ROW row = mysql_fetch_row(res); ++i)
|
||||||
{
|
{
|
||||||
MYSQL_LENGTHS lengths_for_row = mysql_fetch_lengths(res);
|
MYSQL_LENGTHS lengths_for_row = mysql_fetch_lengths(res);
|
||||||
memcpy(&lengths[i * fields], lengths_for_row, sizeof(lengths[0]) * fields);
|
memcpy(&lengths[i * num_fields], lengths_for_row, sizeof(lengths[0]) * num_fields);
|
||||||
|
|
||||||
push_back(Row(row, this, &lengths[i * fields]));
|
push_back(Row(row, this, &lengths[i * num_fields]));
|
||||||
}
|
}
|
||||||
checkError(conn->getDriver());
|
checkError(conn->getDriver());
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user