16
16
+----------------------------------------------------------------------+
17
17
*/
18
18
19
+ #include <stdbool.h>
20
+
19
21
#ifdef HAVE_CONFIG_H
20
22
#include "config.h"
21
23
#endif
@@ -80,6 +82,7 @@ typedef struct {
80
82
*/
81
83
typedef struct {
82
84
union {
85
+ zend_bool bval ;
83
86
short sval ;
84
87
float fval ;
85
88
ISC_LONG lval ;
@@ -239,6 +242,10 @@ static int _php_ibase_alloc_array(ibase_array **ib_arrayp, XSQLDA *sqlda, /* {{{
239
242
a -> el_type = SQL_TEXT ;
240
243
a -> el_size = ar_desc -> array_desc_length ;
241
244
break ;
245
+ case blr_bool :
246
+ a -> el_type = SQL_BOOLEAN ;
247
+ a -> el_size = sizeof (zend_bool );
248
+ break ;
242
249
case blr_short :
243
250
a -> el_type = SQL_SHORT ;
244
251
a -> el_size = sizeof (short );
@@ -574,6 +581,11 @@ static int _php_ibase_bind_array(zval *val, char *buf, zend_ulong buf_size, /* {
574
581
convert_to_double (val );
575
582
* (float * ) buf = (float ) Z_DVAL_P (val );
576
583
break ;
584
+ case SQL_BOOLEAN :
585
+ convert_to_boolean (val );
586
+ // On Windows error unresolved symbol Z_BVAL_P is thrown, so we use Z_LVAL_P
587
+ * (zend_bool * ) buf = Z_LVAL_P (val );
588
+ break ;
577
589
case SQL_DOUBLE :
578
590
convert_to_double (val );
579
591
* (double * ) buf = Z_DVAL_P (val );
@@ -761,6 +773,37 @@ static int _php_ibase_bind(XSQLDA *sqlda, zval *b_vars, BIND_BUF *buf, /* {{{ */
761
773
}
762
774
continue ;
763
775
776
+ case SQL_BOOLEAN :
777
+
778
+ convert_to_string (b_var );
779
+ var -> sqldata = Z_STRVAL_P (b_var );
780
+ var -> sqllen = Z_STRLEN_P (b_var );
781
+ var -> sqltype = SQL_BOOLEAN ;
782
+ continue ;
783
+
784
+ if (Z_STRLEN_P (b_var ) != BLOB_ID_LEN ||
785
+ !_php_ibase_string_to_quad (Z_STRVAL_P (b_var ), & buf [i ].val .qval )) {
786
+
787
+ ibase_blob ib_blob = { 0 , BLOB_INPUT };
788
+
789
+ if (isc_create_blob (IB_STATUS , & ib_query -> link -> handle ,
790
+ & ib_query -> trans -> handle , & ib_blob .bl_handle , & ib_blob .bl_qd )) {
791
+ _php_ibase_error ();
792
+ return FAILURE ;
793
+ }
794
+
795
+ if (_php_ibase_blob_add (b_var , & ib_blob ) != SUCCESS ) {
796
+ return FAILURE ;
797
+ }
798
+
799
+ if (isc_close_blob (IB_STATUS , & ib_blob .bl_handle )) {
800
+ _php_ibase_error ();
801
+ return FAILURE ;
802
+ }
803
+ buf [i ].val .qval = ib_blob .bl_qd ;
804
+ }
805
+ continue ;
806
+
764
807
case SQL_ARRAY :
765
808
766
809
if (Z_TYPE_P (b_var ) != IS_ARRAY ) {
@@ -823,6 +866,9 @@ static void _php_ibase_alloc_xsqlda(XSQLDA *sqlda) /* {{{ */
823
866
case SQL_VARYING :
824
867
var -> sqldata = safe_emalloc (sizeof (char ), var -> sqllen + sizeof (short ), 0 );
825
868
break ;
869
+ case SQL_BOOLEAN :
870
+ var -> sqldata = emalloc (sizeof (zend_bool ));
871
+ break ;
826
872
case SQL_SHORT :
827
873
var -> sqldata = emalloc (sizeof (short ));
828
874
break ;
@@ -1323,6 +1369,10 @@ static int _php_ibase_var_zval(zval *val, void *data, int type, int len, /* {{{
1323
1369
case SQL_TEXT :
1324
1370
ZVAL_STRINGL (val , (char * )data , len );
1325
1371
break ;
1372
+ // The query's field value is boolean
1373
+ case SQL_BOOLEAN :
1374
+ ZVAL_BOOL (val , * (bool * ) data );
1375
+ break ;
1326
1376
case SQL_SHORT :
1327
1377
n = * (short * ) data ;
1328
1378
goto _sql_long ;
@@ -1910,11 +1960,18 @@ static void _php_ibase_field_info(zval *return_value, XSQLVAR *var) /* {{{ */
1910
1960
add_index_stringl (return_value , 3 , buf , len );
1911
1961
add_assoc_stringl (return_value , "length" , buf , len );
1912
1962
1963
+ /*
1964
+ * SQL_ consts are part of Firebird-API.
1965
+ */
1966
+
1913
1967
if (var -> sqlscale < 0 ) {
1914
1968
unsigned short precision = 0 ;
1915
1969
1916
1970
switch (var -> sqltype & ~1 ) {
1917
1971
1972
+ case SQL_BOOLEAN :
1973
+ precision = 1 ;
1974
+ break ;
1918
1975
case SQL_SHORT :
1919
1976
precision = 4 ;
1920
1977
break ;
@@ -1939,6 +1996,9 @@ static void _php_ibase_field_info(zval *return_value, XSQLVAR *var) /* {{{ */
1939
1996
case SQL_SHORT :
1940
1997
s = "SMALLINT" ;
1941
1998
break ;
1999
+ case SQL_BOOLEAN :
2000
+ s = "BOOLEAN" ;
2001
+ break ;
1942
2002
case SQL_LONG :
1943
2003
s = "INTEGER" ;
1944
2004
break ;
0 commit comments