/*
* ====================================================================
* Copyright (c) 2004-2010 TMate Software Ltd. All rights reserved.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://svnkit.com/license.html.
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
* ====================================================================
*/
package org.tmatesoft.svn.core.internal.wc17.db.statement;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNProperties;
import org.tmatesoft.svn.core.internal.db.SVNSqlJetDb;
import org.tmatesoft.svn.core.internal.db.SVNSqlJetSelectStatement;
import org.tmatesoft.svn.core.internal.wc17.db.statement.SVNWCDbSchema.ACTUAL_NODE__Fields;
import org.tmatesoft.svn.core.internal.wc17.db.statement.SVNWCDbSchema.NODES__Fields;
/**
* SELECT IFNULL((SELECT properties FROM actual_node a
* WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
* properties),
* local_relpath, depth
* FROM nodes n
* WHERE wc_id = ?1
* AND (?2 = ''
* OR local_relpath = ?2
* OR (local_relpath > ?2 || '/' AND local_relpath < ?2 || '0'))
* AND kind = 'dir' AND presence='normal'
* AND op_depth=(SELECT MAX(op_depth) FROM nodes o
* WHERE o.wc_id = ?1 AND o.local_relpath = n.local_relpath)
*
* @author TMate Software Ltd.
*/
public class SVNWCDBSelectExternalProperties extends SVNSqlJetSelectStatement {
private SVNWCDbNodesMaxOpDepth maxOpDepthSelect;
private SVNSqlJetSelectStatement propertiesSelect;
public SVNWCDBSelectExternalProperties(SVNSqlJetDb sDb) throws SVNException {
super(sDb, SVNWCDbSchema.NODES);
maxOpDepthSelect = new SVNWCDbNodesMaxOpDepth(sDb, 0);
propertiesSelect = new SVNSqlJetSelectStatement(sDb, SVNWCDbSchema.ACTUAL_NODE);
}
@Override
protected boolean isFilterPassed() throws SVNException {
if (!"dir".equals(getColumnString(SVNWCDbSchema.NODES__Fields.kind))) {
return false;
}
if (!"normal".equals(getColumnString(SVNWCDbSchema.NODES__Fields.presence))) {
return false;
}
return hasMaxOpDepth();
}
private boolean hasMaxOpDepth() throws SVNException {
long rowOpDepth = getColumnLong(SVNWCDbSchema.NODES__Fields.op_depth);
Long maxOpDepth = maxOpDepthSelect.getMaxOpDepth(getColumnLong(NODES__Fields.wc_id),
getColumnString(SVNWCDbSchema.NODES__Fields.local_relpath));
return maxOpDepth != null && maxOpDepth == rowOpDepth;
}
@Override
public SVNProperties getColumnProperties(String f) throws SVNException {
if (!NODES__Fields.properties.toString().equals(f)) {
return super.getColumnProperties(f);
}
SVNProperties properties = null;
try {
propertiesSelect.bindf("is", getBind(1), getColumnString(NODES__Fields.local_relpath));
if (propertiesSelect.next()) {
properties = propertiesSelect.getColumnProperties(ACTUAL_NODE__Fields.properties);
}
} finally {
propertiesSelect.reset();
}
if (properties != null) {
return properties;
}
return super.getColumnProperties(f);
}
protected Object[] getWhere() throws SVNException {
return new Object[] {getBind(1)};
}
@Override
protected String getPathScope() {
return (String) getBind(2);
}
}