[prev in list] [next in list] [prev in thread] [next in thread] 

List:       php-doc-cvs
Subject:    [DOC-CVS] =?utf-8?q?svn:_/phd/trunk/phpdotnet/phd/Package/PHP/_EnhancedCHM.php?=
From:       Richard_Quadling <rquadling () php ! net>
Date:       2011-02-23 13:47:46
Message-ID: svn-rquadling-1298468866-308601-1402589169 () svn ! php ! net
[Download RAW message or body]

rquadling                                Wed, 23 Feb 2011 13:47:46 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=308601

Log:
Updated enhanced format to use TEMP and to cache the usernotes.
Uses bz2 extension rather than external executable.
Decompresses and converts all.bz2 on the fly - no all.bz2 or all files saved.

Changed paths:
    U   phd/trunk/phpdotnet/phd/Package/PHP/EnhancedCHM.php

Modified: phd/trunk/phpdotnet/phd/Package/PHP/EnhancedCHM.php
===================================================================
--- phd/trunk/phpdotnet/phd/Package/PHP/EnhancedCHM.php	2011-02-23 13:16:28 UTC (rev \
                308600)
+++ phd/trunk/phpdotnet/phd/Package/PHP/EnhancedCHM.php	2011-02-23 13:47:46 UTC (rev \
308601) @@ -7,6 +7,9 @@
     // Do not bother processing notes if we haven't got them this time.
     protected $haveNotes = false;

+    // Where are the usernotes?
+    protected $userNotesBaseDir = null;
+
     public function __construct() {
         parent::__construct();
         $this->registerFormatName("PHP-EnhancedCHM");
@@ -17,66 +20,82 @@
         case Render::INIT:
             parent::update($event, $val);

-            // Get http://www.php.net/backend/notes/all.bz2 and save it.
-            v('Downloading usernotes.', VERBOSE_MESSAGES);
-            if (false === ($userNotesArchive = \
                file_get_contents('http://www.php.net/backend/notes/all.bz2'))) {
-                v('Failed to download usernotes.', E_USER_ERROR);
-                break;
-            }
+            // Use %TEMP%/usernotes as base directory for Usernotes.
+            $this->userNotesBaseDir = getenv('TEMP') . DIRECTORY_SEPARATOR . \
'usernotes' . DIRECTORY_SEPARATOR;

-            // Save the usernotes.
-            v('Saving usernotes.', VERBOSE_MESSAGES);
-            if (false === file_put_contents(Config::output_dir() . 'all.bz2', \
                $userNotesArchive)) {
-                v('Failed to save usernotes.', E_USER_ERROR);
-                break;
+            // Make the usernotes directory.
+            if(!file_exists($this->userNotesBaseDir) || \
is_file($this->userNotesBaseDir)) { +                mkdir($this->userNotesBaseDir) \
or v("Can't create the usernotes directory : %s", $this->userNotesBaseDir, \
E_USER_ERROR);  }

-            // Decompress the usernotes.
-            v('Decompressing usernotes.', VERBOSE_MESSAGES);
-            if (false === strpos(exec('bzip2.exe -dfkv ' . Config::output_dir() . \
                'all.bz2 2>&1'), 'all.bz2: done')) {
-                v('Failed to decompress usernotes.' . PHP_EOL . implode(PHP_EOL, \
                $output), E_USER_ERROR);
-                break;
-            }
+            // Get the local last-updated value.
+            $userNotesLastUpdatedLocal = file_exists($this->userNotesBaseDir . \
'last-updated') ? intval(file_get_contents($this->userNotesBaseDir . 'last-updated')) \
: 0;

-            // Extract the usernotes and store them by page and date.
-            v('Preparing usernotes.', VERBOSE_MESSAGES);
+            // Get the remote last-updated value to see if we need to do anything \
with the usernotes we already have. +            v('Checking usernotes.', \
VERBOSE_MESSAGES); +            $userNotesLastUpdatedRemote = \
intval(file_get_contents('http://www.php.net/backend/notes/last-updated'));

-            // Create usernotes directory.
-            $this->userNotesDir = Config::output_dir() . 'usernotes' . \
                DIRECTORY_SEPARATOR;
-            if(!file_exists($this->userNotesDir) || is_file($this->userNotesDir)) {
-                mkdir($this->userNotesDir) or v("Can't create the usernotes \
                directory", E_USER_ERROR);
-            }
+            // Compare the remote and local last-updated values.
+            if ($userNotesLastUpdatedLocal < $userNotesLastUpdatedRemote) {

-            // Remove any existing files.
-            foreach(glob($this->userNotesDir . '*' . DIRECTORY_SEPARATOR . '*') as \
                $sectionFile) {
-                unlink($sectionFile);
-            }
+                // Make sure the bz2 extension is loaded.
+                // Whilst this PhD format is going to be used on Windows, make it \
non windows compliant by using the appropriate filenaming conventions. +              \
if (!extension_loaded('bz2')) { +                    dl((PHP_SHLIB_SUFFIX === 'dll' ? \
'php_' : '') . 'bz2.' . PHP_SHLIB_SUFFIX); +                }
+
+                if (!extension_loaded('bz2')) {
+                    v('The BZip2 extension is not available.', E_USER_ERROR);
+                    break;
+                }
+
+                // Remove any existing files.
+                foreach(glob($this->userNotesBaseDir . '*' . DIRECTORY_SEPARATOR . \
'*') as $sectionFile) { +                    unlink($sectionFile);
+                }

-            // Decompress the 'all' file into single files - one file per sectionid.
-            $userNotesFile = fopen(Config::output_dir() . 'all', 'rt');
-            while($userNotesFile && !feof($userNotesFile) && false !== ($userNote = \
                fgetcsv($userNotesFile, 0, '|'))) {
-                // Usernote index
-                // 0 = Note ID
-                // 1 = Section ID
-                // 2 = Rate
-                // 3 = Timestamp
-                // 4 = User
-                // 5 = Note
+                // Use a decompression stream filter to save having to store \
anything locally other than the expanded user notes. +                if (false === \
($fpNotes = fopen('http://www.php.net/backend/notes/all.bz2', 'rb'))) { +             \
v('Failed to access the usernotes archive.', E_USER_ERROR); +                    \
break; +                }
+
+                $fpsfNotes = stream_filter_append($fpNotes, 'bzip2.decompress', \
STREAM_FILTER_READ, array('small' => true));

-                $sectionHash = md5($userNote[1]);
-                $sectionDir = $this->userNotesDir . $sectionHash[0];
+                // Extract the usernotes and store them by page and date.
+                v('Preparing usernotes.', VERBOSE_MESSAGES);

-                if (!file_exists($sectionDir)) {
-                    mkdir($sectionDir);
+                // Decompress the 'all' file into single files - one file per \
sectionid. +                while($fpNotes && !feof($fpNotes) && false !== ($userNote \
= fgetcsv($fpNotes, 0, '|'))) { +                    // Usernote index
+                    // 0 = Note ID
+                    // 1 = Section ID
+                    // 2 = Rate
+                    // 3 = Timestamp
+                    // 4 = User
+                    // 5 = Note
+
+                    $sectionHash = md5($userNote[1]);
+                    $sectionDir = $this->userNotesBaseDir . $sectionHash[0];
+
+                    if (!file_exists($sectionDir)) {
+                        mkdir($sectionDir);
+                    }
+
+                    file_put_contents($sectionDir . DIRECTORY_SEPARATOR . \
$sectionHash, implode('|', $userNote) . PHP_EOL, FILE_APPEND);  }

-                file_put_contents($sectionDir . DIRECTORY_SEPARATOR . $sectionHash, \
                implode('|', $userNote) . PHP_EOL, FILE_APPEND);
-            }
+		stream_filter_remove($fpsfNotes);
+                fclose($fpNotes);

-            fclose($userNotesFile);
+                // Save the last-updated data.
+                file_put_contents($this->userNotesBaseDir . 'last-updated', \
$userNotesLastUpdatedRemote);

-            $this->haveNotes = true;
-            v('Usernotes prepared.', VERBOSE_MESSAGES);
+                $this->haveNotes = true;
+                v('Usernotes prepared.', VERBOSE_MESSAGES);
+            } else {
+                v('Usernotes not updated.', VERBOSE_MESSAGES);
+            }

             break;

@@ -90,7 +109,7 @@

         // Find usernotes file.
         $idHash = md5($id);
-        $userNotesFile = $this->userNotesDir . $idHash[0] . DIRECTORY_SEPARATOR . \
$idHash; +        $userNotesFile = $this->userNotesBaseDir . $idHash[0] . \
DIRECTORY_SEPARATOR . $idHash;

         if (!file_exists($userNotesFile)) {
             $notes = ' <div class="note">There are no user contributed notes for \
this page.</div>'; @@ -98,6 +117,13 @@
             $notes = '';

             foreach(file($userNotesFile) as $userNote) {
+                // Usernote index
+                // 0 = Note ID
+                // 1 = Section ID
+                // 2 = Rate
+                // 3 = Timestamp
+                // 4 = User
+                // 5 = Note
                 list($noteId, $noteSection, $noteRate, $noteTimestamp, $noteUser, \
$noteText) = explode('|', $userNote);

                 if ($noteUser) {



-- 
PHP Documentation Commits Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic