… | |
… | |
21 | #endif |
21 | #endif |
22 | return sv; |
22 | return sv; |
23 | } |
23 | } |
24 | |
24 | |
25 | static SV * |
25 | static SV * |
26 | sql_force_utf8 (SV *sv) |
26 | mortalcopy_and_maybe_force_utf8(int utf8, SV *sv) |
27 | { |
27 | { |
|
|
28 | sv = sv_mortalcopy (sv); |
28 | #if CAN_UTF8 |
29 | #if CAN_UTF8 |
29 | if (SvPOK (sv)) |
30 | if (utf8 && SvPOK (sv)) |
30 | SvUTF8_on (sv); |
31 | SvUTF8_on (sv); |
31 | #endif |
32 | #endif |
32 | return sv; |
33 | return sv; |
33 | } |
34 | } |
34 | |
35 | |
35 | #define maybe_upgrade_utf8(utf8,sv) ((utf8) ? sql_upgrade_utf8 (sv) : (sv)) |
36 | #define maybe_upgrade_utf8(utf8,sv) ((utf8) ? sql_upgrade_utf8 (sv) : (sv)) |
36 | #define maybe_force_utf8(utf8,sv) ((utf8) ? sql_force_utf8 (sv) : (sv)) |
|
|
37 | |
37 | |
38 | #define is_dbh(sv) ((sv) && sv_isobject (sv) && sv_derived_from ((sv), "DBI::db")) |
38 | #define is_dbh(sv) ((sv) && sv_isobject (sv) && sv_derived_from ((sv), "DBI::db")) |
39 | |
39 | |
40 | typedef struct lru_node { |
40 | typedef struct lru_node { |
41 | struct lru_node *next; |
41 | struct lru_node *next; |
… | |
… | |
378 | case G_VOID: |
378 | case G_VOID: |
379 | /* no thing */ |
379 | /* no thing */ |
380 | break; |
380 | break; |
381 | case G_SCALAR: |
381 | case G_SCALAR: |
382 | /* the first element */ |
382 | /* the first element */ |
383 | XPUSHs (maybe_force_utf8 (ix & 1, *av_fetch ((AV *)SvRV (row), 0, 1))); |
383 | XPUSHs (mortalcopy_and_maybe_force_utf8 (ix & 1, *av_fetch ((AV *)SvRV (row), 0, 1))); |
384 | break; |
384 | break; |
385 | case G_ARRAY: |
385 | case G_ARRAY: |
386 | av = (AV *)SvRV (row); |
386 | av = (AV *)SvRV (row); |
387 | count = AvFILL (av) + 1; |
387 | count = AvFILL (av) + 1; |
388 | EXTEND (SP, count); |
388 | EXTEND (SP, count); |
389 | for (arg = 0; arg < count; arg++) |
389 | for (arg = 0; arg < count; arg++) |
390 | PUSHs (maybe_force_utf8 (ix & 1, AvARRAY (av)[arg])); |
390 | PUSHs (mortalcopy_and_maybe_force_utf8 (ix & 1, AvARRAY (av)[arg])); |
391 | |
391 | |
392 | break; |
392 | break; |
393 | default: |
393 | default: |
394 | abort (); |
394 | abort (); |
395 | } |
395 | } |
… | |
… | |
420 | int columns = AvFILL ((AV *) SvRV (AvARRAY (av)[0])) + 1; /* columns? */ |
420 | int columns = AvFILL ((AV *) SvRV (AvARRAY (av)[0])) + 1; /* columns? */ |
421 | |
421 | |
422 | EXTEND (SP, count); |
422 | EXTEND (SP, count); |
423 | if (columns == 1) |
423 | if (columns == 1) |
424 | for (arg = 0; arg < count; arg++) |
424 | for (arg = 0; arg < count; arg++) |
425 | PUSHs (maybe_force_utf8 (ix & 1, AvARRAY ((AV *)SvRV (AvARRAY (av)[arg]))[0])); |
425 | PUSHs (mortalcopy_and_maybe_force_utf8 (ix & 1, AvARRAY ((AV *)SvRV (AvARRAY (av)[arg]))[0])); |
426 | else |
426 | else |
427 | for (arg = 0; arg < count; arg++) |
427 | for (arg = 0; arg < count; arg++) |
428 | PUSHs (maybe_force_utf8 (ix & 1, AvARRAY (av)[arg])); |
428 | PUSHs (mortalcopy_and_maybe_force_utf8 (ix & 1, AvARRAY (av)[arg])); |
429 | } |
429 | } |
430 | } |
430 | } |
431 | } |
431 | } |
432 | else |
432 | else |
433 | XPUSHs (sth); |
433 | XPUSHs (sth); |