Explorar o código

Feat: put csv callback

viest %!s(int64=5) %!d(string=hai) anos
pai
achega
88070795e5
Modificáronse 3 ficheiros con 54 adicións e 4 borrados
  1. 1 1
      include/csv.h
  2. 22 2
      kernel/csv.c
  3. 31 1
      kernel/excel.c

+ 1 - 1
include/csv.h

@@ -13,6 +13,6 @@
 #ifndef PHP_EXT_XLS_WRITER_CSV_H
 #define PHP_EXT_XLS_WRITER_CSV_H
 
-unsigned int xlsx_to_csv(zval *stream_resource, xlsxioreadersheet sheet_t, zval *zv_type_arr_t, unsigned int flag);
+unsigned int xlsx_to_csv(zval *stream_resource, xlsxioreadersheet sheet_t, zval *zv_type_arr_t, unsigned int flag, zend_fcall_info *fci, zend_fcall_info_cache *fci_cache);
 
 #endif // PHP_EXT_XLS_WRITER_CSV_H

+ 22 - 2
kernel/csv.c

@@ -15,12 +15,12 @@
 #include "ext/standard/file.h"
 
 /* {{{ */
-unsigned int xlsx_to_csv(zval *stream_resource, xlsxioreadersheet sheet_t, zval *zv_type_arr_t, unsigned int flag)
+unsigned int xlsx_to_csv(zval *stream_resource, xlsxioreadersheet sheet_t, zval *zv_type_arr_t, unsigned int flag, zend_fcall_info *fci, zend_fcall_info_cache *fci_cache)
 {
     zval *_zv_type_arr_t = NULL;
     php_stream *_stream_t;
 
-    ssize_t ret;
+    ssize_t ret = 0;
     char delimiter = ',';
     char enclosure = '"';
     int escape_char = (unsigned char) '\\';
@@ -42,8 +42,28 @@ unsigned int xlsx_to_csv(zval *stream_resource, xlsxioreadersheet sheet_t, zval
     while (sheet_read_row(sheet_t))
     {
         load_sheet_current_row_data(sheet_t, &_zv_tmp_row, _zv_type_arr_t, flag);
+
+        if (fci != NULL && fci_cache != NULL) {
+            zval retval;
+
+            fci->retval      = &retval;
+            fci->params      = &_zv_tmp_row;
+            fci->param_count = 1;
+
+            zend_call_function(fci, fci_cache);
+
+            if (Z_TYPE(retval) == IS_ARRAY) {
+                ret = php_fputcsv(_stream_t, &retval, delimiter, enclosure, escape_char);
+            }
+
+            zval_ptr_dtor(&retval);
+            goto CLEAN_UP_SCENE;
+        }
+
         ret = php_fputcsv(_stream_t, &_zv_tmp_row, delimiter, enclosure, escape_char);
 
+        CLEAN_UP_SCENE:
+
         zend_hash_clean(Z_ARRVAL(_zv_tmp_row));
 
         if (ret < 0) {

+ 31 - 1
kernel/excel.c

@@ -974,7 +974,36 @@ PHP_METHOD(vtiful_xls, putCSV)
 
     zv_type = zend_read_property(vtiful_xls_ce, getThis(), ZEND_STRL(V_XLS_TYPE), 0, NULL);
 
-    if (xlsx_to_csv(fp, obj->read_ptr.sheet_t, zv_type, READ_SKIP_ROW) == XLSWRITER_TRUE) {
+    if (xlsx_to_csv(fp, obj->read_ptr.sheet_t, zv_type, READ_SKIP_ROW, NULL, NULL) == XLSWRITER_TRUE) {
+        RETURN_TRUE;
+    }
+
+    RETURN_FALSE;
+}
+/* }}} */
+
+/** {{{ \Vtiful\Kernel\Excel::putCSVCallback()
+ */
+PHP_METHOD(vtiful_xls, putCSVCallback)
+{
+    zval *fp = NULL, *zv_type = NULL;
+    zend_fcall_info       fci       = empty_fcall_info;
+    zend_fcall_info_cache fci_cache = empty_fcall_info_cache;
+
+    ZEND_PARSE_PARAMETERS_START(2, 2)
+            Z_PARAM_FUNC(fci, fci_cache)
+            Z_PARAM_RESOURCE(fp)
+    ZEND_PARSE_PARAMETERS_END();
+
+    xls_object *obj = Z_XLS_P(getThis());
+
+    if (!obj->read_ptr.sheet_t) {
+        RETURN_FALSE;
+    }
+
+    zv_type = zend_read_property(vtiful_xls_ce, getThis(), ZEND_STRL(V_XLS_TYPE), 0, NULL);
+
+    if (xlsx_to_csv(fp, obj->read_ptr.sheet_t, zv_type, READ_SKIP_ROW, &fci, &fci_cache) == XLSWRITER_TRUE) {
         RETURN_TRUE;
     }
 
@@ -1097,6 +1126,7 @@ zend_function_entry xls_methods[] = {
         PHP_ME(vtiful_xls, openFile,         xls_open_file_arginfo,          ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, openSheet,        xls_open_sheet_arginfo,         ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, putCSV,           xls_put_csv_arginfo,            ZEND_ACC_PUBLIC)
+        PHP_ME(vtiful_xls, putCSVCallback,   NULL, ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, sheetList,        NULL,                           ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, setType,          xls_set_type_arginfo,           ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, getSheetData,     NULL,                           ZEND_ACC_PUBLIC)