? .bzr ? book.dbtng.patch ? url_filter_2.patch ? sites/default/files ? sites/default/settings.php Index: modules/book/book.module =================================================================== RCS file: /cvs/drupal/drupal/modules/book/book.module,v retrieving revision 1.469 diff -u -p -r1.469 book.module --- modules/book/book.module 27 Sep 2008 20:37:00 -0000 1.469 +++ modules/book/book.module 5 Oct 2008 22:00:06 -0000 @@ -210,7 +210,12 @@ function book_block($op = 'list', $delta } elseif ($current_bid) { // Only display this block when the user is browsing a book. - $title = db_result(db_query(db_rewrite_sql('SELECT n.title FROM {node} n WHERE n.nid = %d'), $node->book['bid'])); + $title = db_select('node') + ->addField('node', 'title') + ->condition('nid', $node->book['bid']) + ->addTag('node_access') + ->execute() + ->fetchField(); // Only show the block if the user has view access for the top-level node. if ($title) { $tree = menu_tree_all_data($node->book['menu_name'], $node->book); @@ -268,20 +273,32 @@ function book_get_books() { $all_books = array(); $result = db_query("SELECT DISTINCT(bid) FROM {book}"); $nids = array(); - while ($book = db_fetch_array($result)) { - $nids[] = $book['bid']; + foreach ($result as $book) { + $nids[] = $book->bid; } if ($nids) { - $result2 = db_query(db_rewrite_sql("SELECT n.type, n.title, b.*, ml.* FROM {book} b INNER JOIN {node} n on b.nid = n.nid INNER JOIN {menu_links} ml ON b.mlid = ml.mlid WHERE n.nid IN (" . implode(',', $nids) . ") AND n.status = 1 ORDER BY ml.weight, ml.link_title")); - while ($link = db_fetch_array($result2)) { + $query = db_select('book', 'b', array('fetch' => PDO::FETCH_ASSOC)); + $node_alias = $query->join('node', 'n', 'b.nid = n.nid'); + $query->join('menu_links', 'ml', 'b.mlid = ml.mlid'); + $query->addField('n', 'type', 'type'); + $query->addField('n', 'title', 'title'); + $query->addExpression('b.*'); + $query->addExpression('ml.*'); + $query->condition('n.nid', $nids, 'IN'); + $query->condition('n.status', 1); + $query->orderBy('ml.weight'); + $query->orderBy('ml.link_title'); + $query->addTag('node_access'); + $result2 = $query->execute(); + foreach ($result2 as $link) { $link['href'] = $link['link_path']; $link['options'] = unserialize($link['options']); $all_books[$link['bid']] = $link; } } } - + return $all_books; } @@ -466,10 +483,14 @@ function _book_update_outline(&$node) { else { // Check in case the parent is not is this book; the book takes precedence. if (!empty($node->book['plid'])) { - $parent = db_fetch_array(db_query("SELECT * FROM {book} WHERE mlid = %d", $node->book['plid'])); + $parent = db_query("SELECT * FROM {book} WHERE mlid = :mlid", array( + ':mlid' => $node->book['plid'], + ))->fetch(PDO::FETCH_ASSOC); } if (empty($node->book['plid']) || !$parent || $parent['bid'] != $node->book['bid']) { - $node->book['plid'] = db_result(db_query("SELECT mlid FROM {book} WHERE nid = %d", $node->book['bid'])); + $node->book['plid'] = db_query("SELECT mlid FROM {book} WHERE nid = :nid", array( + ':nid' => $node->book['bid'], + ))->fetchField(); $node->book['parent_mismatch'] = TRUE; // Likely when JS is disabled. } } @@ -477,10 +498,16 @@ function _book_update_outline(&$node) { if (menu_link_save($node->book)) { if ($new) { // Insert new. - db_query("INSERT INTO {book} (nid, mlid, bid) VALUES (%d, %d, %d)", $node->nid, $node->book['mlid'], $node->book['bid']); + db_insert('book')->fields(array( + 'nid' => $node->nid, + 'mlid' => $node->book['mlid'], + 'bid' => $node->book['bid'], + ))->execute(); } else { - if ($node->book['bid'] != db_result(db_query("SELECT bid FROM {book} WHERE nid = %d", $node->nid))) { + if ($node->book['bid'] != db_query("SELECT bid FROM {book} WHERE nid = :nid", array( + ':nid' => $node->nid, + ))->fetchField()) { // Update the bid for this page and all children. book_update_bid($node->book); } @@ -500,19 +527,15 @@ function _book_update_outline(&$node) { * A fully loaded menu link that is part of the book hierarchy. */ function book_update_bid($book_link) { + $query = db_select('menu_links'); + $query->addField('menu_links', 'mlid'); for ($i = 1; $i <= MENU_MAX_DEPTH && $book_link["p$i"]; $i++) { - $match[] = "p$i = %d"; - $args[] = $book_link["p$i"]; - } - $result = db_query("SELECT mlid FROM {menu_links} WHERE " . implode(' AND ', $match), $args); - - $mlids = array(); - while ($a = db_fetch_array($result)) { - $mlids[] = $a['mlid']; + $query->condition("p$i", $book_link["p$i"]); } + $mlids = $query->execute()->fetchCol(); if ($mlids) { - db_query("UPDATE {book} SET bid = %d WHERE mlid IN (" . implode(',', $mlids) . ")", $book_link['bid']); + db_update('book')->fields('bid', $book_link['bid'])->condition('mlid', $mlids, 'IN')->execute(); } } @@ -677,7 +700,9 @@ function book_nodeapi(&$node, $op, $teas switch ($op) { case 'load': // Note - we cannot use book_link_load() because it will call node_load(). - $info['book'] = db_fetch_array(db_query('SELECT * FROM {book} b INNER JOIN {menu_links} ml ON b.mlid = ml.mlid WHERE b.nid = %d', $node->nid)); + $info['book'] = db_query('SELECT * FROM {book} b INNER JOIN {menu_links} ml ON b.mlid = ml.mlid WHERE b.nid = :nid', array( + ':nid' => $node->nid + ))->fetch(PDO::FETCH_ASSOC); if ($info['book']) { $info['book']['href'] = $info['book']['link_path']; @@ -732,15 +757,17 @@ function book_nodeapi(&$node, $op, $teas if (!empty($node->book['bid'])) { if ($node->nid == $node->book['bid']) { // Handle deletion of a top-level post. - $result = db_query("SELECT b.nid FROM {menu_links} ml INNER JOIN {book} b on b.mlid = ml.mlid WHERE ml.plid = %d", $node->book['mlid']); - while ($child = db_fetch_array($result)) { + $result = db_query("SELECT b.nid FROM {menu_links} ml INNER JOIN {book} b on b.mlid = ml.mlid WHERE ml.plid = :plid", array( + ':plid' => $node->book['mlid'], + ), array('fetch' => PDO::FETCH_ASSOC)); + foreach ($result as $child) { $child_node = node_load($child['nid']); $child_node->book['bid'] = $child_node->nid; _book_update_outline($child_node); } } menu_link_delete($node->book['mlid']); - db_query('DELETE FROM {book} WHERE mlid = %d', $node->book['mlid']); + db_delete('book')->condition('mlid', $node->book['mlid'])->execute(); } break; @@ -1060,7 +1087,9 @@ function book_help($path, $arg) { * Do not call when loading a node, since this function may call node_load(). */ function book_link_load($mlid) { - if ($item = db_fetch_array(db_query("SELECT * FROM {menu_links} ml INNER JOIN {book} b ON b.mlid = ml.mlid LEFT JOIN {menu_router} m ON m.path = ml.router_path WHERE ml.mlid = %d", $mlid))) { + if ($item = db_query("SELECT * FROM {menu_links} ml INNER JOIN {book} b ON b.mlid = ml.mlid LEFT JOIN {menu_router} m ON m.path = ml.router_path WHERE ml.mlid = :mlid", array( + ':mlid' => $mlid, + ))->fetch(PDO::FETCH_ASSOC)) { _menu_link_translate($item); return $item; } @@ -1100,22 +1129,23 @@ function book_menu_subtree_data($item) { // If the subtree data was not in the cache, $data will be NULL. if (!isset($data)) { - $match = array("menu_name = '%s'"); - $args = array($item['menu_name']); - $i = 1; - while ($i <= MENU_MAX_DEPTH && $item["p$i"]) { - $match[] = "p$i = %d"; - $args[] = $item["p$i"]; - $i++; - } - $sql = " - SELECT b.*, m.load_functions, m.to_arg_functions, m.access_callback, m.access_arguments, m.page_callback, m.page_arguments, m.title, m.title_callback, m.title_arguments, m.type, ml.* - FROM {menu_links} ml INNER JOIN {menu_router} m ON m.path = ml.router_path - INNER JOIN {book} b ON ml.mlid = b.mlid - WHERE " . implode(' AND ', $match) . " - ORDER BY p1 ASC, p2 ASC, p3 ASC, p4 ASC, p5 ASC, p6 ASC, p7 ASC, p8 ASC, p9 ASC"; + $query = db_select('menu_links', 'ml'); + $menu_router_alias = $query->join('menu_router', 'm', 'm.path = ml.router_path'); + $book_alias = $query->join('book', 'b', 'ml.mlid = b.mlid'); + $query->addExpression('b.*'); + foreach (array('load_functions', 'to_arg_functions', 'access_callback', 'access_arguments', 'page_callback', 'page_arguments', 'title', 'title_callback', 'title_arguments', 'type') as $field) { + $query->addField($menu_router_alias, $field, $field); + } + $query->addExpression('ml.*'); + $query->condition('menu_name', $item['menu_name']); + for ($i = 1; $i <= MENU_MAX_DEPTH && $item["p$i"]; ++$i) { + $query->condition("p$i", $item["p$i"]); + } + for ($i = 1; $i <= MENU_MAX_DEPTH; ++$i) { + $query->orderBy("p$i"); + } - $data['tree'] = menu_tree_data(db_query($sql, $args), array(), $item['depth']); + $data['tree'] = menu_tree_data($query->execute(), array(), $item['depth']); $data['node_links'] = array(); menu_tree_collect_node_links($data['tree'], $data['node_links']); // Compute the real cid for book subtree data. Index: modules/book/book.pages.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/book/book.pages.inc,v retrieving revision 1.7 diff -u -p -r1.7 book.pages.inc --- modules/book/book.pages.inc 15 May 2008 21:19:24 -0000 1.7 +++ modules/book/book.pages.inc 5 Oct 2008 22:00:06 -0000 @@ -210,7 +210,7 @@ function book_remove_form_submit($form, if ($node->nid != $node->book['bid']) { // Only allowed when this is not a book (top-level page). menu_link_delete($node->book['mlid']); - db_query('DELETE FROM {book} WHERE nid = %d', $node->nid); + db_delete('book')->condition('nid', $node->nid)->execute(); drupal_set_message(t('The post has been removed from the book.')); } $form_state['redirect'] = 'node/' . $node->nid;