+class contribs_finder {
+ var $username, $offset, $limit, $namespace, $invert;
+ var $dbr;
+
+ function contribs_finder($username) {
+ $this->username = $username;
+ $this->dbr =& wfGetDB(DB_SLAVE);
+ }
+
+ function set_limit($limit) {
+ $this->limit = $limit;
+ }
+
+ function set_offset($offset) {
+ $this->offset = $offset;
+ }
+
+ function set_namespace($namespace, $invert = false) {
+ $this->namespace = $namespace;
+ $this->invert = $invert;
+ }
+
+ function set_hide_minor($hm) {
+ $this->hide_minor = $hm;
+ }
+
+ function get_edit_limits() {
+ $sql = "SELECT MIN(rev_timestamp) as earliest, MAX(rev_timestamp) as latest " .
+ "FROM revision " .
+ "WHERE rev_user_text = " . $this->dbr->addQuotes($this->username);
+ $res = $this->dbr->query($sql, "contribs_finder::get_edit_limits");
+ $row = $this->dbr->fetchObject($res);
+ if (!$row)
+ return array(null, null);
+ $this->dbr->freeResult($res);
+ return array($row->earliest, $row->latest);
+ }
+
+ function get_previous_offset_for_paging() {
+ $sql = "SELECT rev_timestamp FROM revision " .
+ "WHERE rev_timestamp > " . $this->offset . " AND " .
+ "rev_user_text = " . $this->dbr->addQuotes($this->username) .
+ " ORDER BY rev_timestamp ASC LIMIT " . $this->limit;
+ $res = $this->dbr->query($sql);
+ $rows = array();
+ while ($obj = $this->dbr->fetchObject($res))
+ $rows[] = $obj;
+ $this->dbr->freeResult($res);
+ return $rows[count($rows) - 1]->rev_timestamp;
+ }
+
+ /* private */ function make_sql() {
+ $userCond = $condition = $index = $minorQuery = $nsQuery
+ = $offsetQuery = $limitQuery = $nsinvert = "";
+
+ if ($this->username == 'newbies') {
+ $max = $this->dbr->selectField('user', 'max(user_id)', false, "make_sql");
+ $userCond = '>' . ($max - $max / 100);
+ $id = 0;
+ }
+
+ if ($this->hide_minor)
+ $minorQuery = 'AND rev_minor_edit=0';
+
+ if ($this->invert)
+ $nsinvert = "!";
+
+ if (!is_null($this->namespace))
+ $nsQuery .= "AND page_namespace {$nsinvert}= {$this->namespace}";
+
+ extract($this->dbr->tableNames('page', 'revision'));
+ if ($userCond == "") {
+ $condition = "rev_user_text=" . $this->dbr->addQuotes($this->username);
+ $index = 'usertext_timestamp';
+ } else {
+ $condition = "rev_user {$userCond}";
+ $index = 'user_timestamp';
+ }
+
+ $limitQuery = "LIMIT {$this->limit}";
+ if ($this->offset)
+ $offsetQuery = "AND rev_timestamp < {$this->offset}";
+
+ $use_index = $this->dbr->useIndexClause($index);
+ $sql = "SELECT
+ page_namespace,page_title,page_is_new,page_latest,
+ rev_id,rev_timestamp,rev_comment,rev_minor_edit,rev_user_text,
+ rev_deleted
+ FROM $page,$revision $use_index
+ WHERE page_id=rev_page AND $condition $minorQuery $nsQuery $offsetQuery
+ ORDER BY rev_timestamp DESC $limitQuery";
+ return $sql;
+ }
+
+ function find() {
+ $contribs = array();
+ $res = $this->dbr->query($this->make_sql(), "contribs_finder::find");
+ while ($c = $this->dbr->fetchObject($res))
+ $contribs[] = $c;
+ $this->dbr->freeResult($res);
+ return $contribs;
+ }
+};
+