package org.tmatesoft.svn.core.internal.wc17.db.statement; import org.tmatesoft.sqljet.core.SqlJetException; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.internal.db.SVNSqlJetDb; import org.tmatesoft.svn.core.internal.db.SVNSqlJetSelectFieldsStatement; import org.tmatesoft.svn.core.internal.db.SVNSqlJetStatement; /* * SELECT u.local_relpath, * u.presence, u.repos_id, u.repos_path, u.revision, * l.presence, l.repos_id, l.repos_path, l.revision, * u.moved_here, u.moved_to * FROM nodes u * LEFT OUTER JOIN nodes l ON l.wc_id = ?1 * AND l.local_relpath = u.local_relpath * AND l.op_depth = ?3 * WHERE u.wc_id = ?1 * AND u.local_relpath = ?2 * AND u.op_depth = ?4 * UNION ALL * SELECT u.local_relpath, * u.presence, u.repos_id, u.repos_path, u.revision, * l.presence, l.repos_id, l.repos_path, l.revision, * u.moved_here, NULL * FROM nodes u * LEFT OUTER JOIN nodes l ON l.wc_id=?1 * AND l.local_relpath=u.local_relpath * AND l.op_depth=?3 * WHERE u.wc_id = ?1 * AND IS_STRICT_DESCENDANT_OF(u.local_relpath, ?2) * AND u.op_depth = ?4 * * @version 1.8 */ public class SVNWCDbSelectMovedBack extends SVNSqlJetSelectFieldsStatement<SVNWCDbSchema.NODES__Fields> { private boolean firstPartOfUnion = true; private SVNSqlJetStatement joinedStatement; public SVNWCDbSelectMovedBack(SVNSqlJetDb sDb) throws SVNException { super(sDb, SVNWCDbSchema.NODES); } @Override protected void defineFields() { fields.add(SVNWCDbSchema.NODES__Fields.local_relpath); fields.add(SVNWCDbSchema.NODES__Fields.presence); fields.add(SVNWCDbSchema.NODES__Fields.repos_path); fields.add(SVNWCDbSchema.NODES__Fields.revision); fields.add(SVNWCDbSchema.NODES__Fields.moved_here); fields.add(SVNWCDbSchema.NODES__Fields.moved_to); } @Override protected String getPathScope() { return firstPartOfUnion ? null : (String) getBind(2); } @Override protected boolean isStrictiDescendant() { return true; } @Override protected boolean isFilterPassed() throws SVNException { return firstPartOfUnion ? true : getColumnLong(SVNWCDbSchema.NODES__Fields.op_depth) == (Long) getBind(4); } @Override protected Object[] getWhere() throws SVNException { if (firstPartOfUnion) { return new Object[]{getBind(1), getBind(2), getBind(4)}; } else { return new Object[]{getBind(1)}; } } @Override public void reset() throws SVNException { super.reset(); firstPartOfUnion = true; if (joinedStatement != null) { joinedStatement.reset(); } } @Override public boolean next() throws SVNException { if (firstPartOfUnion) { boolean next = super.next(); if (next) { if (joinedStatement != null) { joinedStatement.reset(); } joinedStatement = new JoinedStatement(sDb); joinedStatement.bindf("isi", getBind(1), getColumnString(SVNWCDbSchema.NODES__Fields.local_relpath), getBind(3)); joinedStatement.next(); return true; } else { firstPartOfUnion = false; resetCursor(); } } if (!firstPartOfUnion) { boolean next = super.next(); if (next) { if (joinedStatement != null) { joinedStatement.reset(); } joinedStatement = new JoinedStatement(sDb); joinedStatement.bindf("isi", getBind(1), getColumnString(SVNWCDbSchema.NODES__Fields.local_relpath), getBind(3)); joinedStatement.next(); } return next; } return false; } private void resetCursor() throws SVNException { try { getCursor().close(); } catch (SqlJetException e) { SVNSqlJetDb.createSqlJetError(e); } setCursor(openCursor()); } @Override public SVNSqlJetStatement getJoinedStatement(Enum<?> joinedTable) throws SVNException { return joinedStatement; } private static class JoinedStatement extends SVNSqlJetSelectFieldsStatement<SVNWCDbSchema.NODES__Fields> { public JoinedStatement(SVNSqlJetDb sDb) throws SVNException { super(sDb, SVNWCDbSchema.NODES); } @Override protected void defineFields() { fields.add(SVNWCDbSchema.NODES__Fields.presence); fields.add(SVNWCDbSchema.NODES__Fields.repos_id); fields.add(SVNWCDbSchema.NODES__Fields.repos_path); fields.add(SVNWCDbSchema.NODES__Fields.revision); } @Override protected Object[] getWhere() throws SVNException { return new Object[]{getBind(1), getBind(2), getBind(3)}; } } }