@@ -1963,6 +1963,82 @@ 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+ }
2020+
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+ }
2036+
2037+ dataPtr = guidArray;
2038+ bufferLength = sizeof (SQLGUID);
2039+ break ;
2040+ }
2041+
19662042 default : {
19672043 ThrowStdException (" BindParameterArray: Unsupported C type: " + std::to_string (info.paramCType ));
19682044 }
0 commit comments