JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
metaform: enter captions and optionally field names
[wfpl.git] / db.php
diff --git a/db.php b/db.php
index 6f8b38d..b1faf2c 100644 (file)
--- a/db.php
+++ b/db.php
@@ -16,8 +16,8 @@
 #  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
-require_once('code/wfpl/encode.php');
-require_once('code/wfpl/format.php');
+require_once(__DIR__ . '/encode.php');
+require_once(__DIR__ . '/format.php');
 
 # db_connect() -- connect to a mysql database
 #
@@ -95,6 +95,7 @@ function db_send_query($sql) {
 #
 # %%  put a % in the output
 # %i  put an integer in the output (strips non-numeric digits, and puts in 0 if blank)
+# %f  put a floating point value in the output (strips non-numeric digits, puts in 0.0 if not valid)
 # %"  output double quotes, surrounding the variable which is encoded to be in there.
 # %s  output encoded to be in double quotes, but don't output the quotes
 # %$  output argument as-is, no encoding. Make sure you quote everything from the user!
@@ -133,6 +134,16 @@ function _db_printf($str, $args) {
                        $int = format_int(array_shift($args));
                        if($int == '') $int = '0';
                        $out .= $int;
+               } elseif($chr == 'f') {
+                       $arg = array_shift($args);
+                       if(is_numeric($arg)) {
+                               $arg = sprintf("%f", $arg);
+                       }
+                       $arg = format_decimal($arg);
+                       if(strlen($arg) < 1) {
+                               $arg = '0.0';
+                       }
+                       $out .= $arg;
                } elseif($chr == '$') {
                        $out .= array_shift($args);
                } else {
@@ -408,8 +419,11 @@ function db_delete($table, $where = '') {
 
 define('DB_ORD_MAX', 2000000000);
 
-function db_reposition_respace($table, $field) {
-       $ids = db_get_column($table, 'id', "where $field != 0 order by $field");
+function db_reposition_respace($table, $field, $where = '') {
+       if($where) {
+               $andand = " && ($where) ";
+       }
+       $ids = db_get_column($table, 'id', "where $field != 0 $andand order by $field");
        $c = count($ids);
        if(!$c) {
                # should never happen
@@ -431,10 +445,13 @@ function db_reposition_respace($table, $field) {
 #
 # return value is the "ord" value you should set/insert into your database
 
-function db_reposition($table, $row_id, $new_pos, $field = 'ord', $pretty = 'same as $table', $renumbered_already = false) {
+function db_reposition($table, $row_id, $new_pos, $field = 'ord', $pretty = 'same as $table', $where = '', $renumbered_already = false) {
        if($pretty == 'same as $table') {
                $pretty = $table;
        }
+       if($where) {
+               $andand = " && ($where) ";
+       }
 
        if($new_pos === 'ignored') {
                # not sorted
@@ -443,7 +460,7 @@ function db_reposition($table, $row_id, $new_pos, $field = 'ord', $pretty = 'sam
 
        # strategy: calculate $prev_ord and $next_ord. If there's no space between, renumber and recurse
        if($new_pos == '0') {
-               $row = db_get_row($table, "id,$field", "where $field != 0 order by $field limit 1");
+               $row = db_get_row($table, "id,$field", "where $field != 0 $andand order by $field limit 1");
                if($row) {
                        list($first_row_id, $first_row_ord) = $row;
                        if($first_row_id == $row_id) {
@@ -459,10 +476,10 @@ function db_reposition($table, $row_id, $new_pos, $field = 'ord', $pretty = 'sam
                $prev_ord = 0;
        } else {
                $new_pos = format_int_0($new_pos);
-               $rows = db_get_rows($table, "id,$field", "where $field != 0 order by $field limit %i,2", $new_pos - 1);
+               $rows = db_get_rows($table, "id,$field", "where $field != 0 $andand order by $field limit %i,2", $new_pos - 1);
                if(!$rows) {
                        message("Sorry, couldn't find the $pretty you asked to put this $pretty after. Putting it first instead.");
-                       return db_reposition($table, $row_id, '0', $field, $pretty);
+                       return db_reposition($table, $row_id, '0', $field, $pretty, $where);
                } else {
                        list($prev_id, $prev_ord) = $rows[0];
                        if($prev_id == $row_id) {
@@ -486,8 +503,8 @@ function db_reposition($table, $row_id, $new_pos, $field = 'ord', $pretty = 'sam
                        message("Programmer error in $pretty ordering code. Please tell your website administrator.");
                        return '' . rand(2, DB_ORD_MAX - 2); # reasonably unlikely to be the same as some other ord
                }
-               db_reposition_respace($table, $field);
-               return db_reposition($table, $row_id, $new_pos, $field, $pretty, $renumbered_already = true);
+               db_reposition_respace($table, $field, $where);
+               return db_reposition($table, $row_id, $new_pos, $field, $pretty, $where, $renumbered_already = true);
        } else {
                return $prev_ord + round(($next_ord - $prev_ord) / 2);
        }