connection1.hh
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:5k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #ifndef __connection1_hh__
  2. #define __connection1_hh__
  3. #include <vector>
  4. #include <deque>
  5. #include <list>
  6. #include <set>
  7. #include <map>
  8. using namespace std ;
  9. #include <mysql.h>
  10. #include "define_short.h"
  11. #include "bad_query.hh"
  12. #include "query1.hh"
  13. #include "result1.hh"
  14. //The main database handle
  15. class Connection
  16. {
  17.   friend ResNSel;
  18.   friend ResUse;
  19.   friend Query;
  20. private:
  21.   bool throw_exceptions;
  22.   MYSQL mysql;
  23.   bool is_connected;
  24.   bool locked;
  25.   bool Success;
  26. public:
  27.   Connection () : throw_exceptions(true), locked(false)
  28.     {mysql_init(&mysql);} //:
  29.   Connection (bool te) : throw_exceptions(te), is_connected(false), locked(true), Success(false) //:
  30.     {mysql_init(&mysql);} //:
  31.   Connection (const char *db, const char *host = "", const char *user = "",
  32.       const char *passwd = "", bool te = true); //:
  33.   Connection (const char *db, const char *host, const char *user,
  34.       const char *passwd, uint port, my_bool compress = 1,
  35.       unsigned int connect_timeout = 5, bool te = true,
  36.       cchar *socket_name = ""); //:
  37.   bool   real_connect (cchar *db = "", cchar *host = "",
  38.        cchar *user = "", cchar *passwd = "", uint port = 0,
  39.        my_bool compress = 0, unsigned int connect_timeout = 60,
  40.        cchar *socket_name= ""); //:
  41.   ~Connection (); //:
  42.   void         close() {mysql_close(&mysql);}  //:
  43.   string       info (); //:
  44.   bool   connected() const {return is_connected;}
  45.   //: returns true if a successful connection was made
  46.   bool   success() {return Success;}
  47.   //: returns true of the last query was successful
  48.   bool   connect (cchar *db = "", cchar *host = "",
  49.   cchar *user = "", cchar *passwd = "");
  50.   //:
  51.   bool   lock() {if (locked) return true; locked = true; return false;}
  52.   void   unlock() {locked = false;}
  53.   void purge (void) {mysql_close(&mysql); }
  54.   //:
  55.   inline Query query();
  56.   //:
  57.   operator bool () {return success();}                  //: returns success()
  58.   string error () {return string(mysql_error(&mysql));} //: last error message()
  59. int errnum () {return mysql_errno(&mysql);}
  60. int   refresh (unsigned int refresh_options){ return mysql_refresh (&mysql,refresh_options); }
  61. int ping (void) { return mysql_ping(&mysql);}
  62. int kill (unsigned long pid) { return mysql_kill (&mysql,pid);}
  63.   string clinet_info () {return string(mysql_get_client_info());} //:
  64.   string host_info () {return string(mysql_get_host_info(&mysql));} //:
  65.   int    proto_info () {return mysql_get_proto_info(&mysql);} //:
  66.   string server_info () {return string(mysql_get_server_info(&mysql));} //:
  67.   string stat() {return string(mysql_stat(&mysql));} //:
  68.   Result  store(const string &str) {return store(str, throw_exceptions);} //:
  69.   ResUse  use(const string &str)   {return use(str, throw_exceptions);} //:
  70.   ResNSel execute(const string &str) {return execute(str, throw_exceptions);} //:
  71. bool exec (const string &str);
  72.   Result  store(const string &str, bool te); //:
  73.   ResUse  use(const string &str, bool te); //:
  74.   ResNSel execute(const string &str, bool te); //:
  75.   bool   create_db (string db) {return !(execute( "CREATE DATABASE " + db ));} //:
  76.   bool   drop_db (string db) {return !(execute( "DROP DATABASE " + db ));} //:
  77.   bool   select_db (string db) {return select_db(db.c_str());} //:
  78.   bool   select_db (const char *db); //:
  79.   bool   reload(); //:
  80.   bool   shutdown (); //:
  81. string infoo (void) {return info ();}
  82. st_mysql_options get_options (void) const {return mysql.options;}
  83. int read_options(enum mysql_option option,const char *arg) {return  mysql_options(&mysql, option,arg);}
  84.   int          affected_rows()  {return mysql_affected_rows((MYSQL*) &mysql);}
  85.   int          insert_id () {return mysql_insert_id(&mysql);}
  86.   // FIX:
  87.   // implementation of template function must be done in the class definition
  88.   // (instead of connection2.hh), otherwise Visual C++ gives template
  89.   // matching errors
  90.   template <class Sequence>
  91.   void storein_sequence(Sequence &seq, const string &str) {
  92.     ResUse result = use(str);
  93.     while (1) {
  94.     MYSQL_ROW d = mysql_fetch_row(result.mysql_res);
  95.   if (!d) break;
  96.     Row row(d,&result,(unsigned int *)mysql_fetch_lengths(result.mysql_res),true);
  97.   if (!row) break;
  98.       seq.push_back(/*typename*/ Sequence::value_type(row));
  99.   }
  100. }
  101.   template <class Set>
  102.   void storein_set(Set &sett, const string &str) {
  103.     ResUse result = use(str);
  104.   while (1) {
  105.     MYSQL_ROW d = mysql_fetch_row(result.mysql_res);
  106.   if (!d) return;
  107.     Row row(d,&result,(unsigned int *)mysql_fetch_lengths(result.mysql_res),true);
  108.   if (!row) break;
  109.       sett.insert(typename Set::value_type(row));
  110.   }
  111.   }
  112.   //!dummy: void storein(TYPE &con, const string &s);
  113.   //: Stores the results in TYPE.
  114.   // Stores the result in TYPE. TYPE must be some sort of STL container.
  115.   template <class T>        void storein(vector<T> &con, const string &s)
  116.     {storein_sequence(con,s);}
  117.   template <class T>        void storein(deque<T> &con, const string &s)
  118.      {storein_sequence(con,s);}
  119.   template <class T>        void storein(list<T> &con, const string &s)
  120.     {storein_sequence(con,s);}
  121.   template <class T>        void storein(set<T> &con, const string &s)
  122.     {storein_set(con,s);}
  123.   template <class T>        void storein(multiset<T> &con, const string &s)
  124.     {storein_set(con,s);}
  125. };
  126. typedef Connection Mysql;
  127. #endif