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 #ifndef RESOURCEPOOL_MYSQL_SQLTYPE_HH
00026 #define RESOURCEPOOL_MYSQL_SQLTYPE_HH
00027
00028 #include <iostream>
00029
00030 #include "mm/gc_ptr.hh"
00031
00032 namespace fatalmind {
00033 namespace mysql {
00034
00035 class SQLType: public usg_cnt_t<DefaultThreadedModel> {
00036 public:
00037 SQLType(bool nul = false)
00038 : _nul(nul)
00039 {
00040 }
00041 virtual ~SQLType()
00042 {
00043 }
00044
00045 virtual bool needsquote() const = 0;
00046 virtual void outputoperator(std::ostream&) const = 0;
00047 void setnull(bool nul = true) {
00048 _nul = nul;
00049 };
00050 bool isnull() const throw() {
00051 return _nul;
00052 }
00053
00054 private:
00055 bool _nul;
00056 };
00057
00058 template<typename T>
00059 class SQLTypeImpl: public SQLType
00060 {
00061 public:
00062 SQLTypeImpl<T>(const T& val, const bool nul = true);
00063 virtual ~SQLTypeImpl<T>();
00064
00065 virtual bool needsquote() const;
00066 virtual void outputoperator(std::ostream&) const;
00067
00068 private:
00069 T _val;
00070 };
00071
00072 class SQLRefType: public usg_cnt_t<DefaultThreadedModel> {
00073 public:
00074 virtual ~SQLRefType() {
00075 }
00076
00077 virtual void assign(const char*, const int len) = 0;
00078 protected:
00079 const void* _valptr;
00080 };
00081
00082 template<typename T>
00083 class SQLRefTypeImpl: public SQLRefType
00084 {
00085 public:
00086 SQLRefTypeImpl<T>(T& val, bool& isnull);
00087 virtual ~SQLRefTypeImpl<T>();
00088 virtual void assign(const char*, const int len);
00089 private:
00090 T& val;
00091 bool& isnull;
00092 };
00093
00094 inline std::ostream& operator<<(std::ostream& os, const SQLType& val)
00095 {
00096 val.outputoperator(os);
00097 return os;
00098 }
00099
00100 }
00101 }
00102 #endif