result1.hh
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:7k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #ifndef __result1_hh__
  2. #define __result1_hh__
  3. #include <map>
  4. #include <set>
  5. #include <string>
  6. using namespace std;
  7. #include <mysql.h>
  8. #include "define_short.h"
  9. #include "field_names1.hh"
  10. #include "row1.hh"
  11. #include "resiter1.hh"
  12. #include "field_types1.hh"
  13. #include "fields1.hh"
  14. #include "bad_query.hh"
  15. class ResUse
  16. {
  17.   friend Connection;
  18. protected:
  19.   Connection            *mysql;
  20.   mutable MYSQL_RES     *mysql_res;
  21.   bool                  throw_exceptions, initialized;
  22.   mutable FieldNames    *_names;
  23.   mutable FieldTypes    *_types;
  24.   Fields                _fields;
  25.   string                _table;
  26.   void copy(const ResUse& other);
  27.  public:
  28.   ResUse () : mysql(0), mysql_res(0), throw_exceptions(false),initialized(false), _names(NULL), _types(NULL), _fields(this) {}
  29.   ResUse (MYSQL_RES *result, Connection *m = NULL, bool te = false);
  30.   ResUse (const ResUse &other) {copy(other);}
  31.   inline ResUse& operator = (const ResUse &other);
  32.   MYSQL_RES *mysql_result (void) {return mysql_res;}
  33.   /* raw mysql c api functions */
  34.   Row  fetch_row() ;
  35.   bool eof () const {return mysql_eof(mysql_res);}
  36.   long unsigned int *fetch_lengths () const {return mysql_fetch_lengths(mysql_res);}
  37.   Field&  fetch_field () const   {return *mysql_fetch_field(mysql_res);}
  38.   //-----------------------
  39.   void  field_seek (int field)
  40.   {
  41.        mysql_field_seek(mysql_res, field);
  42.   }
  43.   //-------------------------
  44.   unsigned int num_fields() const ;
  45.   ~ResUse ();
  46.   void parent_leaving() {mysql = NULL;}
  47.   void purge(void);
  48.   operator bool() const {if (mysql_res) return true; return false;} //:
  49.   unsigned int columns() const {return num_fields();} //:
  50.   string& table() {return _table;}
  51.   //: table name
  52.   const string& table() const {return _table;}
  53.   //: table name
  54.   /* methods for working with field names */
  55.   inline int               field_num(const string&) const;
  56.   //: Returns the offset of the filed which equals str.
  57.   inline string&           field_name(int);
  58.   //: Returns the field with an offset of i.
  59.   inline const string&     field_name(int) const;
  60.   //: Returns the field with an offset of i.
  61.   inline FieldNames&       field_names();
  62.   //: Returns a reference to the underlying FieldNames class.
  63.   inline const FieldNames& field_names() const;
  64.   //: Returns a const reference to the underlaying FieldNames class.
  65.   inline void              reset_field_names();
  66.   //: Resets the field names to there original values.
  67.   /* methods for working with field types */
  68.   inline mysql_type_info&  field_type(int i);
  69.   //: Returns a reference to the  mysql field type for the field with an offset of i.
  70.   inline const mysql_type_info& field_type(int) const;
  71.   //: Returns a const reference to the  mysql field type for the field with an offset of i.
  72.   inline FieldTypes&       field_types();
  73.   //: Returns a reference to the underlying FieldTypes
  74.   inline const FieldTypes& field_types() const;
  75.   //: Returns a const reference to the underlying FieldTypes
  76.   inline void              reset_field_types();
  77.   //: Resets the field_types to their original values.
  78.   /* short names for the above methods */
  79.   inline int               names(const string& s) const;
  80.   //: Returns the offset of the filed which equals str.
  81.   inline string&           names(int i);
  82.   //: Returns the field with an offset of i.
  83.   inline const string&     names(int i) const;
  84.   //: Returns the field with an offset of i.
  85.   inline FieldNames&       names();
  86.   //: Returns a reference to the underlying FieldNames class.
  87.   inline const FieldNames& names() const;
  88.   //: Returns a const reference to the underlying FieldNames class.
  89.   inline void              reset_names();
  90.   //: Resets the field names to their original values.
  91.   inline mysql_type_info&  types(int i);
  92.   //: Returns a reference to the  mysql field type for the field with an offset of i.
  93.   inline const mysql_type_info& types(int i) const;
  94.   //: Returns a const reference to the mysql field type for the field with an offset of i.
  95.   inline FieldTypes&       types();
  96.   //: Returns a reference to the underlying FieldTypes
  97.   inline const FieldTypes& types() const;
  98.   //: Returns a const reference to the underlying FieldTypes
  99.   inline void              reset_types();
  100.   //: Resets the field_types to their original values.
  101.   /* methods for working with field info */
  102.   const Fields&     fields() const {return _fields;}
  103.   //: returns a reference to the underling Fields structure.
  104.   const Field&      fields(unsigned int i) const {return _fields[i];}
  105.   //: returns a reference to the the mysql field info for a field with an offset of i.
  106.   bool     operator == (const ResUse &other) const
  107.     {return mysql_res == other.mysql_res;}
  108.   //:
  109.   bool     operator != (const ResUse &other) const
  110.     {return mysql_res != other.mysql_res;}
  111.   //:
  112. };
  113. //---------------------------------------------------------------------------
  114. //: This class handles the result set.
  115. // It is also a Random Access Container that is not LessThanComparable
  116. // and not Assignable. Being a Random Access Container it can
  117. // return a Random Access Iterator or a reverse Random Access Iterator
  118. // yet.
  119. //
  120. class Result : public ResUse,
  121.        public const_subscript_container<Result,Row,const Row>
  122. {
  123.   friend Connection;
  124. public:
  125.   Result () {} //:
  126.   Result (MYSQL_RES *result, bool te = false)
  127.     : ResUse(result, NULL, te) {mysql = NULL;} //:
  128.   Result (const Result &other) : ResUse(other) {mysql = NULL;} //:
  129.   virtual ~Result() {}
  130.   // raw mysql c api functions
  131.   const Row fetch_row() const
  132.   {
  133.   if (!mysql_res) {  if (throw_exceptions) throw BadQuery("Results not fetched");
  134.     else return Row();}
  135.     MYSQL_ROW row = mysql_fetch_row(mysql_res);
  136.     unsigned int* length = (unsigned int*) mysql_fetch_lengths(mysql_res);
  137.   if (!row || !length) {  if (throw_exceptions) throw BadQuery("Bad row");
  138.     else return Row();}
  139.     return Row(row, this, length, throw_exceptions);
  140.   }
  141.   //: Raw c api function
  142.   int          num_rows() const {return mysql_num_rows(mysql_res);}
  143.   //: Raw c api function
  144.   void         data_seek (uint offset) const
  145.     {mysql_data_seek(mysql_res, offset);}
  146.   //: Raw c api function
  147.   size_type size() const {return num_rows();}
  148.   //: Returns the number of rows
  149.   size_type rows() const {return num_rows();}
  150.   //: Returns the number of rows.
  151.   const Row operator [] (size_type i) const {data_seek(i); return fetch_row();}
  152.   //: Returns the row with an offset of i.
  153. };
  154. //-------------------------------------------------------------------------
  155. inline void swap (ResUse &x, ResUse &y)
  156. {
  157.   ResUse tmp = x;
  158.   x = y;
  159.   y = tmp;
  160. }
  161. //-------------------------------------------------------------------------
  162. inline void swap (Result &x, Result &y) {
  163.   Result tmp = x;
  164.   x = y;
  165.   y = tmp;
  166. }
  167. //--------------------------------------------------------------------------
  168. //: This structure holds the information on the success of queries that
  169. //: don't return any results.
  170. struct ResNSel
  171. {
  172.   bool     success;
  173.   int      insert_id; //:
  174.   int      rows;      //: Number of rows affected
  175.   string   info;      //: Additional info
  176.   ResNSel() : success(false) {};
  177.   ResNSel (Connection *q);
  178.   operator bool() {return success;}  //: If the query was successful
  179. };
  180. //--------------------------------------------------------------------------
  181. #endif