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