diff --git a/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseManager.java b/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseManager.java index 5a143597e9..6e339039c0 100644 --- a/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseManager.java +++ b/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseManager.java @@ -7,11 +7,7 @@ */ package org.dspace.storage.rdbms; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.Reader; -import java.io.StringReader; -import java.io.UnsupportedEncodingException; +import java.io.*; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.Date; @@ -1914,4 +1910,49 @@ public class DatabaseManager System.out.println("Connected successfully!\n"); } + + public static void applyOffsetAndLimit(StringBuffer query, List params, int offset, int limit){ + if(!isOracle()){ + offsetAndLimitPostgresQuery(query,params,offset,limit); + }else{ + offsetAndLimitOracleQuery(query,params,offset,limit); + } + } + + private static void offsetAndLimitPostgresQuery(StringBuffer query , List params, int offset, int limit){ + query.append(" OFFSET ? LIMIT ?"); + params.add(offset); + params.add(limit); + } + + private static void offsetAndLimitOracleQuery(StringBuffer query , List params, int offset, int limit) + { + // prepare the LIMIT clause + if (limit > 0 || offset > 0) + { + query.insert(0, "SELECT /*+ FIRST_ROWS(n) */ rec.*, ROWNUM rnum FROM ("); + query.append(") "); + } + + if (limit > 0) + { + query.append("rec WHERE rownum<=? "); + if (offset > 0) + { + params.add(Integer.valueOf(limit + offset)); + } + else + { + params.add(Integer.valueOf(limit)); + } + } + + if (offset > 0) + { + query.insert(0, "SELECT * FROM ("); + query.append(") WHERE rnum>?"); + params.add(Integer.valueOf(offset)); + } + } + } diff --git a/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java b/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java index 528877fe61..d2f9d07af4 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java @@ -174,11 +174,17 @@ public class XOAI System.out .println("Incremental import. Searching for documents modified after: " + last.toString()); + + String sqlQuery = "SELECT item_id FROM item WHERE in_archive=TRUE AND last_modified > ?"; + if(DatabaseManager.isOracle()){ + sqlQuery = "SELECT item_id FROM item WHERE in_archive=1 AND last_modified > ?"; + } + try { TableRowIterator iterator = DatabaseManager .query(_context, - "SELECT item_id FROM item WHERE in_archive=TRUE AND last_modified > ?", + sqlQuery, new java.sql.Timestamp(last.getTime())); return this.index(iterator); } @@ -193,8 +199,14 @@ public class XOAI System.out.println("Full import"); try { + + String sqlQuery = "SELECT item_id FROM item WHERE in_archive=TRUE"; + if(DatabaseManager.isOracle()){ + sqlQuery = "SELECT item_id FROM item WHERE in_archive=1"; + } + TableRowIterator iterator = DatabaseManager.query(_context, - "SELECT item_id FROM item WHERE in_archive=TRUE"); + sqlQuery); return this.index(iterator); } catch (SQLException ex) diff --git a/dspace-oai/src/main/java/org/dspace/xoai/data/DSpaceSetRepository.java b/dspace-oai/src/main/java/org/dspace/xoai/data/DSpaceSetRepository.java index d4fc138a1d..a7c780c481 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/data/DSpaceSetRepository.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/data/DSpaceSetRepository.java @@ -7,13 +7,13 @@ */ package org.dspace.xoai.data; +import java.io.Serializable; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; -import org.dspace.core.ConfigurationManager; import org.dspace.core.Context; import org.dspace.storage.rdbms.DatabaseManager; import org.dspace.storage.rdbms.TableRow; @@ -78,27 +78,16 @@ public class DSpaceSetRepository extends AbstractSetRepository private List community(int offset, int length) { List array = new ArrayList(); - String query = "SELECT community_id, name, handle FROM community c, handle h WHERE h.resource_id=community_id AND h.resource_type_id=? ORDER BY community_id"; - String db = ConfigurationManager.getProperty("db.name"); - boolean postgres = true; - // Assuming postgres as default - if ("oracle".equals(db)) - postgres = false; - if (postgres) - { - query += " OFFSET ? LIMIT ?"; - } - else - { - // ORACLE - query = "SELECT *, ROWNUM r FROM (" + query - + ") WHERE r BETWEEN ? AND ?"; - length = length + offset; - } + StringBuffer query = new StringBuffer("SELECT community_id, name, handle FROM community c, handle h WHERE h.resource_id=community_id AND h.resource_type_id=? ORDER BY community_id"); + List params = new ArrayList(); + params.add(Constants.COMMUNITY); + + DatabaseManager.applyOffsetAndLimit(query,params,offset,length); + try { - TableRowIterator iterator = DatabaseManager.query(_context, query, - Constants.COMMUNITY, offset, length); + TableRowIterator iterator = DatabaseManager.query(_context, query.toString(), + params.toArray()); int i = 0; while (iterator.hasNext() && i < length) { @@ -119,27 +108,16 @@ public class DSpaceSetRepository extends AbstractSetRepository private List collection(int offset, int length) { List array = new ArrayList(); - String query = "SELECT collection_id, name, handle FROM collection c, handle h WHERE h.resource_id=collection_id AND h.resource_type_id=? ORDER BY collection_id"; - String db = ConfigurationManager.getProperty("db.name"); - boolean postgres = true; - // Assuming postgres as default - if ("oracle".equals(db)) - postgres = false; - if (postgres) - { - query += " OFFSET ? LIMIT ?"; - } - else - { - // ORACLE - query = "SELECT *, ROWNUM r FROM (" + query - + ") WHERE r BETWEEN ? AND ?"; - length = length + offset; - } + StringBuffer query = new StringBuffer("SELECT collection_id, name, handle FROM collection c, handle h WHERE h.resource_id=collection_id AND h.resource_type_id=? ORDER BY collection_id"); + List params = new ArrayList(); + params.add(Constants.COLLECTION); + + DatabaseManager.applyOffsetAndLimit(query,params,offset,length); + try { - TableRowIterator iterator = DatabaseManager.query(_context, query, - Constants.COLLECTION, offset, length); + TableRowIterator iterator = DatabaseManager.query(_context, query.toString(), + params.toArray()); int i = 0; while (iterator.hasNext() && i < length) {