diff options
Diffstat (limited to 'ext/pdo_firebird/firebird_statement.c')
-rw-r--r-- | ext/pdo_firebird/firebird_statement.c | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/ext/pdo_firebird/firebird_statement.c b/ext/pdo_firebird/firebird_statement.c index c83ba38db5..3feeedf39f 100644 --- a/ext/pdo_firebird/firebird_statement.c +++ b/ext/pdo_firebird/firebird_statement.c @@ -217,7 +217,23 @@ static int firebird_stmt_describe(pdo_stmt_t *stmt, int colno) /* {{{ */ } memmove(cp, var->aliasname, var->aliasname_length); *(cp+var->aliasname_length) = '\0'; - col->param_type = PDO_PARAM_STR; + + if (var->sqlscale < 0) { + col->param_type = PDO_PARAM_STR; + } else { + switch (var->sqltype & ~1) { + case SQL_SHORT: + case SQL_LONG: +#if SIZEOF_ZEND_LONG >= 8 + case SQL_INT64: +#endif + col->param_type = PDO_PARAM_INT; + break; + default: + col->param_type = PDO_PARAM_STR; + break; + } + } return 1; } @@ -373,16 +389,24 @@ static int firebird_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, /* {{ *len = var->sqllen; break; case SQL_SHORT: - *ptr = FETCH_BUF(S->fetch_buf[colno], char, CHAR_BUF_LEN, NULL); - *len = slprintf(*ptr, CHAR_BUF_LEN, "%d", *(short*)var->sqldata); + *len = sizeof(zend_long); + *ptr = FETCH_BUF(S->fetch_buf[colno], zend_long, 1, NULL); + *(zend_long *)*ptr = *(short*)var->sqldata; break; case SQL_LONG: - *ptr = FETCH_BUF(S->fetch_buf[colno], char, CHAR_BUF_LEN, NULL); - *len = slprintf(*ptr, CHAR_BUF_LEN, "%d", *(ISC_LONG*)var->sqldata); + *len = sizeof(zend_long); + *ptr = FETCH_BUF(S->fetch_buf[colno], zend_long, 1, NULL); + *(zend_long *)*ptr = *(ISC_LONG*)var->sqldata; break; case SQL_INT64: +#if SIZEOF_ZEND_LONG >= 8 + *len = sizeof(zend_long); + *ptr = FETCH_BUF(S->fetch_buf[colno], zend_long, 1, NULL); + *(zend_long *)*ptr = *(ISC_INT64*)var->sqldata; +#else *ptr = FETCH_BUF(S->fetch_buf[colno], char, CHAR_BUF_LEN, NULL); *len = slprintf(*ptr, CHAR_BUF_LEN, "%" LL_MASK "d", *(ISC_INT64*)var->sqldata); +#endif break; case SQL_FLOAT: *ptr = FETCH_BUF(S->fetch_buf[colno], char, CHAR_BUF_LEN, NULL); |