1 30 package com.genimen.djeneric.repository.rdbms; 31 32 import java.sql.ResultSet ; 33 import java.sql.SQLException ; 34 import java.util.Stack ; 35 36 import com.genimen.djeneric.repository.DjIdProvider; 37 import com.genimen.djeneric.repository.DjSession; 38 import com.genimen.djeneric.repository.exceptions.DjenericException; 39 40 public class RdbmsIdProvider extends DjIdProvider 41 { 42 Stack _cache = new Stack (); 43 44 public RdbmsIdProvider() 45 { 46 setSequenceName(RdbmsPersistenceManager.POLYMORPH_TABLE); 47 } 48 49 public RdbmsIdProvider(int cacheSize) 50 { 51 super(cacheSize); 52 } 53 54 public long getNextId(DjSession forSession) throws DjenericException 56 { 57 if (!_cache.isEmpty()) 58 { 59 Long val = (Long ) _cache.pop(); 60 return val.longValue(); 61 } 62 63 try 64 { 65 RdbmsSession session = (RdbmsSession) forSession.getPersistenceManager().createSession(); 66 try 67 { 68 SqlStatement s = session.getInternalSqlStatement("update " + RdbmsPersistenceManager.INTERNAL_IDS_TABLE 70 + " set next_value = next_value + :incr" 71 + " where name = :seqName"); 72 s.setInt("incr", getCacheSize() + 1); 73 s.setString("seqName", getSequenceName()); 74 int recsHit = s.executeUpdate(); 75 s.close(); 76 77 if (recsHit == 0) 78 { 79 s = session.getInternalSqlStatement("insert into " + RdbmsPersistenceManager.INTERNAL_IDS_TABLE 81 + "(name, next_value) values(:seqName, " + (getCacheSize() + 2) + ")"); 82 s.setString("seqName", getSequenceName()); 83 s.executeUpdate(); 84 } 85 86 s = session 88 .getInternalSqlStatement("select next_value " + "from " + RdbmsPersistenceManager.INTERNAL_IDS_TABLE 89 + " " + "where name = :name "); 90 s.setString("name", getSequenceName()); 91 ResultSet rs = s.executeQuery(); 92 long id; 93 if (rs.next()) 94 { 95 id = rs.getLong("next_value") - 1; 96 } 97 else throw new DjenericException("Internal error, could not get next object id"); 98 99 rs.close(); 100 s.close(); 101 session.commit(); 102 103 long lastId = id; 104 for (int i = 0; i < getCacheSize(); i++) 105 { 106 _cache.push(new Long (lastId - i)); 107 } 108 return id - getCacheSize(); 109 } 110 finally 111 { 112 session.close(); 113 } 114 } 115 catch (SQLException x) 116 { 117 throw new DjenericException(x); 118 } 119 } 120 } | Popular Tags |