Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions doc/release-notes/12127-fix-stored-proc-generated-pids.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
This release fixes a bug which prevents PIDs from being generated when the `identifier-generation-style` is set to `storedProcGenerated`.

Previously, this caused a database error ("ERROR: procedure generateidentifierfromstoredprocedure(unknown) does not exist").
22 changes: 0 additions & 22 deletions src/main/java/edu/harvard/iq/dataverse/Dataset.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,10 @@
import jakarta.persistence.NamedNativeQuery;
import jakarta.persistence.NamedQueries;
import jakarta.persistence.NamedQuery;
import jakarta.persistence.NamedStoredProcedureQuery;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OneToOne;
import jakarta.persistence.OrderBy;
import jakarta.persistence.ParameterMode;
import jakarta.persistence.SqlResultSetMapping;
import jakarta.persistence.StoredProcedureParameter;
import jakarta.persistence.Table;
import jakarta.persistence.Temporal;
import jakarta.persistence.TemporalType;
Expand Down Expand Up @@ -94,25 +91,6 @@
}
)

/*
Below is the database stored procedure for getting a string dataset id.
Used when the Dataverse is (optionally) configured to use
procedurally generated values for dataset ids, instead of the default
random strings.

The use of a stored procedure to create an identifier is explained in the
installation documentation (where an example script is supplied).
The stored procedure can be implemented using other SQL flavors -
without having to modify the application code.
-- L.A. 4.6.2 (modified by C.S. for version 5.4.1+)
*/
@NamedStoredProcedureQuery(
name = "Dataset.generateIdentifierFromStoredProcedure",
procedureName = "generateIdentifierFromStoredProcedure",
parameters = {
@StoredProcedureParameter(mode = ParameterMode.OUT, type = String.class)
}
)
@Entity
@Table(indexes = {
@Index(columnList = "guestbook_id"),
Expand Down
13 changes: 9 additions & 4 deletions src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@
import jakarta.persistence.NonUniqueResultException;
import jakarta.persistence.PersistenceContext;
import jakarta.persistence.Query;
import jakarta.persistence.StoredProcedureQuery;

import org.apache.commons.lang3.StringUtils;
import org.eclipse.persistence.exceptions.DatabaseException;

/**
* Your goto bean for everything {@link DvObject}, that's not tied to any
Expand Down Expand Up @@ -402,9 +402,14 @@ public Map<Long, String> getObjectPathsByIds(Set<Long> objectIds){
}

public String generateNewIdentifierByStoredProcedure() {
StoredProcedureQuery query = this.em.createNamedStoredProcedureQuery("Dataset.generateIdentifierFromStoredProcedure");
query.execute();
return (String) query.getOutputParameterValue(1);
try {
Query query = em.createNativeQuery("SELECT generateIdentifierFromStoredProcedure()");
return (String) query.getSingleResult();
} catch (DatabaseException e) {
// It's possible that the function "generateIdentifierFromStoredProcedure" is not defined in the database
logger.severe("Error generating identifier using stored procedure: " + e.getMessage());
return null;
}
}

/** @deprecated Backward-compatibility method to get the effective pid generator for a DvObjectContainer.
Expand Down