You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by oz...@apache.org on 2004/05/11 12:41:57 UTC

cvs commit: jakarta-slide/src/stores/org/apache/slide/store/impl/rdbms SequenceAdapter.java SybaseRDBMSAdapter.java SQLServerRDBMSAdapter.java

ozeigermann    2004/05/11 03:41:57

  Modified:    src/stores/org/apache/slide/store/impl/rdbms
                        SybaseRDBMSAdapter.java SQLServerRDBMSAdapter.java
  Added:       src/stores/org/apache/slide/store/impl/rdbms
                        SequenceAdapter.java
  Log:
  Added Seqeunce support implementation for MS SQLServer and Sybase
  
  Revision  Changes    Path
  1.4       +10 -5     jakarta-slide/src/stores/org/apache/slide/store/impl/rdbms/SybaseRDBMSAdapter.java
  
  Index: SybaseRDBMSAdapter.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/impl/rdbms/SybaseRDBMSAdapter.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SybaseRDBMSAdapter.java	11 Feb 2004 11:30:21 -0000	1.3
  +++ SybaseRDBMSAdapter.java	11 May 2004 10:41:56 -0000	1.4
  @@ -40,5 +40,10 @@
       public SybaseRDBMSAdapter(Service service, Logger logger) {
           super(service, logger);
       }
  -}
   
  +    protected String getExistsQuery(String sequenceName) {
  +        String selectQuery = "SELECT * FROM dbo.sysobjects WHERE name = '" + normalizeSequenceName(sequenceName) + "'";
  +        return selectQuery;
  +    }
  +
  +}
  
  
  
  1.4       +100 -11   jakarta-slide/src/stores/org/apache/slide/store/impl/rdbms/SQLServerRDBMSAdapter.java
  
  Index: SQLServerRDBMSAdapter.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/impl/rdbms/SQLServerRDBMSAdapter.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SQLServerRDBMSAdapter.java	11 Feb 2004 11:30:21 -0000	1.3
  +++ SQLServerRDBMSAdapter.java	11 May 2004 10:41:56 -0000	1.4
  @@ -23,10 +23,15 @@
   
   package org.apache.slide.store.impl.rdbms;
   
  +import java.sql.Connection;
  +import java.sql.PreparedStatement;
  +import java.sql.ResultSet;
   import java.sql.SQLException;
  +import java.sql.Statement;
   
   import org.apache.slide.common.*;
   import org.apache.slide.macro.ConflictException;
  +import org.apache.slide.store.SequenceStore;
   import org.apache.slide.util.logger.Logger;
   
   /**
  @@ -36,10 +41,14 @@
    * @version $Revision$
    */
   
  -public class SQLServerRDBMSAdapter extends StandardRDBMSAdapter {
  +public class SQLServerRDBMSAdapter extends StandardRDBMSAdapter implements SequenceAdapter {
   
       protected static final String LOG_CHANNEL = SQLServerRDBMSAdapter.class.getName();
   
  +    protected static String normalizeSequenceName(String sequenceName) {
  +        return sequenceName.replace('-', '_').toUpperCase() + "_SEQ";
  +    }
  +
       public SQLServerRDBMSAdapter(Service service, Logger logger) {
           super(service, logger);
       }
  @@ -50,20 +59,100 @@
               case 1205 : // thread was deadlock victim
                   getLogger().log(e.getErrorCode() + ": Deadlock resolved on " + uri, LOG_CHANNEL, Logger.WARNING);
                   return new ServiceAccessException(service, new ConflictException(uri));
  -                
  +
               case 547 : // referential integraty constaint was violated (like in storeObject on table URI )
               case 2627 : // primary key constraint violation (like in storeContent on table VERSION_CONTENT)
                   getLogger().log(e.getErrorCode() + ": Low isolation conflict for " + uri, LOG_CHANNEL, Logger.WARNING);
                   return new ServiceAccessException(service, new ConflictException(uri));
  -                
  +
               default :
  -            getLogger().log("SQL error " + e.getErrorCode() + " on " + uri + ": " + e.getMessage(),
  -                LOG_CHANNEL,
  -                Logger.ERROR);
  -            
  +                getLogger().log(
  +                    "SQL error " + e.getErrorCode() + " on " + uri + ": " + e.getMessage(),
  +                    LOG_CHANNEL,
  +                    Logger.ERROR);
  +
                   return new ServiceAccessException(service, e);
           }
   
  +    }
  +
  +    public boolean isSequenceSupported(Connection conn) {
  +        return true;
  +    }
  +
  +    public boolean createSequence(Connection conn, String sequenceName) throws ServiceAccessException {
  +
  +        // XXX DUMMY is a keyword in Sybase, so spell it wrong
  +        String query =
  +            "CREATE TABLE dbo."
  +                + normalizeSequenceName(sequenceName)
  +                + " (ID id_type IDENTITY UNIQUE NOT NULL, DUMY bit NOT NULL)";
  +
  +        PreparedStatement statement = null;
  +
  +        try {
  +            statement = conn.prepareStatement(query);
  +            statement.executeUpdate();
  +            return true;
  +        } catch (SQLException e) {
  +            throw new ServiceAccessException(service, e);
  +        } finally {
  +            close(statement);
  +        }
  +
  +    }
  +
  +    public long nextSequenceValue(Connection conn, String sequenceName) throws ServiceAccessException {
  +        String query = "INSERT INTO dbo." + normalizeSequenceName(sequenceName) + " (DUMY) VALUES(1)";
  +
  +        String selectQuery = "SELECT @@identity";
  +
  +        PreparedStatement statement = null;
  +        PreparedStatement selectStatement = null;
  +        ResultSet res = null;
  +
  +        try {
  +            statement = conn.prepareStatement(query);
  +            statement.executeUpdate();
  +
  +            selectStatement = conn.prepareStatement(selectQuery);
  +            res = selectStatement.executeQuery();
  +            if (!res.next()) {
  +                throw new ServiceAccessException(service, "Could not increment sequence " + sequenceName);
  +            }
  +            long value = res.getLong(1);
  +            return value;
  +        } catch (SQLException e) {
  +            throw new ServiceAccessException(service, e);
  +        } finally {
  +            close(statement);
  +            close(selectStatement, res);
  +        }
  +    }
  +
  +    public boolean sequenceExists(Connection conn, String sequenceName) throws ServiceAccessException {
  +        String selectQuery = getExistsQuery(sequenceName);
  +
  +        PreparedStatement selectStatement = null;
  +        ResultSet res = null;
  +
  +        try {
  +            selectStatement = conn.prepareStatement(selectQuery);
  +            res = selectStatement.executeQuery();
  +            return res.next();
  +        } catch (SQLException e) {
  +            throw new ServiceAccessException(service, e);
  +        } finally {
  +            close(selectStatement, res);
  +        }
  +    }
  +
  +    protected String getExistsQuery(String sequenceName) {
  +        String selectQuery =
  +            "SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].["
  +                + normalizeSequenceName(sequenceName)
  +                + "]') and OBJECTPROPERTY(id, N'IsUserTable') = 1";
  +        return selectQuery;
       }
   
   }
  
  
  
  1.1                  jakarta-slide/src/stores/org/apache/slide/store/impl/rdbms/SequenceAdapter.java
  
  Index: SequenceAdapter.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/impl/rdbms/SequenceAdapter.java,v 1.1 2004/05/11 10:41:56 ozeigermann Exp $
   * $Revision: 1.1 $
   * $Date: 2004/05/11 10:41:56 $
   *
   * ====================================================================
   *
   * Copyright 1999-2003 The Apache Software Foundation 
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   *
   */
  
  package org.apache.slide.store.impl.rdbms;
  
  import java.sql.Connection;
  
  import org.apache.slide.common.ServiceAccessException;
  
  /**
   * 
   * 
   * @author <a href="mailto:ozeigermann@apache.org">Oliver Zeigermann</a>
   * @version $Revision: 1.1 $
   */
  public interface SequenceAdapter {
      
      public boolean isSequenceSupported(Connection conn);
      public boolean createSequence(Connection conn, String sequenceName) throws ServiceAccessException;
      public long nextSequenceValue(Connection conn, String sequenceName) throws ServiceAccessException;
      public boolean sequenceExists(Connection conn, String sequenceName) throws ServiceAccessException;
  }
  
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org