/php/lib/mtdb.base.php
PHP | 1701 lines | 1561 code | 100 blank | 40 comment | 195 complexity | 9bdd2ffaf1370260fff7c08f70d576b9 MD5 | raw file
Possible License(s): BSD-3-Clause, GPL-2.0, LGPL-2.1
Large files files are truncated, but you can click here to view the full file
- <?php
- # Movable Type (r) Open Source (C) 2001-2010 Six Apart, Ltd.
- # This program is distributed under the terms of the
- # GNU General Public License, version 2.
- #
- # $Id: mtdb.base.php 5417 2010-05-12 02:58:17Z takayama $
- require_once('adodb-exceptions.inc.php');
- require_once('adodb.inc.php');
- require_once('adodb-active-record.inc.php');
- abstract class MTDatabase {
- var $savedqueries = array();
- // Member variables
- protected $id;
- protected $conn;
- protected $serializer;
- protected $pdo_enabled = false;
- protected $has_distinct = true;
- // Cache variables
- protected $_entry_id_cache = array();
- protected $_comment_count_cache = array();
- protected $_ping_count_cache = array();
- protected $_cat_id_cache = array();
- protected $_tag_id_cache = array();
- protected $_blog_id_cache = array();
- protected $_entry_link_cache = array();
- protected $_cat_link_cache = array();
- protected $_archive_link_cache = array();
- protected $_entry_tag_cache = array();
- protected $_blog_tag_cache = array();
- protected $_asset_tag_cache = array();
- protected $_blog_asset_tag_cache = array();
- protected $_author_id_cache = array();
- // Construction
- public function __construct($user, $password = '', $dbname = '', $host = '', $port = '', $sock = '') {
- $this->id = md5(uniqid('MTDatabase',true));
- $this->connect($user, $password, $dbname, $host, $port, $sock);
- ADOdb_Active_Record::SetDatabaseAdapter($this->conn);
- # $this->conn->debug = true;
- }
- // Abstract method
- abstract protected function connect($user, $password = '', $dbname = '', $host = '', $port = '', $sock = '');
- abstract public function escape($str);
- abstract public function set_names($mt);
- // Utility method
- public function has_distinct_support () {
- return $this->has_distinct;
- }
- public function db() {
- return $this->conn;
- }
- public function execute($sql) {
- return $this->conn->Execute($sql);
- }
- public function SelectLimit($sql, $limit = -1, $offset = -1) {
- return $this->conn->SelectLimit($sql, $limit, $offset);
- }
- public function unserialize($data) {
- if (!$this->serializer) {
- require_once("MTSerialize.php");
- $this->serializer = new MTSerialize();
- }
- return $this->serializer->unserialize($data);
- }
- public function serialize($data) {
- if (!$this->serializer) {
- require_once("MTSerialize.php");
- $this->serializer = new MTSerialize();
- }
- return $this->serializer->serialize($data);
- }
- protected function include_exclude_blogs(&$args) {
- if (isset($args['blog_ids']) || isset($args['include_blogs']) || isset($args['include_websites'])) {
- // The following are aliased
- $args['blog_ids'] and $args['include_blogs'] = $args['blog_ids'];
- $args['include_websites'] and $args['include_blogs'] = $args['include_websites'];
- $attr = $args['include_blogs'];
- unset($args['blog_ids']);
- unset($args['include_websites']);
- $is_excluded = 0;
- } elseif (isset($args['exclude_blogs']) || isset($args['exclude_websites'])) {
- $attr = $args['exclude_blogs'];
- $attr or $attr = $args['exclude_websites'];
- $is_excluded = 1;
- } elseif (isset($args['blog_id']) && is_numeric($args['blog_id'])) {
- return " = " . $args['blog_id'];
- } else {
- return;
- }
- if (preg_match('/-/', $attr)) {
- # parse range blog ids out
- $list = preg_split('/\s*,\s*/', $attr);
- $attr = '';
- foreach ($list as $item) {
- if (preg_match('/(\d+)-(\d+)/', $item, $matches)) {
- for ($i = $matches[1]; $i <= $matches[2]; $i++) {
- if ($attr != '') $attr .= ',';
- $attr .= $i;
- }
- } else {
- if ($attr != '') $attr .= ',';
- $attr .= $item;
- }
- }
- }
- $blog_ids = preg_split('/\s*,\s*/',
- $attr,
- -1, PREG_SPLIT_NO_EMPTY);
- $sql = '';
- if ($is_excluded) {
- $sql = 'not in ( ' . implode(',', $blog_ids) . ' )';
- } elseif ($args[include_blogs] == 'all') {
- $sql = '> 0';
- } elseif (
- ($args[include_blogs] == 'site')
- || ($args[include_blogs] == 'children')
- || ($args[include_blogs] == 'siblings')
- ) {
- $mt = MT::get_instance();
- $ctx = $mt->context();
- $blog = $ctx->stash('blog');
- if (!empty($blog) && $blog->class == 'blog') {
- require_once('class.mt_blog.php');
- $blog_class = new Blog();
- $blogs = $blog_class->Find("blog_parent_id = " . $blog->parent_id);
- $blog_ids = array();
- foreach($blogs as $b) {
- array_push($ids, $b->id);
- }
- if ( $args[include_with_website] )
- array_push($blog_ids, $blog->parent_id);
- if (count($blog_ids)) {
- $sql = 'in ( ' . implode(',', $blog_ids) . ' )';
- } else {
- $sql = '> 0';
- }
- } else {
- $sql = '> 0';
- }
- } else {
- if (count($blog_ids)) {
- $sql = 'in ( ' . implode(',', $blog_ids) . ' )';
- } else {
- $sql = '> 0';
- }
- }
- return $sql;
- }
- public function db2ts($dbts) {
- $dbts = preg_replace('/[^0-9]/', '', $dbts);
- return $dbts;
- }
- public function ts2db($ts) {
- preg_match('/^(\d\d\d\d)?(\d\d)?(\d\d)?(\d\d)?(\d\d)?(\d\d)?$/', $ts, $matches);
- list($all, $y, $mo, $d, $h, $m, $s) = $matches;
- return sprintf("%04d-%02d-%02d %02d:%02d:%02d", $y, $mo, $d, $h, $m, $s);
- }
- public function apply_extract_date($part, $column) {
- return "extract($part from $column)";
- }
- // Deprecated method
- public function get_row($query = null, $output = OBJECT, $y = 0) {
- require_once('class.exception.php');
- throw new MTDeprecatedException('get_row was Deprecated.');
- }
- public function get_results($query = null, $output = ARRAY_A) {
- require_once('class.exception.php');
- throw new MTDeprecatedException('get_results was Deprecated.');
- }
- public function convert_fieldname($array) {
- require_once('class.exception.php');
- throw new MTDeprecatedException('convert_fieldname was Deprecated.');
- }
- public function expand_meta($rows) {
- require_once('class.exception.php');
- throw new MTDeprecatedException('expand_meta was Deprecated.');
- }
- public function get_meta($obj_type, $obj_id) {
- require_once('class.exception.php');
- throw new MTDeprecatedException('get_meta was Deprecated.');
- }
- function apply_limit_sql($sql, $limit, $offset = 0) {
- require_once('class.exception.php');
- throw new MTDeprecatedException('apply_limit_sql was Deprecated.');
- }
- // Public method
- public function resolve_url($path, $blog_id, $build_type = 3) {
- $path = preg_replace('!/$!', '', $path);
- $blog_id = intval($blog_id);
- # resolve for $path -- one of:
- # /path/to/file.html
- # /path/to/index.html
- # /path/to/
- # /path/to
- $mt = MT::get_instance();
- $index = $this->escape($mt->config('IndexBasename'));
- $escindex = $this->escape($index);
- require_once('class.mt_fileinfo.php');
- $records = null;
- $extras['join'] = array(
- 'mt_template' => array(
- 'condition' => "fileinfo_template_id = template_id"
- ),
- 'mt_templatemap' => array(
- 'condition' => "fileinfo_templatemap_id = templatemap_id",
- 'type' => 'left'
- ),
- );
- foreach ( array($path, urldecode($path), urlencode($path)) as $p ) {
- $where = "fileinfo_blog_id = $blog_id
- and ((fileinfo_url = '%1\$s' or fileinfo_url = '%1\$s/') or (fileinfo_url like '%1\$s/$escindex%%'))
- and template_type != 'backup'
- order by length(fileinfo_url) asc";
- $fileinfo= new FileInfo;
- $records = $fileinfo->Find(sprintf($where, $this->escape($p)), false, false, $extras);
- if (!empty($records))
- break;
- }
- $path = $p;
- if (empty($records)) return null;
- $found = false;
- foreach ($records as $record) {
- if ( !empty( $build_type ) ) {
- if ( !is_array( $build_type ) ) {
- $build_type_array = array( $build_type );
- } else {
- $build_type_array = $build_type;
- }
- $tmpl = $record->template();
- $map = $record->templatemap();
- $type = empty( $map ) ? $tmpl->build_type : $map->build_type;
- if ( !in_array( $type, $build_type_array ) ) {
- continue;
- }
- }
- $fiurl = $record->url;
- if ($fiurl == $path) {
- $found = true;
- break;
- }
- if ($fiurl == "$path/") {
- $found = true;
- break;
- }
- $ext = $record->blog()->file_extension;
- if (!empty($ext)) $ext = '.' . $ext;
- if ($fiurl == ($path.'/'.$index.$ext)) {
- $found = true; break;
- }
- if ($found) break;
- }
- if (!$found) return null;
- $blog = $record->blog();
- $this->_blog_id_cache[$blog->id] =& $blog;
- return $record;
- }
- public function load_index_template($ctx, $tmpl, $blog_id = null) {
- return $this->load_special_template($ctx, $tmpl, 'index', $blog_id);
- }
- public function fetch_websites($args) {
- $args['class'] = 'website';
- return $this->fetch_blogs($args);
- }
- public function fetch_blogs($args = null) {
- if ($blog_ids = $this->include_exclude_blogs($args))
- $blog_filter = 'blog_id ' . $blog_ids;
- else
- $blog_filter = '1 = 1';
- if (!isset($args['class']))
- $args['class'] = 'blog';
- $where = $blog_filter;
- $where .= $args['class'] == '*' ? "" : " and blog_class = '".$args['class']."'";
- $where .= ' order by blog_name';
- require_once('class.mt_blog.php');
- $blogs = null;
- $blog = new Blog();
- $blogs = $blog->Find($where);
- return $blogs;
- }
- public function fetch_templates($args = null) {
- if (isset($args['type'])) {
- $type_filter = 'and template_type = \'' . $this->escape($args['type']) . '\'';
- }
- if (isset($args['blog_id'])) {
- $blog_filter = 'and template_blog_id = ' . intval($args['blog_id']);
- }
- $where = "1 = 1
- $blog_filter
- $type_filter
- order by template_name";
- require_once('class.mt_template.php');
- $template = new Template;
- $result = $template->Find($where);
- return $result;
- }
- public function fetch_templatemap($args = null) {
- if (isset($args['type'])) {
- $type_filter = 'and templatemap_archive_type = \'' . $this->escape($args['type']) . '\'';
- }
- if (isset($args['blog_id'])) {
- $blog_filter = 'and templatemap_blog_id = ' . intval($args['blog_id']);
- }
- $where = "1 = 1
- $blog_filter
- $type_filter
- order by templatemap_archive_type";
- require_once('class.mt_templatemap.php');
- $tmap = new TemplateMap;
- $result = $tmap->Find($where);
- return $result;
- }
- public function load_special_template($ctx, $tmpl, $type, $blog_id = null) {
- if (empty($blog_id))
- $blog_id = $ctx->stash('blog_id');
- $tmpl_name = $this->escape($tmpl);
- $where = "template_blog_id = $blog_id";
- if (!empty($tmpl)) {
- $where .= " and (template_name = '$tmpl_name'
- or template_outfile = '$tmpl_name'
- or template_identifier='$tmpl_name')";
- }
- $where .= " and template_type = '".$this->escape($type)."'";
- require_once('class.mt_template.php');
- $template = new Template;
- $template->Load($where);
- return $template;
- }
- public function fetch_config() {
- require_once('class.mt_config.php');
- $config = new Config;
- $config->Load();
- return $config;
- }
- public function category_link($cid) {
- if (isset($this->_cat_link_cache[$cid])) {
- $url = $this->_cat_link_cache[$cid];
- } else {
- $where = "fileinfo_category_id = $cid and
- fileinfo_archive_type = 'Category'";
- require_once('class.mt_fileinfo.php');
- $finfo = new FileInfo;
- $finfos = $finfo->Find($where);
- $found = false;
- foreach($finfos as $fi) {
- $tmap = $fi->TemplateMap();
- if ($tmap->is_preferred == 1) {
- $found = true;
- $finfo = $fi;
- break;
- }
- }
- if (!$found)
- return null;
- $blog = $finfo->Blog();
- $blog_url = $blog->archive_url();
- if (empty($blog_url))
- $blog_url = $blog->site_url();
- $blog_url = preg_replace('!(https?://(?:[^/]+))/.*!', '$1', $blog_url);
- $url = $blog_url . $finfo->url;
- require_once('MTUtil.php');
- $url = _strip_index($url, $blog);
- $this->_cat_link_cache[$cid] = $url;
- }
- return $url;
- }
- public function archive_link($ts, $at, $sql, $args) {
- $blog_id = intval($args['blog_id']);
- if (isset($this->_archive_link_cache[$blog_id.';'.$ts.';'.$at])) {
- $url = $this->_archive_link_cache[$blog_id.';'.$ts.';'.$at];
- } else {
- if (empty($sql)) {
- $sql = "fileinfo_startdate = '$ts'
- and fileinfo_blog_id = $blog_id
- and fileinfo_archive_type = '" . $this->escape($at). "'" .
- " and templatemap_is_preferred = 1";
- }
- $extras['join'] = array(
- 'mt_templatemap' => array(
- 'condition' => "templatemap_id = fileinfo_templatemap_id"
- )
- );
-
- require_once('class.mt_fileinfo.php');
- $finfo = new FileInfo;
- $infos = $finfo->Find($sql, false, false, $extras);
- if (empty($infos))
- return null;
- $finfo = $infos[0];
- $blog = $finfo->blog();
- if ($at == 'Page') {
- $blog_url = $blog->site_url();
- } else {
- $blog_url = $blog->archive_url();
- }
- require_once('MTUtil.php');
- $blog_url = preg_replace('!(https?://(?:[^/]+))/.*!', '$1', $blog_url);
- $url = $blog_url . $finfo->fileinfo_url;
- $url = _strip_index($url, $blog);
- $this->_archive_link_cache[$ts.';'.$at] = $url;
- }
- return $url;
- }
- public function entry_link($eid, $at = "Individual", $args = null) {
- $eid = intval($eid);
- if (isset($this->_entry_link_cache[$eid.';'.$at])) {
- $url = $this->_entry_link_cache[$eid.';'.$at];
- } else {
- $extras['join'] = array(
- 'mt_templatemap' => array(
- 'condition' => "templatemap_id = fileinfo_templatemap_id"
- )
- );
- $filter = '';
- if (preg_match('/Category/', $at)) {
- $extras['join']['mt_placement'] = array(
- 'condition' => "fileinfo_category_id = placement_category_id"
- );
- $filter = " and placement_entry_id = $eid
- and placement_is_primary = 1";
- }
- if (preg_match('/Page/', $at)) {
- $entry = $this->fetch_page($eid);
- } else {
- $entry = $this->fetch_entry($eid);
- }
- $ts = $entry->entry_authored_on;
- if (preg_match('/Monthly$/', $at)) {
- $ts = substr($ts, 0, 6) . '01000000';
- } elseif (preg_match('/Daily$/', $at)) {
- $ts = substr($ts, 0, 8) . '000000';
- } elseif (preg_match('/Weekly$/', $at)) {
- require_once("MTUtil.php");
- list($ws, $we) = start_end_week($ts);
- $ts = $ws;
- } elseif (preg_match('/Yearly$/', $at)) {
- $ts = substr($ts, 0, 4) . '0101000000';
- } elseif ($at == 'Individual' || $at == 'Page') {
- $filter .= " and fileinfo_entry_id = $eid";
- }
- if ($ts != $entry->entry_authored_on) {
- $filter .= " and fileinfo_startdate = '$ts'";
- }
- if (preg_match('/Author/', $at)) {
- $filter .= " and fileinfo_author_id = ". $entry->entry_author_id;
- }
- $where .= "templatemap_archive_type = '$at'
- and templatemap_is_preferred = 1
- $filter";
- if (isset($args['blog_id']))
- $where .= " and fileinfo_blog_id = " . $args['blog_id'];
- require_once('class.mt_fileinfo.php');
- $finfo = new FileInfo;
- $infos = $finfo->Find($where, false, false, $extras);
- if (empty($infos))
- return null;
- $finfo = $infos[0];
- $blog = $finfo->blog();
- if ($at == 'Page') {
- $blog_url = $blog->site_url();
- } else {
- $blog_url = $blog->archive_url();
- if (empty($blog_url))
- $blog_url = $blog->site_url();
- }
- require_once('MTUtil.php');
- $blog_url = preg_replace('!(https?://(?:[^/]+))/.*!', '$1', $blog_url);
- $url = $blog_url . $finfo->fileinfo_url;
- $url = _strip_index($url, $blog);
- $this->_entry_link_cache[$eid.';'.$at] = $url;
- }
- if ($at != 'Individual' && $at != 'Page') {
- if (!$args || !isset($args['no_anchor'])) {
- $url .= '#' . (!$args || isset($args['valid_html']) ? 'a' : '') .
- sprintf("%06d", $eid);
- }
- }
- return $url;
- }
- public function get_template_text($ctx, $module, $blog_id = null, $type = 'custom', $global = null) {
- if (empty($blog_id))
- $blog_id = $ctx->stash('blog_id');
- if ($type === 'custom' || $type === 'widget'|| $type === 'widgetset') {
- $col = 'template_name';
- $type_filter = "and template_type='$type'";
- } else {
- $col = 'template_identifier';
- $type_filter = "";
- }
- if (!isset($global)) {
- $blog_filter = "template_blog_id in (".$this->escape($blog_id).",0)";
- } elseif ($global) {
- $blog_filter = "template_blog_id = 0";
- } else {
- $blog_filter = "template_blog_id = ".$this->escape($blog_id);
- }
- require_once('class.mt_template.php');
- $template = new Template;
- $where = "$blog_filter
- and $col = '".$this->escape($module)."'
- $type_filter
- order by template_blog_id desc";
- $tmpls = $template->Find($where);
- if (empty($tmpls)) return '';
- $tmpl = $tmpls[0]->text;
- $ts = $tmpls[0]->modified_on;
- $file = $tmpls[0]->linked_file;
- $mtime = $tmpls[0]->linked_file_mtime;
- $size = $tmpls[0]->linked_file_size;
- if ($file) {
- if (!file_exists($file)) {
- $blog = $ctx->stash('blog');
- if ($blog->id != $blog_id) {
- $blog = $this->fetch_blog($blog_id);
- }
- $path = $blog->site_path();
- if (!preg_match('![\\/]$!', $path))
- $path .= '/';
- $path .= $file;
- if (is_file($path) && is_readable($path))
- $file = $path;
- else
- $file = '';
- }
- if ($file) {
- if ((filemtime($file) > $mtime) || (filesize($file) != $size)) {
- $contents = @file($file);
- $tmpl = implode('', $contents);
- }
- }
- }
- return $tmpl;
- }
- public function fetch_website($blog_id) {
- if (!empty($this->_blog_id_cache) && isset($this->_blog_id_cache[$blog_id])) {
- return $this->_blog_id_cache[$blog_id];
- }
- require_once('class.mt_website.php');
- $blog = new Website;
- $blog->Load("blog_id = $blog_id");
- $this->_blog_id_cache[$blog_id] = $blog;
- return $blog;
- }
- public function fetch_blog($blog_id) {
- if (!empty($this->_blog_id_cache) && isset($this->_blog_id_cache[$blog_id])) {
- return $this->_blog_id_cache[$blog_id];
- }
- require_once('class.mt_blog.php');
- $blog = new Blog;
- $blog->Load("blog_id = $blog_id");
- $this->_blog_id_cache[$blog_id] = $blog;
- return $blog;
- }
- function fetch_pages($args) {
- $args['class'] = 'page';
- return $this->fetch_entries($args);
- }
- function fetch_entry($eid) {
- $args['class'] = 'entry';
- $args['entry_id'] = $eid;
- $entries = $this->fetch_entries($args);
- if (empty($entries))
- return null;
- else
- return $entries[0];
- }
- public function fetch_entries($args, &$total_count = NULL) {
- require_once('class.mt_entry.php');
- $extras = array();
- if ($sql = $this->include_exclude_blogs($args)) {
- $blog_filter = 'and entry_blog_id ' . $sql;
- } elseif (isset($args['blog_id'])) {
- $blog_id = intval($args['blog_id']);
- $blog_filter = 'and entry_blog_id = ' . $blog_id;
- $blog = $this->fetch_blog($blog_id);
- }
- if ( empty($blog) ) {
- $mt = MT::get_instance();
- $blog = $this->fetch_blog($mt->blog_id());
- }
- if (empty($blog))
- return null;
- // determine any custom fields that we should filter on
- $fields = array();
- foreach ($args as $name => $v)
- if (preg_match('/^field___(\w+)$/', $name, $m))
- $fields[$m[1]] = $v;
- # automatically include offset if in request
- if ($args['offset'] == 'auto') {
- $args['offset'] = 0;
- if ($args['limit'] || $args['lastn']) {
- if (intval($_REQUEST['offset']) > 0) {
- $args['offset'] = intval($_REQUEST['offset']);
- }
- }
- }
- if ($args['limit'] > 0) {
- $args['lastn'] = $args['limit'];
- } elseif (!isset($args['days']) && !isset($args['lastn'])) {
- # if ($days = $blog['blog_days_on_index']) {
- # if (!isset($args['recently_commented_on'])) {
- # $args['days'] = $days;
- # }
- # } elseif ($posts = $blog['blog_entries_on_index']) {
- # $args['lastn'] = $posts;
- # }
- }
- if ($args['limit'] == 'auto') {
- if ((intval($_REQUEST['limit']) > 0) && (intval($_REQUEST['limit']) < $args['lastn'])) {
- $args['lastn'] = intval($_REQUEST['limit']);
- } elseif (!isset($args['days']) && !isset($args['lastn'])) {
- if ($days = $blog->blog_days_on_index) {
- if (!isset($args['recently_commented_on'])) {
- $args['days'] = $days;
- }
- } elseif ($posts = $blog->blog_entries_on_index) {
- $args['lastn'] = $posts;
- }
- }
- }
- if (isset($args['include_blogs']) or isset($args['exclude_blogs'])) {
- $blog_ctx_arg = isset($args['include_blogs']) ?
- array('include_blogs' => $args['include_blogs']) :
- array('exclude_blogs' => $args['exclude_blogs']);
- }
- # a context hash for filter routines
- $ctx = array();
- $filters = array();
- if (!isset($_REQUEST['entry_ids_published'])) {
- $_REQUEST['entry_ids_published'] = array();
- }
- if (isset($args['unique']) && $args['unique']) {
- $filters[] = create_function('$e,$ctx', 'return !isset($ctx["entry_ids_published"][$e->entry_id]);');
- $ctx['entry_ids_published'] = &$_REQUEST['entry_ids_published'];
- }
- # special case for selecting a particular entry
- if (isset($args['entry_id'])) {
- $entry_filter = 'and entry_id = '.$args['entry_id'];
- $start = ''; $end = ''; $limit = 1; $blog_filter = ''; $day_filter = '';
- } else {
- $entry_filter = '';
- }
- # special case for excluding a particular entry
- if (isset($args['not_entry_id'])) {
- $entry_filter .= ' and entry_id != '.$args['not_entry_id'];
- }
- $entry_list = array();
- # Adds a category filter to the filters list.
- $cat_class = 'category';
- if (!isset($args['class']))
- $args['class'] = 'entry';
- if ($args['class'] == 'page')
- $cat_class = 'folder';
- if (isset($args['category']) or isset($args['categories'])) {
- $category_arg = isset($args['category']) ? $args['category'] : $args['categories'];
- require_once("MTUtil.php");
- if (!preg_match('/\b(AND|OR|NOT)\b|\(|\)/i', $category_arg)) {
- $not_clause = false;
- $cats = cat_path_to_category($category_arg, $blog_ctx_arg, $cat_class);
- if (!empty($cats)) {
- $category_arg = '';
- foreach ($cats as $cat) {
- if ($category_arg != '')
- $category_arg .= '|| ';
- $category_arg .= '#' . $cat->category_id;
- }
- $category_arg = '(' . $category_arg . ')';
- }
- } else {
- $not_clause = preg_match('/\bNOT\b/i', $category_arg);
- if ($blog_ctx_arg)
- $cats =& $this->fetch_categories(array_merge($blog_ctx_arg, array('show_empty' => 1, 'class' => $cat_class)));
- else
- $cats =& $this->fetch_categories(array('blog_id' => $blog_id, 'show_empty' => 1, 'class' => $cat_class));
- }
- if (!empty($cats)) {
- $cexpr = create_cat_expr_function($category_arg, $cats, array('children' => $args['include_subcategories']));
- if ($cexpr) {
- $cmap = array();
- $cat_list = array();
- foreach ($cats as $cat)
- $cat_list[] = $cat->category_id;
- $pl = $this->fetch_placements(array('category_id' => $cat_list));
- if (!empty($pl)) {
- foreach ($pl as $p) {
- $cmap[$p->placement_entry_id][$p->placement_category_id]++;
- if (!$not_clause)
- $entry_list[$p->placement_entry_id] = 1;
- }
- }
- $ctx['p'] =& $cmap;
- $filters[] = $cexpr;
- } else {
- return null;
- }
- }
- } elseif (isset($args['category_id'])) {
- require_once("MTUtil.php");
- $cat = $this->fetch_category($args['category_id']);
- if (!empty($cat)) {
- $cats = array($cat);
- $cmap = array();
- $cexpr = create_cat_expr_function($cat->category_label, $cats, array('children' => $args['include_subcategories']));
- $pl = $this->fetch_placements(array('category_id' => array($cat->category_id)));
- if (!empty($pl)) {
- foreach ($pl as $p) {
- $cmap[$p->placement_entry_id][$p->placement_category_id]++;
- }
- $ctx['p'] =& $cmap;
- $filters[] = $cexpr;
- } else {
- # this category have no entries (or pages)
- return null;
- }
- }
- }
- if ((0 == count($filters)) && (isset($args['show_empty']) && (1 == $args['show_empty']))) {
- return null;
- }
- # Adds a tag filter to the filters list.
- if (isset($args['tags']) or isset($args['tag'])) {
- $tag_arg = isset($args['tag']) ? $args['tag'] : $args['tags'];
- require_once("MTUtil.php");
- $not_clause = preg_match('/\bNOT\b/i', $tag_arg);
- $include_private = 0;
- $tag_array = tag_split($tag_arg);
- foreach ($tag_array as $tag) {
- if ($tag && (substr($tag,0,1) == '@')) {
- $include_private = 1;
- }
- }
- if (isset($blog_ctx_arg))
- $tags = $this->fetch_entry_tags(array($blog_ctx_arg, 'tag' => $tag_arg, 'include_private' => $include_private, 'class' => $args['class']));
- else
- $tags = $this->fetch_entry_tags(array('blog_id' => $blog_id, 'tag' => $tag_arg, 'include_private' => $include_private, 'class' => $args['class']));
- if (!is_array($tags)) $tags = array();
- $cexpr = create_tag_expr_function($tag_arg, $tags);
- if ($cexpr) {
- $tmap = array();
- $tag_list = array();
- foreach ($tags as $tag) {
- $tag_list[] = $tag->tag_id;
- }
- if (isset($blog_ctx_arg))
- $ot = $this->fetch_objecttags(array('tag_id' => $tag_list, 'datasource' => 'entry', $blog_ctx_arg));
- elseif ($args['blog_id'])
- $ot = $this->fetch_objecttags(array('tag_id' => $tag_list, 'datasource' => 'entry', 'blog_id' => intval($args['blog_id'])));
- if ($ot) {
- foreach ($ot as $o) {
- $tmap[$o->objecttag_object_id][$o->objecttag_tag_id]++;
- if (!$not_clause)
- $entry_list[$o->objecttag_object_id] = 1;
- }
- }
- $ctx['t'] =& $tmap;
- $filters[] = $cexpr;
- } else {
- return null;
- }
- }
- # Adds a score or rate filter to the filters list.
- if (isset($args['namespace'])) {
- require_once("MTUtil.php");
- $arg_names = array('min_score', 'max_score', 'min_rate', 'max_rate', 'min_count', 'max_count' );
- foreach ($arg_names as $n) {
- if (isset($args[$n])) {
- $rating_args = $args[$n];
- $cexpr = create_rating_expr_function($rating_args, $n, $args['namespace']);
- if ($cexpr) {
- $filters[] = $cexpr;
- } else {
- return null;
- }
- }
- }
- if (isset($args['scored_by'])) {
- $voter = $this->fetch_author_by_name($args['scored_by']);
- if (empty($voter)) {
- echo "Invalid scored by filter: ".$args['scored_by'];
- return null;
- }
- $cexpr = create_rating_expr_function($voter->author_id, 'scored_by', $args['namespace']);
- if ($cexpr) {
- $filters[] = $cexpr;
- } else {
- return null;
- }
- }
- }
- # Adds an count of comment filter
- if (isset($args['max_comment']) && is_numeric($args['max_comment'])) {
- $max_comment_filter = 'and entry_comment_count <= ' . intval($args['max_comment']);
- }
- if (isset($args['min_comment']) && is_numeric($args['min_comment'])) {
- $min_comment_filter = 'and entry_comment_count >= ' . intval($args['min_comment']);
- }
- if (count($entry_list) && ($entry_filter == '')) {
- $entry_list = implode(",", array_keys($entry_list));
- # set a reasonable cap on the entry list cache. if
- # user is selecting something too big, then they'll
- # just have to wait through a scan.
- if (strlen($entry_list) < 2048)
- $entry_filter = "and entry_id in ($entry_list)";
- }
- if (isset($args['author'])) {
- $author_filter = 'and author_name = \'' .
- $this->escape($args['author']) . "'";
- $extras['join']['mt_author'] = array(
- 'condition' => "entry_author_id = author_id"
- );
- }
- $start = isset($args['current_timestamp'])
- ? $args['current_timestamp'] : null;
- $end = isset($args['current_timestamp_end'])
- ? $args['current_timestamp_end'] : null;
- if ($start and $end) {
- $start = $this->ts2db($start);
- $end = $this->ts2db($end);
- $date_filter = "and entry_authored_on between '$start' and '$end'";
- } elseif ($start) {
- $start = $this->ts2db($start);
- $date_filter = "and entry_authored_on >= '$start'";
- } elseif ($end) {
- $end = $this->ts2db($end);
- $date_filter = "and entry_authored_on <= '$end'";
- } else {
- $date_filter = '';
- }
- if (isset($args['lastn'])) {
- if (!isset($args['entry_id'])) $limit = $args['lastn'];
- } elseif (isset($args['days']) && !$date_filter) {
- $day_filter = 'and ' . $this->limit_by_day_sql('entry_authored_on', intval($args['days']));
- } else {
- $found_valid_args = 0;
- foreach ( array(
- 'lastn', 'days',
- 'category', 'categories', 'category_id',
- 'tag', 'tags',
- 'author',
- 'min_score', 'max_score',
- 'min_rate', 'max_rate',
- 'min_count', 'max_count',
- 'min_comment', 'max_comment'
- ) as $valid_key )
- {
- if (array_key_exists($valid_key, $args)) {
- $found_valid_args = 1;
- break;
- }
- }
- if ((!isset($args['current_timestamp']) &&
- !isset($args['current_timestamp_end'])) &&
- ($limit <= 0) &&
- (!$found_valid_args) &&
- (isset($blog))) {
- if ($days = $blog->blog_days_on_index) {
- if (!isset($args['recently_commented_on'])) {
- $day_filter = 'and ' . $this->limit_by_day_sql('entry_authored_on', $days);
- }
- } elseif ($posts = $blog->blog_entries_on_index) {
- $limit = $posts;
- }
- }
- }
- if (isset($args['sort_order'])) {
- if ($args['sort_order'] == 'ascend') {
- $order = 'asc';
- } elseif ($args['sort_order'] == 'descend') {
- $order = 'desc';
- }
- }
- if (!isset($order)) {
- $order = 'desc';
- if (isset($blog) && isset($blog->blog_sort_order_posts)) {
- if ($blog->blog_sort_order_posts == 'ascend') {
- $order = 'asc';
- }
- }
- }
- if (isset($args['class'])) {
- $class = $this->escape($args['class']);
- } else {
- $class = 'entry';
- }
- $class_filter = "and entry_class='$class'";
- if ($args['class'] == '*') $class_filter = '';
- if ( isset($args['sort_by'])
- && (($args['sort_by'] == 'score') || ($args['sort_by'] == 'rate'))) {
- $extras['join'] = array(
- 'mt_objectscore' => array(
- 'type' => 'left',
- 'condition' => "objectscore_object_id = entry_id and objectscore_namespace='".
- $args['namespace']."' and objectscore_object_ds='".$class."'"
- )
- );
- $extras['distinct'] = 1;
- }
- if (isset($args['offset']))
- $offset = $args['offset'];
- if (isset($args['limit'])) {
- if (isset($args['sort_by'])) {
- if ($args['sort_by'] == 'title') {
- $sort_field = 'entry_title';
- } elseif ($args['sort_by'] == 'id') {
- $sort_field = 'entry_id';
- } elseif ($args['sort_by'] == 'status') {
- $sort_field = 'entry_status';
- } elseif ($args['sort_by'] == 'modified_on') {
- $sort_field = 'entry_modified_on';
- } elseif ($args['sort_by'] == 'author_id') {
- $sort_field = 'entry_author_id';
- } elseif ($args['sort_by'] == 'excerpt') {
- $sort_field = 'entry_excerpt';
- } elseif ($args['sort_by'] == 'comment_created_on') {
- $sort_field = $args['sort_by'];
- } elseif ($args['sort_by'] == 'trackback_count') {
- $sort_field = 'entry_ping_count';
- } elseif (preg_match('/field[:\.]/', $args['sort_by'])) {
- $no_resort = 0;
- } else {
- $sort_field = 'entry_' . $args['sort_by'];
- }
- if ($sort_field) $no_resort = 1;
- if ($args['sort_by'] == 'score' || $args['sort_by'] == 'rate') {
- $post_sort_limit = $limit;
- $post_sort_offset = $offset;
- $limit = 0; $offset = 0;
- $no_resort = 0;
- $sort_field = "entry_modified_on";
- }
- }
- else {
- $sort_field ='entry_authored_on';
- }
- if ($sort_field) {
- $base_order = ($args['sort_order'] == 'ascend' ? 'asc' : 'desc');
- $base_order or $base_order = 'desc';
- }
- } else {
- $base_order = 'desc';
- if (isset($args['base_sort_order'])) {
- if ($args['base_sort_order'] == 'ascend')
- $base_order = 'asc';
- }
- $sort_field ='entry_authored_on';
- $no_resort = 0;
- }
- if (count($filters) || !is_null($total_count)) {
- $post_select_limit = $limit;
- $post_select_offset = $offset;
- $limit = 0; $offset = 0;
- }
- if (count($fields)) {
- $meta_join_num = 1;
- $entry_meta_info = Entry::get_meta_info();
- if (!empty($entry_meta_info)) {
- foreach ($fields as $name => $value) {
- if (isset($entry_meta_info[$name])) {
- $meta_col = $entry_meta_info[$name];
- $value = $this->escape($value);
- $table = "mt_entry_meta entry_meta$meta_join_num";
- $extras['join'][$table] = array(
- 'condition' => "(entry_meta$meta_join_num.entry_meta_entry_id = entry_id
- and entry_meta$meta_join_num.entry_meta_type = 'field.$name'
- and entry_meta$meta_join_num.entry_meta_$meta_col='$value')\n"
- );
- $meta_join_num++;
- }
- }
- }
- }
- $join_clause = '';
- if (isset($extras['join'])) {
- $joins = $extras['join'];
- $keys = array_keys($joins);
- foreach($keys as $key) {
- $table = $key;
- $cond = $joins[$key]['condition'];
- $type = '';
- if (isset($joins[$key]['type']))
- $type = $joins[$key]['type'];
- $join_clause .= ' ' . strtolower($type) . ' JOIN ' . $table . ' ON ' . $cond;
- }
- }
- $sql = "select
- mt_entry.*
- from mt_entry
- $join_clause
- where
- entry_status = 2
- $blog_filter
- $entry_filter
- $author_filter
- $date_filter
- $day_filter
- $class_filter
- $max_comment_filter
- $min_comment_filter";
- if ($sort_field)
- $sql .= "order by $sort_field $base_order";
- if (isset($args['recently_commented_on'])) {
- $rco = $args['recently_commented_on'];
- $sql = $this->entries_recently_commented_on_sql($sql);
- $args['sort_by'] or $args['sort_by'] = 'comment_created_on';
- $args['sort_order'] or $args['sort_order'] = 'descend';
- $post_select_limit = $rco;
- $no_resort = 1;
- } elseif ( !is_null($total_count) ) {
- $orig_offset = $post_select_offset ? $post_select_offset : $offset;
- $orig_limit = $post_select_limit ? $post_select_limit : $limit;
- }
- if ($limit <= 0) $limit = -1;
- if ($offset <= 0) $offset = -1;
- $result = $this->db()->SelectLimit($sql, $limit, $offset);
- if ($result->EOF) return null;
- $field_names = array_keys($result->fields);
- $entries = array();
- $j = 0;
- $offset = $post_select_offset ? $post_select_offset : $orig_offset;
- $limit = $post_select_limit ? $post_select_limit : 0;
- $id_list = array();
- $_total_count = 0;
- while (!$result->EOF) {
- $e = new Entry;
- foreach($field_names as $key) {
- $key = strtolower($key);
- $e->$key = $result->fields($key);
- }
- $result->MoveNext();
- if (empty($e)) break;
- if (count($filters)) {
- foreach ($filters as $f) {
- if (!$f($e, $ctx)) {
- continue 2;
- }
- }
- }
- Entry::load_meta($e);
- $_total_count++;
- if ( !is_null($total_count) ) {
- if ( ($orig_limit > 0)
- && ( ($_total_count-$offset) > $orig_limit) ) {
- // collected all the entries; only count numbers;
- continue;
- }
- }
- if ($offset && ($j++ < $offset)) continue;
- $e->entry_authored_on = $this->db2ts($e->entry_authored_on);
- $e->entry_modified_on = $this->db2ts($e->entry_modified_on);
- $id_list[] = $e->entry_id;
- $entries[] = $e;
- $this->_comment_count_cache[$e->entry_id] = $e->entry_comment_count;
- $this->_ping_count_cache[$e->entry_id] = $e->entry_ping_count;
- if ( is_null($total_count) ) {
- // the request does not want total count; break early
- if (($limit > 0) && (count($entries) >= $limit)) break;
- }
- }
- if ( !is_null($total_count) )
- $total_count = $_total_count;
- if (!$no_resort) {
- $sort_field = '';
- if (isset($args['sort_by'])) {
- if ($args['sort_by'] == 'title') {
- $sort_field = 'entry_title';
- } elseif ($args['sort_by'] == 'id') {
- $sort_field = 'entry_id';
- } elseif ($args['sort_by'] == 'status') {
- $sort_field = 'entry_status';
- } elseif ($args['sort_by'] == 'modified_on') {
- $sort_field = 'entry_modified_on';
- } elseif ($args['sort_by'] == 'author_id') {
- $sort_field = 'entry_author_id';
- } elseif ($args['sort_by'] == 'excerpt') {
- $sort_field = 'entry_excerpt';
- } elseif ($args['sort_by'] == 'comment_created_on') {
- $sort_field = $args['sort_by'];
- } elseif ($args['sort_by'] == 'score') {
- $sort_field = $args['sort_by'];
- } elseif ($args['sort_by'] == 'rate') {
- $sort_field = $args['sort_by'];
- } elseif ($args['sort_by'] == 'trackback_count') {
- $sort_field = 'entry_ping_count';
- } elseif (preg_match('/^field[:\.](.+)$/', $args['sort_by'], $match)) {
- $sort_field = 'entry_field.' . $match[1];
- } else {
- $sort_field = 'entry_' . $args['sort_by'];
- }
- } else {
- $sort_field = 'entry_authored_on';
- }
- if ($sort_field) {
- if ($sort_field == 'score') {
- $offset = $post_sort_offset ? $post_sort_offset : 0;
- $limit = $post_sort_limit ? $post_sort_limit : 0;
- $entries_tmp = array();
- foreach ($entries as $e) {
- $entries_tmp[$e->entry_id] = $e;
- }
- $scores = $this->fetch_sum_scores($args['namespace'], 'entry', $order,
- $blog_filter . "\n" .
- $entry_filter . "\n" .
- $author_filter . "\n" .
- $date_filter . "\n" .
- $day_filter . "\n" .
- $class_filter . "\n"
- );
- $entries_sorted = array();
- foreach($scores as $score) {
- if (--$offset >= 0) continue;
- if (array_key_exists($score['objectscore_object_id'], $entries_tmp)) {
- array_push($entries_sorted, $entries_tmp[$score['objectscore_object_id']]);
- unset($entries_tmp[$score['objectscore_object_id']]);
- if (--$limit == 0) break;
- }
- }
- foreach ($entries_tmp as $et) {
- if ($limit == 0) break;
- if ($order == 'asc')
- array_unshift($entries_sorted, $et);
- else
- array_push($entries_sorted, $et);
- $limit--;
- }
- $entries = $entries_sorted;
- } elseif ($sort_field == 'rate') {
- $offset = $post_sort_offset ? $post_sort_offset : 0;
- $limit = $post_sort_limit ? $post_sort_limit : 0;
- $entries_tmp = array();
- foreach ($entries as $e) {
- $entries_tmp[$e->entry_id] = $e;
- }
- $scores = $this->fetch_avg_scores($args['namespace'], 'entry', $order,
- $blog_filter . "\n" .
- $entry_filter . "\n" .
- $author_filter . "\n" .
- $date_filter . "\n" .
- $day_filter . "\n" .
- $class_filter . "\n"
- );
- $entries_sorted = array();
- foreach($scores as $score) {
- if (--$offset >= 0) continue;
- if (array_key_exists($score->objectscore_object_id, $entries_tmp)) {
- array_push($entries_sorted, $entries_tmp[$score->objectscore_object_id]);
- unset($entries_tmp[$score->objectscore_object_id]);
- if (--$limit == 0) break;
- }
- }
- foreach ($entries_tmp as $et) {
- if ($limit == 0) break;
- if ($order == 'asc')
- array_unshift($entries_sorted, $et);
- else
- array_push($entries_sorted, $et);
- $limit--;
- }
- $entries = $entries_sorted;
- } else {
- if (($sort_field == 'entry_status') || ($sort_field == 'entry_author_id') || ($sort_field == 'entry_id')
- || ($sort_field == 'entry_comment_count') || ($sort_field == 'entry_ping_count')) {
- $sort_fn = "if (\$a->$sort_field == \$b->$sort_field) return 0; return \$a->$sort_field < \$b->$sort_field ? -1 : 1;";
- } else {
- $sort_fn = "return strcmp(\$a->$sort_field,\$b->$sort_field);";
- }
- $sorter = create_function(
- $order == 'asc' ? '$a,$b' : '$b,$a',…
Large files files are truncated, but you can click here to view the full file