diff options
-rw-r--r-- | ext/interbase/interbase.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/ext/interbase/interbase.c b/ext/interbase/interbase.c index bc189b553c..3e7d8e4360 100644 --- a/ext/interbase/interbase.c +++ b/ext/interbase/interbase.c @@ -2880,6 +2880,8 @@ PHP_FUNCTION(ibase_blob_import) char bl_data[IBASE_BLOB_SEG]; /* FIXME? blob_seg_size parameter? */ FILE *fp; IBLS_FETCH(); + void * what; + int type; RESET_ERRMSG; @@ -2907,8 +2909,12 @@ PHP_FUNCTION(ibase_blob_import) RETURN_FALSE; } - ZEND_FETCH_RESOURCE(fp, FILE *, file_arg, -1, "File-Handle", php_file_le_fopen()); + what = zend_fetch_resource(arg1, -1, "File-Handle", &type, 2, php_file_le_fopen(), php_file_le_stream()); + ZEND_VERIFY_RESOURCE(what); + if (type == php_file_le_fopen()) + fp = (FILE*)what; + ib_blob.link = ib_link->link; ib_blob.trans_handle = ib_link->trans[trans_n]; ib_blob.bl_handle = NULL; @@ -2921,6 +2927,21 @@ PHP_FUNCTION(ibase_blob_import) } size = 0; + +#if HAVE_PHP_STREAM + if (type == php_file_le_stream()) { + while(b = php_stream_read((php_stream*)what, bl_data, 1, sizeof(bl_data)) > 0) { + if (isc_put_segment(IB_STATUS, &ib_blob.bl_handle, b, bl_data)) { + _php_ibase_error(); + RETURN_FALSE; + } + size += b; + + } + } + else { +#endif + /* Can't see much use for the issock stuff here, it should be nuked --Wez */ while (issock?(b=SOCK_FREAD(bl_data,sizeof(bl_data),socketd)):(b = fread(bl_data, 1, sizeof(bl_data), fp)) > 0) { if (isc_put_segment(IB_STATUS, &ib_blob.bl_handle, b, bl_data)) { _php_ibase_error(); @@ -2929,6 +2950,10 @@ PHP_FUNCTION(ibase_blob_import) size += b; } +#if HAVE_PHP_STREAM + } +#endif + if (isc_close_blob(IB_STATUS, &ib_blob.bl_handle)) { _php_ibase_error(); RETURN_FALSE; |