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
00026
00027
00028
00029
00030
00031
00032 #pragma once
00033
00034 #include <drizzled/error_t.h>
00035
00036 #include <queue>
00037 #include <stdexcept>
00038
00039 namespace drizzled {
00040 namespace sql {
00041
00042 class ResultSet;
00043
00044 class Exception : public std::runtime_error
00045 {
00046 public:
00047 Exception(std::string reason, std::string sql_state, drizzled::error_t error_arg) :
00048 std::runtime_error(reason),
00049 _error_code(error_arg),
00050 _sql_state(sql_state),
00051 _reason(reason)
00052 {
00053 if (_sql_state.length() != 5)
00054 _sql_state= "HY000";
00055 }
00056
00057 Exception() :
00058 std::runtime_error("no error"),
00059 _error_code(drizzled::EE_OK),
00060 _sql_state("00000")
00061 {
00062 }
00063
00064 Exception(std::string reason, drizzled::error_t error_arg) :
00065 std::runtime_error(reason),
00066 _error_code(error_arg),
00067 _reason(reason)
00068 {
00069 _sql_state= "00000";
00070 }
00071
00072 ~Exception () throw ()
00073 { }
00074
00075 drizzled::error_t getErrorCode() const
00076 {
00077 return _error_code;
00078 }
00079
00080 const std::string &getErrorMessage() const
00081 {
00082 return _reason;
00083 }
00084
00085 Exception getNextException() const
00086 {
00087 if (_next_exception.empty())
00088 {
00089 return Exception();
00090 }
00091
00092 Exception tmp= _next_exception.front();
00093 _next_exception.pop();
00094
00095 return Exception();
00096 }
00097
00098 const std::string &getSQLState() const
00099 {
00100 return _sql_state;
00101 }
00102
00103 protected:
00104 friend class ResultSet;
00105 void setNextException(Exception arg)
00106 {
00107 (void)arg;
00108 return;
00109 }
00110
00111 private:
00112 drizzled::error_t _error_code;
00113 std::string _sql_state;
00114 std::string _reason;
00115 mutable std::queue <Exception> _next_exception;
00116 };
00117
00118 std::ostream& operator<<(std::ostream& output, const Exception &arg);
00119
00120 }
00121 }
00122