00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef INCLUDE_SQLSTATEMENTIMPL_HH
00025 #define INCLUDE_SQLSTATEMENTIMPL_HH
00026
00027 #include <string>
00028 #include <vector>
00029
00030 #include "Exceptions/Exception.hh"
00031 #include "mm/gc_ptr.hh"
00032 #include "SQLStatement.hh"
00033
00034 namespace fatalmind {
00035 namespace SQL {
00036
00037 class SQLParser;
00038
00039 class SQLStatementImpl: public usg_cnt_t<DefaultThreadedModel> {
00040 public:
00043 class Parameter {
00044 public:
00045 Parameter()
00046 : name()
00047 , type(SQLStatement::Parameter::UNKNOWN)
00048 {
00049 }
00050
00051 std::string getName() const {
00052 return name;
00053 }
00054
00055 int getType() const {
00056 return type;
00057 }
00058
00059 private:
00060 std::string name;
00061 int type;
00062
00063 void setName(const char* const n, int length) {
00064 name = std::string(n, length);
00065 }
00066
00067 void setType(const int t) {
00068 type = t;
00069 }
00070
00071 void reset() {
00072 name.clear();
00073 type = SQLStatement::Parameter::UNKNOWN;
00074 }
00075
00076 friend
00077 class SQLParser;
00078 };
00079
00080 SQLStatementImpl();
00081
00082 SQLStatementImpl(const std::string& sql);
00083 SQLStatementImpl(const char*);
00084
00085 void parse();
00086
00087 unsigned int getParamCount() const;
00088 std::string getNameFor(const int pos) const;
00089 int getTypeFor(const int pos) const;
00090 const std::string& getSQL() const;
00091 const std::string& getSQLFragment(const int pos) const;
00092
00093 bool operator==(const SQLStatementImpl& rho) {
00094 return sql == rho.sql;
00095 };
00096 bool operator!=(const SQLStatementImpl& rho) {
00097 return sql != rho.sql;
00098 };
00099
00100 private:
00101
00102
00103 void addFragment(const int begin, const int end) {
00104 int length = end - begin;
00105 fragments.push_back(sql.substr(begin, length));
00106 }
00107
00108 void addParam(const Parameter& p) {
00109 parameters.push_back(p);
00110 }
00111
00112 void buildNameMap();
00113
00114 std::string sql;
00115 std::vector<std::string> fragments;
00116 std::vector<class Parameter> parameters;
00117 friend
00118 class SQLParser;
00119
00120 template<class charT, class traits>
00121 friend
00122 std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& s, const SQLStatementImpl& rho);
00123 };
00124
00125 }
00126 }
00127
00128 template<class charT, class traits>
00129 std::basic_ostream<charT, traits>& fatalmind::SQL::operator<<(std::basic_ostream<charT, traits>& s, const fatalmind::SQL::SQLStatementImpl& rho) {
00130 s << rho.sql;
00131 return s;
00132 }
00133
00134 #endif