00001
00002
00003
00004
00005
00006
00007
00008 #include "Database.h"
00009
00010
00011 Database::Database(string server, string user, string pwd, string db)
00012 {
00013 setServer(server);
00014 setUser(user);
00015 setPassword(pwd);
00016 setDB(db);
00017
00018 _conn = NULL;
00019 }
00020
00021 Database::~Database()
00022 {
00023 disconnect();
00024 }
00025
00026 bool Database::connect()
00027 {
00028 try {
00029 _conn = new Connection(false);
00030 _conn->set_option(new MultiStatementsOption(true));
00031 _conn->connect(_db.c_str(), 0, _user.c_str(), _passwd.c_str());
00032 }
00033 catch (std::exception &e) {
00034 cerr << "unable to connect to database ("
00035 << _conn->error() << endl;
00036 delete _conn;
00037
00038 return false;
00039 }
00040
00041 return _conn->connected();
00042 }
00043
00044 void Database::disconnect()
00045 {
00046 if (_conn) {
00047 _conn->disconnect();
00048 delete _conn;
00049 _conn = NULL;
00050 }
00051 }
00052
00053 void Database::setServer(string aValue)
00054 {
00055 if (_server != aValue) {
00056 _server = aValue;
00057
00058 if (isConnected())
00059 disconnect();
00060 }
00061 }
00062
00063 void Database::setUser(string aValue)
00064 {
00065 if (_user != aValue) {
00066 _user = aValue;
00067
00068 if (isConnected())
00069 disconnect();
00070 }
00071 }
00072
00073 void Database::setPassword(string aValue)
00074 {
00075 if (_passwd != aValue) {
00076 _passwd = aValue;
00077
00078 if (isConnected())
00079 disconnect();
00080 }
00081 }
00082
00083 void Database::setDB(string aValue)
00084 {
00085 if (_db != aValue) {
00086 _db = aValue;
00087
00088 if (isConnected()) {
00089 _conn->select_db(_db);
00090 }
00091 }
00092 }
00093
00094 bool Database::isConnected()
00095 {
00096 return ((_conn) && (_conn->connected()));
00097 }
00098
00099 void Database::printRow(IntVector & widths, Row & row)
00100 {
00101 cout << " |" << setfill(' ');
00102 for (size_t i = 0; i < row.size(); ++i) {
00103 cout << " " << setw(widths.at(i)) << row[int(i)] << " |";
00104 }
00105 cout << endl;
00106 }
00107
00108 void Database::printResult(StoreQueryResult& res)
00109 {
00110 StoreQueryResult::size_type num_results = res.size();
00111 if (!res || (num_results == 0)) {
00112 return;
00113 }
00114
00115 IntVector widths;
00116 size_t size = res.num_fields();
00117 for (size_t i = 0; i < size; i++) {
00118 widths.push_back(max(res.field(i).max_length(),
00119 res.field_name(i).size()));
00120 }
00121
00122 for (StoreQueryResult::size_type i = 0; i < num_results; ++i) {
00123 printRow(widths, res[i]);
00124 }
00125 }
00126
00127 ostream& operator<<(ostream& aStream, Database& d) {
00128 return aStream << "Connection to database is" <<
00129 (d._conn->connected()?"":" NOT") << " established\n";
00130 }
00131