Return integer field types as native integers instead of strings

Use another define for better compatibility

Test case for #72583 Feature. Small optimisations.

Adjust conditional directives according to coding standards

Add more compatibility for "end of line" on multiple environements

Updated execute.phpt test after switching to integer mapping
This commit is contained in:
Dorin Marcoci 2017-01-02 16:46:09 +02:00 committed by Anatol Belski
parent e55e93a1e3
commit 826122fa8e
3 changed files with 52 additions and 7 deletions

View File

@ -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);

View File

@ -0,0 +1,21 @@
--TEST--
PDO_Firebird: Feature 72583 Fetch integers as php integers not as strings
--SKIPIF--
<?php if (!extension_loaded('interbase') || !extension_loaded('pdo_firebird')) die('skip'); ?>
--FILE--
<?php
require 'testdb.inc';
$C = new PDO('firebird:dbname='.$test_base, $user, $password) or die;
@$C->exec('drop table atable');
$C->exec('create table atable (aint integer, asmi smallint)');
$C->exec('insert into atable values (1, -1)');
$S = $C->prepare('select aint, asmi from atable');
$S->execute();
$D = $S->fetch(PDO::FETCH_NUM);
echo gettype($D[0])."\n".gettype($D[1]);
unset($S);
unset($C);
?>
--EXPECT--
integer
integer

View File

@ -50,9 +50,9 @@ bool(true)
int(1)
array(6) {
["ID"]=>
string(1) "1"
int(1)
[0]=>
string(1) "1"
int(1)
["TEXT"]=>
string(3) "bla"
[1]=>