[svn:dbi] r14444 - dbi/trunk
[email protected] Thu, 23 Sep 2010 03:48:38 -0700 (PDT)
| Newsgroups | perl.dbi.changes |
|---|---|
| Message-ID | <[email protected]> |
Author: timbo
Date: Thu Sep 23 03:48:34 2010
New Revision: 14444
Modified:
dbi/trunk/DBI.xs
Log:
Replace the assertion in $h->{NAME*} code with a warning.
Modified: dbi/trunk/DBI.xs
==============================================================================
--- dbi/trunk/DBI.xs (original)
+++ dbi/trunk/DBI.xs Thu Sep 23 03:48:34 2010
@@ -2130,15 +2130,28 @@
int upcase = (key[5] == 'u');
AV *av = Nullav;
HV *hv = Nullhv;
+ int num_fields_mismatch = 0;
+
if (strEQ(&key[strlen(key)-5], "_hash"))
hv = newHV();
else av = newAV();
i = DBIc_NUM_FIELDS(imp_sth);
- if (DBIc_TRACE_LEVEL(imp_sth) >= 10)
+
+ /* catch invalid NUM_FIELDS */
+ if (i != AvFILL(name_av)+1) {
+ /* flag as mismatch, except for "-1 and empty" case */
+ if ( ! (i == -1 && 0 == AvFILL(name_av)+1) )
+ num_fields_mismatch = 1;
+ i = AvFILL(name_av)+1; /* limit for safe iteration over array */
+ }
+
+ if (DBIc_TRACE_LEVEL(imp_sth) >= 10 || (num_fields_mismatch && DBIc_WARN(imp_xxh))) {
PerlIO_printf(DBILOGFP," FETCH $h->{%s} from $h->{NAME} with $h->{NUM_OF_FIELDS} = %d"
- " and %ld entries in $h->{NAME}\n",
- neatsvpv(keysv,0), i, AvFILL(name_av)+1);
- assert((i == -1 && 0 == AvFILL(name_av)+1) || (i == AvFILL(name_av)+1));
+ " and %ld entries in $h->{NAME}%s\n",
+ neatsvpv(keysv,0), DBIc_NUM_FIELDS(imp_sth), AvFILL(name_av)+1,
+ (num_fields_mismatch) ? " (possible bug in driver)" : "");
+ }
+
while (--i >= 0) {
sv = newSVsv(AvARRAY(name_av)[i]);
name = SvPV_nolen(sv);