11#include " statement.h"
22
3- #include < cstring>
43#include < ydb-cpp-sdk/client/params/params.h>
54#include < ydb-cpp-sdk/client/value/value.h>
65
@@ -22,7 +21,6 @@ SQLRETURN TStatement::ExecDirect(const std::string& statementText) {
2221 if (!Errors_.empty ()) {
2322 return SQL_ERROR;
2423 }
25- // --- конец сборки параметров ---
2624
2725 auto sessionResult = client->GetSession ().ExtractValueSync ();
2826 if (!sessionResult.IsSuccess ()) {
@@ -50,7 +48,6 @@ SQLRETURN TStatement::Fetch() {
5048 while (true ) {
5149 if (ResultSetParser_) {
5250 if (ResultSetParser_->TryNextRow ()) {
53- // Автоматически заполняем связанные буферы
5451 for (const auto & col : BoundColumns_) {
5552 GetData (col.ColumnNumber , col.TargetType , col.TargetValue , col.BufferLength , col.StrLenOrInd );
5653 }
@@ -95,22 +92,38 @@ SQLRETURN TStatement::GetData(SQLUSMALLINT columnNumber, SQLSMALLINT targetType,
9592
9693SQLRETURN TStatement::GetDiagRec (SQLSMALLINT recNumber, SQLCHAR* sqlState, SQLINTEGER* nativeError,
9794 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+
99100 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+
102109 if (messageText && bufferLength > 0 ) {
103110 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+ }
105114 }
106115 return SQL_SUCCESS;
107116}
108117
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+
111124 BoundColumns_.erase (std::remove_if (BoundColumns_.begin (), BoundColumns_.end (),
112125 [columnNumber](const TBoundColumn& col) { return col.ColumnNumber == columnNumber; }), BoundColumns_.end ());
113- // Если targetValue == nullptr, просто удаляем связь
126+
114127 if (!targetValue) {
115128 return SQL_SUCCESS;
116129 }
@@ -127,14 +140,15 @@ SQLRETURN TStatement::BindParameter(SQLUSMALLINT paramNumber,
127140 SQLPOINTER parameterValuePtr,
128141 SQLLEN bufferLength,
129142 SQLLEN* strLenOrIndPtr) {
143+
130144 if (inputOutputType != SQL_PARAM_INPUT) {
131145 AddError (" HYC00" , 0 , " Only input parameters are supported" );
132146 return SQL_ERROR;
133147 }
134- // Удаляем старую связь для этого параметра, если есть
148+
135149 BoundParams_.erase (std::remove_if (BoundParams_.begin (), BoundParams_.end (),
136150 [paramNumber](const TBoundParam& p) { return p.ParamNumber == paramNumber; }), BoundParams_.end ());
137- // Если parameterValuePtr == nullptr, просто удаляем связь
151+
138152 if (!parameterValuePtr) {
139153 return SQL_SUCCESS;
140154 }
@@ -162,7 +176,6 @@ SQLRETURN TStatement::ConvertYdbValue(NYdb::TValueParser& valueParser,
162176 SQLLEN bufferLength,
163177 SQLLEN* strLenOrInd) {
164178
165- // 1. Проверка на NULL
166179 if (valueParser.IsNull ()) {
167180 if (strLenOrInd) *strLenOrInd = SQL_NULL_DATA;
168181 return SQL_SUCCESS;
@@ -249,7 +262,6 @@ SQLRETURN TStatement::ConvertYdbValue(NYdb::TValueParser& valueParser,
249262 if (strLenOrInd) *strLenOrInd = sizeof (char );
250263 return SQL_SUCCESS;
251264 }
252- // Добавьте обработку дат/времени, бинарных данных и других типов по необходимости
253265 default :
254266 return SQL_ERROR;
255267 }
@@ -259,84 +271,12 @@ NYdb::TParams TStatement::BuildParams() {
259271 Errors_.clear ();
260272 NYdb::TParamsBuilder paramsBuilder;
261273 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));
336276 }
337277
338278 return paramsBuilder.Build ();
339279}
340280
341281} // namespace NOdbc
342- } // namespace NYdb
282+ } // namespace NYdb
0 commit comments