mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-17 15:03:18 +00:00
DS-1425 - OAI improved support for Oracle DB
This commit is contained in:
@@ -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<Serializable> 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<Serializable> params, int offset, int limit){
|
||||
query.append(" OFFSET ? LIMIT ?");
|
||||
params.add(offset);
|
||||
params.add(limit);
|
||||
}
|
||||
|
||||
private static void offsetAndLimitOracleQuery(StringBuffer query , List<Serializable> 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));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -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)
|
||||
|
@@ -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<Set> community(int offset, int length)
|
||||
{
|
||||
List<Set> array = new ArrayList<Set>();
|
||||
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<Serializable> params = new ArrayList<Serializable>();
|
||||
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<Set> collection(int offset, int length)
|
||||
{
|
||||
List<Set> array = new ArrayList<Set>();
|
||||
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)
|
||||
{
|
||||
|
Reference in New Issue
Block a user