package org.tmatesoft.svn.core.internal.wc17.db;
import java.io.File;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNNodeKind;
import org.tmatesoft.svn.core.SVNProperties;
import org.tmatesoft.svn.core.internal.db.SVNSqlJetStatement;
import org.tmatesoft.svn.core.internal.util.SVNDate;
import org.tmatesoft.svn.core.internal.wc.SVNFileUtil;
import org.tmatesoft.svn.core.internal.wc17.SVNWCUtils;
import org.tmatesoft.svn.core.internal.wc17.db.ISVNWCDb.SVNWCDbKind;
import org.tmatesoft.svn.core.internal.wc17.db.ISVNWCDb.SVNWCDbLock;
import org.tmatesoft.svn.core.internal.wc17.db.ISVNWCDb.SVNWCDbStatus;
import org.tmatesoft.svn.core.internal.wc17.db.StructureFields.InheritedProperties;
import org.tmatesoft.svn.core.internal.wc17.db.statement.SVNWCDbSchema;
import org.tmatesoft.svn.core.wc.SVNEventAction;
import org.tmatesoft.svn.core.wc.SVNStatusType;
import org.tmatesoft.svn.core.wc2.SvnChecksum;
public class SvnWcDbStatementUtil {
private static final EnumMap<SVNWCDbStatus, String> presenceMap = new EnumMap<SVNWCDbStatus, String>(SVNWCDbStatus.class);
private static final HashMap<String, SVNWCDbStatus> presenceMap2 = new HashMap<String, SVNWCDbStatus>();
static {
presenceMap.put(SVNWCDbStatus.Normal, "normal");
presenceMap.put(SVNWCDbStatus.Excluded, "excluded");
presenceMap.put(SVNWCDbStatus.ServerExcluded, "server-excluded");
presenceMap.put(SVNWCDbStatus.NotPresent, "not-present");
presenceMap.put(SVNWCDbStatus.Incomplete, "incomplete");
presenceMap.put(SVNWCDbStatus.BaseDeleted, "base-deleted");
presenceMap2.put("normal", SVNWCDbStatus.Normal);
presenceMap2.put("server-excluded", SVNWCDbStatus.ServerExcluded);
presenceMap2.put("absent", SVNWCDbStatus.ServerExcluded);
presenceMap2.put("excluded", SVNWCDbStatus.Excluded);
presenceMap2.put("not-present", SVNWCDbStatus.NotPresent);
presenceMap2.put("incomplete", SVNWCDbStatus.Incomplete);
presenceMap2.put("base-deleted", SVNWCDbStatus.BaseDeleted);
}
private static final EnumMap<SVNWCDbKind, String> kindMap = new EnumMap<SVNWCDbKind, String>(SVNWCDbKind.class);
private static final HashMap<String, SVNWCDbKind> kindMap2 = new HashMap<String, SVNWCDbKind>();
static {
kindMap.put(SVNWCDbKind.File, "file");
kindMap.put(SVNWCDbKind.Dir, "dir");
kindMap.put(SVNWCDbKind.Symlink, "symlink");
kindMap.put(SVNWCDbKind.Unknown, "unknown");
kindMap2.put("file", SVNWCDbKind.File);
kindMap2.put("dir", SVNWCDbKind.Dir);
kindMap2.put("symlink", SVNWCDbKind.Symlink);
kindMap2.put("unknown", SVNWCDbKind.Unknown);
}
public static SVNSqlJetStatement bindf(SVNSqlJetStatement stmt, String format, Object... binds) throws SVNException {
if (binds != null) {
for (int i = 0; i < binds.length; i++) {
if (binds[i] instanceof SVNWCDbStatus) {
binds[i] = getPresenceText((SVNWCDbStatus) binds[i]);
} else if (binds[i] instanceof SVNWCDbKind) {
binds[i] = getKindText((SVNWCDbKind) binds[i]);
} else if (binds[i] instanceof File) {
binds[i] = SVNFileUtil.getFilePath((File) binds[i]);
} else if (binds[i] instanceof SVNDate) {
binds[i] = ((SVNDate) binds[i]).getTimeInMicros();
} else if (binds[i] instanceof SVNDepth) {
binds[i] = binds[i].toString();
}
}
}
stmt.bindf(format, binds);
return stmt;
}
public static String getPresenceText(SVNWCDbStatus status) {
return presenceMap.get(status);
}
public static String getKindText(SVNWCDbKind kind) {
return kindMap.get(kind);
}
public static SVNWCDbStatus parsePresence(String presenceString) {
return presenceMap2.get(presenceString);
}
public static SVNWCDbKind parseKind(String kindString) {
return kindMap2.get(kindString);
}
public static SVNDepth parseDepth(String depthStr) {
SVNDepth d = null;
if (depthStr != null) {
d = SVNDepth.fromString(depthStr);
}
if (d == null) {
d = SVNDepth.UNKNOWN;
}
return d;
}
public static SVNWCDbStatus getColumnPresence(SVNSqlJetStatement stmt) throws SVNException {
return getColumnToken(stmt, SVNWCDbSchema.NODES__Fields.presence, presenceMap2);
}
public static SVNWCDbStatus getColumnPresence(SVNSqlJetStatement stmt, Enum<?> f) throws SVNException {
return getColumnToken(stmt, f, presenceMap2);
}
public static SVNWCDbKind getColumnKind(SVNSqlJetStatement stmt, Enum<?> f) throws SVNException {
return getColumnToken(stmt, f, kindMap2);
}
public static SVNProperties getColumnProperties(SVNSqlJetStatement stmt, Enum<?> f) throws SVNException {
return stmt.getColumnProperties(f);
}
public static List<Structure<InheritedProperties>> getColumnInheritedProperties(SVNSqlJetStatement stmt, Enum<?> f) throws SVNException {
return stmt.getColumnInheritedProperties(f);
}
public static boolean hasColumnProperties(SVNSqlJetStatement stmt, Enum<?> f) throws SVNException {
return stmt.hasColumnProperties(f);
}
public static String getColumnText(SVNSqlJetStatement stmt, Enum<?> f) throws SVNException {
return stmt.getColumnString(f);
}
public static File getColumnPath(SVNSqlJetStatement stmt, Enum<?> f) throws SVNException {
String path = stmt.getColumnString(f);
if (path != null) {
return SVNFileUtil.createFilePath(path);
}
return null;
}
public static SVNDepth getColumnDepth(SVNSqlJetStatement stmt, Enum<?> f) throws SVNException {
return parseDepth(stmt.getColumnString(f));
}
public static boolean isColumnNull(SVNSqlJetStatement stmt, Enum<?> f) throws SVNException {
return stmt.isColumnNull(f);
}
public static long getColumnInt64(SVNSqlJetStatement stmt, Enum<?> f) throws SVNException {
return stmt.getColumnLong(f);
}
public static byte[] getColumnBlob(SVNSqlJetStatement stmt, Enum<?> f) throws SVNException {
return stmt.getColumnBlob(f);
}
public static boolean getColumnBoolean(SVNSqlJetStatement stmt, Enum<?> f) throws SVNException {
return stmt.getColumnBoolean(f);
}
public static long getColumnRevNum(SVNSqlJetStatement stmt, Enum<?> f) throws SVNException {
if (isColumnNull(stmt, f))
return ISVNWCDb.INVALID_REVNUM;
return (int) getColumnInt64(stmt, f);
}
public static long getTranslatedSize(SVNSqlJetStatement stmt, Enum<?> f) throws SVNException {
if (isColumnNull(stmt, f))
return ISVNWCDb.INVALID_FILESIZE;
return getColumnInt64(stmt, f);
}
public static <T extends Enum<T>> T getColumnToken(SVNSqlJetStatement stmt, Enum<?> f, Map<String, T> tokenMap) throws SVNException {
return tokenMap.get(getColumnText(stmt, f));
}
public static SvnChecksum getColumnChecksum(SVNSqlJetStatement stmt, Enum<?> f) throws SVNException {
String str = stmt.getColumnString(f);
if (str == null) {
return null;
}
return SvnChecksum.fromString(str);
}
public static SVNDate getColumnDate(SVNSqlJetStatement stmt, Enum<?> f) throws SVNException {
if (isColumnNull(stmt, f)) {
return null;
}
return SVNWCUtils.readDate(getColumnInt64(stmt, f));
}
public static SVNWCDbLock getLockFromColumns(SVNSqlJetStatement stmt, Enum<?> tokenField, Enum<?> owner, Enum<?> comment, Enum<?> date) throws SVNException {
if (isColumnNull(stmt, tokenField)) {
return null;
}
SVNWCDbLock lock = new SVNWCDbLock();
lock.token = getColumnText(stmt, tokenField);
if (!isColumnNull(stmt, owner)) {
lock.owner = getColumnText(stmt, owner);
}
if (!isColumnNull(stmt, SVNWCDbSchema.LOCK__Fields.lock_comment)) {
lock.comment = getColumnText(stmt, comment);
}
if (!isColumnNull(stmt, SVNWCDbSchema.LOCK__Fields.lock_date)) {
lock.date = getColumnDate(stmt, date);
}
return lock;
}
public static void reset(SVNSqlJetStatement stmt) throws SVNException {
if (stmt != null) {
stmt.reset();
}
}
public static SVNEventAction getColumnEventAction(SVNSqlJetStatement stmt, Enum<?> f) throws SVNException {
return SVNEventAction.getEventActionById((int) stmt.getColumnLong(f));
}
public static SVNStatusType getColumnStatusType(SVNSqlJetStatement stmt, Enum<?> f) throws SVNException {
return SVNStatusType.getEventStatusById((int) stmt.getColumnLong(f));
}
public static SVNNodeKind getColumnNodeKind(SVNSqlJetStatement stmt, Enum<?> f) throws SVNException {
return SVNNodeKind.getNodeKindById((int) stmt.getColumnLong(f));
}
}