<?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 <crodas@php.net> |
+---------------------------------------------------------------------------------+
*/
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
*/
|