00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef RESOURCEPOOL_MYSQL_RESOURCE_HH
00026 #define RESOURCEPOOL_MYSQL_RESOURCE_HH
00027
00028 #include "ResourcePool/ResourcePoolEventObserver.hh"
00029
00030 #ifndef RESOURCEPOOL_MYSQL_MYSQLFWD_HH
00031 #include "mysqlFwd.hh"
00032 #endif
00033
00034 #include <string>
00035
00036 namespace fatalmind {
00037 namespace mysql {
00038 class FinallyTxDepth;
00039 }
00040
00041 class mysqlResource {
00042 public:
00043 mysqlResource(const std::string& host
00044 , const std::string& user
00045 , const std::string& pass
00046 , const std::string& db
00047 , gc_ptr<ResourcePoolEventObserver> o
00048 , unsigned int port = 3306
00049 , const std::string& sock = ""
00050 );
00051 ~mysqlResource();
00052 bool precheck();
00053 bool postcheck();
00054 void close();
00055 void fail_close();
00056 MYSQL& get_plain_resource();
00057
00058 int getTxDepth() {
00059 return _txDepth;
00060 }
00061
00062 const std::string& getSessionID() const;
00063 inline const std::string& getResourceID() const {
00064 return getSessionID();
00065 }
00066
00067 struct Events {
00068 ResourcePoolEventObserver::event_t PREPARE;
00069 ResourcePoolEventObserver::event_t EXECUTE;
00070 ResourcePoolEventObserver::event_t FETCH;
00071 ResourcePoolEventObserver::event_t COMMIT;
00072 ResourcePoolEventObserver::event_t ROLLBACK;
00073 } Event;
00074
00075 gc_ptr<EventReader> getReader(const ResourcePoolEventObserver::event_t eventid) {
00076 return observer->getReader(eventid, getResourceID());
00077 }
00078 private:
00079 MYSQL* _dbh;
00080
00081 int _txDepth;
00082 int incTxDepth() {
00083 return _txDepth++;
00084 }
00085 void decTxDepth() {
00086 --_txDepth;
00087 }
00088 mutable std::string sessionID;
00089
00090 gc_ptr<ResourcePoolEventObserver> observer;
00091
00092 friend class mysql::FinallyTxDepth;
00093 };
00094
00095 namespace mysql {
00096
00097 class FinallyTxDepth {
00098 public:
00099 FinallyTxDepth(mysqlResource& a_hand)
00100 : hand(a_hand)
00101 {
00102 hand.incTxDepth();
00103 }
00104
00105 ~FinallyTxDepth() {
00106 hand.decTxDepth();
00107 }
00108 private:
00109 mysqlResource& hand;
00110 };
00111 }
00112
00113 }
00114 #endif