summaryrefslogtreecommitdiff
path: root/libodbcpp/column.h
blob: e981a145e94ead7e12a857b76bfe3397cdc3ba5a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#ifndef ODBC_COLUMN_H
#define ODBC_COLUMN_H

#include "../libdbpp/column.h"
#include <typeinfo>
#include <glibmm/ustring.h>
#include <algorithm>
#include "bind.h"
#include "param.h"

namespace ODBC {
	class SelectCommand;
	class Column : public virtual Bind, public virtual DB::Column {
		public:
			Column(SelectCommand *, const Glib::ustring & s, unsigned int i);
			virtual ~Column() = 0;
			void bind();
			virtual void * rwDataAddress() = 0;
			void rebind(DB::Command *, unsigned int idx) const;
			virtual bool resize();

			virtual operator int () const { throw std::bad_cast(); }
			virtual operator long () const { throw std::bad_cast(); }
			virtual operator long long () const { throw std::bad_cast(); }
			virtual operator unsigned int () const { throw std::bad_cast(); }
			virtual operator unsigned long () const { throw std::bad_cast(); }
			virtual operator unsigned long long () const { throw std::bad_cast(); }

			virtual operator double () const { throw std::bad_cast(); }
			virtual operator float () const { throw std::bad_cast(); }

			virtual operator std::string () const { throw std::bad_cast(); }
			virtual operator Glib::ustring () const { throw std::bad_cast(); }

			virtual operator struct tm () const { throw std::bad_cast(); }
			virtual operator SQL_TIMESTAMP_STRUCT () const { throw std::bad_cast(); }

			bool isNull() const;
			virtual void apply(DB::HandleField &) const = 0;

			const SelectCommand *	selectCmd;
		protected:
			virtual const Param * meAsAParam() const = 0;
	};
	class CharArrayColumn : public Column, public Param {
		public:
			typedef std::vector<char> CharArray;
			CharArrayColumn(SelectCommand * sc, const Glib::ustring & n, unsigned int i, SQLULEN sizeHint) :
				DB::Column(n, i),
				Column(sc, n, i)
			{
				data.resize(std::max<SQLULEN>(sizeHint, 64) + 1);
			}
			virtual SQLSMALLINT ctype() const { return SQL_C_CHAR; }
			virtual SQLSMALLINT stype() const { return SQL_CHAR; }
			virtual SQLULEN size() const { return data.size(); }
			virtual SQLINTEGER dp() const { return 0; }
			virtual const void * dataAddress() const { return &data.front(); }
			virtual void * rwDataAddress() { return &data.front(); }
			void operator=(const Glib::ustring & d);
			bool resize();
			virtual operator std::string () const { return std::string(&data.front(), bindLen); }
			virtual operator Glib::ustring () const { return std::string(&data.front(), bindLen); }
			virtual void apply(DB::HandleField &) const;
		protected:
			virtual const Param * meAsAParam() const { return this; }
			CharArray data;
	};
	class SignedIntegerColumn : public Column, public SignedIntegerParam {
		public:
			SignedIntegerColumn(SelectCommand * sc, const Glib::ustring & n, unsigned int i) :
				DB::Column(n, i),
				Column(sc, n, i) { }
			virtual SQLSMALLINT ctype() const { return SignedIntegerParam::ctype(); }
			virtual SQLULEN size() const { return SignedIntegerParam::size(); }
			virtual void * rwDataAddress() { return &data; }
			virtual operator int () const { return data; }
			virtual operator long () const { return data; }
			virtual operator long long () const { return data; }
			virtual const Param * meAsAParam() const { return this; }
			virtual void apply(DB::HandleField &) const;
	};
#ifdef COMPLETENESS
	class UnsignedIntegerColumn : public Column, public UnsignedIntegerParam {
		public:
			UnsignedIntegerColumn(SelectCommand * sc, const Glib::ustring & n, unsigned int i) :
				Column(sc, n, i) { }
			virtual const Param * meAsAParam() const { return this; }
	};
#endif
	class FloatingPointColumn : public Column, public FloatingPointParam {
		public:
			FloatingPointColumn(SelectCommand * sc, const Glib::ustring & n, unsigned int i) :
				DB::Column(n, i),
				Column(sc, n, i) { }
			virtual SQLSMALLINT ctype() const { return FloatingPointParam::ctype(); }
			virtual SQLULEN size() const { return FloatingPointParam::size(); }
			virtual void * rwDataAddress() { return &data; }
			virtual operator double () const { return data; }
			virtual operator float () const { return data; }
			virtual const Param * meAsAParam() const { return this; }
			virtual void apply(DB::HandleField &) const;
	};
	class TimeStampColumn : public Column, public TimeStampParam {
		public:
			TimeStampColumn(SelectCommand * sc, const Glib::ustring & n, unsigned int i) :
				DB::Column(n, i),
				Column(sc, n, i) { }
			virtual SQLSMALLINT ctype() const { return TimeStampParam::ctype(); }
			virtual SQLULEN size() const { return TimeStampParam::size(); }
			virtual void * rwDataAddress() { return &data; }
			virtual operator struct tm () const;
			virtual operator SQL_TIMESTAMP_STRUCT () const { return data; }
			virtual const Param * meAsAParam() const { return this; }
			virtual void apply(DB::HandleField &) const;
	};
}

#endif