summaryrefslogtreecommitdiff
path: root/libodbcpp/param.h
blob: 53ace6780ea4212eac46ae0f1d20151992ff7886 (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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#ifndef ODBC_PARAM_H
#define ODBC_PARAM_H

#include <malloc.h>
#include <sqlext.h>
#include <glibmm/ustring.h>
#include "bind.h"
#include <boost/date_time/posix_time/posix_time_types.hpp>

namespace ODBC {
	class Command;
	class Param : public virtual Bind {
		public:
			Param();
			Param(Command *, unsigned int idx);
			virtual	~Param() = 0;
			void bind() const;

			virtual SQLSMALLINT stype() const = 0; // The SQL type ID
			virtual SQLINTEGER dp() const = 0; // The decimal place count
			virtual const void * dataAddress() const = 0; // The address of the data

		protected:
			friend class Column;
			mutable Command * paramCmd;
			mutable unsigned int paramIdx;
			mutable bool paramBound;				// Has SqlBind(...) been called since last change of address?
			SQLLEN dataLength;
	};

	class BooleanParam : public Param {
		public:
			BooleanParam() : Param() { }
			BooleanParam(Command * c, unsigned int i) : Param(c, i) { bindLen = size(); }
			virtual SQLSMALLINT ctype() const { return SQL_C_BIT; }
			virtual SQLSMALLINT stype() const { return SQL_C_BIT; }
			virtual SQLULEN size() const { return sizeof(SQLINTEGER); }
			virtual SQLINTEGER dp() const { return 0; }
			virtual const void * dataAddress() const { return &data; }
			void operator=(const SQLINTEGER & d) { data = d; }
		protected:
			SQLINTEGER data;
	};
	class SignedIntegerParam : public Param {
		public:
			SignedIntegerParam() : Param() { }
			SignedIntegerParam(Command * c, unsigned int i) : Param(c, i) { bindLen = size(); }
			virtual SQLSMALLINT ctype() const { return SQL_C_LONG; }
			virtual SQLSMALLINT stype() const { return SQL_C_LONG; }
			virtual SQLULEN size() const { return sizeof(SQLINTEGER); }
			virtual SQLINTEGER dp() const { return 0; }
			virtual const void * dataAddress() const { return &data; }
			void operator=(const SQLINTEGER & d) { data = d; }
		protected:
			SQLINTEGER data;
	};
	class UnsignedIntegerParam : public Param {
		public:
			UnsignedIntegerParam() : Param() { }
			UnsignedIntegerParam(Command * c, unsigned int i) : Param(c, i) { bindLen = size(); }
			virtual SQLSMALLINT ctype() const { return SQL_C_ULONG; }
			virtual SQLSMALLINT stype() const { return SQL_C_ULONG; }
			virtual SQLULEN size() const { return sizeof(SQLUINTEGER); }
			virtual SQLINTEGER dp() const { return 0; }
			virtual const void * dataAddress() const { return &data; }
			void operator=(const SQLUINTEGER & d) { data = d; }
		protected:
			SQLUINTEGER data;
	};
	class FloatingPointParam : public Param {
		public:
			FloatingPointParam() : Param() { }
			FloatingPointParam(Command * c, unsigned int i) : Param(c, i) { bindLen = size(); }
			virtual SQLSMALLINT ctype() const { return SQL_C_DOUBLE; }
			virtual SQLSMALLINT stype() const { return SQL_C_DOUBLE; }
			virtual SQLULEN size() const { return sizeof(SQLDOUBLE); }
			virtual SQLINTEGER dp() const { return 10; }
			virtual const void * dataAddress() const { return &data; }
			void operator=(const SQLDOUBLE & d) { data = d; }
		protected:
			SQLDOUBLE data;
	};
	class GlibUstringParam : public Param {
		public:
			GlibUstringParam() : Param() { }
			GlibUstringParam(Command * c, unsigned int i) : Param(c, i) { bindLen = size(); }
			virtual SQLSMALLINT ctype() const { return SQL_C_CHAR; }
			virtual SQLSMALLINT stype() const { return SQL_CHAR; }
			virtual SQLULEN size() const { return data.bytes(); }
			virtual SQLINTEGER dp() const { return 0; }
			virtual const void * dataAddress() const { return data.data(); }
			void operator=(const Glib::ustring & d);
		protected:
			Glib::ustring data;
	};
	class IntervalParam : public Param {
		public:
			IntervalParam() : Param() { }
			IntervalParam(Command * c, unsigned int i) : Param(c, i) { bindLen = size(); }
			virtual SQLSMALLINT ctype() const { return SQL_C_INTERVAL_DAY_TO_SECOND; }
			virtual SQLSMALLINT stype() const { return SQL_INTERVAL; }
			virtual SQLULEN size() const { return sizeof(SQL_INTERVAL); }
			virtual SQLINTEGER dp() const { return boost::posix_time::time_res_traits::num_fractional_digits(); }
			virtual const void * dataAddress() const { return &data; }
			void operator=(const boost::posix_time::time_duration & d);
		protected:
			SQL_INTERVAL_STRUCT data;
	};
	class TimeStampParam : public Param {
		public:
			TimeStampParam() : Param() { }
			TimeStampParam(Command * c, unsigned int i) : Param(c, i) { bindLen = size(); }
			virtual SQLSMALLINT ctype() const { return SQL_C_TYPE_TIMESTAMP; }
			virtual SQLSMALLINT stype() const { return SQL_TYPE_TIMESTAMP; }
			virtual SQLULEN size() const { return sizeof(SQL_TIMESTAMP_STRUCT); }
			virtual SQLINTEGER dp() const { return boost::posix_time::time_res_traits::num_fractional_digits(); }
			virtual const void * dataAddress() const { return &data; }
			void operator=(const boost::posix_time::ptime & d);
		protected:
			SQL_TIMESTAMP_STRUCT data;
	};
	class NullParam : public Param {
		public:
			NullParam() : Param() { }
			NullParam(Command * c, unsigned int i) : Param(c, i) { bindLen = SQL_NULL_DATA; }
			virtual SQLSMALLINT ctype() const { return SQL_C_LONG; }
			virtual SQLSMALLINT stype() const { return SQL_C_LONG; }
			virtual SQLULEN size() const { return 0; }
			virtual SQLINTEGER dp() const { return 0; }
			virtual const void * dataAddress() const { return NULL; }
	};
}

#endif