package com.tesora.dve.sql.schema; /* * #%L * Tesora Inc. * Database Virtualization Engine * %% * Copyright (C) 2011 - 2014 Tesora Inc. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ import java.util.EnumSet; import java.util.LinkedHashSet; import java.util.Set; import com.tesora.dve.sql.util.BinaryProcedure; import com.tesora.dve.sql.util.Functional; public class SQLMode { public enum SQLModes { NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES, STRICT_ALL_TABLES, PIPES_AS_CONCAT, ANSI, DB2, MAXDB, MSSQL, ORACLE, POSTGRESQL, NO_AUTO_VALUE_ON_ZERO, DEFAULT; public static SQLModes find(String raw) { for(SQLModes m : SQLModes.values()) { if (raw.equals(m.name())) return m; } return null; } } private Set<String> unknownModes; private EnumSet<SQLModes> knownModes; @SuppressWarnings("unchecked") public SQLMode(String raw) { unknownModes = new LinkedHashSet<String>(); knownModes = EnumSet.noneOf(SQLModes.class); if (raw != null) { String traw = raw.trim(); if (!"".equals(traw)) { String[] parts = traw.split(","); for(String s : parts) { String fixed = s.trim().toUpperCase(); SQLModes m = SQLModes.find(fixed); if (m != null) knownModes.add(m); else unknownModes.add(fixed); } } } } public SQLMode(SQLMode o) { unknownModes = new LinkedHashSet<String>(o.unknownModes); knownModes = EnumSet.noneOf(SQLModes.class); knownModes.addAll(o.knownModes); } public String toString() { StringBuilder buf = new StringBuilder(); Functional.join(knownModes, buf, ",", new BinaryProcedure<SQLModes,StringBuilder>() { @Override public void execute(SQLModes aobj, StringBuilder bobj) { bobj.append(aobj.name()); } }); if (!unknownModes.isEmpty()) { if (buf.length() > 0) buf.append(","); buf.append(Functional.join(unknownModes, ",")); } return buf.toString(); } public boolean isStrictMode() { return knownModes.contains(SQLModes.STRICT_TRANS_TABLES) || knownModes.contains(SQLModes.STRICT_ALL_TABLES); } public boolean isPipesAsConcat() { return knownModes.contains(SQLModes.PIPES_AS_CONCAT) || isOracle() || isAnsi() || isDB2() || isMaxDB() || isMSSql() || isPostgres(); } public boolean isAnsi() { return knownModes.contains(SQLModes.ANSI); } public boolean isDB2() { return knownModes.contains(SQLModes.DB2); } public boolean isMaxDB() { return knownModes.contains(SQLModes.MAXDB); } public boolean isMSSql() { return knownModes.contains(SQLModes.MSSQL); } public boolean isOracle() { return knownModes.contains(SQLModes.ORACLE); } public boolean isPostgres() { return knownModes.contains(SQLModes.POSTGRESQL); } public boolean isNoAutoOnZero() { return knownModes.contains(SQLModes.NO_AUTO_VALUE_ON_ZERO); } public SQLMode add(SQLMode other) { SQLMode out = new SQLMode(this); out.knownModes.addAll(other.knownModes); out.unknownModes.addAll(other.unknownModes); return out; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((knownModes == null) ? 0 : knownModes.hashCode()); result = prime * result + ((unknownModes == null) ? 0 : unknownModes.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; SQLMode other = (SQLMode) obj; if (knownModes == null) { if (other.knownModes != null) return false; } else if (!knownModes.equals(other.knownModes)) return false; if (unknownModes == null) { if (other.unknownModes != null) return false; } else if (!unknownModes.equals(other.unknownModes)) return false; return true; } }