375 lines
9.2 KiB
C++
375 lines
9.2 KiB
C++
/***********************************************************************
|
|
options.cpp - Implements the Option class hierarchy.
|
|
|
|
Copyright (c) 2007-2009 by Educational Technology Resources, Inc.
|
|
Others may also hold copyrights on code in this file. See the
|
|
CREDITS file in the top directory of the distribution for details.
|
|
|
|
This file is part of MySQL++.
|
|
|
|
MySQL++ is free software; you can redistribute it and/or modify it
|
|
under the terms of the GNU Lesser General Public License as published
|
|
by the Free Software Foundation; either version 2.1 of the License, or
|
|
(at your option) any later version.
|
|
|
|
MySQL++ is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
|
License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with MySQL++; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
|
|
USA
|
|
***********************************************************************/
|
|
|
|
#define MYSQLPP_NOT_HEADER
|
|
#include "options.h"
|
|
|
|
#include "dbdriver.h"
|
|
|
|
|
|
namespace mysqlpp {
|
|
|
|
#if !defined(DOXYGEN_IGNORE)
|
|
// We're hiding all the Option subclass internals from Doxygen. All the
|
|
// upper-level classes are documented fully, and each leaf class itself
|
|
// is documented. It's just the ctors and set() methods we're refusing
|
|
// to document over and over again.
|
|
|
|
Option::Error
|
|
CompressOption::set(DBDriver* dbd)
|
|
{
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(MYSQL_OPT_COMPRESS) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
}
|
|
|
|
|
|
Option::Error
|
|
ConnectTimeoutOption::set(DBDriver* dbd)
|
|
{
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(MYSQL_OPT_CONNECT_TIMEOUT, &arg_) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
}
|
|
|
|
|
|
Option::Error
|
|
FoundRowsOption::set(DBDriver* dbd)
|
|
{
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(CLIENT_FOUND_ROWS, arg_) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
}
|
|
|
|
|
|
Option::Error
|
|
GuessConnectionOption::set(DBDriver* dbd)
|
|
{
|
|
#if MYSQL_VERSION_ID >= 40101
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(MYSQL_OPT_GUESS_CONNECTION) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
#else
|
|
return Option::err_api_limit;
|
|
#endif
|
|
}
|
|
|
|
|
|
Option::Error
|
|
IgnoreSpaceOption::set(DBDriver* dbd)
|
|
{
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(CLIENT_IGNORE_SPACE, arg_) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
}
|
|
|
|
|
|
Option::Error
|
|
InitCommandOption::set(DBDriver* dbd)
|
|
{
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(MYSQL_INIT_COMMAND, arg_.c_str()) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
}
|
|
|
|
|
|
Option::Error
|
|
InteractiveOption::set(DBDriver* dbd)
|
|
{
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(CLIENT_INTERACTIVE, arg_) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
}
|
|
|
|
|
|
Option::Error
|
|
LocalFilesOption::set(DBDriver* dbd)
|
|
{
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(CLIENT_LOCAL_FILES, arg_) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
}
|
|
|
|
|
|
Option::Error
|
|
LocalInfileOption::set(DBDriver* dbd)
|
|
{
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(MYSQL_OPT_LOCAL_INFILE, &arg_) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
}
|
|
|
|
|
|
Option::Error
|
|
MultiResultsOption::set(DBDriver* dbd)
|
|
{
|
|
#if MYSQL_VERSION_ID >= 40101
|
|
if (dbd->connected()) {
|
|
return dbd->set_option(arg_ ? MYSQL_OPTION_MULTI_STATEMENTS_ON :
|
|
MYSQL_OPTION_MULTI_STATEMENTS_OFF) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
}
|
|
else {
|
|
return dbd->set_option(CLIENT_MULTI_RESULTS, arg_) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
}
|
|
#else
|
|
return Option::err_api_limit;
|
|
#endif
|
|
}
|
|
|
|
|
|
Option::Error
|
|
MultiStatementsOption::set(DBDriver* dbd)
|
|
{
|
|
#if MYSQL_VERSION_ID >= 40101
|
|
if (dbd->connected()) {
|
|
return dbd->set_option(arg_ ? MYSQL_OPTION_MULTI_STATEMENTS_ON :
|
|
MYSQL_OPTION_MULTI_STATEMENTS_OFF) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
}
|
|
else {
|
|
return dbd->set_option(CLIENT_MULTI_STATEMENTS, arg_) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
}
|
|
#else
|
|
return Option::err_api_limit;
|
|
#endif
|
|
}
|
|
|
|
|
|
Option::Error
|
|
NamedPipeOption::set(DBDriver* dbd)
|
|
{
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(MYSQL_OPT_NAMED_PIPE) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
}
|
|
|
|
|
|
Option::Error
|
|
NoSchemaOption::set(DBDriver* dbd)
|
|
{
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(CLIENT_NO_SCHEMA, arg_) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
}
|
|
|
|
|
|
#if MYSQL_VERSION_ID > 40000 // only in 4.0 +
|
|
Option::Error
|
|
ProtocolOption::set(DBDriver* dbd)
|
|
{
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(MYSQL_OPT_PROTOCOL, &arg_) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
}
|
|
#endif
|
|
|
|
|
|
Option::Error
|
|
ReadDefaultFileOption::set(DBDriver* dbd)
|
|
{
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(MYSQL_READ_DEFAULT_FILE, arg_.c_str()) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
}
|
|
|
|
|
|
Option::Error
|
|
ReadDefaultGroupOption::set(DBDriver* dbd)
|
|
{
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(MYSQL_READ_DEFAULT_GROUP, arg_.c_str()) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
}
|
|
|
|
|
|
Option::Error
|
|
ReadTimeoutOption::set(DBDriver* dbd)
|
|
{
|
|
#if MYSQL_VERSION_ID >= 40101
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(MYSQL_OPT_READ_TIMEOUT, &arg_) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
#else
|
|
return Option::err_api_limit;
|
|
#endif
|
|
}
|
|
|
|
|
|
Option::Error
|
|
ReconnectOption::set(DBDriver* dbd)
|
|
{
|
|
#if MYSQL_VERSION_ID >= 50106
|
|
// Option fixed in this version to work correctly whether set before
|
|
// connection comes up, or after
|
|
return dbd->set_option(MYSQL_OPT_RECONNECT, &arg_) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
#elif MYSQL_VERSION_ID >= 50013
|
|
// Between the time the option was created in 5.0.13 and when it was
|
|
// fixed in 5.1.6, it only worked correctly if set after initial
|
|
// connection. So, don't accept it if disconnected, even though API
|
|
// does accept it; option gets reset when the connection comes up.
|
|
return dbd->connected() ?
|
|
dbd->set_option(MYSQL_OPT_RECONNECT, &arg_) ?
|
|
Option::err_NONE : Option::err_api_reject :
|
|
Option::err_disconnected;
|
|
#else
|
|
return Option::err_api_limit;
|
|
#endif
|
|
}
|
|
|
|
|
|
Option::Error
|
|
ReportDataTruncationOption::set(DBDriver* dbd)
|
|
{
|
|
#if MYSQL_VERSION_ID >= 50003
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(MYSQL_REPORT_DATA_TRUNCATION, &arg_) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
#else
|
|
return Option::err_api_limit;
|
|
#endif
|
|
}
|
|
|
|
|
|
Option::Error
|
|
SecureAuthOption::set(DBDriver* dbd)
|
|
{
|
|
#if MYSQL_VERSION_ID >= 40101
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(MYSQL_SECURE_AUTH, &arg_) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
#else
|
|
return Option::err_api_limit;
|
|
#endif
|
|
}
|
|
|
|
|
|
Option::Error
|
|
SetCharsetDirOption::set(DBDriver* dbd)
|
|
{
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(MYSQL_SET_CHARSET_DIR, arg_.c_str()) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
}
|
|
|
|
|
|
Option::Error
|
|
SetCharsetNameOption::set(DBDriver* dbd)
|
|
{
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(MYSQL_SET_CHARSET_NAME, arg_.c_str()) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
}
|
|
|
|
|
|
Option::Error
|
|
SetClientIpOption::set(DBDriver* dbd)
|
|
{
|
|
#if MYSQL_VERSION_ID >= 40101
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(MYSQL_SET_CLIENT_IP, arg_.c_str()) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
#else
|
|
return Option::err_api_limit;
|
|
#endif
|
|
}
|
|
|
|
|
|
Option::Error
|
|
SharedMemoryBaseNameOption::set(DBDriver* dbd)
|
|
{
|
|
#if MYSQL_VERSION_ID >= 40100
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(MYSQL_SHARED_MEMORY_BASE_NAME, arg_.c_str()) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
#else
|
|
return Option::err_api_limit;
|
|
#endif
|
|
}
|
|
|
|
|
|
Option::Error
|
|
SslOption::set(DBDriver* dbd)
|
|
{
|
|
#if defined(HAVE_MYSQL_SSL_SET)
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->enable_ssl(
|
|
key_.size() ? key_.c_str() : 0,
|
|
cert_.size() ? cert_.c_str() : 0,
|
|
ca_.size() ? ca_.c_str() : 0,
|
|
capath_.size() ? capath_.c_str() : 0,
|
|
cipher_.size() ? cipher_.c_str() : 0) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
#else
|
|
(void)dbd;
|
|
return Option::err_api_limit;
|
|
#endif
|
|
}
|
|
|
|
|
|
Option::Error
|
|
UseEmbeddedConnectionOption::set(DBDriver* dbd)
|
|
{
|
|
#if MYSQL_VERSION_ID >= 40101
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(MYSQL_OPT_USE_EMBEDDED_CONNECTION) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
#else
|
|
return Option::err_api_limit;
|
|
#endif
|
|
}
|
|
|
|
|
|
Option::Error
|
|
UseRemoteConnectionOption::set(DBDriver* dbd)
|
|
{
|
|
#if MYSQL_VERSION_ID >= 40101
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(MYSQL_OPT_USE_REMOTE_CONNECTION) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
#else
|
|
return Option::err_api_limit;
|
|
#endif
|
|
}
|
|
|
|
|
|
Option::Error
|
|
WriteTimeoutOption::set(DBDriver* dbd)
|
|
{
|
|
#if MYSQL_VERSION_ID >= 40101
|
|
return dbd->connected() ? Option::err_connected :
|
|
dbd->set_option(MYSQL_OPT_WRITE_TIMEOUT, &arg_) ?
|
|
Option::err_NONE : Option::err_api_reject;
|
|
#else
|
|
return Option::err_api_limit;
|
|
#endif
|
|
}
|
|
|
|
#endif // !defined(DOXYGEN_IGNORE)
|
|
|
|
} // end namespace mysqlpp
|