001 /* 002 * Copyright 2005-2007 The Kuali Foundation 003 * 004 * $Source: /opt/cvs/rice/shared/src/main/java/org/apache/ojb/broker/platforms/KualiMySQLSequenceManagerImpl.java,v $ 005 * 006 * Licensed under the Educational Community License, Version 2.0 (the "License") 007 ; 008 * you may not use this file except in compliance with the License. 009 * You may obtain a copy of the License at 010 * 011 * http://www.opensource.org/licenses/ecl2.php 012 * 013 * Unless required by applicable law or agreed to in writing, software 014 * distributed under the License is distributed on an "AS IS" BASIS, 015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 016 * See the License for the specific language governing permissions and 017 * limitations under the License. 018 */ 019 package org.apache.ojb.broker.platforms; 020 021 import java.sql.Connection; 022 import java.sql.ResultSet; 023 import java.sql.Statement; 024 025 import org.apache.ojb.broker.PersistenceBroker; 026 import org.apache.ojb.broker.metadata.FieldDescriptor; 027 import org.apache.ojb.broker.util.sequence.AbstractSequenceManager; 028 import org.apache.ojb.broker.util.sequence.SequenceManagerException; 029 030 public class KualiMySQLSequenceManagerImpl extends AbstractSequenceManager { 031 032 public KualiMySQLSequenceManagerImpl(PersistenceBroker broker) { 033 super(broker); 034 } 035 036 @Override 037 protected long getUniqueLong(FieldDescriptor arg0) 038 throws SequenceManagerException { 039 PersistenceBroker broker = getBrokerForClass(); 040 041 Statement stmt = null; 042 Long seqNumber = null; 043 final String sequenceName = arg0.getSequenceName(); 044 045 try { 046 //FIXME: should we be closing this connection in a finally block? 047 Connection c = broker.serviceConnectionManager().getConnection(); 048 stmt = c.createStatement(); 049 String sql = "INSERT INTO " + sequenceName + " VALUES (NULL);"; 050 stmt.executeUpdate(sql); 051 sql = "SELECT LAST_INSERT_ID()"; 052 053 //FIXME: should we be closing this result set in a finally block? 054 ResultSet rs = stmt.executeQuery(sql); 055 if (rs != null) { 056 rs.first(); 057 seqNumber = rs.getLong(1); 058 } 059 } catch (Exception e) { 060 throw new RuntimeException("Unable to execute for sequence name: " + sequenceName, e); 061 } finally { 062 try { 063 if (stmt != null) { 064 stmt.close(); 065 } 066 } catch (Exception e) { 067 throw new RuntimeException("Unable to close statement for sequence name: " + sequenceName, e); 068 } 069 } 070 071 return seqNumber; 072 } 073 074 }