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
|
#include "column.h"
#include "selectcommand.h"
#include "error.h"
#include <string.h>
MySQL::ColumnBase::ColumnBase(const char * name, unsigned int i) :
DB::Column(name, i)
{
}
bool
MySQL::ColumnBase::isNull() const
{
return is_null;
}
void
MySQL::ColumnBase::rebind(DB::Command *, unsigned int) const
{
throw Error("Not supported");
}
MySQL::StringColumn::StringColumn(const char * name, unsigned int field, MYSQL_BIND * b, unsigned int len) :
ColumnBase(name, field),
value(new char[len])
{
b->is_null = &is_null;
b->buffer_type = MYSQL_TYPE_STRING;
b->is_unsigned = 0;
b->buffer = value;
b->buffer_length = len;
b->length = &length;
}
MySQL::StringColumn::~StringColumn()
{
delete[] value;
}
void
MySQL::StringColumn::apply(DB::HandleField & h) const
{
if (is_null) {
h.null();
}
else {
h.string(value, length);
}
}
MySQL::NullColumn::NullColumn(const char * name, unsigned int field, MYSQL_BIND * b) :
ColumnBase(name, field)
{
b->is_null = &is_null;
b->buffer_type = MYSQL_TYPE_NULL;
b->buffer = NULL;
b->buffer_length = 0;
}
void
MySQL::NullColumn::apply(DB::HandleField & h) const
{
h.null();
}
namespace MySQL {
template <class T, enum_field_types MT> Column<T, MT>::Column(const char * name, unsigned int field, MYSQL_BIND * b) :
ColumnBase(name, field)
{
b->is_null = &is_null;
b->buffer_type = MT;
b->is_unsigned = 0;
b->buffer = &value;
b->buffer_length = sizeof(T);
}
template <> void Column<int64_t, MYSQL_TYPE_LONGLONG>::apply(DB::HandleField & h) const
{
if (is_null) {
h.null();
}
else {
h.integer(value);
}
}
template <> void Column<double, MYSQL_TYPE_DOUBLE>::apply(DB::HandleField & h) const
{
if (is_null) {
h.null();
}
else {
h.floatingpoint(value);
}
}
template <> void Column<MYSQL_TIME, MYSQL_TYPE_DATETIME>::apply(DB::HandleField & h) const
{
if (is_null) {
h.null();
}
else {
struct tm tm;
memset(&tm, 0, sizeof(tm));
tm.tm_year = value.year - 1900;
tm.tm_mon = value.month - 1;
tm.tm_mday = value.day;
tm.tm_hour = value.hour;
tm.tm_min = value.minute;
tm.tm_sec = value.second;
h.timestamp(tm);
}
}
template class Column<int64_t, MYSQL_TYPE_LONGLONG>;
template class Column<double, MYSQL_TYPE_DOUBLE>;
template class Column<MYSQL_TIME, MYSQL_TYPE_DATETIME>;
}
|