]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/WikiDB/backend/dumb/MostRecentIter.php
include [all] Include and file path should be devided with single space. File path...
[SourceForge/phpwiki.git] / lib / WikiDB / backend / dumb / MostRecentIter.php
1 <?php // -*-php-*-
2 // $Id$
3
4 require_once 'lib/WikiDB/backend.php';
5
6 /**
7  * An inefficient but general most_recent iterator.
8  *
9  * This iterator will work with any backends.
10  */
11 class WikiDB_backend_dumb_MostRecentIter
12 extends WikiDB_backend_iterator
13 {
14     function WikiDB_backend_dumb_MostRecentIter(&$backend, &$pages, $params) {
15         $limit = false;
16         extract($params);
17         if ($exclude_major_revisions)
18             $include_minor_revisions = true;
19
20         $reverse = $limit < 0;
21         if($reverse){$limit = -$limit;}
22         $this->_revisions = array();
23         while ($page = $pages->next()) {
24             $revs = $backend->get_all_revisions($page['pagename']);
25             while ($revision = $revs->next()) {
26                 $vdata = &$revision['versiondata'];
27                 if (!$vdata) continue;
28                 assert(is_array($vdata));
29                 if (empty($vdata['mtime'])) {
30             $vdata['mtime'] = 0;
31         }
32                 if (!empty($vdata['is_minor_edit'])) {
33                     if (!$include_minor_revisions)
34                         continue;
35                 }
36                 else {
37                     if ($exclude_major_revisions)
38                         continue;
39                 }
40                 if (!empty($since) && $vdata['mtime'] < $since)
41                     break;
42
43                 $this->_revisions[] = $revision;
44
45                 if (!$include_all_revisions)
46                     break;
47             }
48             $revs->free();
49         }
50         if ($reverse) {
51             usort($this->_revisions, 'WikiDB_backend_dumb_MostRecentIter_sortf_rev');
52         } else {
53             usort($this->_revisions, 'WikiDB_backend_dumb_MostRecentIter_sortf');
54         }
55         if (!empty($limit) && $limit < count($this->_revisions)) {
56             array_splice($this->_revisions, $limit);
57         }
58     }
59
60     function next() {
61         return array_shift($this->_revisions);
62     }
63
64     function free() {
65         unset($this->_revisions);
66     }
67 }
68
69 function WikiDB_backend_dumb_MostRecentIter_sortf($a, $b) {
70     $acreated = $a['versiondata']['mtime'];
71     $bcreated = $b['versiondata']['mtime'];
72     return $bcreated - $acreated;
73 }
74
75 function WikiDB_backend_dumb_MostRecentIter_sortf_rev($a, $b) {
76     $acreated = $a['versiondata']['mtime'];
77     $bcreated = $b['versiondata']['mtime'];
78     return $acreated - $bcreated;
79 }
80
81 // Local Variables:
82 // mode: php
83 // tab-width: 8
84 // c-basic-offset: 4
85 // c-hanging-comment-ender-p: nil
86 // indent-tabs-mode: nil
87 // End: