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; package org.dspace.storage.rdbms;
import java.io.BufferedReader; import java.io.*;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.sql.Connection; import java.sql.Connection;
import java.sql.DatabaseMetaData; import java.sql.DatabaseMetaData;
import java.sql.Date; import java.sql.Date;
@@ -1914,4 +1910,49 @@ public class DatabaseManager
System.out.println("Connected successfully!\n"); 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 System.out
.println("Incremental import. Searching for documents modified after: " .println("Incremental import. Searching for documents modified after: "
+ last.toString()); + 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 try
{ {
TableRowIterator iterator = DatabaseManager TableRowIterator iterator = DatabaseManager
.query(_context, .query(_context,
"SELECT item_id FROM item WHERE in_archive=TRUE AND last_modified > ?", sqlQuery,
new java.sql.Timestamp(last.getTime())); new java.sql.Timestamp(last.getTime()));
return this.index(iterator); return this.index(iterator);
} }
@@ -193,8 +199,14 @@ public class XOAI
System.out.println("Full import"); System.out.println("Full import");
try 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, TableRowIterator iterator = DatabaseManager.query(_context,
"SELECT item_id FROM item WHERE in_archive=TRUE"); sqlQuery);
return this.index(iterator); return this.index(iterator);
} }
catch (SQLException ex) catch (SQLException ex)

View File

@@ -7,13 +7,13 @@
*/ */
package org.dspace.xoai.data; package org.dspace.xoai.data;
import java.io.Serializable;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.apache.log4j.LogManager; import org.apache.log4j.LogManager;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.dspace.storage.rdbms.DatabaseManager; import org.dspace.storage.rdbms.DatabaseManager;
import org.dspace.storage.rdbms.TableRow; import org.dspace.storage.rdbms.TableRow;
@@ -78,27 +78,16 @@ public class DSpaceSetRepository extends AbstractSetRepository
private List<Set> community(int offset, int length) private List<Set> community(int offset, int length)
{ {
List<Set> array = new ArrayList<Set>(); 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"; 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");
String db = ConfigurationManager.getProperty("db.name"); List<Serializable> params = new ArrayList<Serializable>();
boolean postgres = true; params.add(Constants.COMMUNITY);
// Assuming postgres as default
if ("oracle".equals(db)) DatabaseManager.applyOffsetAndLimit(query,params,offset,length);
postgres = false;
if (postgres)
{
query += " OFFSET ? LIMIT ?";
}
else
{
// ORACLE
query = "SELECT *, ROWNUM r FROM (" + query
+ ") WHERE r BETWEEN ? AND ?";
length = length + offset;
}
try try
{ {
TableRowIterator iterator = DatabaseManager.query(_context, query, TableRowIterator iterator = DatabaseManager.query(_context, query.toString(),
Constants.COMMUNITY, offset, length); params.toArray());
int i = 0; int i = 0;
while (iterator.hasNext() && i < length) while (iterator.hasNext() && i < length)
{ {
@@ -119,27 +108,16 @@ public class DSpaceSetRepository extends AbstractSetRepository
private List<Set> collection(int offset, int length) private List<Set> collection(int offset, int length)
{ {
List<Set> array = new ArrayList<Set>(); 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"; 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");
String db = ConfigurationManager.getProperty("db.name"); List params = new ArrayList();
boolean postgres = true; params.add(Constants.COLLECTION);
// Assuming postgres as default
if ("oracle".equals(db)) DatabaseManager.applyOffsetAndLimit(query,params,offset,length);
postgres = false;
if (postgres)
{
query += " OFFSET ? LIMIT ?";
}
else
{
// ORACLE
query = "SELECT *, ROWNUM r FROM (" + query
+ ") WHERE r BETWEEN ? AND ?";
length = length + offset;
}
try try
{ {
TableRowIterator iterator = DatabaseManager.query(_context, query, TableRowIterator iterator = DatabaseManager.query(_context, query.toString(),
Constants.COLLECTION, offset, length); params.toArray());
int i = 0; int i = 0;
while (iterator.hasNext() && i < length) while (iterator.hasNext() && i < length)
{ {