package org.tmatesoft.svn.core.internal.wc17.db.statement; 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.SVNSqlJetSelectStatement; import org.tmatesoft.svn.core.internal.wc17.db.ISVNWCDb; import org.tmatesoft.svn.core.internal.wc17.db.SvnWcDbStatementUtil; /** * SELECT local_relpath, kind, def_repos_relpath, * (SELECT root FROM repository AS r WHERE r.id = e.repos_id) * FROM externals e * WHERE wc_id = ?1 * AND IS_STRICT_DESCENDANT_OF(e.local_relpath, ?2) * AND parent_relpath = ?2 * AND def_revision IS NULL * AND repos_id = (SELECT repos_id * FROM nodes AS n * WHERE n.wc_id = ?1 * AND n.local_relpath = '' * AND n.op_depth = 0) * AND ((kind='dir') * OR EXISTS (SELECT 1 FROM nodes * WHERE nodes.wc_id = e.wc_id * AND nodes.local_relpath = e.parent_relpath)) * * @version 1.8 */ public class SVNWCDbSelectCommittableExternalsImmediatelyBelow extends SVNSqlJetSelectStatement { private InternalStatement1 internalStatement1; private InternalStatement2 internalStatement2; public SVNWCDbSelectCommittableExternalsImmediatelyBelow(SVNSqlJetDb sDb) throws SVNException { super(sDb, SVNWCDbSchema.EXTERNALS); internalStatement2 = new InternalStatement2(sDb); } public InternalStatement1 getInternalStatement1() { return internalStatement1; } @Override protected String getPathScope() { return (String)getBind(2); } @Override protected boolean isStrictiDescendant() { return true; } @Override protected boolean isFilterPassed() throws SVNException { return checkForImmediate() && isColumnNull(SVNWCDbSchema.EXTERNALS__Fields.def_revision) && getColumnLong(SVNWCDbSchema.EXTERNALS__Fields.repos_id) == getInternalStatement2().getColumnLong(SVNWCDbSchema.NODES__Fields.repos_id); } private InternalStatement2 getInternalStatement2() throws SVNException { if (internalStatement2 == null) { internalStatement2 = new InternalStatement2(sDb); internalStatement2.bindf("isi", getBind(1), getBind(2), 0); internalStatement2.next(); } return internalStatement2; } protected boolean checkForImmediate() throws SVNException { return getColumnString(SVNWCDbSchema.EXTERNALS__Fields.parent_relpath).equals(getBind(2)); } @Override protected Object[] getWhere() throws SVNException { return new Object[]{getBind(1)}; } @Override public boolean next() throws SVNException { if (internalStatement1 != null) { internalStatement1.reset(); internalStatement1 = null; } if (internalStatement2 != null) { internalStatement2.reset(); internalStatement2 = null; } boolean next = super.next(); if (next) { if (internalStatement1 == null) { internalStatement1 = new InternalStatement1(sDb); internalStatement1.bindf("i", getColumnLong(SVNWCDbSchema.EXTERNALS__Fields.repos_id)); internalStatement1.next(); } if (internalStatement2 != null) { internalStatement2.reset(); internalStatement2 = null; } } return next; } @Override public void reset() throws SVNException { if (internalStatement1 != null) { internalStatement1.reset(); } if (internalStatement2 != null) { internalStatement2.reset(); } super.reset(); } private static class InternalStatement1 extends SVNSqlJetSelectFieldsStatement<SVNWCDbSchema.REPOSITORY__Fields> { public InternalStatement1(SVNSqlJetDb sDb) throws SVNException { super(sDb, SVNWCDbSchema.REPOSITORY); } @Override protected void defineFields() { fields.add(SVNWCDbSchema.REPOSITORY__Fields.root); } } private static class InternalStatement2 extends SVNSqlJetSelectFieldsStatement<SVNWCDbSchema.NODES__Fields> { private InternalStatement3 internalStatement3; public InternalStatement2(SVNSqlJetDb sDb) throws SVNException { super(sDb, SVNWCDbSchema.NODES); } @Override protected void defineFields() { fields.add(SVNWCDbSchema.NODES__Fields.repos_id); } @Override protected boolean isFilterPassed() throws SVNException { return SvnWcDbStatementUtil.getColumnKind(this, SVNWCDbSchema.NODES__Fields.kind) == ISVNWCDb.SVNWCDbKind.Dir || !getInternalStatement3().isColumnNull(SVNWCDbSchema.NODES__Fields.wc_id); } private InternalStatement3 getInternalStatement3() throws SVNException { if (internalStatement3 == null) { internalStatement3 = new InternalStatement3(sDb); internalStatement3.bindf("is", getColumnLong(SVNWCDbSchema.NODES__Fields.wc_id), getBind(2)); internalStatement3.next(); } return internalStatement3; } @Override public boolean next() throws SVNException { boolean next = super.next(); if (next) { if (internalStatement3 != null) { internalStatement3.reset(); internalStatement3 = null; } } return next; } @Override public void reset() throws SVNException { if (internalStatement3 != null) { internalStatement3.reset(); } super.reset(); } @Override protected Object[] getWhere() throws SVNException { return new Object[] {getBind(1), "", 0}; } } private static class InternalStatement3 extends SVNSqlJetSelectFieldsStatement<SVNWCDbSchema.NODES__Fields> { public InternalStatement3(SVNSqlJetDb sDb) throws SVNException { super(sDb, SVNWCDbSchema.NODES); } @Override protected void defineFields() { } } }