1 53 54 106 107 package com.Yasna.forum.database; 108 109 import com.Yasna.forum.PropertyManager; 110 111 import java.util.HashMap ; 112 import java.sql.*; 113 114 126 public class DbSequenceManager { 127 128 private static final String NEXT_FORUM_ID = "SELECT max(forumID) FROM yazdForum"; 129 private static final String NEXT_THREAD_ID = "SELECT max(threadID) FROM yazdThread"; 130 private static final String NEXT_MESSAGE_ID = "SELECT max(messageID) FROM yazdMessage"; 131 private static final String NEXT_GROUP_ID = "SELECT max(groupID) FROM yazdGroup"; 132 private static final String NEXT_USER_ID = "SELECT max("+SystemProperty.getProperty("User.Column.UserID")+") FROM "+SystemProperty.getProperty("User.Table"); 133 private static final String NEXT_CATEGORY_ID = "SELECT max(categoryID) FROM yazdCategory"; 134 private static final String NEXT_FORUM_GROUP_ID = "SELECT max(forumGroupID) FROM yazdForumGroup"; 135 138 private static DbSequenceManager sequenceManager = null; 139 140 143 private static Object initLock = new Object (); 144 145 151 public static int nextID(String type) { 152 if (sequenceManager == null) { 153 synchronized(initLock) { 154 if (sequenceManager == null) { 155 sequenceManager = new DbSequenceManager(); 156 } 157 } 158 } 159 return sequenceManager.nextUniqueID(type); 160 } 161 162 private HashMap uniqueIDCounters; 163 private HashMap keys; 164 165 168 public DbSequenceManager() { 169 keys = new HashMap (); 170 keys.put("Forum",NEXT_FORUM_ID); 171 keys.put("ForumThread",NEXT_THREAD_ID); 172 keys.put("ForumMessage",NEXT_MESSAGE_ID); 173 keys.put("Group",NEXT_GROUP_ID); 174 keys.put("User",NEXT_USER_ID); 175 keys.put("Category",NEXT_CATEGORY_ID); 176 keys.put("ForumGroup",NEXT_FORUM_GROUP_ID); 177 178 uniqueIDCounters = new HashMap (); 179 180 uniqueIDCounters.put("Forum", new Counter(getNextDbID((String )keys.get("Forum")))); 182 uniqueIDCounters.put("ForumThread", new Counter(getNextDbID((String )keys.get("ForumThread")))); 184 uniqueIDCounters.put("ForumMessage", new Counter(getNextDbID((String )keys.get("ForumMessage")))); 186 uniqueIDCounters.put("Group", new Counter(getNextDbID((String )keys.get("Group")))); 188 uniqueIDCounters.put("User", new Counter(getNextDbID((String )keys.get("User")))); 190 uniqueIDCounters.put("Category", new Counter(getNextDbID((String )keys.get("Category")))); 191 uniqueIDCounters.put("ForumGroup", new Counter(getNextDbID((String )keys.get("ForumGroup")))); 192 } 193 194 204 public int nextUniqueID(String counterName) { 205 if(Boolean.valueOf(PropertyManager.getProperty("Sequence.UseDatabase")).booleanValue()){ 206 return getNextDbID((String )keys.get(counterName))+1; 207 } else { 208 Counter counter = (Counter)uniqueIDCounters.get(counterName); 209 return counter.next(); 210 } 211 } 212 213 218 private int getNextDbID(String query) { 219 int currentID = 0; 220 Connection con = null; 221 PreparedStatement pstmt = null; 222 223 try { 224 con = DbConnectionManager.getConnection(); 225 pstmt = con.prepareStatement(query); 226 ResultSet rs = pstmt.executeQuery(); 227 rs.next(); 228 currentID = rs.getInt(1); 229 } 230 catch( Exception sqle ) { 231 System.err.println("Error in DbSequenceManager:getNextDbID()-" + sqle); 232 sqle.printStackTrace(); 233 } 234 finally { 235 try { pstmt.close(); } 236 catch (Exception e) { e.printStackTrace(); } 237 try { con.close(); } 238 catch (Exception e) { e.printStackTrace(); } 239 } 240 if (currentID < 0) { 242 currentID = 0; 243 } 244 return currentID; 245 } 246 247 250 private final class Counter { 251 252 private int count; 253 254 public Counter(int currentCount) { 255 count = currentCount; 256 } 257 258 public final synchronized int next() { 259 return (++count); 260 } 261 } 262 } 263 | Popular Tags |