Prechádzať zdrojové kódy

Fix(kernel): insertDate use curtom format segmentation fault

viest 4 rokov pred
rodič
commit
db00f424b3

+ 7 - 7
kernel/excel.c

@@ -602,7 +602,7 @@ PHP_METHOD(vtiful_xls, insertText)
 
     SHEET_LINE_SET(obj, row);
 
-    if (format_handle) {
+    if (format_handle != NULL) {
         type_writer(data, row, column, &obj->write_ptr, format, zval_get_format(format_handle));
     } else {
         type_writer(data, row, column, &obj->write_ptr, format, obj->format_ptr.format);
@@ -640,13 +640,13 @@ PHP_METHOD(vtiful_xls, insertDate)
     }
 
     // Default datetime format
-    if (format == NULL) {
+    if (format == NULL || (format != NULL && ZSTR_LEN(format) == 0)) {
         format = zend_string_init(ZEND_STRL("yyyy-mm-dd hh:mm:ss"), 0);
     }
 
     lxw_datetime datetime = timestamp_to_datetime(data->value.lval);
 
-    if (format_handle) {
+    if (format_handle != NULL) {
         datetime_writer(&datetime, row, column, format, &obj->write_ptr, zval_get_format(format_handle));
     } else {
         datetime_writer(&datetime, row, column, format, &obj->write_ptr, obj->format_ptr.format);
@@ -771,7 +771,7 @@ PHP_METHOD(vtiful_xls, insertFormula)
         formula_writer(formula, row, column, &obj->write_ptr, obj->format_ptr.format);
     }
 
-    if (argc == 4) {
+    if (argc == 4 && format_handle != NULL) {
         formula_writer(formula, row, column, &obj->write_ptr, zval_get_format(format_handle));
     }
 }
@@ -860,7 +860,7 @@ PHP_METHOD(vtiful_xls, mergeCells)
         merge_cells(range, data, &obj->write_ptr, obj->format_ptr.format);
     }
 
-    if (argc == 3) {
+    if (argc == 3 && format_handle != NULL) {
         merge_cells(range, data, &obj->write_ptr, zval_get_format(format_handle));
     }
 }
@@ -889,7 +889,7 @@ PHP_METHOD(vtiful_xls, setColumn)
 
     WORKBOOK_NOT_INITIALIZED(obj);
 
-    if (argc == 3) {
+    if (argc == 3 && format_handle != NULL) {
         set_column(range, width, &obj->write_ptr, zval_get_format(format_handle));
     }
 
@@ -922,7 +922,7 @@ PHP_METHOD(vtiful_xls, setRow)
 
     WORKBOOK_NOT_INITIALIZED(obj);
 
-    if (argc == 3) {
+    if (argc == 3 && format_handle != NULL) {
         set_row(range, height, &obj->write_ptr, zval_get_format(format_handle));
     }
 

+ 9 - 1
kernel/resource.c

@@ -28,7 +28,15 @@ xls_resource_write_t * zval_get_resource(zval *handle)
 /* {{{ */
 lxw_format * zval_get_format(zval *handle)
 {
-    lxw_format *res;
+    lxw_format *res = NULL;
+
+    if (handle == NULL) {
+        return NULL;
+    }
+
+    if (zval_get_type(handle) != IS_RESOURCE) {
+        return NULL;
+    }
 
     if((res = (lxw_format *)zend_fetch_resource(Z_RES_P(handle), VTIFUL_RESOURCE_NAME, le_xls_writer)) == NULL) {
         zend_throw_exception(vtiful_exception_ce, "format resources resolution fail", 210);

+ 1 - 2
kernel/write.c

@@ -212,13 +212,12 @@ void chart_writer(zend_long row, zend_long columns, xls_resource_chart_t *chart_
  */
 void datetime_writer(lxw_datetime *datetime, zend_long row, zend_long columns, zend_string *format, xls_resource_write_t *res, lxw_format *format_handle)
 {
-    lxw_format *value_format = NULL;
+    lxw_format *value_format = workbook_add_format(res->workbook);
 
     if (format_handle != NULL) {
         format_copy(value_format, format_handle);
     }
 
-    value_format = workbook_add_format(res->workbook);
     format_set_num_format(value_format, ZSTR_VAL(format));
     worksheet_write_datetime(res->worksheet, (lxw_row_t)row, (lxw_col_t)columns, datetime, value_format);
 }

+ 30 - 0
tests/insert_date_resource_format.phpt

@@ -0,0 +1,30 @@
+--TEST--
+Check for vtiful presence
+--SKIPIF--
+<?php if (!extension_loaded("xlswriter")) print "skip"; ?>
+--FILE--
+<?php
+$config = [
+    'path' => './tests'
+];
+
+$fileObject = new \Vtiful\Kernel\Excel($config);
+$fileObject = $fileObject->fileName('tutorial.xlsx');
+
+$fileHandle = $fileObject->getHandle();
+
+$format     = new \Vtiful\Kernel\Format($fileHandle);
+$colorStyle = $format->fontColor(\Vtiful\Kernel\Format::COLOR_ORANGE)->toResource();
+
+$filePath = $fileObject->header(['date'])
+    ->insertDate(1, 0, time(), 'mmm d yyyy hh:mm AM/PM', $colorStyle)
+    ->output();
+
+var_dump($filePath);
+?>
+--CLEAN--
+<?php
+@unlink(__DIR__ . '/tutorial.xlsx');
+?>
+--EXPECT--
+string(21) "./tests/tutorial.xlsx"