registry =& $viewsvn; } // ################################################################### /** * Sets the hash so we know what table we're dealing with * * @access public */ function set_hash() { $this->hash = md5($this->registry->repos->fetch_path($this->registry->paths->repos)); } // ################################################################### /** * Returns a specific log entry * * @access public * * @param integer Revision number * * @return array Complete revision/commit entry */ function fetch_revision($revision) { $revision = $this->registry->clean($revision, TYPE_UINT); if (!isset($this->memcache["$revision"])) { $this->memcache["$revision"] = $this->registry->db->query_first("SELECT * FROM {$this->hash}_revs WHERE revision = $revision"); } return $this->memcache["$revision"]; } // ################################################################### /** * Checks to see if it's necessary to rebuild the cacheV table for the * current repository. This is done by making sure $count > 0. If not, * then rebuild() is run. This also checks against the cacheV table * to make sure that it's up-to-date against the root repository. * * @access public */ function exec_build() { $result = $this->registry->db->query_first("SELECT MAX(revision) AS max FROM {$this->hash}_revs"); $this->count = $result['max']; // time to go from the start if ($this->count == 0) { $this->build(null); } else { // send an Xquery to SVN to see if we need to update $query = $this->registry->svn->svn('info --xml ' . $this->registry->repos->fetch_path($this->registry->paths->repos)); $query = implode("\n", $query); $tree = $this->registry->xml->parse($query); if ($tree['info']['entry']['revision'] != $this->count) { $this->build($this->count); } } } // ################################################################### /** * Builds the cacheV table. This can be used to build only part of the * cache or the entire thing, if the revision is set to NULL. * * @access public * * @param integer Lower (current) revision */ function build($revision) { $start = microtime(); // get _revs $output = $this->registry->svn->svn('log --xml -v ' . ($revision !== null ? '-r' . $revision . ':HEAD ' : '') . $this->registry->repos->fetch_path($this->registry->paths->repos)); $output = implode("\n", $output); $tree = $this->registry->xml->parse($output); // get _nodes $output = $this->registry->svn->svn('info --xml -R ' . ($revision !== null ? '-r' . $revision . ':HEAD ' : '') . $this->registry->repos->fetch_path($this->registry->paths->repos)); $output = implode("\n", $output); $infolist = $this->registry->xml->parse($output); // other part of _nodes: properties $output = $this->registry->svn->svn('proplist -v -R ' . ($revision !== null ? ' -r' . $revision . ':HEAD ' : '') . $this->registry->repos->fetch_path($this->registry->paths->repos)); foreach ($output AS $line) { if (preg_match('#^Properties on \'(.*?)\':$#', $line, $bits)) { $proplist["$index"]["$curprop"] = trim($proplist["$index"]["$curprop"]); $index = str_replace($this->registry->repos->fetch_path($this->registry->paths->repos), '', $bits[1]); $capture = false; } else { if (preg_match('#^\s+(.*)\s:\s(.*)#', $line, $matches)) { $curprop = $matches[1]; $proplist["$index"]["$curprop"] = $matches[2] . "\n"; $capture = true; } else if ($capture == true) { $proplist["$index"]["$curprop"] .= $line . "\n"; } } } // construct _revs inserts and the list of add revisions foreach ($tree['log']['logentry'] AS $log) { $this->registry->xml->unify_node($log['paths']['path']); $inserts['revs'][] = "($log[revision], '{$log['author']['value']}', '{$log['date']['value']}', '" . $this->registry->escape($log['msg']['value']) . "', '" . $this->registry->escape(serialize($log['paths']['path'])) . "')"; foreach ($log['paths']['path'] AS $path) { if (trim($path['action']) == 'A') { $path['value'] = preg_replace('#^/#', '', $path['value']); $addlist["$path[value]"] = $log['revision']; } } } // construct list of HEAD nodes for _nodes foreach ($infolist['info']['entry'] AS $node) { $inserts['nodes'][] = "('$node[path]', " . $this->registry->clean($addlist["$node[path]"], TYPE_UINT) . ", " . $node['revision'] . ", '" . $this->registry->escape(serialize($proplist["$node[path]"])) . "')"; } // insert _revs $this->registry->db->query(" REPLACE INTO {$this->hash}_revs (revision, author, dateline, message, files) VALUES " . implode(",\n", $inserts['revs']) ); // insert _nodes $this->registry->db->query(" REPLACE INTO {$this->hash}_nodes (name, revadd, revnow, properties) VALUES " . implode(",\n", $inserts['nodes']) ); $this->registry->debug("TIME TO (RE)BUILD: " . $this->registry->funct->fetch_microtime_diff($start)); } } /*=====================================================================*\ || ################################################################### || # $HeadURL$ || # $Id$ || ################################################################### \*=====================================================================*/ ?>