gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r15113 - gauger/web


From: gnunet
Subject: [GNUnet-SVN] r15113 - gauger/web
Date: Fri, 29 Apr 2011 05:26:29 +0200

Author: bartpolot
Date: 2011-04-29 05:26:29 +0200 (Fri, 29 Apr 2011)
New Revision: 15113

Modified:
   gauger/web/io.php
   gauger/web/run_test.sh
Log:
Added finally working, more elgant, efficient POST handler


Modified: gauger/web/io.php
===================================================================
--- gauger/web/io.php   2011-04-28 22:27:57 UTC (rev 15112)
+++ gauger/web/io.php   2011-04-29 03:26:29 UTC (rev 15113)
@@ -157,7 +157,7 @@
         return 0;
     }
     fseek($f, -1, SEEK_CUR);
-    while(($b = fread($f, 1)) != "\n") {
+    while(($b = fgetc($f)) != "\n") {
         fseek($f, -2, SEEK_CUR);
         if(ftell($f) == 0) return 0;
     }
@@ -170,6 +170,17 @@
     return line_beginning($f);
 }
 
+function fpeek($f) {
+    line_beginning($f);
+    $b = fgets($f, 512);
+    previous_line($f);
+    return $b;
+}
+
+function get_line($f) {
+    return explode(' ', fpeek($f));
+}
+
 function check_permissions($path, $type = 'file') {
     if(file_exists($path)) {
         $f = 'is_'.$type;
@@ -192,46 +203,35 @@
 }
 
 function find_position($f, $size, $rev) {
-    $pos = $gap = $size/2;
-    $pos2 = 0;
+    $pos = $gap = (int)($size/2);
+    $lastpos = 0;
     fseek($f, $pos, SEEK_SET);
-    line_beginning($f);
-//     echo "Size: $size\n";
-    while ($gap > 0) { // max log2(size) steps
-//         echo "GAP: $gap POS: " . ftell($f) . "\n";
-        $gap = $gap > 1 ? (int)(($gap+1)/2) : 0;
-        $lastpos = $pos;
-
+    while ($gap > 0.5) { // max log2(size) steps
+        $gap /= 2;
         $pos = ftell($f);
-        $buffer = fgets($f, 512);
-        $l = explode(' ', $buffer);
+        $l = get_line($f);
 
-        $pos2 = ftell($f);
-        $buffer2 = fgets($f, 512);
-        $l2 = explode(' ', $buffer2);
-
-        if((int)$l[0] > (int)$rev) {
-//             echo "rew\n";
-            if($pos == 0) {
-                $pos2 = $pos;
-                break;
+        if((int)$rev < (int)$l[0]) {
+            if(ftell($f) == 0) {
+                return 0;
             }
-            fseek($f, max($pos - $gap, 0), SEEK_SET);
-            line_beginning($f);
-        } else if((int)$l2[0] < (int)$rev && $pos2 < $size) {
-//             echo "fwd\n";
-            fseek($f, min($pos + $gap, $size), SEEK_SET);
-            fgets($f, 512); //skip half-line
+            fseek($f, $pos - $gap, SEEK_SET);
+        } else if((int)$rev > (int)$l[0]) {
+            fgets($f, 512);
             if(ftell($f) == $size) {
-                previous_line($f);
+                return $size;
             }
+            $l = get_line($f);
+            if((int)$rev <= (int)$l[0]) {
+                break;
+            }
+            fseek($f, min($pos + $gap, $size-1), SEEK_SET);
         } else {
-//             echo "ok $buffer | $buffer2\n";
             break;
         }
     }
 
-    return $pos2;
+    return ftell($f);
 }
 
 function add_data_to_file($filename, $rev, $data) {
@@ -254,33 +254,28 @@
     $f = @fopen("$filename", 'r+');
     if ($f === false) return false;
     $size = filesize($filename);
-    $sum = $sum2 = $c = 0;
     fseek($f, $pos, SEEK_SET);
-    $r = explode(' ', fgets($f, 512));
-    while($r[0] == $rev) {
+    $r = get_line($f);
+    while($r[0] == $rev && ftell($f) != 0) {
         previous_line($f);
-        previous_line($f);
-        if (ftell($f) == 0) break;
-        $r = explode(' ', fgets($f, 512));
+        $r = get_line($f);
     }
+    if($r[0] != $rev) {
+        fgets($f, 512);
+    }
     $vals = array();
-    $r = explode(' ', fgets($f, 512));
-    if($r[0] != $rev) { // corner case: lines 1 to n are $rev but line 0 is not
-        $r = explode(' ', fgets($f, 512));
-    }
-    while($r[0] == $rev && ftell($f) != $size) {
+    $r = get_line($f);
+    while($r[0] == $rev) {
         $vals[] = $r[1];
-        $c++;
-        $r = explode(' ', fgets($f, 512));
+        fgets($f, 512);
+        if(ftell($f) == $size) break;
+        $r = get_line($f);
     }
-    $avg = 0;
-    foreach($vals as $val) {
-        $avg += $val;
-    }
-    $avg /= $c;
+    $c = count($vals);
+    $avg = array_sum($vals) / $c;
     $stddev = 0;
     foreach($vals as $val) {
-        $stddev += ($avg - $val) * ($avg - $val);
+        $stddev += pow($avg - $val, 2);
     }
     $stddev = sqrt($stddev/$c);
     return array($avg, $stddev);
@@ -289,10 +284,22 @@
 function write_data_to_summary($filename, $rev, $data) {
     $f = @fopen("$filename.dat", 'r+');
     if ($f === false) return false;
-    $size = filesize($filename);
+    $size = filesize("$filename.dat");
     $pos = find_position($f, $size, $rev);
     fseek($f, $pos, SEEK_SET);
-    $r = explode(' ', fgets());
+    $r = get_line($f);
+    if($r[0] == $rev) {
+        fgets($f, 512);
+        $rest = ftell($f) < $size ? fread($f, $size - ftell($f)) : "";
+    } else if($r[0] > $rev) {
+        $rest = $pos < $size ? fread($f, $size - $pos) : "";
+    } else {
+        $rest = "";
+    }
+    fseek($f, $pos, SEEK_SET);
+    fwrite($f, "$rev " . $data[0] . ' ' . $data[1] . "\n");
+    fwrite($f, $rest);
+    ftruncate($f, ftell($f));
     fclose($f);
     return true;
 }
@@ -314,10 +321,10 @@
     }
     $data = recalculate_data($datadir, $rev, $pos);
     print_r($data);
-    //$res = write_data_to_summary($datadir,$rev, $data);
-//     if ($res === false) {
-//         header('HTTP/1.1 500 Internal Server Error');
-//         die("cannot add data to $datadir.dat");
-//     }
-    die("OK ($pos)");
+    $res = write_data_to_summary($datadir, $rev, $data);
+    if ($res === false) {
+        header('HTTP/1.1 500 Internal Server Error');
+        die("cannot add data to $datadir.dat");
+    }
+    die("OK");
 }

Modified: gauger/web/run_test.sh
===================================================================
--- gauger/web/run_test.sh      2011-04-28 22:27:57 UTC (rev 15112)
+++ gauger/web/run_test.sh      2011-04-29 03:26:29 UTC (rev 15113)
@@ -13,7 +13,13 @@
 
 rm -f *~ 2>&1 > /dev/null;
 
-for i in test_data*; do
+if [ -n "$1" ]; then
+    DEST="test_data$1"
+else
+    DEST="test_data*"
+fi
+
+for i in $DEST; do
     N=${i##test_data}
     echo -n "Starting test $N... ";
     if [ ! -f test_result$N ]; then




reply via email to

[Prev in Thread] Current Thread [Next in Thread]