mirror of
https://github.com/pocoproject/poco.git
synced 2025-06-28 07:06:02 +02:00
227 lines
4.9 KiB
C++
227 lines
4.9 KiB
C++
//
|
|
// MySQLException.cpp
|
|
//
|
|
// $Id: //poco/1.4/Data/MySQL/src/SessionImpl.cpp#1 $
|
|
//
|
|
// Library: Data
|
|
// Package: MySQL
|
|
// Module: SessionImpl
|
|
//
|
|
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
|
|
// and Contributors.
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person or organization
|
|
// obtaining a copy of the software and accompanying documentation covered by
|
|
// this license (the "Software") to use, reproduce, display, distribute,
|
|
// execute, and transmit the Software, and to prepare derivative works of the
|
|
// Software, and to permit third-parties to whom the Software is furnished to
|
|
// do so, all subject to the following:
|
|
//
|
|
// The copyright notices in the Software and this entire statement, including
|
|
// the above license grant, this restriction and the following disclaimer,
|
|
// must be included in all copies of the Software, in whole or in part, and
|
|
// all derivative works of the Software, unless such copies or derivative
|
|
// works are solely in the form of machine-executable object code generated by
|
|
// a source language processor.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
|
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
|
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
|
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
// DEALINGS IN THE SOFTWARE.
|
|
//
|
|
|
|
|
|
#include "Poco/Data/MySQL/SessionImpl.h"
|
|
#include "Poco/Data/MySQL/MySQLStatementImpl.h"
|
|
|
|
|
|
namespace
|
|
{
|
|
std::string copyStripped(std::string::const_iterator from, std::string::const_iterator to)
|
|
{
|
|
// skip leading spaces
|
|
while ((from != to) && isspace(*from)) from++;
|
|
// skip trailing spaces
|
|
while ((from != to) && isspace(*(to - 1))) to--;
|
|
|
|
return std::string(from, to);
|
|
}
|
|
}
|
|
|
|
|
|
namespace Poco {
|
|
namespace Data {
|
|
namespace MySQL {
|
|
|
|
|
|
SessionImpl::SessionImpl(const std::string& connectionString) : _mysql(0), _connected(false), _inTransaction(0)
|
|
{
|
|
addProperty("insertId",
|
|
&SessionImpl::setInsertId,
|
|
&SessionImpl::getInsertId);
|
|
|
|
std::map<std::string, std::string> options;
|
|
|
|
// Default values
|
|
options["host"] = "localhost";
|
|
options["port"] = "3306";
|
|
options["user"] = "";
|
|
options["password"] = "";
|
|
options["db"] = "";
|
|
options["compress"] = "";
|
|
options["auto-reconnect"] = "";
|
|
|
|
//
|
|
// Parse string
|
|
//
|
|
|
|
for (std::string::const_iterator start = connectionString.begin();;)
|
|
{
|
|
// find next ';'
|
|
std::string::const_iterator finish = std::find(start, connectionString.end(), ';');
|
|
|
|
// find '='
|
|
std::string::const_iterator middle = std::find(start, finish, '=');
|
|
|
|
if (middle == finish)
|
|
{
|
|
throw MySQLException("create session: bad connection string format, can not find '='");
|
|
}
|
|
|
|
// Parse name and value, skip all spaces
|
|
options[copyStripped(start, middle)] = copyStripped(middle + 1, finish);
|
|
|
|
if ((finish == connectionString.end()) || (finish + 1 == connectionString.end()))
|
|
{
|
|
// end of parse
|
|
break;
|
|
}
|
|
|
|
// move start position after ';'
|
|
start = finish + 1;
|
|
}
|
|
|
|
//
|
|
// Checking
|
|
//
|
|
|
|
if (options["user"] == "")
|
|
{
|
|
throw MySQLException("create session: specify user name");
|
|
}
|
|
|
|
if (options["db"] == "")
|
|
{
|
|
throw MySQLException("create session: specify database");
|
|
}
|
|
|
|
if (atoi(options["port"].c_str()) == 0)
|
|
{
|
|
throw MySQLException("create session: specify correct port (numeric in decimal notation)");
|
|
}
|
|
|
|
//
|
|
// Options
|
|
//
|
|
|
|
if (options["compress"] == "true")
|
|
{
|
|
_mysql.options(MYSQL_OPT_COMPRESS);
|
|
}
|
|
else if (options["compress"] == "false")
|
|
{
|
|
// do nothing
|
|
}
|
|
else if (options["compress"] != "")
|
|
{
|
|
throw MySQLException("create session: specify correct compress option (true or false) or skip it");
|
|
}
|
|
|
|
if (options["auto-reconnect"] == "true")
|
|
{
|
|
_mysql.options(MYSQL_OPT_RECONNECT, true);
|
|
}
|
|
else if (options["auto-reconnect"] == "false")
|
|
{
|
|
_mysql.options(MYSQL_OPT_RECONNECT, false);
|
|
}
|
|
else if (options["auto-reconnect"] != "")
|
|
{
|
|
throw MySQLException("create session: specify correct auto-reconnect option (true or false) or skip it");
|
|
}
|
|
|
|
//
|
|
// Real connect
|
|
//
|
|
|
|
_mysql.connect(
|
|
options["host"].c_str(),
|
|
options["user"].c_str(),
|
|
options["password"].c_str(),
|
|
options["db"].c_str(),
|
|
atoi(options["port"].c_str()));
|
|
|
|
_connected = true;
|
|
}
|
|
|
|
|
|
SessionImpl::~SessionImpl()
|
|
{
|
|
close();
|
|
}
|
|
|
|
|
|
Poco::Data::StatementImpl* SessionImpl::createStatementImpl()
|
|
{
|
|
return new MySQLStatementImpl(*this);
|
|
}
|
|
|
|
|
|
void SessionImpl::begin()
|
|
{
|
|
_mysql.startTransaction();
|
|
_inTransaction++;
|
|
}
|
|
|
|
|
|
void SessionImpl::commit()
|
|
{
|
|
_mysql.commit();
|
|
_inTransaction--;
|
|
}
|
|
|
|
|
|
void SessionImpl::rollback()
|
|
{
|
|
_mysql.rollback();
|
|
_inTransaction--;
|
|
}
|
|
|
|
|
|
void SessionImpl::close()
|
|
{
|
|
if (_connected)
|
|
{
|
|
_mysql.close();
|
|
_connected = false;
|
|
}
|
|
}
|
|
|
|
|
|
bool SessionImpl::isConnected()
|
|
{
|
|
return _connected;
|
|
}
|
|
|
|
|
|
bool SessionImpl::isTransaction()
|
|
{
|
|
return (_inTransaction > 0);
|
|
}
|
|
|
|
|
|
}}}
|