@@ -438,7 +438,11 @@ _mysql_ResultObject_Initialize(
438
438
Py_INCREF (Py_None );
439
439
}
440
440
else if (PySequence_Check (fun )) {
441
+ long flags = fields [i ].flags ;
441
442
int j , n2 = PySequence_Size (fun );
443
+ if (fields [i ].charsetnr != 63 ) { /* maaagic */
444
+ flags &= ~BINARY_FLAG ;
445
+ }
442
446
PyObject * fun2 = NULL ;
443
447
for (j = 0 ; j < n2 ; j ++ ) {
444
448
PyObject * t = PySequence_GetItem (fun , j );
@@ -448,17 +452,13 @@ _mysql_ResultObject_Initialize(
448
452
return -1 ;
449
453
}
450
454
if (PyTuple_Check (t ) && PyTuple_GET_SIZE (t ) == 2 ) {
451
- long mask , flags ;
455
+ long mask ;
452
456
PyObject * pmask = NULL ;
453
457
pmask = PyTuple_GET_ITEM (t , 0 );
454
458
fun2 = PyTuple_GET_ITEM (t , 1 );
455
459
Py_XINCREF (fun2 );
456
460
if (PyInt_Check (pmask )) {
457
461
mask = PyInt_AS_LONG (pmask );
458
- flags = fields [i ].flags ;
459
- if (fields [i ].charsetnr != 63 ) { /* maaagic */
460
- flags &= ~BINARY_FLAG ;
461
- }
462
462
if (mask & flags ) {
463
463
Py_DECREF (t );
464
464
break ;
@@ -1343,23 +1343,41 @@ static PyObject *
1343
1343
_mysql_field_to_python (
1344
1344
PyObject * converter ,
1345
1345
char * rowitem ,
1346
- unsigned long length )
1346
+ unsigned long length ,
1347
+ MYSQL_FIELD * field )
1347
1348
{
1349
+ int field_type = field -> type ;
1348
1350
PyObject * v ;
1351
+ #ifdef IS_PY3K
1352
+ // Return bytes for binary and string types.
1353
+ int binary = 0 ;
1354
+ if (field_type == FIELD_TYPE_TINY_BLOB ||
1355
+ field_type == FIELD_TYPE_MEDIUM_BLOB ||
1356
+ field_type == FIELD_TYPE_LONG_BLOB ||
1357
+ field_type == FIELD_TYPE_BLOB ||
1358
+ field_type == FIELD_TYPE_VAR_STRING ||
1359
+ field_type == FIELD_TYPE_STRING ) {
1360
+ binary = 1 ;
1361
+ }
1362
+ #endif
1349
1363
if (rowitem ) {
1350
1364
if (converter != Py_None ) {
1365
+ const char * fmt = "s#" ;
1351
1366
v = PyObject_CallFunction (converter ,
1352
1367
#ifdef IS_PY3K
1353
- "y #" ,
1368
+ binary ? "y#" : "s #" ,
1354
1369
#else
1355
1370
"s#" ,
1356
1371
#endif
1357
1372
rowitem ,
1358
1373
(int )length );
1359
1374
} else {
1360
- // TODO: Should we decode here on Python 3?
1361
- v = PyBytes_FromStringAndSize (rowitem ,
1362
- (int )length );
1375
+ #ifdef IS_PY3K
1376
+ if (!binary ) {
1377
+ v = PyUnicode_FromStringAndSize (rowitem , (int )length );
1378
+ } else
1379
+ #endif
1380
+ v = PyBytes_FromStringAndSize (rowitem , (int )length );
1363
1381
}
1364
1382
if (!v )
1365
1383
return NULL ;
@@ -1378,14 +1396,16 @@ _mysql_row_to_tuple(
1378
1396
unsigned int n , i ;
1379
1397
unsigned long * length ;
1380
1398
PyObject * r , * c ;
1399
+ MYSQL_FIELD * fields ;
1381
1400
1382
1401
n = mysql_num_fields (self -> result );
1383
1402
if (!(r = PyTuple_New (n ))) return NULL ;
1384
1403
length = mysql_fetch_lengths (self -> result );
1404
+ fields = mysql_fetch_fields (self -> result );
1385
1405
for (i = 0 ; i < n ; i ++ ) {
1386
1406
PyObject * v ;
1387
1407
c = PyTuple_GET_ITEM (self -> converter , i );
1388
- v = _mysql_field_to_python (c , row [i ], length [i ]);
1408
+ v = _mysql_field_to_python (c , row [i ], length [i ], & fields [ i ] );
1389
1409
if (!v ) goto error ;
1390
1410
PyTuple_SET_ITEM (r , i , v );
1391
1411
}
@@ -1403,16 +1423,16 @@ _mysql_row_to_dict(
1403
1423
unsigned int n , i ;
1404
1424
unsigned long * length ;
1405
1425
PyObject * r , * c ;
1406
- MYSQL_FIELD * fields ;
1426
+ MYSQL_FIELD * fields ;
1407
1427
1408
1428
n = mysql_num_fields (self -> result );
1409
1429
if (!(r = PyDict_New ())) return NULL ;
1410
1430
length = mysql_fetch_lengths (self -> result );
1411
- fields = mysql_fetch_fields (self -> result );
1431
+ fields = mysql_fetch_fields (self -> result );
1412
1432
for (i = 0 ; i < n ; i ++ ) {
1413
1433
PyObject * v ;
1414
1434
c = PyTuple_GET_ITEM (self -> converter , i );
1415
- v = _mysql_field_to_python (c , row [i ], length [i ]);
1435
+ v = _mysql_field_to_python (c , row [i ], length [i ], & fields [ i ] );
1416
1436
if (!v ) goto error ;
1417
1437
if (!PyMapping_HasKeyString (r , fields [i ].name )) {
1418
1438
PyMapping_SetItemString (r , fields [i ].name , v );
@@ -1447,11 +1467,11 @@ _mysql_row_to_dict_old(
1447
1467
n = mysql_num_fields (self -> result );
1448
1468
if (!(r = PyDict_New ())) return NULL ;
1449
1469
length = mysql_fetch_lengths (self -> result );
1450
- fields = mysql_fetch_fields (self -> result );
1470
+ fields = mysql_fetch_fields (self -> result );
1451
1471
for (i = 0 ; i < n ; i ++ ) {
1452
1472
PyObject * v ;
1453
1473
c = PyTuple_GET_ITEM (self -> converter , i );
1454
- v = _mysql_field_to_python (c , row [i ], length [i ]);
1474
+ v = _mysql_field_to_python (c , row [i ], length [i ], & fields [ i ] );
1455
1475
if (!v ) goto error ;
1456
1476
{
1457
1477
int len = 0 ;
0 commit comments