1
0
Fork 0
mirror of https://github.com/DBD-SQLite/DBD-SQLite synced 2025-06-07 22:28:47 -04:00

attempt to numerify bind parameters if possible; still needs more tests

This commit is contained in:
Kenichi Ishigaki 2010-06-16 09:28:31 +00:00
parent ab861ced83
commit c6b0a42831

View file

@ -124,6 +124,37 @@ sqlite_set_result(pTHX_ sqlite3_context *context, SV *result, int is_error)
} }
} }
static int
sqlite_is_number(pTHX_ const char *v)
{
const char *z = v;
int i;
int depth = 0;
double f;
char str[30], format[10];
if (*z == '+' || *z == '-') z++;
if (!isdigit(*z)) return 0;
z++;
while (isdigit(*z)) { z++; }
if (*z == '.') {
z++;
if (!isdigit(*z)) return 0;
while (isdigit(*z)) { depth++; z++; }
}
if (*z == 'e' || *z == 'E') {
z++;
if (*z == '+' || *z == '-') { z++; }
if (!isdigit(*z)) return 0;
while (isdigit(*z)) { z++; }
}
sprintf(str, "%i", atoi(v));
if (strEQ(str, v)) return 1;
sprintf(format, "%%.%df", depth);
sprintf(str, format, atof(v));
if (strEQ(str, v)) return 2;
return 0;
}
/*-----------------------------------------------------* /*-----------------------------------------------------*
* DBD Methods * DBD Methods
*-----------------------------------------------------*/ *-----------------------------------------------------*/
@ -539,31 +570,27 @@ sqlite_st_execute(SV *sth, imp_sth_t *imp_sth)
rc = sqlite3_bind_blob(imp_sth->stmt, i+1, data, len, SQLITE_TRANSIENT); rc = sqlite3_bind_blob(imp_sth->stmt, i+1, data, len, SQLITE_TRANSIENT);
} }
else { else {
#if 0 STRLEN len;
/* stop guessing until we figure out better way to do this */ const char *data;
const int numtype = looks_like_number(value); int numtype;
if ((numtype & (IS_NUMBER_IN_UV|IS_NUMBER_NOT_INT)) == IS_NUMBER_IN_UV) { if (imp_dbh->unicode) {
sv_utf8_upgrade(value);
}
data = SvPV(value, len);
numtype = sqlite_is_number(aTHX_ data);
if (numtype == 1) {
#if defined(USE_64_BIT_INT) #if defined(USE_64_BIT_INT)
rc = sqlite3_bind_int64(imp_sth->stmt, i+1, SvIV(value)); rc = sqlite3_bind_int64(imp_sth->stmt, i+1, atoi(data));
#else #else
rc = sqlite3_bind_int(imp_sth->stmt, i+1, SvIV(value)); rc = sqlite3_bind_int(imp_sth->stmt, i+1, atoi(data));
#endif #endif
} }
else if ((numtype & (IS_NUMBER_NOT_INT|IS_NUMBER_INFINITY|IS_NUMBER_NAN)) == IS_NUMBER_NOT_INT) { else if (numtype == 2) {
rc = sqlite3_bind_double(imp_sth->stmt, i+1, SvNV(value)); rc = sqlite3_bind_double(imp_sth->stmt, i+1, atof(data));
} }
else { else {
#endif
STRLEN len;
char *data;
if (imp_dbh->unicode) {
sv_utf8_upgrade(value);
}
data = SvPV(value, len);
rc = sqlite3_bind_text(imp_sth->stmt, i+1, data, len, SQLITE_TRANSIENT); rc = sqlite3_bind_text(imp_sth->stmt, i+1, data, len, SQLITE_TRANSIENT);
#if 0
} }
#endif
} }
if (value) { if (value) {