Ctx.hpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:4k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #ifndef ODBC_COMMON_Ctx_hpp
  14. #define ODBC_COMMON_Ctx_hpp
  15. #include <NdbDictionary.hpp>
  16. class Ndb;
  17. class NdbConnection;
  18. class NdbOperation;
  19. class NdbSchemaCon;
  20. class NdbSchemaOp;
  21. class NdbError;
  22. class Sqlstate;
  23. class DiagArea;
  24. class CtxOwner;
  25. #ifndef MAX_PATH
  26. #define MAX_PATH 1024
  27. #endif
  28. /**
  29.  * @class Error
  30.  * @brief Sql state, error codes, and message
  31.  */
  32. struct Error {
  33.     enum {
  34. Gen = NDB_ODBC_ERROR_MIN + 1 // unclassified
  35.     };
  36.     explicit Error(const Sqlstate& sqlstate);
  37.     const Sqlstate& m_sqlstate;
  38.     int m_status;
  39.     int m_classification;
  40.     int m_code;
  41.     const char* m_message;
  42.     const char* m_sqlFunction;
  43.     bool driverError() const;
  44. };
  45. inline
  46. Error::Error(const Sqlstate& sqlstate) :
  47.     m_sqlstate(sqlstate),
  48.     m_status(0),
  49.     m_classification(0),
  50.     m_code(0),
  51.     m_sqlFunction(0)
  52. {
  53. }
  54. inline bool
  55. Error::driverError() const
  56. {
  57.     return NDB_ODBC_ERROR_MIN <= m_code && m_code < NDB_ODBC_ERROR_MAX;
  58. }
  59. #define ctx_assert(x)
  60.     do { if (x) break; throw CtxAssert(__FILE__, __LINE__); } while (0)
  61. /**
  62.  * @class Assert
  63.  * @brief Assert thrown
  64.  */
  65. class CtxAssert {
  66. public:
  67.     CtxAssert(const char* file, int line);
  68.     const char* const m_file;
  69.     const int m_line;
  70. };
  71. /**
  72.  * @class Ctx
  73.  * @brief Context for one ODBC SQL function
  74.  * 
  75.  * Local to the function (not member of the handle) because methods on
  76.  * a handle can call methods on other handles.  Created in driver/
  77.  * before method calls and saved under the handle on return.  Contains
  78.  * diag area for the function.  Also used as logger.
  79.  */
  80. class Ctx {
  81. public:
  82.     Ctx();
  83.     ~Ctx();
  84.     // handle exceptions
  85.     void handleEx(CtxAssert& ctxAssert);
  86.     // logging methods
  87.     int logLevel() const;
  88.     void log(const char* fmt, ...) PRINTFLIKE(2,3);
  89.     void logSqlEnter(const char* sqlFunction);
  90.     void logSqlExit();
  91.     const char* sqlFunction() const;
  92.     void print(const char* fmt, ...) PRINTFLIKE(2,3);
  93.     void print(int level, const char* fmt, ...) PRINTFLIKE(3,4);
  94.     // diagnostics area.
  95.     DiagArea& diagArea() const;
  96.     DiagArea& diagArea();
  97.     SQLRETURN getCode() const;
  98.     void setCode(SQLRETURN ret);
  99.     // push diagnostic record
  100.     void pushStatus(const Sqlstate& state, SQLINTEGER code, const char* fmt, ...) PRINTFLIKE(4,5);
  101.     void pushStatus(SQLINTEGER code, const char* fmt, ...) PRINTFLIKE(3,4);
  102.     void pushStatus(const NdbError& ndbError, const char* fmt, ...) PRINTFLIKE(3,4);
  103.     void pushStatus(const Ndb* ndb, const char* fmt, ...) PRINTFLIKE(3,4);
  104.     void pushStatus(const Ndb* ndb, const NdbConnection* tcon, const NdbOperation* op, const char* fmt, ...) PRINTFLIKE(5,6);
  105.     void pushStatus(const Ndb* ndb, const NdbSchemaCon* scon, const NdbSchemaOp* op, const char* fmt, ...) PRINTFLIKE(5,6);
  106.     // check if we should continue executing.
  107.     bool ok();
  108. private:
  109.     static int m_logLevel;
  110.     static char m_szTraceFile[MAX_PATH];
  111.     char m_sqlFunction[32]; // max needed is 20
  112.     DiagArea* m_diagArea;
  113. };
  114. inline int
  115. Ctx::logLevel() const
  116. {
  117.     return m_logLevel;
  118. }
  119. inline const char*
  120. Ctx::sqlFunction() const
  121. {
  122.     return m_sqlFunction;
  123. }
  124. // logging macros can be used only when ctx is in scope
  125. #define ctx_logN(n, x)
  126.     do { if (ctx.logLevel() < (n)) break; ctx.log x; } while (0)
  127. #if NDB_ODBC_MAX_LOG_LEVEL >= 0
  128. #define ctx_log0(x) ctx_logN(0, x)
  129. #else
  130. #define ctx_log0(x)
  131. #endif
  132. #if NDB_ODBC_MAX_LOG_LEVEL >= 1
  133. #define ctx_log1(x) ctx_logN(1, x)
  134. #else
  135. #define ctx_log1(x)
  136. #endif
  137. #if NDB_ODBC_MAX_LOG_LEVEL >= 2
  138. #define ctx_log2(x) ctx_logN(2, x)
  139. #else
  140. #define ctx_log2(x)
  141. #endif
  142. #if NDB_ODBC_MAX_LOG_LEVEL >= 3
  143. #define ctx_log3(x) ctx_logN(3, x)
  144. #else
  145. #define ctx_log3(x)
  146. #endif
  147. #if NDB_ODBC_MAX_LOG_LEVEL >= 4
  148. #define ctx_log4(x) ctx_logN(4, x)
  149. #else
  150. #define ctx_log4(x)
  151. #endif
  152. #if NDB_ODBC_MAX_LOG_LEVEL >= 5
  153. #define ctx_log5(x) ctx_logN(5, x)
  154. #else
  155. #define ctx_log5(x)
  156. #endif
  157. #endif