]> granicus.if.org Git - php/commitdiff
stream context for specifying meta-data
authorGreg Beaver <cellog@php.net>
Sun, 28 Jan 2007 03:25:53 +0000 (03:25 +0000)
committerGreg Beaver <cellog@php.net>
Sun, 28 Jan 2007 03:25:53 +0000 (03:25 +0000)
ext/phar/TODO
ext/phar/phar.c
ext/phar/phar_object.c
ext/phar/tests/phar_ctx_001.phpt

index e93b6254cfa81b6c63d70a4fcf36749d7bbc0ebf..3a2ddaf18d0c898c291f325790ffdbb16654ff98 100644 (file)
@@ -13,7 +13,7 @@ Version 1.0.0
  X docs on file format/manifest description
  * docs on uses
  X stream context for specifying compression of a file [Marcus]
- * stream context for specifying meta-data
+ X stream context for specifying meta-data [Greg]
  X Phar->begin()/Phar->commitWrite() for specifying a new stub to the phar,
    and deferring flush until all modifications are complete [Greg]
  X Phar->getStub() for retrieving the stub of the phar [Marcus]
index 8999385c5cf00967a942f860770ea75e90815a49..c4398000d064a81108a506b1de59de4fea53d90a 100644 (file)
@@ -1312,11 +1312,12 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, char *pat
        char *error;
        char *filter_name;
        char tmpbuf[8];
+       HashTable *pharcontext;
        php_url *resource = NULL;
        php_stream *fp, *fpf;
        php_stream_filter *filter/*,  *consumed */;
        php_uint32 offset, read, total, toread;
-       zval **pzoption;
+       zval **pzoption, *metadata;
 
        resource = php_url_parse(path);
 
@@ -1350,20 +1351,34 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, char *pat
                        php_url_free(resource);
                        return NULL;
                }
-               efree(error);
+               if (error) {
+                       efree(error);
+               }
                fpf = php_stream_alloc(&phar_ops, idata, NULL, mode);
                php_url_free(resource);
                efree(internal_file);
-               if (idata->internal_file->uncompressed_filesize == 0
-                       &&  idata->internal_file->compressed_filesize == 0
-                       && context && context->options
-                       && zend_hash_find(HASH_OF(context->options), "phar", sizeof("phar"), (void**)&pzoption) == SUCCESS
-                       && zend_hash_find(HASH_OF(*pzoption), "compress", sizeof("compress"), (void**)&pzoption) == SUCCESS
-                       && Z_TYPE_PP(pzoption) == IS_LONG
-                       && (Z_LVAL_PP(pzoption) & ~PHAR_ENT_COMPRESSION_MASK) == 0
-               ) {
-                       idata->internal_file->flags &= ~PHAR_ENT_COMPRESSION_MASK;
-                       idata->internal_file->flags |= Z_LVAL_PP(pzoption);
+               if (context && context->options && zend_hash_find(HASH_OF(context->options), "phar", sizeof("phar"), (void**)&pzoption) == SUCCESS) {
+                       pharcontext = HASH_OF(*pzoption);
+                       if (idata->internal_file->uncompressed_filesize == 0
+                               && idata->internal_file->compressed_filesize == 0
+                               && zend_hash_find(pharcontext, "compress", sizeof("compress"), (void**)&pzoption) == SUCCESS
+                               && Z_TYPE_PP(pzoption) == IS_LONG
+                               && (Z_LVAL_PP(pzoption) & ~PHAR_ENT_COMPRESSION_MASK) == 0
+                       ) {
+                               idata->internal_file->flags &= ~PHAR_ENT_COMPRESSION_MASK;
+                               idata->internal_file->flags |= Z_LVAL_PP(pzoption);
+                       }
+                       if (zend_hash_find(pharcontext, "metadata", sizeof("metadata"), (void**)&pzoption) == SUCCESS) {
+                               if (idata->internal_file->metadata) {
+                                       zval_ptr_dtor(&idata->internal_file->metadata);
+                                       idata->internal_file->metadata = NULL;
+                               }
+
+                               MAKE_STD_ZVAL(idata->internal_file->metadata);
+                               metadata = *pzoption;
+                               ZVAL_ZVAL(idata->internal_file->metadata, metadata, 1, 0);
+                               idata->phar->is_modified = 1;
+                       }
                }
                return fpf;
        } else {
@@ -1992,7 +2007,7 @@ int phar_flush(phar_archive_data *archive, char *user_stub, long len TSRMLS_DC)
                phar_set_32(entry_buffer+16, entry->flags);
                phar_set_32(entry_buffer+20, 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, sizeof(metadata_str.len))) {
+               || metadata_str.len != php_stream_write(newfile, metadata_str.c, metadata_str.len)) {
                        smart_str_free(&metadata_str);
                        if (oldfile) {
                                php_stream_close(oldfile);
@@ -2532,7 +2547,9 @@ static int phar_wrapper_unlink(php_stream_wrapper *wrapper, char *url, int optio
                php_url_free(resource);
                return FAILURE;
        }
-       efree(error);
+       if (error) {
+               efree(error);
+       }
        if (!idata) {
                php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "phar error: \"%s\" is not a file in phar \"%s\", cannot unlink", internal_file, resource->host);
                efree(internal_file);
index 2504462384f122ec85596950340c47a7ce8899c0..58cc6364345d29a9786c731df8f005c849d6215c 100755 (executable)
@@ -499,7 +499,9 @@ PHP_METHOD(Phar, offsetSet)
                        zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "Entry %s does not exist and cannot be created", fname);
                }
        } else {
-               efree(error);
+               if (error) {
+                       efree(error);
+               }
                if (Z_TYPE_P(contents) == IS_STRING) {
                        contents_len = php_stream_write(data->fp, Z_STRVAL_P(contents), Z_STRLEN_P(contents));
                        if (contents_len != Z_STRLEN_P(contents)) {
index 6ec812df86733eaf319cbef9b8cc803a13b953fd..11a1ba252067385fd0b71f8ccc558e9d467e1658 100644 (file)
@@ -28,29 +28,42 @@ var_dump($phar['b']->isCompressed());
 var_dump(file_get_contents($pname . '/c'));
 var_dump($phar['c']->isCompressed());
 
-$context = stream_context_create(array('phar'=>array('compress'=>Phar::GZ)));
+$context = stream_context_create(array('phar'=> array('compress'=>Phar::GZ, 'metadata' => array(2, 'hi' => 3))));
+$context2 = stream_context_create(array('phar' => array('metadata' => array(4))));
 
 file_put_contents($pname . '/a', 'new a', 0); // no compression
 file_put_contents($pname . '/b', 'new b', 0, $context);
-file_put_contents($pname . '/d', 'new d');//, 0, $context);
+file_put_contents($pname . '/d', 'new d', 0, $context2);
 
 $phar = new Phar($fname);
 var_dump(file_get_contents($pname . '/a'));
 var_dump($phar['a']->isCompressed());
+var_dump($phar['a']->getMetaData());
 var_dump(file_get_contents($pname . '/b'));
 var_dump($phar['b']->isCompressed());
+var_dump($phar['b']->getMetaData());
 var_dump(file_get_contents($pname . '/c'));
 var_dump($phar['c']->isCompressed());
+var_dump($phar['c']->getMetaData());
 var_dump(file_get_contents($pname . '/d'));
 var_dump($phar['d']->isCompressed());
-
+var_dump($phar['d']->getMetaData());
+$context2 = stream_context_create(array('phar' => array('metadata' => array(4))));
+$fp = fopen($pname . '/b', 'r+', 0, $context2);
+fclose($fp);
+?>
+==AFTER==
+<?php
+var_dump(file_get_contents($pname . '/b'));
+var_dump($phar['b']->isCompressed());
+var_dump($phar['b']->getMetaData());
 ?>
 ===DONE===
 --CLEAN--
 <?php 
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php');
 ?>
---EXPECTF--
+--EXPECT--
 string(1) "a"
 bool(false)
 string(1) "b"
@@ -59,10 +72,29 @@ string(1) "c"
 bool(false)
 string(5) "new a"
 bool(false)
+NULL
 string(5) "new b"
 bool(true)
+array(2) {
+  [0]=>
+  int(2)
+  ["hi"]=>
+  int(3)
+}
 string(1) "c"
 bool(false)
+NULL
 string(5) "new d"
 bool(false)
-===DONE===
+array(1) {
+  [0]=>
+  int(4)
+}
+==AFTER==
+string(5) "new b"
+bool(true)
+array(1) {
+  [0]=>
+  int(4)
+}
+===DONE===
\ No newline at end of file