1. #include "session.h"
  2.  
  3. #include <iostream>
  4. #include <iomanip>
  5. using namespace std;
  6.  
  7.  
  8. // -------------------------------------------------
  9.  
  10.  
  11. session::session(boost::asio::io_service& io_service)
  12. : socket_(io_service)
  13. , sqlsocket_(io_service)
  14. , resolver(io_service)
  15. {
  16. }
  17.  
  18. session::~session()
  19. {
  20.     cout << "closing session ..." << endl;
  21.     socket_.close();
  22.     sqlsocket_.close();
  23. }
  24.  
  25. tcp::socket& session::socket()
  26. {
  27.     return socket_;
  28. }
  29.  
  30. void session::start()
  31. {
  32.     //cout << "session::start()" << endl;
  33.  
  34.     // connect to the sqlserver database
  35.     tcp::resolver::query query("10.10.10.10", "1433");
  36.     tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
  37.     tcp::endpoint endpoint = *endpoint_iterator;
  38.  
  39.     sqlsocket_.async_connect(endpoint,
  40.         boost::bind(&session::handle_sqlserver_connect, this,
  41.         boost::asio::placeholders::error, ++endpoint_iterator));
  42. }
  43.  
  44. void session::handle_read(const boost::system::error_code& error,
  45.                           size_t bytes_transferred)
  46. {
  47.     //cout << "session::handle_read()" << endl;
  48.     if (!error)
  49.     {
  50.         boost::asio::async_write(sqlsocket_,
  51.             boost::asio::buffer(buf, bytes_transferred),
  52.             boost::bind(&session::handle_sqlserver_write, this,
  53.             boost::asio::placeholders::error, bytes_transferred));
  54.     }
  55.     else
  56.     {
  57.         delete this;
  58.     }
  59. }
  60.  
  61. void session::handle_sqlserver_read(const boost::system::error_code& error,
  62.                                     size_t bytes_transferred)
  63. {
  64.     //cout << "session::handle_sqlserver_read()" << endl;
  65.     if (!error)
  66.     {
  67.         boost::asio::async_write(socket_,
  68.             boost::asio::buffer(sqlbuf, bytes_transferred),
  69.             boost::bind(&session::handle_write, this,
  70.             boost::asio::placeholders::error, bytes_transferred));
  71.     }
  72.     else
  73.     {
  74.         delete this;
  75.     }
  76. }
  77.  
  78. void session::handle_write(const boost::system::error_code& error,
  79.                            size_t bytes_transferred)
  80. {
  81.     //cout << "session::handle_write()" << endl;
  82.     if (!error)
  83.     {
  84.         sqlsocket_.async_read_some(boost::asio::buffer(sqlbuf, max_length),
  85.             boost::bind(&session::handle_sqlserver_read, this,
  86.             boost::asio::placeholders::error,
  87.             boost::asio::placeholders::bytes_transferred));
  88.     }
  89.     else
  90.     {
  91.         delete this;
  92.     }
  93. }
  94.  
  95. void session::handle_sqlserver_write(const boost::system::error_code& error,
  96.                                      size_t bytes_transferred)
  97. {
  98.     //cout << "session::handle_sqlserver_write()" << endl;
  99.     if (!error)
  100.     {
  101.         socket_.async_read_some(boost::asio::buffer(buf, max_length),
  102.             boost::bind(&session::handle_read, this,
  103.             boost::asio::placeholders::error,
  104.             boost::asio::placeholders::bytes_transferred));
  105.     }
  106.     else
  107.     {
  108.         delete this;
  109.     }
  110. }
  111.  
  112. void session::handle_sqlserver_connect(const boost::system::error_code& error,
  113.                                        tcp::resolver::iterator endpoint_iterator)
  114. {
  115.     //cout << "session::handle_sqlserver_connect()" << endl;
  116.     if (!error)
  117.     {
  118.         socket_.async_read_some(boost::asio::buffer(buf, max_length),
  119.             boost::bind(&session::handle_read, this,
  120.             boost::asio::placeholders::error,
  121.             boost::asio::placeholders::bytes_transferred));
  122.  
  123.         sqlsocket_.async_read_some(boost::asio::buffer(sqlbuf, max_length),
  124.             boost::bind(&session::handle_sqlserver_read, this,
  125.             boost::asio::placeholders::error,
  126.             boost::asio::placeholders::bytes_transferred));
  127.     }
  128.     else if (endpoint_iterator != tcp::resolver::iterator())
  129.     {
  130.         sqlsocket_.close();
  131.         tcp::endpoint endpoint = *endpoint_iterator;
  132.         sqlsocket_.async_connect(endpoint,
  133.             boost::bind(&session::handle_sqlserver_connect, this,
  134.             boost::asio::placeholders::error, ++endpoint_iterator));
  135.     }
  136. }