package org.tmatesoft.svn.core.internal.wc17.db.statement; import org.tmatesoft.sqljet.core.SqlJetException; import org.tmatesoft.sqljet.core.table.ISqlJetCursor; import org.tmatesoft.svn.core.SVNErrorCode; import org.tmatesoft.svn.core.SVNErrorMessage; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.internal.db.SVNSqlJetDb; import org.tmatesoft.svn.core.internal.db.SVNSqlJetSelectStatement; import org.tmatesoft.svn.core.internal.util.SVNPathUtil; import org.tmatesoft.svn.core.internal.wc.SVNErrorManager; import org.tmatesoft.svn.core.internal.wc17.db.statement.SVNWCDbSchema.NODES__Fields; import org.tmatesoft.svn.util.SVNLogType; /* * SELECT l.wc_id, l.local_relpath FROM nodes as l * LEFT OUTER JOIN nodes as r * ON l.wc_id = r.wc_id * AND r.local_relpath = l.parent_relpath * AND r.op_depth = 0 * WHERE l.op_depth = 0 * AND l.repos_path != '' * AND ((l.repos_id IS NOT r.repos_id) * OR (l.repos_path IS NOT RELPATH_SKIP_JOIN(r.local_relpath, r.repos_path, l.local_relpath))) * * @version 1.8 */ public class SVNWCDbSelectWCRootNodes extends SVNSqlJetSelectStatement { public SVNWCDbSelectWCRootNodes(SVNSqlJetDb sDb) throws SVNException { super(sDb, SVNWCDbSchema.NODES); } @Override protected boolean isFilterPassed() throws SVNException { final String localRelpath = getColumnString(NODES__Fields.local_relpath); final String reposRelpath = getColumnString(NODES__Fields.repos_path); if ("".equals(localRelpath) && !"".equals(reposRelpath)) { return true; } else if (!"".equals(localRelpath)) { if (getColumnLong(NODES__Fields.op_depth) != 0) { return false; } final long wcId = getColumnLong(NODES__Fields.wc_id); final String localParentRelpath = getColumnString(NODES__Fields.parent_relpath); final String childName = localParentRelpath.length() == 0 ? localRelpath : localRelpath.substring(localParentRelpath.length() + 1); final String nodeReposRelpath = getNodeReposRelpath(wcId, localParentRelpath); if (nodeReposRelpath == null) { return true; } final String expectedChildReposPath = SVNPathUtil.append(nodeReposRelpath, childName); if (!expectedChildReposPath.equals(reposRelpath)) { return true; } } return false; } private String getNodeReposRelpath(long wcId, String path) throws SVNException { ISqlJetCursor cursor = null; try { cursor = getTable().lookup(null, wcId, path); if (!cursor.eof()) { return cursor.getString(NODES__Fields.repos_path.toString()); } } catch (SqlJetException e) { SVNSqlJetDb.createSqlJetError(e); } finally { if (cursor != null) { try { cursor.close(); } catch (SqlJetException e) { } } } return null; } }