Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 David Berkman
   * 
   * This file is part of the SmallMind Code Project.
   * 
   * The SmallMind Code Project is free software, you can redistribute
   * it and/or modify it under the terms of GNU Affero General Public
   * License as published by the Free Software Foundation, either version 3
   * of the License, or (at your option) any later version.
  * 
  * The SmallMind Code Project is distributed in the hope that it will
  * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  * General Public License for more details.
  * 
  * You should have received a copy of the the GNU Affero General Public
  * License, along with the SmallMind Code Project. If not, see
  * <http://www.gnu.org/licenses/>.
  * 
  * Additional permission under the GNU Affero GPL version 3 section 7
  * ------------------------------------------------------------------
  * If you modify this Program, or any covered work, by linking or
  * combining it with other code, such other code is not for that reason
  * alone subject to any of the requirements of the GNU Affero GPL
  * version 3.
  */
 package org.smallmind.persistence.database.mysql;
 
 
 public class SimulatedSequence extends Sequence {
 
   private final DataSource dataSource;
   private final String tableName;
   private final int incrementBy;
 
   public SimulatedSequence (DataSource dataSourceString tableNameint incrementBy) {
 
     this. = dataSource;
     this. = tableName;
     this. = incrementBy;
   }
 
   public void register () {
 
     SequenceManager.register(this);
   }
 
   @Override
   public long nextLong (String name) {
 
     return getSequenceData(name).nextLong();
   }
 
   private SequenceData getSequenceData (String name) {
 
     SequenceData sequenceData;
 
     if ((sequenceData = .get(name)) == null) {
       synchronized () {
         if ((sequenceData = .get(name)) == null) {
           .put(namesequenceData = new SequenceData(name));
         }
       }
     }
 
     return sequenceData;
   }
 
   private class SequenceData {
 
     private final AtomicLong atomicBoundary;
     private final AtomicLong atomicOffset = new AtomicLong(0);
     private final String name;
     private final String sequenceSql;
 
     public SequenceData (String name) {
 
       this. = name;
 
        = "UPDATE " +  + " SET next_val=LAST_INSERT_ID(next_val + " +  + ") where name = '" + name + "'";
        = new AtomicLong(getLastInsertId());
     }
 
     public long nextLong () {
 
       long nextValue = 0;
 
       do {
         if ( == 1) {
          nextValue = getLastInsertId();
        }
        else {
          long currentOffset;
          do {
            if ((currentOffset = .incrementAndGet()) < ) {
              nextValue = .get() + currentOffset;
            }
            else if (currentOffset == ) {
              try {
                .set(nextValue = getLastInsertId());
                .set(0);
              }
              catch (SimulatedSequenceDisasterException simulatedSequenceDisasterException) {
                LoggerManager.getLogger(SimulatedSequence.class).error(simulatedSequenceDisasterException);
                .set( - 1);
              }
            }
          } while (currentOffset > );
        }
      } while (nextValue == 0);
      return nextValue;
    }
    private long getLastInsertId () {
      Connection connection = null;
      Statement statement = null;
      ResultSet resultSet = null;
      try {
        try {
          connection = .getConnection();
          statement = connection.createStatement(..);
          resultSet = statement.getGeneratedKeys();
          if (resultSet.next()) {
            return resultSet.getLong(1);
          }
          else {
            throw new SimulatedSequenceDisasterException("No sequence(%s) has been generated");
          }
        }
        finally {
          if (resultSet != null) {
            resultSet.close();
          }
          if (statement != null) {
            statement.close();
          }
          if (connection != null) {
            connection.close();
          }
        }
      }
      catch (SimulatedSequenceDisasterException simulatedSequenceDisasterException) {
        throw simulatedSequenceDisasterException;
      }
      catch (SQLException sqlException) {
        throw new SimulatedSequenceDisasterException(sqlException"Unable to update sequence(%s)");
      }
      catch (Throwable throwable) {
        throw new SimulatedSequenceDisasterException(throwable"Unknown exception encountered in sequence(%s) update");
      }
    }
  }
New to GrepCode? Check out our FAQ X