mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-18 07:23:08 +00:00
DS-1425 - OAI improved support for Oracle DB
This commit is contained in:
@@ -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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -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)
|
||||||
|
@@ -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)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user