From a781daf79ad6d3a3dfec09ac61e8dcc4c8cc1c48 Mon Sep 17 00:00:00 2001 From: Jason Woofenden Date: Wed, 4 Apr 2012 23:47:17 -0400 Subject: [PATCH] db_reposition: add $where arg so you can reposition a subset --- db.php | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/db.php b/db.php index ddecff3..1bf78fd 100644 --- 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); } -- 1.7.10.4