From 4ea19dd03241a940a4194ac3bdea89bf7cca8f42 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 26 Aug 2011 13:40:20 +0200 Subject: Add support for specifying client character set for MySQL database --- odb/mysql/connection.cxx | 5 +++++ odb/mysql/database.cxx | 16 ++++++++++++++-- odb/mysql/database.hxx | 13 +++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/odb/mysql/connection.cxx b/odb/mysql/connection.cxx index b783f69..f8e88a0 100644 --- a/odb/mysql/connection.cxx +++ b/odb/mysql/connection.cxx @@ -32,6 +32,11 @@ namespace odb if (mysql_init (handle_) == 0) throw bad_alloc (); + if (*db_.charset () != '\0') + // Can only fail if we pass an unknown option. + // + mysql_options (handle_, MYSQL_SET_CHARSET_NAME, db_.charset ()); + // Force the CLIENT_FOUND_ROWS flag so that UPDATE returns the // number of found rows, not the number of changed rows. This // is necessary to distinguish between the object-not-persistent diff --git a/odb/mysql/database.cxx b/odb/mysql/database.cxx index d37351f..8ee072c 100644 --- a/odb/mysql/database.cxx +++ b/odb/mysql/database.cxx @@ -30,6 +30,7 @@ namespace odb const char* host, unsigned int port, const char* socket, + const char* charset, unsigned long client_flags, auto_ptr factory) : user_ (user ? user : ""), @@ -40,6 +41,7 @@ namespace odb port_ (port), socket_str_ (socket ? socket : ""), socket_ (socket ? socket_str_.c_str () : 0), + charset_ (charset == 0 ? "" : charset), client_flags_ (client_flags), factory_ (factory) { @@ -56,6 +58,7 @@ namespace odb const string& host, unsigned int port, const string* socket, + const string& charset, unsigned long client_flags, auto_ptr factory) : user_ (user), @@ -66,6 +69,7 @@ namespace odb port_ (port), socket_str_ (socket ? *socket : ""), socket_ (socket ? socket_str_.c_str () : 0), + charset_ (charset), client_flags_ (client_flags), factory_ (factory) { @@ -82,6 +86,7 @@ namespace odb const string& host, unsigned int port, const string* socket, + const string& charset, unsigned long client_flags, auto_ptr factory) : user_ (user), @@ -92,6 +97,7 @@ namespace odb port_ (port), socket_str_ (socket ? *socket : ""), socket_ (socket ? socket_str_.c_str () : 0), + charset_ (charset), client_flags_ (client_flags), factory_ (factory) { @@ -108,6 +114,7 @@ namespace odb const string& host, unsigned int port, const string& socket, + const string& charset, unsigned long client_flags, auto_ptr factory) : user_ (user), @@ -118,6 +125,7 @@ namespace odb port_ (port), socket_str_ (socket), socket_ (socket_str_.c_str ()), + charset_ (charset), client_flags_ (client_flags), factory_ (factory) { @@ -134,6 +142,7 @@ namespace odb const string& host, unsigned int port, const string& socket, + const string& charset, unsigned long client_flags, auto_ptr factory) : user_ (user), @@ -144,6 +153,7 @@ namespace odb port_ (port), socket_str_ (socket), socket_ (socket_str_.c_str ()), + charset_ (charset), client_flags_ (client_flags), factory_ (factory) { @@ -157,10 +167,12 @@ namespace odb database (int& argc, char* argv[], bool erase, + const string& charset, unsigned long client_flags, - std::auto_ptr factory) + auto_ptr factory) : passwd_ (0), socket_ (0), + charset_ (charset), client_flags_ (client_flags), factory_ (factory) { @@ -203,7 +215,7 @@ namespace odb } void database:: - print_usage (std::ostream& os) + print_usage (ostream& os) { details::options::print_usage (os); } diff --git a/odb/mysql/database.hxx b/odb/mysql/database.hxx index ba4ee80..be9bb58 100644 --- a/odb/mysql/database.hxx +++ b/odb/mysql/database.hxx @@ -42,6 +42,7 @@ namespace odb const char* host = 0, unsigned int port = 0, const char* socket = 0, + const char* charset = 0, unsigned long client_flags = 0, std::auto_ptr = std::auto_ptr (0)); @@ -52,6 +53,7 @@ namespace odb const std::string& host = "", unsigned int port = 0, const std::string* socket = 0, + const std::string& charset = "", unsigned long client_flags = 0, std::auto_ptr = std::auto_ptr (0)); @@ -62,6 +64,7 @@ namespace odb const std::string& host = "", unsigned int port = 0, const std::string* socket = 0, + const std::string& charset = "", unsigned long client_flags = 0, std::auto_ptr = std::auto_ptr (0)); @@ -72,6 +75,7 @@ namespace odb const std::string& host, unsigned int port, const std::string& socket, + const std::string& charset = "", unsigned long client_flags = 0, std::auto_ptr = std::auto_ptr (0)); @@ -82,6 +86,7 @@ namespace odb const std::string& host, unsigned int port, const std::string& socket, + const std::string& charset = "", unsigned long client_flags = 0, std::auto_ptr = std::auto_ptr (0)); @@ -105,6 +110,7 @@ namespace odb database (int& argc, char* argv[], bool erase = false, + const std::string& charset = "", unsigned long client_flags = 0, std::auto_ptr = std::auto_ptr (0)); @@ -150,6 +156,12 @@ namespace odb return socket_; } + const char* + charset () const + { + return charset_.c_str (); + } + unsigned long client_flags () const { @@ -181,6 +193,7 @@ namespace odb unsigned int port_; std::string socket_str_; const char* socket_; + std::string charset_; unsigned long client_flags_; std::auto_ptr factory_; }; -- cgit v1.1