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 $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"; } } } 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 ($path['action'] == 'A') { $act = 'addrevs'; } else if ($path['action'] == 'D') { $act = 'delrevs'; } else { $act = 'revs'; } $path['value'] = preg_replace('#^/#', '', $path['value']); $pathlist["$path[value]"]["$act"][] = $log['revision']; } } foreach ($infolist['info']['entry'] AS $node) { $inserts['nodes'][] = "('$node[path]', '{$node['repository']['uuid']['value']}', '" . implode(',', $pathlist["$node[path]"]['delrevs']) . "', '" . implode(',', $pathlist["$node[path]"]['addrevs']) . "', '" . implode(',', $pathlist["$node[path]"]['revs']) . "', '" . $this->registry->escape(serialize($proplist["$node[path]"])) . "')"; } $this->registry->db->query(" REPLACE INTO {$this->hash}_revs (revision, author, dateline, message, files) VALUES " . implode(",\n", $inserts['revs']) ); $this->registry->db->query(" REPLACE INTO {$this->hash}_nodes (name, uuid, delrevs, addrevs, revs, properties) VALUES " . implode(",\n", $inserts['nodes']) ); /* name VARCHAR(255) NOT NULL DEFAULT '', uuid VARCHAR(50) NOT NULL DEFAULT '', delrevs MEDIUMTEXT NOT NULL DEFAULT '', addrevs MEDIUMTEXT NOT NULL DEFAULT '', revs MEDIUMTEXT NOT NULL DEFAULT '', properties MEDIUMTEXT NOT NULL DEFAULT '',*/ $this->registry->debug("TIME TO (RE)BUILD: " . $this->registry->funct->fetch_microtime_diff($start)); } } /*=====================================================================*\ || ################################################################### || # $HeadURL$ || # $Id$ || ################################################################### \*=====================================================================*/ ?>