From acbab22bb29e9557284b9da2293da4288e7f2475 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Wed, 9 Mar 2011 20:11:29 +0000 Subject: [PATCH] mysqlxx: development. --- libs/libmysqlxx/include/mysqlxx/Connection.h | 2 +- libs/libmysqlxx/include/mysqlxx/Exception.h | 10 +++---- libs/libmysqlxx/include/mysqlxx/Manip.h | 28 +++++++++++++++++++ libs/libmysqlxx/include/mysqlxx/Query.h | 4 +-- libs/libmysqlxx/include/mysqlxx/ResultBase.h | 10 +++---- libs/libmysqlxx/include/mysqlxx/Row.h | 8 +++--- .../include/mysqlxx/StoreQueryResult.h | 2 +- .../include/mysqlxx/UseQueryResult.h | 2 +- libs/libmysqlxx/src/Connection.cpp | 6 ++-- libs/libmysqlxx/src/Query.cpp | 20 ++++++------- libs/libmysqlxx/src/ResultBase.cpp | 6 ++-- libs/libmysqlxx/src/StoreQueryResult.cpp | 6 ++-- libs/libmysqlxx/src/UseQueryResult.cpp | 6 ++-- 13 files changed, 69 insertions(+), 41 deletions(-) diff --git a/libs/libmysqlxx/include/mysqlxx/Connection.h b/libs/libmysqlxx/include/mysqlxx/Connection.h index 0c91c94433f..b5d972d6683 100644 --- a/libs/libmysqlxx/include/mysqlxx/Connection.h +++ b/libs/libmysqlxx/include/mysqlxx/Connection.h @@ -49,7 +49,7 @@ public: void disconnect(); bool ping(); Query query(const std::string & str = ""); - MYSQL & getDriver(); + MYSQL * getDriver(); private: MYSQL driver; diff --git a/libs/libmysqlxx/include/mysqlxx/Exception.h b/libs/libmysqlxx/include/mysqlxx/Exception.h index 83788474576..23617fc10a4 100644 --- a/libs/libmysqlxx/include/mysqlxx/Exception.h +++ b/libs/libmysqlxx/include/mysqlxx/Exception.h @@ -26,17 +26,17 @@ struct BadQuery : public Exception }; -inline void checkError(MYSQL & driver) +inline void checkError(MYSQL * driver) { - unsigned num = mysql_errno(&driver); + unsigned num = mysql_errno(driver); if (num) - throw Exception(mysql_error(&driver), num); + throw Exception(mysql_error(driver), num); } -inline void onError(MYSQL & driver) +inline void onError(MYSQL * driver) { - throw Exception(mysql_error(&driver), mysql_errno(&driver)); + throw Exception(mysql_error(driver), mysql_errno(driver)); } } diff --git a/libs/libmysqlxx/include/mysqlxx/Manip.h b/libs/libmysqlxx/include/mysqlxx/Manip.h index 4e2b21f6c11..ddb56eb29b2 100644 --- a/libs/libmysqlxx/include/mysqlxx/Manip.h +++ b/libs/libmysqlxx/include/mysqlxx/Manip.h @@ -4,6 +4,7 @@ #include #include #include +#include namespace mysqlxx @@ -80,6 +81,33 @@ struct EscapeManipResult return ostr << value; } + + std::ostream & operator<< (const String & string) + { + writeEscapedData(string.data(), string.size()); + return ostr; + } + + + std::ostream & operator<< (const Row & row) + { + for (size_t i = 0; i < row.size(); ++i) + { + if (i != 0) + ostr << '\t'; + + if (row[i].isNull()) + { + ostr << "\\N"; + continue; + } + + (*this) << row[i]; + } + + return ostr; + } + private: void writeEscapedData(const char * data, size_t length) diff --git a/libs/libmysqlxx/include/mysqlxx/Query.h b/libs/libmysqlxx/include/mysqlxx/Query.h index 82a21ad757e..a4539765d0d 100644 --- a/libs/libmysqlxx/include/mysqlxx/Query.h +++ b/libs/libmysqlxx/include/mysqlxx/Query.h @@ -13,7 +13,7 @@ namespace mysqlxx class Query { public: - Query(Connection & conn_, const std::string & query_string); + Query(Connection * conn_, const std::string & query_string); Query(const Query & other); Query & operator= (const Query & other); @@ -45,7 +45,7 @@ public: } private: - Connection & conn; + Connection * conn; std::stringstream query_stream; }; diff --git a/libs/libmysqlxx/include/mysqlxx/ResultBase.h b/libs/libmysqlxx/include/mysqlxx/ResultBase.h index aa498c61778..975c57e53a7 100644 --- a/libs/libmysqlxx/include/mysqlxx/ResultBase.h +++ b/libs/libmysqlxx/include/mysqlxx/ResultBase.h @@ -14,18 +14,18 @@ class Connection; class ResultBase { public: - ResultBase(MYSQL_RES & res_, Connection & conn_); + ResultBase(MYSQL_RES * res_, Connection * conn_); - Connection & getConnection() { return conn; } + Connection * getConnection() { return conn; } MYSQL_FIELDS getFields() { return fields; } unsigned getNumFields() { return num_fields; } - MYSQL_RES & getRes() { return res; } + MYSQL_RES * getRes() { return res; } virtual ~ResultBase() {} protected: - MYSQL_RES & res; - Connection & conn; + MYSQL_RES * res; + Connection * conn; MYSQL_FIELDS fields; unsigned num_fields; }; diff --git a/libs/libmysqlxx/include/mysqlxx/Row.h b/libs/libmysqlxx/include/mysqlxx/Row.h index 11ea6e72554..b95d6b8af7f 100644 --- a/libs/libmysqlxx/include/mysqlxx/Row.h +++ b/libs/libmysqlxx/include/mysqlxx/Row.h @@ -5,7 +5,6 @@ #include #include -#include namespace mysqlxx { @@ -29,18 +28,16 @@ public: Row(MYSQL_ROW row_, ResultBase * res_) : row(row_), res(res_) { - lengths = mysql_fetch_lengths(&res->getRes()); + lengths = mysql_fetch_lengths(res->getRes()); } String operator[] (int n) const { - std::cerr << lengths[0] << std::endl; return String(row[n], lengths[n]); } String operator[] (const char * name) const { - std::cerr << "???" << std::endl; unsigned n = res->getNumFields(); MYSQL_FIELDS fields = res->getFields(); @@ -56,6 +53,9 @@ public: return operator[](n); } + size_t size() const { return res->getNumFields(); } + bool empty() const { return row == NULL; } + operator private_bool_type() const { return row == NULL ? NULL : &Row::row; } private: diff --git a/libs/libmysqlxx/include/mysqlxx/StoreQueryResult.h b/libs/libmysqlxx/include/mysqlxx/StoreQueryResult.h index 83df6d2d1c7..11cab5f800f 100644 --- a/libs/libmysqlxx/include/mysqlxx/StoreQueryResult.h +++ b/libs/libmysqlxx/include/mysqlxx/StoreQueryResult.h @@ -15,7 +15,7 @@ class Connection; class StoreQueryResult : public std::vector, public ResultBase { public: - StoreQueryResult(MYSQL_RES & res_, Connection & conn_); + StoreQueryResult(MYSQL_RES * res_, Connection * conn_); size_t num_rows() const { return size(); } }; diff --git a/libs/libmysqlxx/include/mysqlxx/UseQueryResult.h b/libs/libmysqlxx/include/mysqlxx/UseQueryResult.h index d927c726d9c..f03bbe6cd03 100644 --- a/libs/libmysqlxx/include/mysqlxx/UseQueryResult.h +++ b/libs/libmysqlxx/include/mysqlxx/UseQueryResult.h @@ -13,7 +13,7 @@ class Connection; class UseQueryResult : public ResultBase { public: - UseQueryResult(MYSQL_RES & res_, Connection & conn_); + UseQueryResult(MYSQL_RES * res_, Connection * conn_); Row fetch_row(); }; diff --git a/libs/libmysqlxx/src/Connection.cpp b/libs/libmysqlxx/src/Connection.cpp index 625f9cc7c58..ff361ef338e 100644 --- a/libs/libmysqlxx/src/Connection.cpp +++ b/libs/libmysqlxx/src/Connection.cpp @@ -66,12 +66,12 @@ bool Connection::ping() Query Connection::query(const std::string & str) { - return Query(*this, str); + return Query(this, str); } -MYSQL & Connection::getDriver() +MYSQL * Connection::getDriver() { - return driver; + return &driver; } } diff --git a/libs/libmysqlxx/src/Query.cpp b/libs/libmysqlxx/src/Query.cpp index eed8f3aaf66..38f2cb72e66 100644 --- a/libs/libmysqlxx/src/Query.cpp +++ b/libs/libmysqlxx/src/Query.cpp @@ -5,7 +5,7 @@ namespace mysqlxx { -Query::Query(Connection & conn_, const std::string & query_string) : conn(conn_) +Query::Query(Connection * conn_, const std::string & query_string) : conn(conn_) { query_stream << query_string; } @@ -29,33 +29,33 @@ void Query::reset() void Query::execute() { std::string query_string = query_stream.str(); - if (mysql_real_query(&conn.getDriver(), query_string.data(), query_string.size())) - throw BadQuery(mysql_error(&conn.getDriver()), mysql_errno(&conn.getDriver())); + if (mysql_real_query(conn->getDriver(), query_string.data(), query_string.size())) + throw BadQuery(mysql_error(conn->getDriver()), mysql_errno(conn->getDriver())); } UseQueryResult Query::use() { execute(); - MYSQL_RES * res = mysql_use_result(&conn.getDriver()); + MYSQL_RES * res = mysql_use_result(conn->getDriver()); if (!res) - onError(conn.getDriver()); + onError(conn->getDriver()); - return UseQueryResult(*res, conn); + return UseQueryResult(res, conn); } StoreQueryResult Query::store() { execute(); - MYSQL_RES * res = mysql_store_result(&conn.getDriver()); + MYSQL_RES * res = mysql_store_result(conn->getDriver()); if (!res) - checkError(conn.getDriver()); + checkError(conn->getDriver()); - return StoreQueryResult(*res, conn); + return StoreQueryResult(res, conn); } UInt64 Query::insertID() { - return mysql_insert_id(&conn.getDriver()); + return mysql_insert_id(conn->getDriver()); } } diff --git a/libs/libmysqlxx/src/ResultBase.cpp b/libs/libmysqlxx/src/ResultBase.cpp index 55cbe508a86..0ef749dda93 100644 --- a/libs/libmysqlxx/src/ResultBase.cpp +++ b/libs/libmysqlxx/src/ResultBase.cpp @@ -5,10 +5,10 @@ namespace mysqlxx { -ResultBase::ResultBase(MYSQL_RES & res_, Connection & conn_) : res(res_), conn(conn_) +ResultBase::ResultBase(MYSQL_RES * res_, Connection * conn_) : res(res_), conn(conn_) { - fields = mysql_fetch_fields(&res); - num_fields = mysql_num_fields(&res); + fields = mysql_fetch_fields(res); + num_fields = mysql_num_fields(res); std::cerr << num_fields << std::endl; std::cerr << fields[0].name << std::endl; diff --git a/libs/libmysqlxx/src/StoreQueryResult.cpp b/libs/libmysqlxx/src/StoreQueryResult.cpp index c0ab2ffe85a..f8b7b92274f 100644 --- a/libs/libmysqlxx/src/StoreQueryResult.cpp +++ b/libs/libmysqlxx/src/StoreQueryResult.cpp @@ -5,11 +5,11 @@ namespace mysqlxx { -StoreQueryResult::StoreQueryResult(MYSQL_RES & res_, Connection & conn_) : ResultBase(res_, conn_) +StoreQueryResult::StoreQueryResult(MYSQL_RES * res_, Connection * conn_) : ResultBase(res_, conn_) { - while (MYSQL_ROW row = mysql_fetch_row(&res)) + while (MYSQL_ROW row = mysql_fetch_row(res)) push_back(Row(row, this)); - checkError(conn.getDriver()); + checkError(conn->getDriver()); } } diff --git a/libs/libmysqlxx/src/UseQueryResult.cpp b/libs/libmysqlxx/src/UseQueryResult.cpp index cec3ca05e33..14fe1e76256 100644 --- a/libs/libmysqlxx/src/UseQueryResult.cpp +++ b/libs/libmysqlxx/src/UseQueryResult.cpp @@ -5,15 +5,15 @@ namespace mysqlxx { -UseQueryResult::UseQueryResult(MYSQL_RES & res_, Connection & conn_) : ResultBase(res_, conn_) +UseQueryResult::UseQueryResult(MYSQL_RES * res_, Connection * conn_) : ResultBase(res_, conn_) { } Row UseQueryResult::fetch_row() { - MYSQL_ROW row = mysql_fetch_row(&res); + MYSQL_ROW row = mysql_fetch_row(res); if (!row) - checkError(conn.getDriver()); + checkError(conn->getDriver()); return Row(row, this); }