DS-1425 - OAI improved support for Oracle DB

This commit is contained in:
akonczak
2012-12-13 18:05:35 +00:00
parent 945b0283c9
commit c2d4c50f9a
3 changed files with 77 additions and 46 deletions

View File

@@ -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));
}
}
}

View File

@@ -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)

View File

@@ -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)
{