#include "session.h"
#include <iostream>
#include <iomanip>
using namespace std;
// -------------------------------------------------
session::session(boost::asio::io_service& io_service)
: socket_(io_service)
, sqlsocket_(io_service)
, resolver(io_service)
{
}
session::~session()
{
cout << "closing session ..." << endl;
socket_.close();
sqlsocket_.close();
}
tcp::socket& session::socket()
{
return socket_;
}
void session::start()
{
//cout << "session::start()" << endl;
// connect to the sqlserver database
tcp::resolver::query query("10.10.10.10", "1433");
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
tcp::endpoint endpoint = *endpoint_iterator;
sqlsocket_.async_connect(endpoint,
boost::bind(&session::handle_sqlserver_connect, this,
boost::asio::placeholders::error, ++endpoint_iterator));
}
void session::handle_read(const boost::system::error_code& error,
size_t bytes_transferred)
{
//cout << "session::handle_read()" << endl;
if (!error)
{
boost::asio::async_write(sqlsocket_,
boost::asio::buffer(buf, bytes_transferred),
boost::bind(&session::handle_sqlserver_write, this,
boost::asio::placeholders::error, bytes_transferred));
}
else
{
delete this;
}
}
void session::handle_sqlserver_read(const boost::system::error_code& error,
size_t bytes_transferred)
{
//cout << "session::handle_sqlserver_read()" << endl;
if (!error)
{
boost::asio::async_write(socket_,
boost::asio::buffer(sqlbuf, bytes_transferred),
boost::bind(&session::handle_write, this,
boost::asio::placeholders::error, bytes_transferred));
}
else
{
delete this;
}
}
void session::handle_write(const boost::system::error_code& error,
size_t bytes_transferred)
{
//cout << "session::handle_write()" << endl;
if (!error)
{
sqlsocket_.async_read_some(boost::asio::buffer(sqlbuf, max_length),
boost::bind(&session::handle_sqlserver_read, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
else
{
delete this;
}
}
void session::handle_sqlserver_write(const boost::system::error_code& error,
size_t bytes_transferred)
{
//cout << "session::handle_sqlserver_write()" << endl;
if (!error)
{
socket_.async_read_some(boost::asio::buffer(buf, max_length),
boost::bind(&session::handle_read, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
else
{
delete this;
}
}
void session::handle_sqlserver_connect(const boost::system::error_code& error,
tcp::resolver::iterator endpoint_iterator)
{
//cout << "session::handle_sqlserver_connect()" << endl;
if (!error)
{
socket_.async_read_some(boost::asio::buffer(buf, max_length),
boost::bind(&session::handle_read, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
sqlsocket_.async_read_some(boost::asio::buffer(sqlbuf, max_length),
boost::bind(&session::handle_sqlserver_read, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
else if (endpoint_iterator != tcp::resolver::iterator())
{
sqlsocket_.close();
tcp::endpoint endpoint = *endpoint_iterator;
sqlsocket_.async_connect(endpoint,
boost::bind(&session::handle_sqlserver_connect, this,
boost::asio::placeholders::error, ++endpoint_iterator));
}
}