/* * Copyright (c) 2012, 2016 Eike Stepper (Berlin, Germany) and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Eike Stepper - initial API and implementation */ package org.eclipse.emf.cdo.server.internal.lissome.db; import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; import org.eclipse.emf.cdo.common.branch.CDOBranchVersion; import org.eclipse.net4j.db.DBType; import org.eclipse.net4j.db.ddl.IDBField; import org.eclipse.net4j.db.ddl.IDBIndex; /** * @author Eike Stepper */ public class ObjectsTable extends Table { protected IDBField branch; protected IDBField time; protected IDBField revised; protected IDBField version; protected IDBField cid; protected IDBField oid; protected IDBField container; protected IDBField name; protected IDBField pointer; public ObjectsTable(Index index) { super(index, "cdo_objects"); oid = addCDOIDField("cdo_oid"); if (isSupportingBranches()) { branch = table.addField("cdo_branch", DBType.INTEGER); } if (isSupportingAudits()) { time = table.addField("cdo_time", DBType.BIGINT); revised = table.addField("cdo_revised", DBType.BIGINT); version = table.addField("cdo_version", DBType.INTEGER); } cid = table.addField("cdo_cid", DBType.INTEGER); container = addCDOIDField("cdo_container"); name = table.addField("cdo_name", DBType.VARCHAR, 255); pointer = table.addField("cdo_pointer", DBType.BIGINT); table.addIndex(IDBIndex.Type.PRIMARY_KEY, oid, time, branch); // TODO Additional indexes to speed up queries } protected boolean addCriterion(StringBuilder builder, boolean needAnd, boolean withBranch, boolean historical) { if (withBranch) { if (needAnd) { builder.append(" AND "); } builder.append(branch); builder.append("=?"); needAnd = true; } if (isSupportingAudits()) { if (needAnd) { builder.append(" AND "); } if (historical) { builder.append(time); builder.append("<=? AND (?<="); builder.append(revised); builder.append(" OR "); builder.append(revised); builder.append("="); builder.append(CDOBranchPoint.UNSPECIFIED_DATE); builder.append(")"); } else { builder.append(revised); builder.append("="); builder.append(CDOBranchPoint.UNSPECIFIED_DATE); } needAnd = true; } return needAnd; } protected String sqlQueryResources(boolean historical, boolean exactMatch) { StringBuilder builder = new StringBuilder(); builder.append("SELECT "); builder.append(oid); builder.append(" FROM "); builder.append(this); builder.append(" WHERE "); builder.append(container); builder.append("=? AND "); builder.append(name); builder.append(exactMatch ? "=?" : " LIKE ?"); addCriterion(builder, true, isSupportingBranches(), historical); builder.append(" AND "); builder.append(version); builder.append(">="); builder.append(CDOBranchVersion.FIRST_VERSION); return builder.toString(); } protected StringBuilder sqlReadRevision() { StringBuilder builder = new StringBuilder(); builder.append("SELECT "); builder.append(pointer); if (isSupportingAudits()) { builder.append(", "); builder.append(revised); } builder.append(" FROM "); builder.append(this); return builder; } protected String sqlReadRevision(boolean historical) { StringBuilder builder = sqlReadRevision(); builder.append(" WHERE "); builder.append(oid); builder.append("=?"); addCriterion(builder, true, isSupportingBranches(), historical); return builder.toString(); } protected String sqlReadRevisionByVersion() { StringBuilder builder = sqlReadRevision(); builder.append(" WHERE "); builder.append(oid); builder.append("=? AND "); builder.append(branch); builder.append("=? AND "); builder.append(version); builder.append("=?"); return builder.toString(); } protected String sqlHandleRevisions(boolean withClass, boolean withBranch, boolean withTime, boolean exactTime, boolean historical) { StringBuilder builder = new StringBuilder(); builder.append("SELECT "); builder.append(oid); builder.append(", "); builder.append(pointer); if (isSupportingAudits()) { builder.append(", "); builder.append(revised); } builder.append(" FROM "); builder.append(this); int appended = 0; if (withClass) { builder.append(appended++ == 0 ? " WHERE " : " AND "); builder.append(cid); builder.append("=?"); } if (withBranch) { builder.append(appended++ == 0 ? " WHERE " : " AND "); builder.append(branch); builder.append("=?"); } if (withTime) { if (exactTime) { if (historical) { builder.append(appended++ == 0 ? " WHERE " : " AND "); builder.append(time); builder.append("=?"); } } else { builder.append(appended++ == 0 ? " WHERE " : " AND "); addCriterion(builder, false, false, historical); } } return builder.toString(); } protected String sqlAddRevision() { StringBuilder builder = new StringBuilder(); StringBuilder params = new StringBuilder(); builder.append("INSERT INTO "); builder.append(this); builder.append(" ("); builder.append(oid); params.append("?"); if (isSupportingBranches()) { builder.append(", "); builder.append(branch); params.append(", ?"); } if (isSupportingAudits()) { builder.append(", "); builder.append(time); params.append(", ?"); builder.append(", "); builder.append(revised); params.append(", ?"); builder.append(", "); builder.append(version); params.append(", ?"); } builder.append(", "); builder.append(cid); params.append(", ?"); builder.append(", "); builder.append(container); params.append(", ?"); builder.append(", "); builder.append(name); params.append(", ?"); builder.append(", "); builder.append(pointer); params.append(", ?"); builder.append(") VALUES ("); builder.append(params); builder.append(")"); return builder.toString(); } protected String sqlReviseOldRevisions() { StringBuilder builder = new StringBuilder(); builder.append("UPDATE "); builder.append(this); builder.append(" SET "); builder.append(revised); builder.append("=?"); builder.append(" WHERE "); builder.append(oid); builder.append("=?"); if (isSupportingBranches()) { builder.append(" AND "); builder.append(branch); builder.append("=?"); } builder.append(" AND "); builder.append(version); builder.append("=?"); return builder.toString(); } }