From cfb71e37ca8859c4ad9a1db73de0a293ffc7a902 Mon Sep 17 00:00:00 2001
From: Patrick Brown <ptbrown@whoopdedo.org>
Date: Wed, 6 May 2015 23:31:39 -0400
Subject: [PATCH] Deleting lines works with BZ2 files.

---
 _test/tests/inc/io_deletefromfile.test.php |  18 ++++++++----
 _test/tests/inc/io_readfile.test.php       |   7 ++++-
 _test/tests/inc/io_readfile/large.txt.bz2  | Bin 0 -> 47 bytes
 _test/tests/inc/io_readfile/long.txt.bz2   | Bin 0 -> 53 bytes
 inc/io.php                                 |  31 +++++++++++++++++++--
 5 files changed, 47 insertions(+), 9 deletions(-)
 create mode 100644 _test/tests/inc/io_readfile/large.txt.bz2
 create mode 100644 _test/tests/inc/io_readfile/long.txt.bz2

diff --git a/_test/tests/inc/io_deletefromfile.test.php b/_test/tests/inc/io_deletefromfile.test.php
index 361c82214..63951f548 100644
--- a/_test/tests/inc/io_deletefromfile.test.php
+++ b/_test/tests/inc/io_deletefromfile.test.php
@@ -33,10 +33,18 @@ class io_deletefromfile_test extends DokuWikiTest {
         $this->_write(TMP_DIR.'/test.txt');
     }
 
-//    /**
-//     * @depends test_ext_zlib
-//     */
-//    function test_gzwrite(){
-//    }
+    /**
+     * @depends test_ext_zlib
+     */
+    function test_gzwrite(){
+        $this->_write(TMP_DIR.'/test.txt.gz');
+    }
+
+    /**
+     * @depends test_ext_bz2
+     */
+    function test_bzwrite(){
+        $this->_write(TMP_DIR.'/test.txt.bz2');
+    }
 
 }
diff --git a/_test/tests/inc/io_readfile.test.php b/_test/tests/inc/io_readfile.test.php
index e3e90cd8d..700c1902b 100644
--- a/_test/tests/inc/io_readfile.test.php
+++ b/_test/tests/inc/io_readfile.test.php
@@ -48,6 +48,11 @@ class io_readfile_test extends DokuWikiTest {
         $this->assertEquals("The\015\012Test\015\012", io_readFile(__DIR__.'/io_readfile/test.txt.bz2', false));
         $this->assertEquals(false, io_readFile(__DIR__.'/io_readfile/nope.txt.bz2'));
         $this->assertEquals(false, io_readFile(__DIR__.'/io_readfile/corrupt.txt.bz2'));
+        // internal bzfile function
+        $this->assertEquals(array("The\015\012","Test\015\012"), bzfile(__DIR__.'/io_readfile/test.txt.bz2', true));
+        $this->assertEquals(array_fill(0, 120, str_repeat('a', 80)."\012"), bzfile(__DIR__.'/io_readfile/large.txt.bz2', true));
+        $line = str_repeat('a', 8888)."\012";
+        $this->assertEquals(array($line,"\012",$line,"!"), bzfile(__DIR__.'/io_readfile/long.txt.bz2', true));
     }
 
-}
\ No newline at end of file
+}
diff --git a/_test/tests/inc/io_readfile/large.txt.bz2 b/_test/tests/inc/io_readfile/large.txt.bz2
new file mode 100644
index 0000000000000000000000000000000000000000..3135435f82ed3e14ecd60b87af5b9d16f247f45a
GIT binary patch
literal 47
zcmZ>Y%CIzaj8qGbWSZVOn}IR-C<B841B(KK0)xRBR?X#H8?+9s7cX+P2$%p;001oo
B4aNWf

literal 0
HcmV?d00001

diff --git a/_test/tests/inc/io_readfile/long.txt.bz2 b/_test/tests/inc/io_readfile/long.txt.bz2
new file mode 100644
index 0000000000000000000000000000000000000000..fb40759e618fa0c589f4a787e11fc48b6d7c75e4
GIT binary patch
literal 53
zcmZ>Y%CIzaj8qGbEKBiU%fO%#$kZU9z@Wgu$iTp%z+iBeA*5~2QH8gQ93Q>&Sk5KH
Jcc$~}0swxR5gY&j

literal 0
HcmV?d00001

diff --git a/inc/io.php b/inc/io.php
index 8846b7e56..b8a77b730 100644
--- a/inc/io.php
+++ b/inc/io.php
@@ -127,22 +127,36 @@ function io_readFile($file,$clean=true){
  * @author  Andreas Gohr <andi@splitbrain.org>
  *
  * @param string $file filename
- * @return string|bool content or false on error
+ * @param bool   $array return array of lines
+ * @return string|array|bool content or false on error
  */
-function bzfile($file){
+function bzfile($file, $array=false) {
     $bz = bzopen($file,"r");
     if($bz === false) return false;
 
+    if($array) $lines = array();
     $str = '';
-    while (!feof($bz)){
+    while (!feof($bz)) {
         //8192 seems to be the maximum buffersize?
         $buffer = bzread($bz,8192);
         if(($buffer === false) || (bzerrno($bz) !== 0)) {
             return false;
         }
         $str = $str . $buffer;
+        if($array) {
+            $pos = strpos($str, "\n");
+            while($pos !== false) {
+                $lines[] = substr($str, 0, $pos+1);
+                $str = substr($str, $pos+1);
+                $pos = strpos($str, "\n");
+            }
+        }
     }
     bzclose($bz);
+    if($array) {
+        if($str !== '') $lines[] = $str;
+        return $lines;
+    }
     return $str;
 }
 
@@ -280,6 +294,8 @@ function io_deleteFromFile($file,$badline,$regex=false){
     // load into array
     if(substr($file,-3) == '.gz'){
         $lines = gzfile($file);
+    }else if(substr($file,-4) == '.bz2'){
+        $lines = bzfile($file, true);
     }else{
         $lines = file($file);
     }
@@ -306,6 +322,15 @@ function io_deleteFromFile($file,$badline,$regex=false){
             }
             gzwrite($fh, $content);
             gzclose($fh);
+        }else if(substr($file,-4) == '.bz2'){
+            $fh = @bzopen($file,'w');
+            if(!$fh){
+                msg("Removing content from $file failed",-1);
+                io_unlock($file);
+                return false;
+            }
+            bzwrite($fh, $content);
+            bzclose($fh);
         }else{
             $fh = @fopen($file,'wb');
             if(!$fh){
-- 
GitLab