| 
<?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
 */
 
 |