00001 #ifndef MYSQLPP_QUERY_H
00002 #define MYSQLPP_QUERY_H
00003
00022
00023 #include "defs.h"
00024
00025 #include "coldata.h"
00026 #include "connection.h"
00027 #include "result.h"
00028 #include "sql_query.h"
00029
00030 #include <mysql.h>
00031
00032 #define mysql_query_define1(RETURN, FUNC) \
00033 RETURN FUNC (const char* str); \
00034 RETURN FUNC (parms &p);\
00035 mysql_query_define0(RETURN,FUNC) \
00036
00037 #define mysql_query_define2(FUNC) \
00038 template <class T1> void FUNC (T1 &con, const char* str); \
00039 template <class T1> void FUNC (T1 &con, parms &p, query_reset r = RESET_QUERY);\
00040 template <class T1> void FUNC (T1 &con, ss a)\
00041 {FUNC (con, parms() << a);}\
00042 template <class T1> void FUNC (T1 &con, ss a, ss b)\
00043 {FUNC (con, parms() << a << b);}\
00044 template <class T1> void FUNC (T1 &con, ss a, ss b, ss c)\
00045 {FUNC (con, parms() << a << b << c);}\
00046 template <class T1> void FUNC (T1 &con, ss a, ss b, ss c, ss d)\
00047 {FUNC (con, parms() << a << b << c << d);}\
00048 template <class T1> void FUNC (T1 &con, ss a, ss b, ss c, ss d, ss e)\
00049 {FUNC (con, parms() << a << b << c << d << e);} \
00050 template <class T1> void FUNC (T1 &con, ss a, ss b, ss c, ss d, ss e, ss f)\
00051 {FUNC (con, parms() << a << b << c << d << e << f);}\
00052 template <class T1> void FUNC (T1 &con,ss a,ss b,ss c,ss d,ss e,ss f,ss g)\
00053 {FUNC (con, parms() << a << b << c << d << e << f << g);}\
00054 template <class T1> void FUNC (T1 &con,ss a,ss b,ss c,ss d,ss e,ss f,ss g,ss h)\
00055 {FUNC (con, parms() << a << b << c << d << e << f << g << h);}\
00056 template <class T1> void FUNC (T1 &con, ss a, ss b, ss c, ss d, ss e, ss f, ss g, ss h, ss i)\
00057 {FUNC (con, parms() << a << b << c << d << e << f << g << h << i);}\
00058 template <class T1> void FUNC (T1 &con, ss a,ss b,ss c,ss d,ss e,ss f,ss g,ss h,ss i,ss j)\
00059 {FUNC (con, parms() <<a <<b <<c <<d <<e <<f <<g <<h <<i <<j);}\
00060 template <class T1> void FUNC (T1 &con, ss a,ss b,ss c,ss d,ss e,ss f,ss g,ss h,ss i,ss j,ss k)\
00061 {FUNC (con, parms() <<a <<b <<c <<d <<e <<f <<g <<h <<i <<j <<k);}\
00062 template <class T1> void FUNC (T1 &con, ss a,ss b,ss c,ss d,ss e,ss f,ss g,ss h,ss i,ss j,ss k,\
00063 ss l)\
00064 {FUNC (con, parms() <<a <<b <<c <<d <<e <<f <<g <<h <<i <<j <<k <<l);}\
00065
00066 namespace mysqlpp {
00067
00074
00075 class Query : public SQLQuery
00076 {
00077 private:
00078 Connection* mysql;
00079 bool throw_exceptions;
00080
00081 my_ulonglong affected_rows() const;
00082 my_ulonglong insert_id();
00083 std::string info();
00084 bool lock();
00085 void unlock();
00086
00087 public:
00094 Query(Connection * c, bool te = false) :
00095 SQLQuery(),
00096 mysql(c),
00097 throw_exceptions(te)
00098 {
00099 Success = true;
00100 }
00101
00103 Query(const Query& q);
00104
00107 std::string error();
00108
00110 bool success();
00111
00113 std::string preview() { return str(def); }
00114 std::string preview(parms& p) { return str(p); }
00115
00130 bool exec(const std::string& str);
00131
00154 ResNSel execute() { return execute(def); }
00155
00172 ResUse use() { return use(def); }
00173
00191 Result store() { return store(def); }
00192
00211 template<class T1> void storein_sequence(T1& con,
00212 query_reset r = RESET_QUERY)
00213 { storein_sequence_(con, def, r); }
00214
00220 template<class T1> void storein_set(T1& con,
00221 query_reset r = RESET_QUERY) { storein_set(con, def, r); }
00222
00241 template<class T1> void storein(T1& con,
00242 query_reset r = RESET_QUERY) { storein(con, def, r); }
00243
00254 template<class T> Query& update(const T& o, const T& n)
00255 {
00256 SQLQuery::update(o, n);
00257 return *this;
00258 }
00259
00268 template<class T> Query& insert(const T& v)
00269 {
00270 SQLQuery::insert(v);
00271 return *this;
00272 }
00273
00283 template<class T> Query& replace(const T& v)
00284 {
00285 SQLQuery::replace(v);
00286 return *this;
00287 }
00288
00289
00290
00291
00292
00294
00295 mysql_query_define1(ResNSel, execute)
00296 mysql_query_define1(ResUse, use)
00297 mysql_query_define1(Result, store)
00298 mysql_query_define2(storein_sequence)
00299 mysql_query_define2(storein_set)
00300 mysql_query_define2(storein)
00302 };
00303
00305
00306
00307 template<class Seq>
00308 void Query::storein_sequence(Seq& seq, parms& p, query_reset r)
00309 {
00310 r = parsed.size() ? DONT_RESET : RESET_QUERY;
00311 mysql->storein_sequence(seq, str(p, r));
00312 }
00313
00314 template<class Set>
00315 void Query::storein_set(Set& sett, parms& p, query_reset r)
00316 {
00317 r = parsed.size() ? DONT_RESET : RESET_QUERY;
00318 mysql->storein_set(sett, str(p, r));
00319 }
00320
00321 template<class Sequence>
00322 void Query::storein_sequence(Sequence& seq, const char *s)
00323 {
00324 mysql->storein_sequence(seq, s);
00325 }
00326
00327 template<class Set>
00328 void Query::storein_set(Set& sett, const char *s)
00329 {
00330 mysql->storein_set(sett, s);
00331 }
00332
00333 template<class T>
00334 void Query::storein(T& con, parms& p, query_reset r)
00335 {
00336 r = parsed.size() ? DONT_RESET : RESET_QUERY;
00337 mysql->storein(con, str(p, r));
00338 }
00339
00340 template<class T>
00341 void Query::storein(T& con, const char *s)
00342 {
00343 mysql->storein(con, s);
00344 }
00345
00347
00348 }
00349
00350 #endif
00351