<?php 
/* 
  +---------------------------------------------------------------------------------+ 
  | Copyright (c) 2010 ActiveMongo                                                  | 
  +---------------------------------------------------------------------------------+ 
  | Redistribution and use in source and binary forms, with or without              | 
  | modification, are permitted provided that the following conditions are met:     | 
  | 1. Redistributions of source code must retain the above copyright               | 
  |    notice, this list of conditions and the following disclaimer.                | 
  |                                                                                 | 
  | 2. Redistributions in binary form must reproduce the above copyright            | 
  |    notice, this list of conditions and the following disclaimer in the          | 
  |    documentation and/or other materials provided with the distribution.         | 
  |                                                                                 | 
  | 3. All advertising materials mentioning features or use of this software        | 
  |    must display the following acknowledgement:                                  | 
  |    This product includes software developed by César D. Rodas.                  | 
  |                                                                                 | 
  | 4. Neither the name of the César D. Rodas nor the                               | 
  |    names of its contributors may be used to endorse or promote products         | 
  |    derived from this software without specific prior written permission.        | 
  |                                                                                 | 
  | THIS SOFTWARE IS PROVIDED BY CÉSAR D. RODAS ''AS IS'' AND ANY                   | 
  | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED       | 
  | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE          | 
  | DISCLAIMED. IN NO EVENT SHALL CÉSAR D. RODAS BE LIABLE FOR ANY                  | 
  | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES      | 
  | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;    | 
  | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND     | 
  | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT      | 
  | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS   | 
  | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE                     | 
  +---------------------------------------------------------------------------------+ 
  | Authors: César Rodas <[email protected]>                                           | 
  +---------------------------------------------------------------------------------+ 
*/ 
 
require "MongoFS.php"; 
 
/* Ejemplo */ 
MongoFS::connect("mongofs", "localhost"); 
 
define("RAND_OPERATIONS", 30000); 
 
try { 
    $localfile  = generate_test_file(); 
    $remotefile = "gridfs://testing.bin"; 
    $tmpfile    = tempnam("/tmp/", "mongofs"); 
 
    print "Uploading file to MongoDB\n"; 
    do_stream_copy($localfile, $remotefile); 
    print "\tOK\n"; 
 
    print "Downloading file\n"; 
    do_stream_copy($remotefile, $tmpfile); 
    print "\tOK\n"; 
 
    print "Comparing local and remote files\n"; 
    stream_cmp($tmpfile, $localfile); 
    print "\tOK\n"; 
 
 
    print "Random reading\n"; 
    partial_reading($tmpfile, $remotefile); 
    print "\tOK\n"; 
 
    print "Random writing\n"; 
    partial_writing($tmpfile, $remotefile); 
    print "\tOK\n"; 
 
} catch (Exception $e) { 
    echo "\tFAILED:"; 
    echo $e->getMessage()."\n"; 
} 
 
/* delete files  */ 
unlink($remotefile); 
unlink($tmpfile); 
unlink($localfile); 
 
// do_stream_copy($source, $dest) {{{ 
function do_stream_copy($source, $dest) 
{ 
    $f1 = fopen($source, "r"); 
    $f2 = fopen($dest, "w"); 
 
    while ($data = fread($f1, 8096)) { 
        fwrite($f2, $data); 
    } 
    fclose($f1); 
    fclose($f2); 
} 
// }}} 
 
// bool partial_reading(string $file1, string $file2) {{{ 
function partial_reading($file1, $file2) 
{ 
    $fi = fopen($file1, "r"); 
    $fp = fopen($file2, "r"); 
 
    $max = filesize($file1); 
 
    for ($i=0; $i < RAND_OPERATIONS; $i++) { 
        /* random offset */ 
        $offset = rand(0, $max); 
        fseek($fp, $offset, SEEK_SET); 
        fseek($fi, $offset, SEEK_SET); 
        
        /* random data */ 
        $bytes = rand(1, 1024); 
        $data1 = fread($fp, $bytes); 
        $data2 = fread($fi, $bytes); 
        if ($data1 !== $data2) { 
            throw new Exception("File mismatch at position $offset"); 
        } 
    } 
    fclose($fp); 
    fclose($fi); 
} 
// }}} 
 
// bool partial_writing(string $file1, string $file2) {{{ 
function partial_writing($file1, $file2) 
{ 
    $fi = fopen($file1, "r+"); 
    $fp = fopen($file2, "r+"); 
 
    $max = filesize($file1); 
 
    for ($i=0; $i < RAND_OPERATIONS; $i++) { 
        /* random offset */ 
        $offset = rand(0, $max);  
        fseek($fp, $offset, SEEK_SET); 
        fseek($fi, $offset, SEEK_SET); 
        
        /* random data */ 
        $data  = strtoupper(sha1(microtime())); 
        $data .= strtoupper(sha1(microtime())); 
 
        fwrite($fi, $data); 
        fwrite($fp, $data); 
 
    } 
 
    fclose($fp); 
    fclose($fi); 
 
    return stream_cmp($file1, $file2, 50); 
} 
// }}} 
 
// bool stream_cmp($file1, $file2, $bytes) {{{ 
function stream_cmp($file1, $file2, $bytes = 8096) 
{ 
    $size1 = filesize($file1); 
    $size2 = filesize($file2); 
    if ($size1 != $size2) { 
        throw new Exception("file size mismatch {$size1} != {$size2}"); 
    } 
 
    $f1 = fopen($file1, "r"); 
    $f2 = fopen($file2, "r"); 
 
    while (!feof($f2) && !feof($f1)) { 
        $data2 = fread($f2, $bytes); 
        $data1 = fread($f1, $bytes); 
        if ($data1 !== $data2) { 
            for ($i=0; $i < $bytes; $i++) { 
                if ($data1[$i] != $data2[$i]) { 
                    break; 
                } 
            } 
            var_dump(array($data1, $data2)); 
            throw new exception("File mismatch at position ".(ftell($f1)+$i)); 
        } 
    } 
 
    if (feof($f2) !== feof($f1)) { 
        var_dump("Unexpected offset error"); 
        //throw new Exception("Unexpected offset error"); 
    } 
    if (sha1_file($file1) !== sha1_file($file2)) { 
        throw new Exception("SHA1 mismatch"); 
    } 
    fclose($f2); 
    fclose($f1); 
} 
// }}} 
 
// string generate_test_file() {{{ 
function generate_test_file() 
{ 
    echo "Creating random file\n\t"; 
    $fname = tempnam("/tmp/", "mongofs"); 
    $fp    = fopen($fname, "w"); 
    if (!$fp) { 
        throw new Exception("Error while creating testing file"); 
    } 
    $size = rand(40000, 1000000); 
    for ($i=0; $i < $size; $i++) { 
        fwrite($fp, sha1(($i * $size))); 
    } 
    fclose($fp); 
    echo "Done\n"; 
    return $fname; 
} 
// }}} 
 
/* 
 * Local variables: 
 * tab-width: 4 
 * c-basic-offset: 4 
 * End: 
 * vim600: sw=4 ts=4 fdm=marker 
 * vim<600: sw=4 ts=4 
 */ 
 
 |