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 #if !defined(MYSQLPP_ROW_H)
00029 #define MYSQLPP_ROW_H
00030
00031 #include "common.h"
00032
00033 #include "mystring.h"
00034 #include "noexceptions.h"
00035 #include "refcounted.h"
00036 #include "vallist.h"
00037
00038 #include <vector>
00039 #include <string>
00040
00041 namespace mysqlpp {
00042
00043 #if !defined(DOXYGEN_IGNORE)
00044
00045 class FieldNames;
00046 class MYSQLPP_EXPORT ResultBase;
00047 #endif
00048
00062
00063 class MYSQLPP_EXPORT Row : public OptionalExceptions
00064 {
00065 private:
00070 typedef bool Row::*private_bool_type;
00071
00072 public:
00077 typedef std::vector<String> list_type;
00078
00080 typedef list_type::const_iterator const_iterator;
00081
00083 typedef list_type::const_reference const_reference;
00084
00086 typedef list_type::const_reverse_iterator const_reverse_iterator;
00087
00089 typedef list_type::difference_type difference_type;
00090
00097 typedef const_iterator iterator;
00098
00102 typedef const_reference reference;
00103
00108 typedef const_reverse_iterator reverse_iterator;
00109
00111 typedef list_type::size_type size_type;
00112
00114 typedef list_type::value_type value_type;
00115
00117 Row() :
00118 initialized_(false)
00119 {
00120 }
00121
00123 Row(const Row& r) :
00124 OptionalExceptions(),
00125 data_(r.data_.begin(), r.data_.end()),
00126 field_names_(r.field_names_),
00127 initialized_(r.initialized_)
00128 {
00129 }
00130
00137 Row(MYSQL_ROW row, const ResultBase* res,
00138 const unsigned long* lengths, bool te = true);
00139
00141 ~Row() { }
00142
00147 const_reference at(size_type i) const;
00148
00150 const_reference back() const { return data_.back(); }
00151
00154 const_iterator begin() const { return data_.begin(); }
00155
00157 bool empty() const { return data_.empty(); }
00158
00161 const_iterator end() const { return data_.end(); }
00162
00168 equal_list_ba<FieldNames, Row, quote_type0>
00169 equal_list(const char* d = ",", const char* e = " = ") const;
00170
00191 template <class Manip>
00192 equal_list_ba<FieldNames, Row, Manip> equal_list(const char* d,
00193 const char* e, Manip m) const;
00194
00199 value_list_ba<FieldNames, do_nothing_type0>
00200 field_list(const char* d = ",") const;
00201
00208 template <class Manip>
00209 value_list_ba<FieldNames, Manip> field_list(const char* d,
00210 Manip m) const;
00211
00220 template <class Manip>
00221 value_list_b<FieldNames, Manip> field_list(const char* d, Manip m,
00222 const std::vector<bool>& vb) const;
00223
00233 value_list_b<FieldNames, quote_type0> field_list(
00234 const char* d, const std::vector<bool>& vb) const;
00235
00243 value_list_b<FieldNames, quote_type0> field_list(
00244 const std::vector<bool>& vb) const;
00245
00253 template <class Manip>
00254 value_list_b<FieldNames, Manip> field_list(const char *d, Manip m,
00255 bool t0,
00256 bool t1 = false, bool t2 = false, bool t3 = false,
00257 bool t4 = false, bool t5 = false, bool t6 = false,
00258 bool t7 = false, bool t8 = false, bool t9 = false,
00259 bool ta = false, bool tb = false, bool tc = false) const;
00260
00268 value_list_b<FieldNames, quote_type0> field_list(
00269 const char *d, bool t0,
00270 bool t1 = false, bool t2 = false, bool t3 = false,
00271 bool t4 = false, bool t5 = false, bool t6 = false,
00272 bool t7 = false, bool t8 = false, bool t9 = false,
00273 bool ta = false, bool tb = false, bool tc = false) const;
00274
00281 value_list_b<FieldNames, quote_type0> field_list(
00282 bool t0,
00283 bool t1 = false, bool t2 = false, bool t3 = false,
00284 bool t4 = false, bool t5 = false, bool t6 = false,
00285 bool t7 = false, bool t8 = false, bool t9 = false,
00286 bool ta = false, bool tb = false, bool tc = false) const;
00287
00289 size_type field_num(const char* name) const;
00290
00292 const_reference front() const { return data_.front(); }
00293
00296 size_type max_size() const { return data_.max_size(); }
00297
00299 Row& operator =(const Row& rhs)
00300 {
00301 data_.assign(rhs.data_.begin(), rhs.data_.end());
00302 field_names_.assign(rhs.field_names_);
00303 initialized_ = rhs.initialized_;
00304 return *this;
00305 }
00306
00314 const_reference operator [](const char* field) const;
00315
00327 const_reference operator [](int i) const
00328 { return at(static_cast<size_type>(i)); }
00329
00347 operator private_bool_type() const
00348 {
00349 return data_.size() && initialized_ ? &Row::initialized_ : 0;
00350 }
00351
00354 const_reverse_iterator rbegin() const { return data_.rbegin(); }
00355
00358 const_reverse_iterator rend() const { return data_.rend(); }
00359
00361 size_type size() const { return data_.size(); }
00362
00371 template <class Manip>
00372 value_list_ba<Row, Manip> value_list(const char* d = ",",
00373 Manip m = quote) const
00374 {
00375 return value_list_ba<Row, Manip>(*this, d, m);
00376 }
00377
00384 template <class Manip>
00385 value_list_b<Row, Manip> value_list(const char *d,
00386 const std::vector<bool>& vb, Manip m = quote) const
00387 {
00388 return value_list_b<Row, Manip>(*this, vb, d, m);
00389 }
00390
00398 value_list_b<Row, quote_type0> value_list(
00399 const std::vector<bool> &vb) const
00400 {
00401 return value_list_b<Row, quote_type0>(*this, vb, ",", quote);
00402 }
00403
00410 template <class Manip>
00411 value_list_b<Row, Manip> value_list(const char *d, Manip m,
00412 bool t0, bool t1 = false, bool t2 = false, bool t3 = false,
00413 bool t4 = false, bool t5 = false, bool t6 = false,
00414 bool t7 = false, bool t8 = false, bool t9 = false,
00415 bool ta = false, bool tb = false, bool tc = false) const
00416 {
00417 std::vector<bool> vb;
00418 create_vector(size(), vb, t0, t1, t2, t3, t4, t5, t6,
00419 t7, t8, t9, ta, tb, tc);
00420 return value_list_b<Row, Manip>(*this, vb, d, m);
00421 }
00422
00429 value_list_b <Row, quote_type0>
00430 value_list(const char *d, bool t0, bool t1 = false, bool t2 = false,
00431 bool t3 = false, bool t4 = false, bool t5 = false,
00432 bool t6 = false, bool t7 = false, bool t8 = false,
00433 bool t9 = false, bool ta = false, bool tb = false,
00434 bool tc = false) const
00435 {
00436 std::vector<bool> vb;
00437 create_vector(size(), vb, t0, t1, t2, t3, t4, t5, t6,
00438 t7, t8, t9, ta, tb, tc);
00439 return value_list_b<Row, quote_type0>(*this, vb, d, quote);
00440 }
00441
00448 value_list_b<Row, quote_type0> value_list(bool t0,
00449 bool t1 = false, bool t2 = false, bool t3 = false,
00450 bool t4 = false, bool t5 = false, bool t6 = false,
00451 bool t7 = false, bool t8 = false, bool t9 = false,
00452 bool ta = false, bool tb = false, bool tc = false) const
00453 {
00454 std::vector<bool> vb;
00455 create_vector(size(), vb, t0, t1, t2, t3, t4, t5, t6,
00456 t7, t8, t9, ta, tb, tc);
00457 return value_list_b<Row, quote_type0>(*this, vb, ",", quote);
00458 }
00459
00466 template <class Manip>
00467 value_list_b<Row, Manip> value_list(const char *d, Manip m,
00468 std::string s0, std::string s1 = "", std::string s2 = "",
00469 std::string s3 = "", std::string s4 = "",
00470 std::string s5 = "", std::string s6 = "",
00471 std::string s7 = "", std::string s8 = "",
00472 std::string s9 = "", std::string sa = "",
00473 std::string sb = "", std::string sc = "") const
00474 {
00475 std::vector<bool> vb;
00476 create_vector(*this, vb, s0, s1, s2, s3, s4, s5, s6, s7, s8,
00477 s9, sa, sb, sc);
00478 return value_list_b<Row, Manip>(*this, vb, d, m);
00479 }
00480
00487 value_list_b<Row, quote_type0> value_list(
00488 const char *d,
00489 std::string s0, std::string s1 = "", std::string s2 = "",
00490 std::string s3 = "", std::string s4 = "",
00491 std::string s5 = "", std::string s6 = "",
00492 std::string s7 = "", std::string s8 = "",
00493 std::string s9 = "", std::string sa = "",
00494 std::string sb = "", std::string sc = "") const
00495 {
00496 std::vector<bool> vb;
00497 create_vector(*this, vb, s0, s1, s2, s3, s4, s5, s6, s7, s8,
00498 s9, sa, sb, sc);
00499 return value_list_b<Row, quote_type0>(*this, vb, d, quote);
00500 }
00501
00508 value_list_b<Row, quote_type0> value_list(
00509 std::string s0,
00510 std::string s1 = "", std::string s2 = "",
00511 std::string s3 = "", std::string s4 = "",
00512 std::string s5 = "", std::string s6 = "",
00513 std::string s7 = "", std::string s8 = "",
00514 std::string s9 = "", std::string sa = "",
00515 std::string sb = "", std::string sc = "") const
00516 {
00517 std::vector<bool> vb;
00518 create_vector(*this, vb, s0, s1, s2, s3, s4, s5, s6, s7, s8,
00519 s9, sa, sb, sc);
00520 return value_list_b<Row, quote_type0>(*this, vb, ",", quote);
00521 }
00522
00523 private:
00524 list_type data_;
00525 RefCountedPointer<FieldNames> field_names_;
00526 bool initialized_;
00527 };
00528
00529 }
00530
00531 #endif // !defined(MYSQLPP_ROW_H)