]> granicus.if.org Git - php/commitdiff
Fixed persistent dba handling
authorXinchen Hui <laruence@php.net>
Wed, 21 May 2014 04:22:59 +0000 (12:22 +0800)
committerXinchen Hui <laruence@php.net>
Wed, 21 May 2014 04:22:59 +0000 (12:22 +0800)
ext/dba/dba.c

index b04a2ee7cd025dfd5133ab9402e0614c9960d63d..15b5ad99e26f973087d3b0e83e2f353af47dbca0 100644 (file)
@@ -417,14 +417,14 @@ static void dba_close(dba_info *info TSRMLS_DC)
                pefree(info->path, info->flags&DBA_PERSISTENT);
        }
        if (info->fp && info->fp != info->lock.fp) {
-               if(info->flags&DBA_PERSISTENT) {
+               if (info->flags & DBA_PERSISTENT) {
                        php_stream_pclose(info->fp);
                } else {
                        php_stream_close(info->fp);
                }
        }
        if (info->lock.fp) {
-               if(info->flags & DBA_PERSISTENT) {
+               if (info->flags & DBA_PERSISTENT) {
                        php_stream_pclose(info->lock.fp);
                } else {
                        php_stream_close(info->lock.fp);
@@ -443,16 +443,14 @@ static void dba_close_rsrc(zend_resource *rsrc TSRMLS_DC)
 {
        dba_info *info = (dba_info *)rsrc->ptr; 
 
-       if (info) {
-               dba_close(info TSRMLS_CC);
-       }
+       dba_close(info TSRMLS_CC);
 }
 /* }}} */
 
 /* {{{ dba_close_pe_rsrc_deleter */
 int dba_close_pe_rsrc_deleter(zval *el, void *pDba TSRMLS_DC)
 {
-       return ((zend_resource *)Z_PTR_P(el))->ptr == pDba;
+       return ((zend_resource *)Z_PTR_P(el))->ptr == pDba ? ZEND_HASH_APPLY_REMOVE: ZEND_HASH_APPLY_KEEP;
 }
 /* }}} */
 
@@ -674,7 +672,8 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent)
                
                        info = (dba_info *)le->ptr;
 
-                       ZEND_REGISTER_RESOURCE(return_value, info, le_pdb);
+                       GC_REFCOUNT(le)++;
+                       RETURN_RES(le);
                        return;
                }
        }
@@ -987,7 +986,11 @@ PHP_FUNCTION(dba_close)
 
        DBA_FETCH_RESOURCE(info, id);
 
-       zend_list_close(Z_RES_P(id));
+       if (info->flags & DBA_PERSISTENT) {
+               zend_list_delete(Z_RES_P(id));
+       } else {
+               zend_list_close(Z_RES_P(id));
+       }
 }
 /* }}} */