0, expired => 1, queued => 2, posted => 3); $rstatus = array(0 => dumped, 1 => expired, 2 => queued, 3 => posted); function _node_get($conditions) { foreach ($conditions as $key=>$value) $cond[] = "n.". check_query($key) ." = '". check_query($value) ."'"; $where = implode(" AND ", $cond); if ($conditions[type]) { $type = $conditions[type]; } else { $node = db_fetch_object(db_query("SELECT n.type FROM node n WHERE $where")); $type = $node ? $node->type : 0; } if ($type) { return db_query("SELECT n.*, l.*, u.userid FROM node n LEFT JOIN $type l ON n.lid = l.lid AND n.nid = l.nid LEFT JOIN users u ON n.author = u.id WHERE $where ORDER BY n.timestamp DESC"); } } function node_comment_status($index = -1) { $status = array("Disabled", "Enabled"); return $index < 0 ? $status : $status[$index]; } function node_promote_status($index = -1) { $status = array("Disabled", "Enabled"); return $index < 0 ? $status : $status[$index]; } function node_submission_status($index = -1) { $status = array("Auto-post new submissions", "Moderate new submissions"); return $index < 0 ? $status : $status[$index]; } function node_get_object($conditions) { return db_fetch_object(_node_get($conditions)); } function node_get_array($conditions) { return db_fetch_array(_node_get($conditions)); } function node_del($conditions) { global $status; if ($node = node_get_object($conditions)) { if ($node->status == $status[dumped]) { module_invoke($node->type, "delete", $node); db_query("DELETE FROM node WHERE nid = '$node->nid'"); db_query("DELETE FROM $node->type WHERE lid = '$node->lid' AND nid = '$node->nid'"); db_query("DELETE FROM comments WHERE lid = '$node->nid'"); watchdog("message", "node: deleted '$node->title'"); return $node; } } } function node_get_comments($nid) { $comment = db_fetch_object(db_query("SELECT COUNT(c.lid) AS number FROM node n LEFT JOIN comments c ON n.nid = c.lid WHERE n.nid = '$nid' GROUP BY n.nid")); return $comment->number ? $comment->number : 0; } function node_save($node, $filter) { global $user, $status; $rows = array(nid, pid, lid, cid, tid, log, type, title, score, votes, author, status, comment, promote, moderate, timestamp); if ($node[nid] > 0) { $n = node_get_object(array("nid" => $node[nid])); $u1 = array(); $u2 = array(); foreach ($node as $field=>$value) { if (in_array("$field", $filter)) { if (in_array("$field", $rows)) { array_push($u1, check_input($field) ." = '". check_input($value) ."'"); } else { array_push($u2, check_input($field) ." = '". check_input($value) ."'"); } } } if ($u1 = implode(", ", $u1)) db_query("UPDATE node SET $u1 WHERE nid = '$node[nid]'"); if ($u2 = implode(", ", $u2)) db_query("UPDATE $n->type SET $u2 WHERE nid = '$node[nid]'"); if ($n->pid && ($node[status] == $status[posted])) db_query("UPDATE node SET status = '$status[expired]' WHERE nid = '$n->pid'"); return $node[nid]; } else { $duplicate = node_get_object(array("title" => $node[title])); if ($duplicate && (time() - $duplicate->timestamp < 60)) { watchdog("warning", "node: duplicate '$node[title]'"); } else { // verify submission rate: throttle("post node", variable_get(max_node_rate, 900)); // prepare queries: foreach ($filter as $field=>$value) { $k = check_input(is_numeric($field) ? $value : $field); $v = check_input(is_numeric($field) ? $node[$value] : $filter[$field]); if (in_array($k, $rows)) { $f1[] = $k; $v1[] = "'$v'"; } else { $f2[] = $k; $v2[] = "'$v'"; } } $f1 = implode(", ", $f1); $v1 = implode(", ", $v1); $f2 = implode(", ", $f2); $v2 = implode(", ", $v2); // insert data, try to roll-back when something goes wrong: $result = db_query("INSERT INTO node ($f1) VALUES ($v1)"); if ($result && $nid = db_insert_id()) { $result = db_query("INSERT INTO $filter[type] ($f2, nid) VALUES ($v2, $nid)"); if ($result && $lid = db_insert_id()) { $result = db_query("UPDATE node SET lid = '$lid' WHERE nid = '$nid'"); if ($result) { if (($node[pid]) && ($node[status] == $status[posted])) { db_query("UPDATE node SET status = '$status[expired]' WHERE nid = '$node[pid]'"); } } else { watchdog("warning", "node: added '$node[title]' - failed"); } } else { db_query("DELETE FROM node WHERE nid = '$nid'"); watchdog("warning", "node: added '$node[title]' - failed"); } } else { watchdog("warning", "node: added '$node[title]' - failed"); } } return $nid; } } function node_invoke($node, $name, $arg = 0) { if (is_array($node)) $function = $node[type] ."_$name"; else if (is_object($node)) $function = $node->type ."_$name"; else if (is_string($node)) $function = $node ."_$name"; if (function_exists($function)) return ($arg ? $function($node, $arg) : $function($node)); } function node_view($node, $main = 0) { return node_invoke($node, "view", $main); } function node_form($node) { return node_invoke($node, "form"); } function node_status($value) { $status = array(dumped, expired, queued, posted); if (module_exist($value)) { return array_intersect($status, node_invoke($value, "status")); } else if (strlen($value) > 3) { $status = array_flip($status); return $status[$value]; } else { return $status[$value]; } } function node_control($node) { global $user, $REQUEST_URI; ?> id) { $choices = array("node.php?id=$node->nid" => t("view node"), "submit.php?mod=$node->type" => t("add node"), "submit.php?mod=$node->type&op=update&id=$node->nid" => t("update node"), "node.php?op=history&id=$node->nid" => t("view history")); } else { $choices = array("node.php?id=$node->nid" => t("view node"), "node.php?op=history&id=$node->nid" => t("view history")); } $output .= "
\n"; return $output; } function node_preview($node) { foreach ($node as $key=>$value) { if ($value) $node[$key] = is_array($value) ? node_preview($value) : check_preview($value); } return $node; } function node_visible($node) { global $user, $status; return ($node->status == $status[posted]) || ($node->status == $status[queued] && $user->id) || user_access($user, $node->type) || user_access($user, "node"); } function node_access($account, $node) { return strstr($node->moderate, $account->userid); } ?>