@@ -1963,82 +1963,44 @@ SQLRETURN BindParameterArray(SQLHANDLE hStmt,
19631963 bufferLength = sizeof (SQL_NUMERIC_STRUCT);
19641964 break ;
19651965 }
1966- // case SQL_C_GUID: {
1967- // SQLGUID* guidArray = AllocateParamBufferArray<SQLGUID>(tempBuffers, paramSetSize);
1968- // strLenOrIndArray = AllocateParamBufferArray<SQLLEN>(tempBuffers, paramSetSize);
1969-
1970- // for (size_t i = 0; i < paramSetSize; ++i) {
1971- // if (columnValues[i].is_none()) {
1972- // std::memset(&guidArray[i], 0, sizeof(SQLGUID));
1973- // strLenOrIndArray[i] = SQL_NULL_DATA;
1974- // } else {
1975- // if (!py::isinstance<py::bytes>(columnValues[i])) {
1976- // ThrowStdException(MakeParamMismatchErrorStr(info.paramCType, paramIndex));
1977- // }
1978- // py::bytes uuid_bytes = columnValues[i].cast<py::bytes>();
1979- // const unsigned char* uuid_data = reinterpret_cast<const unsigned char*>(PyBytes_AS_STRING(uuid_bytes.ptr()));
1980- // if (PyBytes_GET_SIZE(uuid_bytes.ptr()) != 16) {
1981- // ThrowStdException("UUID binary data must be exactly 16 bytes long.");
1982- // }
1983-
1984- // // Map bytes to SQLGUID fields
1985- // guidArray[i].Data1 = (static_cast<uint32_t>(uuid_data[3]) << 24) |
1986- // (static_cast<uint32_t>(uuid_data[2]) << 16) |
1987- // (static_cast<uint32_t>(uuid_data[1]) << 8) |
1988- // (static_cast<uint32_t>(uuid_data[0]));
1989- // guidArray[i].Data2 = (static_cast<uint16_t>(uuid_data[5]) << 8) |
1990- // (static_cast<uint16_t>(uuid_data[4]));
1991- // guidArray[i].Data3 = (static_cast<uint16_t>(uuid_data[7]) << 8) |
1992- // (static_cast<uint16_t>(uuid_data[6]));
1993- // std::memcpy(guidArray[i].Data4, &uuid_data[8], 8);
1994-
1995- // strLenOrIndArray[i] = sizeof(SQLGUID);
1996- // }
1997- // }
1998-
1999- // dataPtr = guidArray;
2000- // bufferLength = sizeof(SQLGUID);
2001- // break;
2002- // }
2003- case SQL_C_GUID: {
2004- SQLGUID* guidArray = AllocateParamBufferArray<SQLGUID>(tempBuffers, paramSetSize);
2005- strLenOrIndArray = AllocateParamBufferArray<SQLLEN>(tempBuffers, paramSetSize);
2006-
2007- py::object uuid_type = py::module_::import (" uuid" ).attr (" UUID" );
2008-
2009- for (size_t i = 0 ; i < paramSetSize; ++i) {
2010- if (columnValues[i].is_none ()) {
2011- std::memset (&guidArray[i], 0 , sizeof (SQLGUID));
2012- strLenOrIndArray[i] = SQL_NULL_DATA;
2013- } else if (py::isinstance (columnValues[i], uuid_type)) {
2014- py::bytes uuid_bytes = columnValues[i].attr (" bytes" );
2015- const unsigned char * uuid_data = reinterpret_cast <const unsigned char *>(PyBytes_AS_STRING (uuid_bytes.ptr ()));
2016-
2017- if (PyBytes_GET_SIZE (uuid_bytes.ptr ()) != 16 ) {
2018- ThrowStdException (" UUID binary data must be exactly 16 bytes long." );
2019- }
1966+ case SQL_C_GUID: {
1967+ SQLGUID* guidArray = AllocateParamBufferArray<SQLGUID>(tempBuffers, paramSetSize);
1968+ strLenOrIndArray = AllocateParamBufferArray<SQLLEN>(tempBuffers, paramSetSize);
20201969
2021- guidArray[i].Data1 = (static_cast <uint32_t >(uuid_data[3 ]) << 24 ) |
2022- (static_cast <uint32_t >(uuid_data[2 ]) << 16 ) |
2023- (static_cast <uint32_t >(uuid_data[1 ]) << 8 ) |
2024- (static_cast <uint32_t >(uuid_data[0 ]));
2025- guidArray[i].Data2 = (static_cast <uint16_t >(uuid_data[5 ]) << 8 ) |
2026- (static_cast <uint16_t >(uuid_data[4 ]));
2027- guidArray[i].Data3 = (static_cast <uint16_t >(uuid_data[7 ]) << 8 ) |
2028- (static_cast <uint16_t >(uuid_data[6 ]));
2029- std::memcpy (guidArray[i].Data4 , &uuid_data[8 ], 8 );
2030-
2031- strLenOrIndArray[i] = sizeof (SQLGUID);
2032- } else {
2033- ThrowStdException (MakeParamMismatchErrorStr (info.paramCType , paramIndex));
2034- }
2035- }
1970+ py::object uuid_type = py::module_::import (" uuid" ).attr (" UUID" );
20361971
2037- dataPtr = guidArray;
2038- bufferLength = sizeof (SQLGUID);
2039- break ;
2040- }
1972+ for (size_t i = 0 ; i < paramSetSize; ++i) {
1973+ if (columnValues[i].is_none ()) {
1974+ std::memset (&guidArray[i], 0 , sizeof (SQLGUID));
1975+ strLenOrIndArray[i] = SQL_NULL_DATA;
1976+ } else if (py::isinstance (columnValues[i], uuid_type)) {
1977+ py::bytes uuid_bytes = columnValues[i].attr (" bytes" );
1978+ const unsigned char * uuid_data = reinterpret_cast <const unsigned char *>(PyBytes_AS_STRING (uuid_bytes.ptr ()));
20411979
1980+ if (PyBytes_GET_SIZE (uuid_bytes.ptr ()) != 16 ) {
1981+ ThrowStdException (" UUID binary data must be exactly 16 bytes long." );
1982+ }
1983+
1984+ guidArray[i].Data1 = (static_cast <uint32_t >(uuid_data[3 ]) << 24 ) |
1985+ (static_cast <uint32_t >(uuid_data[2 ]) << 16 ) |
1986+ (static_cast <uint32_t >(uuid_data[1 ]) << 8 ) |
1987+ (static_cast <uint32_t >(uuid_data[0 ]));
1988+ guidArray[i].Data2 = (static_cast <uint16_t >(uuid_data[5 ]) << 8 ) |
1989+ (static_cast <uint16_t >(uuid_data[4 ]));
1990+ guidArray[i].Data3 = (static_cast <uint16_t >(uuid_data[7 ]) << 8 ) |
1991+ (static_cast <uint16_t >(uuid_data[6 ]));
1992+ std::memcpy (guidArray[i].Data4 , &uuid_data[8 ], 8 );
1993+
1994+ strLenOrIndArray[i] = sizeof (SQLGUID);
1995+ } else {
1996+ ThrowStdException (MakeParamMismatchErrorStr (info.paramCType , paramIndex));
1997+ }
1998+ }
1999+
2000+ dataPtr = guidArray;
2001+ bufferLength = sizeof (SQLGUID);
2002+ break ;
2003+ }
20422004 default : {
20432005 ThrowStdException (" BindParameterArray: Unsupported C type: " + std::to_string (info.paramCType ));
20442006 }
0 commit comments