1
1
#include " statement.h"
2
2
3
- #include < cstring>
4
3
#include < ydb-cpp-sdk/client/params/params.h>
5
4
#include < ydb-cpp-sdk/client/value/value.h>
6
5
@@ -22,7 +21,6 @@ SQLRETURN TStatement::ExecDirect(const std::string& statementText) {
22
21
if (!Errors_.empty ()) {
23
22
return SQL_ERROR;
24
23
}
25
- // --- конец сборки параметров ---
26
24
27
25
auto sessionResult = client->GetSession ().ExtractValueSync ();
28
26
if (!sessionResult.IsSuccess ()) {
@@ -50,7 +48,6 @@ SQLRETURN TStatement::Fetch() {
50
48
while (true ) {
51
49
if (ResultSetParser_) {
52
50
if (ResultSetParser_->TryNextRow ()) {
53
- // Автоматически заполняем связанные буферы
54
51
for (const auto & col : BoundColumns_) {
55
52
GetData (col.ColumnNumber , col.TargetType , col.TargetValue , col.BufferLength , col.StrLenOrInd );
56
53
}
@@ -95,22 +92,38 @@ SQLRETURN TStatement::GetData(SQLUSMALLINT columnNumber, SQLSMALLINT targetType,
95
92
96
93
SQLRETURN TStatement::GetDiagRec (SQLSMALLINT recNumber, SQLCHAR* sqlState, SQLINTEGER* nativeError,
97
94
SQLCHAR* messageText, SQLSMALLINT bufferLength, SQLSMALLINT* textLength) {
98
- if (recNumber < 1 || recNumber > (SQLSMALLINT)Errors_.size ()) return SQL_NO_DATA;
95
+
96
+ if (recNumber < 1 || recNumber > (SQLSMALLINT)Errors_.size ()) {
97
+ return SQL_NO_DATA;
98
+ }
99
+
99
100
const auto & err = Errors_[recNumber-1 ];
100
- if (sqlState) strncpy ((char *)sqlState, err.SqlState .c_str (), 6 );
101
- if (nativeError) *nativeError = err.NativeError ;
101
+ if (sqlState) {
102
+ strncpy ((char *)sqlState, err.SqlState .c_str (), 6 );
103
+ }
104
+
105
+ if (nativeError) {
106
+ *nativeError = err.NativeError ;
107
+ }
108
+
102
109
if (messageText && bufferLength > 0 ) {
103
110
strncpy ((char *)messageText, err.Message .c_str (), bufferLength);
104
- if (textLength) *textLength = (SQLSMALLINT)std::min ((int )err.Message .size (), (int )bufferLength);
111
+ if (textLength) {
112
+ *textLength = (SQLSMALLINT)std::min ((int )err.Message .size (), (int )bufferLength);
113
+ }
105
114
}
106
115
return SQL_SUCCESS;
107
116
}
108
117
109
- SQLRETURN TStatement::BindCol (SQLUSMALLINT columnNumber, SQLSMALLINT targetType, SQLPOINTER targetValue, SQLLEN bufferLength, SQLLEN* strLenOrInd) {
110
- // Удаляем старую связь для этой колонки, если есть
118
+ SQLRETURN TStatement::BindCol (SQLUSMALLINT columnNumber,
119
+ SQLSMALLINT targetType,
120
+ SQLPOINTER targetValue,
121
+ SQLLEN bufferLength,
122
+ SQLLEN* strLenOrInd) {
123
+
111
124
BoundColumns_.erase (std::remove_if (BoundColumns_.begin (), BoundColumns_.end (),
112
125
[columnNumber](const TBoundColumn& col) { return col.ColumnNumber == columnNumber; }), BoundColumns_.end ());
113
- // Если targetValue == nullptr, просто удаляем связь
126
+
114
127
if (!targetValue) {
115
128
return SQL_SUCCESS;
116
129
}
@@ -127,14 +140,15 @@ SQLRETURN TStatement::BindParameter(SQLUSMALLINT paramNumber,
127
140
SQLPOINTER parameterValuePtr,
128
141
SQLLEN bufferLength,
129
142
SQLLEN* strLenOrIndPtr) {
143
+
130
144
if (inputOutputType != SQL_PARAM_INPUT) {
131
145
AddError (" HYC00" , 0 , " Only input parameters are supported" );
132
146
return SQL_ERROR;
133
147
}
134
- // Удаляем старую связь для этого параметра, если есть
148
+
135
149
BoundParams_.erase (std::remove_if (BoundParams_.begin (), BoundParams_.end (),
136
150
[paramNumber](const TBoundParam& p) { return p.ParamNumber == paramNumber; }), BoundParams_.end ());
137
- // Если parameterValuePtr == nullptr, просто удаляем связь
151
+
138
152
if (!parameterValuePtr) {
139
153
return SQL_SUCCESS;
140
154
}
@@ -162,7 +176,6 @@ SQLRETURN TStatement::ConvertYdbValue(NYdb::TValueParser& valueParser,
162
176
SQLLEN bufferLength,
163
177
SQLLEN* strLenOrInd) {
164
178
165
- // 1. Проверка на NULL
166
179
if (valueParser.IsNull ()) {
167
180
if (strLenOrInd) *strLenOrInd = SQL_NULL_DATA;
168
181
return SQL_SUCCESS;
@@ -249,7 +262,6 @@ SQLRETURN TStatement::ConvertYdbValue(NYdb::TValueParser& valueParser,
249
262
if (strLenOrInd) *strLenOrInd = sizeof (char );
250
263
return SQL_SUCCESS;
251
264
}
252
- // Добавьте обработку дат/времени, бинарных данных и других типов по необходимости
253
265
default :
254
266
return SQL_ERROR;
255
267
}
@@ -259,84 +271,12 @@ NYdb::TParams TStatement::BuildParams() {
259
271
Errors_.clear ();
260
272
NYdb::TParamsBuilder paramsBuilder;
261
273
for (const auto & param : BoundParams_) {
262
- std::string paramName = " $p" + std::to_string (param.ParamNumber ); // ODBC нумерует с 1
263
- auto & builder = paramsBuilder.AddParam (paramName);
264
- // Обработка NULL
265
- if (param.StrLenOrIndPtr && *param.StrLenOrIndPtr == SQL_NULL_DATA) {
266
- builder.EmptyOptional ();
267
- builder.Build ();
268
- continue ;
269
- }
270
-
271
- switch (param.ValueType ) {
272
- case SQL_C_SLONG: {
273
- auto value = *static_cast <SQLINTEGER*>(param.ParameterValuePtr );
274
- switch (param.ParameterType ) {
275
- case SQL_INTEGER:
276
- builder.Int32 (static_cast <int32_t >(value));
277
- break ;
278
- case SQL_BIGINT:
279
- builder.Int64 (static_cast <int64_t >(value));
280
- break ;
281
- case SQL_DOUBLE:
282
- builder.Double (static_cast <double >(value));
283
- break ;
284
- case SQL_FLOAT:
285
- builder.Float (static_cast <float >(value));
286
- break ;
287
- case SQL_VARCHAR:
288
- case SQL_CHAR:
289
- case SQL_LONGVARCHAR:
290
- builder.Utf8 (std::to_string (value));
291
- break ;
292
- case SQL_BIT:
293
- builder.Uint8 (static_cast <uint8_t >(value));
294
- break ;
295
- default :
296
- AddError (" 07006" , 0 , " Unsupported SQL type" );
297
- return paramsBuilder.Build ();
298
- }
299
- break ;
300
- }
301
- case SQL_C_SBIGINT: {
302
- auto v = *static_cast <SQLBIGINT*>(param.ParameterValuePtr );
303
- builder.Int32 (static_cast <int32_t >(v));
304
- break ;
305
- }
306
- default : {
307
- AddError (" 07006" , 0 , " Unsupported C type" );
308
- return paramsBuilder.Build ();
309
- }
310
- }
311
-
312
- switch (param.ParameterType ) {
313
- case SQL_INTEGER:
314
- case SQL_BIGINT:
315
- break ;
316
- case SQL_DOUBLE:
317
- builder.Double (*reinterpret_cast <double *>(param.ParameterValuePtr ));
318
- break ;
319
- case SQL_FLOAT:
320
- builder.Double (*reinterpret_cast <double *>(param.ParameterValuePtr ));
321
- break ;
322
- case SQL_VARCHAR:
323
- case SQL_CHAR:
324
- case SQL_LONGVARCHAR:
325
- builder.Utf8 (*reinterpret_cast <std::string*>(param.ParameterValuePtr ));
326
- break ;
327
- case SQL_BIT:
328
- builder.Bool (*reinterpret_cast <bool *>(param.ParameterValuePtr ));
329
- break ;
330
- default :
331
- AddError (" 07006" , 0 , " Unsupported SQL type" );
332
- return paramsBuilder.Build ();
333
- }
334
-
335
- builder.Build ();
274
+ std::string paramName = " $p" + std::to_string (param.ParamNumber );
275
+ ConvertValue (param, paramsBuilder.AddParam (paramName));
336
276
}
337
277
338
278
return paramsBuilder.Build ();
339
279
}
340
280
341
281
} // namespace NOdbc
342
- } // namespace NYdb
282
+ } // namespace NYdb
0 commit comments