JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
fdb works, added fault-tollerent read_wole_file
authorJason Woofenden <jason183@herkamire.com>
Tue, 5 Jun 2007 08:14:40 +0000 (04:14 -0400)
committerJason Woofenden <jason183@herkamire.com>
Tue, 5 Jun 2007 08:14:40 +0000 (04:14 -0400)
fdb.php [new file with mode: 0644]
file.php [new file with mode: 0644]
metaform/template.htaccess [new file with mode: 0644]

diff --git a/fdb.php b/fdb.php
new file mode 100644 (file)
index 0000000..4e28972
--- /dev/null
+++ b/fdb.php
@@ -0,0 +1,128 @@
+<?php
+
+#  Copyright (C) 2007 Jason Woofenden
+#
+#  This file is part of wfpl.
+#
+#  wfpl is free software; you can redistribute it and/or modify it under the
+#  terms of the GNU Lesser General Public License as published by the Free
+#  Software Foundation; either version 2.1 of the License, or (at your option)
+#  any later version.
+#
+#  wfpl is distributed in the hope that it will be useful, but WITHOUT ANY
+#  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+#  FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
+#  more details.
+#
+#  You should have received a copy of the GNU Lesser General Public License
+#  along with wfpl; if not, write to the Free Software Foundation, Inc., 51
+#  Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+# This file contains code to use a web-writeable directory full of files as a
+# very simple database.
+
+# Keys are truncated to 32 bytes, made lowercase, and all characters that are
+# not alpha/numeric are replaced with underscores.
+
+# Data can be either a string or an array.
+
+# To set up the database, make a directory that's writeable by PHP and call
+# fdb_set_dir() passing the path to that directory.
+
+
+# call this to set what directory is used to store the files
+function fdb_set_dir($dir) {
+       $GLOBALS['fdb_dir'] = $dir;
+}
+
+function fdb_get_dir() {
+       if(!isset($GLOBALS['fdb_dir'])) {
+               die('you must call fdb_set_dir() before calling other functions in code/wfpl/fdb.php');
+       }
+       return $GLOBALS['fdb_dir'];
+}
+
+# return a 4 bytes that represent the passed integer as a big-endian binary number
+function to_raw_int($int) {
+       return chr($int >> 24) . chr(($int >> 16) & 0xff) . chr(($int >> 8) & 0xff) . chr($int & 0xff);
+}
+
+# return a php number from the string you pass in. The first 4 bytes of the
+# string are read in as a binary value in big-endian format.
+function from_raw_int($quad) {
+       return (ord(substr($quad, 0, 1)) << 24) + (ord(substr($quad, 1, 1)) << 16) + (ord(substr($quad, 2, 1)) << 8) + ord(substr($quad, 3, 1));
+}
+
+function int_at($string, $index) {
+       return from_raw_int(substr($string, $index * 4, 4));
+}
+
+# remove the first 4 bytes of the string, and return them as an int
+function pop_int($&string) {
+       $int = from_raw_int(substring($string, 0 4));
+       $string = substr($string, 4);
+       return $int;
+}
+
+
+
+function fdb_get_raw($key) {
+       $key = fdb_fix_key($key);
+       return read_whole_file_or_false(fdb_get_dir() . "/$key");
+}
+
+function fdb_set_raw($key, $data) {
+       $key = fdb_fix_key($key);
+       write_whole_file(fdb_get_dir() . "/$key", $data);
+}
+
+# like fdb_get() except it returns an array even when there's just one element
+function fdb_geta($key) {
+       $key = fdb_fix_key($key);
+       $data = fd_get_raw($key);
+       if($data === false) {
+               return false;
+       }
+       $header_count = pop_int($data);
+       $out = array();
+       while($header_count--) {
+               $size = int_at($data);
+               $out[] = substr($data, 0, $size);
+               $data = substr($data, $size);
+       }
+       return $out;
+}
+
+# returns:
+#
+# false if the key is not found in the database
+#
+# an array from the file otherwise
+#
+# a string if there's one field in that file (use fdb_geta() if you want an
+# array in this case too)
+function fdb_get($key) {
+       $ret = fdb_geta($key);
+       if(count($ret) == 1) {
+               return $ret[0];
+       } else {
+               return $ret;
+       }
+}
+
+# data can be a string or array
+function fdb_put($key, $data) {
+       $key = fdb_fix_key($key);
+       if(!is_array($data)) {
+               $data = array($data);
+       }
+       $out = to_raw_int(count($data));
+       foreach($data as $dat) {
+               $out .= to_raw_int(strlen($dat));
+               $out .= $dat;
+       }
+       return $out;
+}
+
+?>
diff --git a/file.php b/file.php
new file mode 100644 (file)
index 0000000..3660397
--- /dev/null
+++ b/file.php
@@ -0,0 +1,44 @@
+<?php
+
+#  Copyright (C) 2007 Jason Woofenden
+#
+#  This file is part of wfpl.
+#
+#  wfpl is free software; you can redistribute it and/or modify it under the
+#  terms of the GNU Lesser General Public License as published by the Free
+#  Software Foundation; either version 2.1 of the License, or (at your option)
+#  any later version.
+#
+#  wfpl is distributed in the hope that it will be useful, but WITHOUT ANY
+#  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+#  FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
+#  more details.
+#
+#  You should have received a copy of the GNU Lesser General Public License
+#  along with wfpl; if not, write to the Free Software Foundation, Inc., 51
+#  Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+# This exists because file_get_contents() is not documented well. (It says that
+# the second parameter is optional, but does not specify the default behavior.)
+function read_whole_file($name) {
+       $fd = fopen($name, 'r');
+       if($fd === false) {
+               die("Failed to read file: '$name'");
+       }
+       $file_data = fread($fd, filesize($name));
+       fclose($fd);
+       return $file_data;
+}
+
+# This exists because file_put_contents() is not included in PHP4.
+function write_whole_file($name, $data) {
+       $fd = fopen($name, 'w');
+       if($fd === false) {
+               die("Failed to read file: '$name'");
+       }
+       fwrite($fd, $data);
+       fclose($fd);
+}
+
+?>
diff --git a/metaform/template.htaccess b/metaform/template.htaccess
new file mode 100644 (file)
index 0000000..eb2ad6d
--- /dev/null
@@ -0,0 +1,3 @@
+RewriteEngine  on
+RewriteRule    ^$  /~form~/run.php
+RewriteRule    ^[^/]*\.html$  /~form~/run.php