]> granicus.if.org Git - php/commitdiff
- Optimize flushing, don't generate metadata twice
authorMarcus Boerger <helly@php.net>
Mon, 14 May 2007 19:14:00 +0000 (19:14 +0000)
committerMarcus Boerger <helly@php.net>
Mon, 14 May 2007 19:14:00 +0000 (19:14 +0000)
ext/phar/phar.c
ext/phar/phar_internal.h

index 9d895ce9d25cb358ae08f82e0ce0ea3cfaa78f5e..cb1f9adf6495df8ec78730a8326d9b7307755569 100644 (file)
@@ -273,6 +273,10 @@ static void destroy_phar_manifest(void *pDest) /* {{{ */
                zval_ptr_dtor(&entry->metadata);
                entry->metadata = 0;
        }
+       if (entry->metadata_str.c) {
+               smart_str_free(&entry->metadata_str);
+               entry->metadata_str.c = 0;
+       }
        efree(entry->filename);
 }
 /* }}} */
@@ -2229,17 +2233,20 @@ int phar_flush(phar_archive_data *archive, char *user_stub, long len, char **err
                }
                /* after excluding deleted files, calculate manifest size in bytes and number of entries */
                ++new_manifest_count;
-               offset += 4 + entry->filename_len + sizeof(entry_buffer);
 
-               metadata_str.c = 0;
                if (entry->metadata) {
+                       if (entry->metadata_str.c) {
+                               smart_str_free(&entry->metadata_str);
+                       }
                        PHP_VAR_SERIALIZE_INIT(metadata_hash);
-                       php_var_serialize(&metadata_str, &entry->metadata, &metadata_hash TSRMLS_CC);
+                       php_var_serialize(&entry->metadata_str, &entry->metadata, &metadata_hash TSRMLS_CC);
                        PHP_VAR_SERIALIZE_DESTROY(metadata_hash);
-                       offset += metadata_str.len;
-                       smart_str_free(&metadata_str);
+               } else {
+                       entry->metadata_str.len = 0;
                }
 
+               offset += 4 + entry->filename_len + sizeof(entry_buffer) + entry->metadata_str.len;
+
                /* compress and rehash as necessary */
                if (oldfile && !entry->is_modified) {
                        continue;
@@ -2433,22 +2440,15 @@ int phar_flush(phar_archive_data *archive, char *user_stub, long len, char **err
                        4: metadata-len
                        +: metadata
                */
-               metadata_str.c = 0;
-               if (entry->metadata) {
-                       PHP_VAR_SERIALIZE_INIT(metadata_hash);
-                       php_var_serialize(&metadata_str, &entry->metadata, &metadata_hash TSRMLS_CC);
-                       PHP_VAR_SERIALIZE_DESTROY(metadata_hash);
-               }
                mytime = time(NULL);
                phar_set_32(entry_buffer, entry->uncompressed_filesize);
                phar_set_32(entry_buffer+4, mytime);
                phar_set_32(entry_buffer+8, entry->compressed_filesize);
                phar_set_32(entry_buffer+12, entry->crc32);
                phar_set_32(entry_buffer+16, entry->flags);
-               phar_set_32(entry_buffer+20, metadata_str.len);
+               phar_set_32(entry_buffer+20, entry->metadata_str.len);
                if (sizeof(entry_buffer) != php_stream_write(newfile, entry_buffer, sizeof(entry_buffer))
-               || metadata_str.len != php_stream_write(newfile, metadata_str.c, metadata_str.len)) {
-                       smart_str_free(&metadata_str);
+               || entry->metadata_str.len != php_stream_write(newfile, entry->metadata_str.c, entry->metadata_str.len)) {
                        if (closeoldfile) {
                                php_stream_close(oldfile);
                        }
@@ -2458,7 +2458,6 @@ int phar_flush(phar_archive_data *archive, char *user_stub, long len, char **err
                        }
                        return EOF;
                }
-               smart_str_free(&metadata_str);
        }
        
        /* now copy the actual file data to the new phar */
index 7a14d93fb7c800ea659bfc78f1066663ea2a0af6..5acbf417209cb175b07e0c1b4024dabccd65d64f 100755 (executable)
@@ -157,6 +157,7 @@ typedef struct _phar_entry_info {
        int                      is_modified:1;
        int                      is_deleted:1;
        phar_archive_data        *phar;
+       smart_str                metadata_str;
 } phar_entry_info;
 
 /* information about a phar file (the archive itself) */