/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.testing.tests.returning; import java.util.*; import org.eclipse.persistence.descriptors.ClassDescriptor; import org.eclipse.persistence.tools.schemaframework.SchemaManager; import org.eclipse.persistence.sessions.*; import org.eclipse.persistence.sessions.Project; import org.eclipse.persistence.platform.database.DatabasePlatform; import org.eclipse.persistence.internal.sequencing.Sequencing; import org.eclipse.persistence.internal.sessions.DatabaseSessionImpl; import org.eclipse.persistence.testing.framework.*; /** * This adapter is meant to generate INSERT and UPDATE * procedures that return values, but currently only generates * procedures that just perform the INSERT/UPDATE, so is not currently used. * It will hopefully be finished at some point... */ public class InsertUpdateStoredProcedureAdapter implements ProjectAndDatabaseAdapter { StoredProcedureGeneratorForAdapter generator; public boolean isOriginalSetupRequired() { return true; } public void updateProject(Project project, Session session) { verifySession(session); if (generator == null) { generator = new StoredProcedureGeneratorForAdapter(new SchemaManager((DatabaseSession)session)); generator.setUseTableNames(true); } removeOptimisticLocking(project); ((DatabaseSession)session).addDescriptors(project); generator.generateStoredProceduresDefinitionsForProject(project); generator.amendDescriptors(); } public void updateDatabase(Session session) { try { generator.writeStoredProcedures(); } finally { clear(); } } protected void clear() { generator = null; } // StoredProcedureGenerator currently can't handle optimistic locking protected int removeOptimisticLocking(Project project) { int removed = 0; Iterator descriptors = project.getDescriptors().values().iterator(); while (descriptors.hasNext()) { ClassDescriptor desc = (ClassDescriptor)descriptors.next(); if (desc.getOptimisticLockingPolicy() != null) { desc.setOptimisticLockingPolicy(null); removed++; } } return removed; } protected void verifySession(Session session) { DatabasePlatform platform = session.getPlatform(); if (((DatabaseSessionImpl)session).getSequencing() != null) { if (((DatabaseSessionImpl)session).getSequencing().whenShouldAcquireValueForAll() != Sequencing.BEFORE_INSERT) { // On Sybase, Infomix, SQLServer native sequencing is provided by calling @@IDENTITY after insert // Apparently if INSERT has occurred inside stored procedure, SELECT @@IDENTITY returns 0. throw new TestWarningException("InsertUpdateStoredProcedureAdapter can't handle native sequencing on this platform. Use table sequencing instead"); } } if ((platform.isSybase() || platform.isSQLAnywhere()) && platform.supportsAutoCommit()) { // stored procedures won't work unless // the flag set to false (at least with JConnect). // see DatabaseLogin.handleTransactionsManuallyForSybaseJConnect() throw new TestWarningException("Sybase requires supportAutoCommit()==false"); } } }