@@ -1908,6 +1908,82 @@ SQLRETURN BindParameterArray(SQLHANDLE hStmt,
19081908 bufferLength = sizeof (SQL_NUMERIC_STRUCT);
19091909 break ;
19101910 }
1911+ // case SQL_C_GUID: {
1912+ // SQLGUID* guidArray = AllocateParamBufferArray<SQLGUID>(tempBuffers, paramSetSize);
1913+ // strLenOrIndArray = AllocateParamBufferArray<SQLLEN>(tempBuffers, paramSetSize);
1914+
1915+ // for (size_t i = 0; i < paramSetSize; ++i) {
1916+ // if (columnValues[i].is_none()) {
1917+ // std::memset(&guidArray[i], 0, sizeof(SQLGUID));
1918+ // strLenOrIndArray[i] = SQL_NULL_DATA;
1919+ // } else {
1920+ // if (!py::isinstance<py::bytes>(columnValues[i])) {
1921+ // ThrowStdException(MakeParamMismatchErrorStr(info.paramCType, paramIndex));
1922+ // }
1923+ // py::bytes uuid_bytes = columnValues[i].cast<py::bytes>();
1924+ // const unsigned char* uuid_data = reinterpret_cast<const unsigned char*>(PyBytes_AS_STRING(uuid_bytes.ptr()));
1925+ // if (PyBytes_GET_SIZE(uuid_bytes.ptr()) != 16) {
1926+ // ThrowStdException("UUID binary data must be exactly 16 bytes long.");
1927+ // }
1928+
1929+ // // Map bytes to SQLGUID fields
1930+ // guidArray[i].Data1 = (static_cast<uint32_t>(uuid_data[3]) << 24) |
1931+ // (static_cast<uint32_t>(uuid_data[2]) << 16) |
1932+ // (static_cast<uint32_t>(uuid_data[1]) << 8) |
1933+ // (static_cast<uint32_t>(uuid_data[0]));
1934+ // guidArray[i].Data2 = (static_cast<uint16_t>(uuid_data[5]) << 8) |
1935+ // (static_cast<uint16_t>(uuid_data[4]));
1936+ // guidArray[i].Data3 = (static_cast<uint16_t>(uuid_data[7]) << 8) |
1937+ // (static_cast<uint16_t>(uuid_data[6]));
1938+ // std::memcpy(guidArray[i].Data4, &uuid_data[8], 8);
1939+
1940+ // strLenOrIndArray[i] = sizeof(SQLGUID);
1941+ // }
1942+ // }
1943+
1944+ // dataPtr = guidArray;
1945+ // bufferLength = sizeof(SQLGUID);
1946+ // break;
1947+ // }
1948+ case SQL_C_GUID: {
1949+ SQLGUID* guidArray = AllocateParamBufferArray<SQLGUID>(tempBuffers, paramSetSize);
1950+ strLenOrIndArray = AllocateParamBufferArray<SQLLEN>(tempBuffers, paramSetSize);
1951+
1952+ py::object uuid_type = py::module_::import (" uuid" ).attr (" UUID" );
1953+
1954+ for (size_t i = 0 ; i < paramSetSize; ++i) {
1955+ if (columnValues[i].is_none ()) {
1956+ std::memset (&guidArray[i], 0 , sizeof (SQLGUID));
1957+ strLenOrIndArray[i] = SQL_NULL_DATA;
1958+ } else if (py::isinstance (columnValues[i], uuid_type)) {
1959+ py::bytes uuid_bytes = columnValues[i].attr (" bytes" );
1960+ const unsigned char * uuid_data = reinterpret_cast <const unsigned char *>(PyBytes_AS_STRING (uuid_bytes.ptr ()));
1961+
1962+ if (PyBytes_GET_SIZE (uuid_bytes.ptr ()) != 16 ) {
1963+ ThrowStdException (" UUID binary data must be exactly 16 bytes long." );
1964+ }
1965+
1966+ guidArray[i].Data1 = (static_cast <uint32_t >(uuid_data[3 ]) << 24 ) |
1967+ (static_cast <uint32_t >(uuid_data[2 ]) << 16 ) |
1968+ (static_cast <uint32_t >(uuid_data[1 ]) << 8 ) |
1969+ (static_cast <uint32_t >(uuid_data[0 ]));
1970+ guidArray[i].Data2 = (static_cast <uint16_t >(uuid_data[5 ]) << 8 ) |
1971+ (static_cast <uint16_t >(uuid_data[4 ]));
1972+ guidArray[i].Data3 = (static_cast <uint16_t >(uuid_data[7 ]) << 8 ) |
1973+ (static_cast <uint16_t >(uuid_data[6 ]));
1974+ std::memcpy (guidArray[i].Data4 , &uuid_data[8 ], 8 );
1975+
1976+ strLenOrIndArray[i] = sizeof (SQLGUID);
1977+ } else {
1978+ ThrowStdException (MakeParamMismatchErrorStr (info.paramCType , paramIndex));
1979+ }
1980+ }
1981+
1982+ dataPtr = guidArray;
1983+ bufferLength = sizeof (SQLGUID);
1984+ break ;
1985+ }
1986+
19111987 default : {
19121988 ThrowStdException (" BindParameterArray: Unsupported C type: " + std::to_string (info.paramCType ));
19131989 }
0 commit comments