@@ -44,78 +44,79 @@ namespace mysql
44
44
45
45
struct st_buffer_size_type
46
46
{
47
- char * buffer;
48
- size_t size;
49
- enum_field_types type;
50
- st_buffer_size_type (char * b, size_t s, enum_field_types t) : buffer(b), size(s), type(t) {}
47
+ char * buffer;
48
+ size_t size;
49
+ enum_field_types type;
50
+ st_buffer_size_type (char * b, size_t s, enum_field_types t) : buffer(b), size(s), type(t) {}
51
51
};
52
52
53
53
54
54
/* {{{ allocate_buffer_for_field() -I- */
55
55
typedef std::pair<char *, size_t > BufferSizePair;
56
56
static struct st_buffer_size_type
57
- allocate_buffer_for_field (const MYSQL_FIELD * const field)
57
+ allocate_buffer_for_field (const MYSQL_FIELD * const field)
58
58
{
59
- switch (field->type ) {
60
- case MYSQL_TYPE_NULL:
61
- return st_buffer_size_type (NULL , 0 , field->type );
62
- case MYSQL_TYPE_TINY:
63
- return st_buffer_size_type (new char [1 ], 1 , field->type );
64
- case MYSQL_TYPE_SHORT:
65
- return st_buffer_size_type (new char [2 ], 2 , field->type );
66
- case MYSQL_TYPE_INT24:
67
- case MYSQL_TYPE_LONG:
68
- case MYSQL_TYPE_FLOAT:
69
- return st_buffer_size_type (new char [4 ], 4 , field->type );
70
- case MYSQL_TYPE_DOUBLE:
71
- case MYSQL_TYPE_LONGLONG:
72
- return st_buffer_size_type (new char [8 ], 8 , field->type );
73
- case MYSQL_TYPE_YEAR:
74
- return st_buffer_size_type (new char [2 ], 2 , MYSQL_TYPE_SHORT);
75
- case MYSQL_TYPE_TIMESTAMP:
76
- case MYSQL_TYPE_DATE:
77
- case MYSQL_TYPE_TIME:
78
- case MYSQL_TYPE_DATETIME:
79
- return st_buffer_size_type (new char [sizeof (MYSQL_TIME)], sizeof (MYSQL_TIME), field->type );
80
-
81
-
82
- case MYSQL_TYPE_TINY_BLOB:
83
- case MYSQL_TYPE_MEDIUM_BLOB:
84
- case MYSQL_TYPE_LONG_BLOB:
85
- case MYSQL_TYPE_BLOB:
86
- case MYSQL_TYPE_STRING:
87
- case MYSQL_TYPE_VAR_STRING:
59
+ switch (field->type )
60
+ {
61
+ case MYSQL_TYPE_NULL:
62
+ return st_buffer_size_type (NULL , 0 , field->type );
63
+ case MYSQL_TYPE_TINY:
64
+ return st_buffer_size_type (new char [1 ], 1 , field->type );
65
+ case MYSQL_TYPE_SHORT:
66
+ return st_buffer_size_type (new char [2 ], 2 , field->type );
67
+ case MYSQL_TYPE_INT24:
68
+ case MYSQL_TYPE_LONG:
69
+ case MYSQL_TYPE_FLOAT:
70
+ return st_buffer_size_type (new char [4 ], 4 , field->type );
71
+ case MYSQL_TYPE_DOUBLE:
72
+ case MYSQL_TYPE_LONGLONG:
73
+ return st_buffer_size_type (new char [8 ], 8 , field->type );
74
+ case MYSQL_TYPE_YEAR:
75
+ return st_buffer_size_type (new char [2 ], 2 , MYSQL_TYPE_SHORT);
76
+ case MYSQL_TYPE_TIMESTAMP:
77
+ case MYSQL_TYPE_DATE:
78
+ case MYSQL_TYPE_TIME:
79
+ case MYSQL_TYPE_DATETIME:
80
+ return st_buffer_size_type (new char [sizeof (MYSQL_TIME)], sizeof (MYSQL_TIME), field->type );
81
+
82
+
83
+ case MYSQL_TYPE_TINY_BLOB:
84
+ case MYSQL_TYPE_MEDIUM_BLOB:
85
+ case MYSQL_TYPE_LONG_BLOB:
86
+ case MYSQL_TYPE_BLOB:
87
+ case MYSQL_TYPE_STRING:
88
+ case MYSQL_TYPE_VAR_STRING:
88
89
case MYSQL_TYPE_JSON:
89
- return st_buffer_size_type (new char [field->max_length + 1 ], field->max_length + 1 , field->type );
90
+ return st_buffer_size_type (new char [field->max_length + 1 ], field->max_length + 1 , field->type );
90
91
91
- case MYSQL_TYPE_DECIMAL:
92
- case MYSQL_TYPE_NEWDECIMAL:
93
- return st_buffer_size_type (new char [64 ], 64 , field->type );
92
+ case MYSQL_TYPE_DECIMAL:
93
+ case MYSQL_TYPE_NEWDECIMAL:
94
+ return st_buffer_size_type (new char [64 ], 64 , field->type );
94
95
#if A1
95
- case MYSQL_TYPE_TIMESTAMP:
96
- case MYSQL_TYPE_YEAR:
97
- return st_buffer_size_type (new char [10 ], 10 , field->type );
96
+ case MYSQL_TYPE_TIMESTAMP:
97
+ case MYSQL_TYPE_YEAR:
98
+ return st_buffer_size_type (new char [10 ], 10 , field->type );
98
99
#endif
99
100
#if A0
100
- // There two are not sent over the wire
101
- case MYSQL_TYPE_ENUM:
102
- case MYSQL_TYPE_SET:
101
+ // There two are not sent over the wire
102
+ case MYSQL_TYPE_ENUM:
103
+ case MYSQL_TYPE_SET:
103
104
#endif
104
- case MYSQL_TYPE_BIT:
105
- return st_buffer_size_type (new char [8 ], 8 , MYSQL_TYPE_BIT);
106
- case MYSQL_TYPE_GEOMETRY:
107
- default :
108
- // TODO: Andrey, there can be crashes when we go through this. Please fix.
109
- throw sql::InvalidArgumentException (" allocate_buffer_for_field: invalid rbind data type" );
110
- }
105
+ case MYSQL_TYPE_BIT:
106
+ return st_buffer_size_type (new char [8 ], 8 , MYSQL_TYPE_BIT);
107
+ case MYSQL_TYPE_GEOMETRY:
108
+ default :
109
+ // TODO: Andrey, there can be crashes when we go through this. Please fix.
110
+ throw sql::InvalidArgumentException (" allocate_buffer_for_field: invalid rbind data type" );
111
+ }
111
112
}
112
113
/* }}} */
113
114
114
115
115
116
/* {{{ MySQL_ResultBind::MySQL_ResultBind -I- */
116
117
MySQL_ResultBind::MySQL_ResultBind (boost::shared_ptr< NativeAPI::NativeStatementWrapper > & stmt,
117
- boost::shared_ptr< MySQL_DebugLogger > & log)
118
- : num_fields(0 ), is_null(NULL ), err(NULL ), len(NULL ), proxy(stmt), logger(log), rbind(NULL )
118
+ boost::shared_ptr< MySQL_DebugLogger > & log)
119
+ : num_fields(0 ), is_null(NULL ), err(NULL ), len(NULL ), proxy(stmt), logger(log), rbind(NULL )
119
120
{
120
121
}
121
122
/* }}} */
@@ -124,62 +125,62 @@ MySQL_ResultBind::MySQL_ResultBind(boost::shared_ptr< NativeAPI::NativeStatement
124
125
/* {{{ MySQL_ResultBind::~MySQL_ResultBind() -I- */
125
126
MySQL_ResultBind::~MySQL_ResultBind ()
126
127
{
127
- if (rbind.get ()) {
128
- for (unsigned int i = 0 ; i < num_fields; ++i) {
129
- delete[] (char *) rbind[i].buffer ;
130
- }
131
- }
128
+ if (rbind.get ()) {
129
+ for (unsigned int i = 0 ; i < num_fields; ++i) {
130
+ delete[] (char *) rbind[i].buffer ;
131
+ }
132
+ }
132
133
}
133
134
/* }}} */
134
135
135
136
136
137
/* {{{ MySQL_ResultBind::bindResult() -I- */
137
138
void MySQL_ResultBind::bindResult ()
138
139
{
139
- CPP_ENTER (" MySQL_Prepared_Statement::bindResult" );
140
- for (unsigned int i = 0 ; i < num_fields; ++i) {
141
- delete[] (char *) rbind[i].buffer ;
142
- }
143
- rbind.reset (NULL );
144
- is_null.reset (NULL );
145
- err.reset (NULL );
146
- len.reset (NULL );
147
-
148
- num_fields = proxy->field_count ();
149
- if (!num_fields) {
150
- return ;
151
- }
152
-
153
- rbind.reset (new MYSQL_BIND[num_fields]);
154
- memset (rbind.get (), 0 , sizeof (MYSQL_BIND) * num_fields);
155
-
156
- is_null.reset (new my_bool[num_fields]);
157
- memset (is_null.get (), 0 , sizeof (my_bool) * num_fields);
158
-
159
- err.reset (new my_bool[num_fields]);
160
- memset (err.get (), 0 , sizeof (my_bool) * num_fields);
161
-
162
- len.reset (new unsigned long [num_fields]);
163
- memset (len.get (), 0 , sizeof (unsigned long ) * num_fields);
164
-
165
- boost::scoped_ptr< NativeAPI::NativeResultsetWrapper > resultMeta (proxy->result_metadata ());
166
-
167
- for (unsigned int i = 0 ; i < num_fields; ++i) {
168
- MYSQL_FIELD * field = resultMeta->fetch_field ();
169
-
170
- struct st_buffer_size_type p = allocate_buffer_for_field (field);
171
- rbind[i].buffer_type = p.type ;
172
- rbind[i].buffer = p.buffer ;
173
- rbind[i].buffer_length = static_cast <unsigned long >(p.size );
174
- rbind[i].length = &len[i];
175
- rbind[i].is_null = &is_null[i];
176
- rbind[i].error = &err[i];
177
- rbind[i].is_unsigned = field->flags & UNSIGNED_FLAG;
178
- }
179
- if (proxy->bind_result (rbind.get ())) {
180
- CPP_ERR_FMT (" Couldn't bind : %d:(%s) %s" , proxy->errNo (), proxy->sqlstate ().c_str (), proxy->error ().c_str ());
181
- sql::mysql::util::throwSQLException (*proxy.get ());
182
- }
140
+ CPP_ENTER (" MySQL_Prepared_Statement::bindResult" );
141
+ for (unsigned int i = 0 ; i < num_fields; ++i) {
142
+ delete[] (char *) rbind[i].buffer ;
143
+ }
144
+ rbind.reset (NULL );
145
+ is_null.reset (NULL );
146
+ err.reset (NULL );
147
+ len.reset (NULL );
148
+
149
+ num_fields = proxy->field_count ();
150
+ if (!num_fields) {
151
+ return ;
152
+ }
153
+
154
+ rbind.reset (new MYSQL_BIND[num_fields]);
155
+ memset (rbind.get (), 0 , sizeof (MYSQL_BIND) * num_fields);
156
+
157
+ is_null.reset (new my_bool[num_fields]);
158
+ memset (is_null.get (), 0 , sizeof (my_bool) * num_fields);
159
+
160
+ err.reset (new my_bool[num_fields]);
161
+ memset (err.get (), 0 , sizeof (my_bool) * num_fields);
162
+
163
+ len.reset (new unsigned long [num_fields]);
164
+ memset (len.get (), 0 , sizeof (unsigned long ) * num_fields);
165
+
166
+ boost::scoped_ptr< NativeAPI::NativeResultsetWrapper > resultMeta (proxy->result_metadata ());
167
+
168
+ for (unsigned int i = 0 ; i < num_fields; ++i) {
169
+ MYSQL_FIELD * field = resultMeta->fetch_field ();
170
+
171
+ struct st_buffer_size_type p = allocate_buffer_for_field (field);
172
+ rbind[i].buffer_type = p.type ;
173
+ rbind[i].buffer = p.buffer ;
174
+ rbind[i].buffer_length = static_cast <unsigned long >(p.size );
175
+ rbind[i].length = &len[i];
176
+ rbind[i].is_null = &is_null[i];
177
+ rbind[i].error = &err[i];
178
+ rbind[i].is_unsigned = field->flags & UNSIGNED_FLAG;
179
+ }
180
+ if (proxy->bind_result (rbind.get ())) {
181
+ CPP_ERR_FMT (" Couldn't bind : %d:(%s) %s" , proxy->errNo (), proxy->sqlstate ().c_str (), proxy->error ().c_str ());
182
+ sql::mysql::util::throwSQLException (*proxy.get ());
183
+ }
183
184
}
184
185
/* }}} */
185
186
0 commit comments