JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
db_reposition: add $where arg so you can reposition a subset
authorJason Woofenden <jason@jasonwoof.com>
Thu, 5 Apr 2012 03:47:17 +0000 (23:47 -0400)
committerJason Woofenden <jason@jasonwoof.com>
Mon, 9 Apr 2012 21:36:48 +0000 (17:36 -0400)
db.php

diff --git a/db.php b/db.php
index ddecff3..1bf78fd 100644 (file)
--- a/db.php
+++ b/db.php
@@ -419,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
@@ -442,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
@@ -454,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) {
@@ -470,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) {
@@ -497,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);
        }