Skip to content

Commit 50a93fa

Browse files
authored
Merge pull request #520 from IBM/lee-master
Update Db2Adapter.createFhirSchemas to succeed when schemas exist
2 parents d86a419 + 0ca117c commit 50a93fa

15 files changed

Lines changed: 98 additions & 114 deletions

File tree

fhir-audit/src/main/java/com/ibm/fhir/audit/logging/beans/Context.java

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -138,14 +138,6 @@ public void setRequestUniqueId(String requestUniqueId) {
138138
this.requestUniqueId = requestUniqueId;
139139
}
140140

141-
public String getResourceName() {
142-
return resourceName;
143-
}
144-
145-
public void setResourceName(String resourceName) {
146-
this.resourceName = resourceName;
147-
}
148-
149141
/**
150142
* Generates JSON from this object.
151143
*/
@@ -191,10 +183,6 @@ public static String generate(Context obj)
191183
generator.write("purpose", obj.getPurpose());
192184
}
193185

194-
if (obj.getResourceName() != null) {
195-
generator.write("resource_name", obj.getResourceName());
196-
}
197-
198186
if (obj.getStartTime() != null) {
199187
generator.write("start_time", obj.getStartTime());
200188
}
@@ -275,12 +263,6 @@ public static Context parse(InputStream in)
275263
builder.purpose(purpose);
276264
}
277265

278-
t = jsonObject.get("resource_name");
279-
if (t != null) {
280-
String resourceName = jsonObject.getString("resource_name");
281-
builder.resourceName(resourceName);
282-
}
283-
284266
t = jsonObject.get("start_time");
285267
if (t != null) {
286268
String startTime = jsonObject.getString("start_time");
@@ -387,11 +369,6 @@ public Builder requestUniqueId(String requestUniqueId) {
387369
return this;
388370
}
389371

390-
public Builder resourceName(String resourceName) {
391-
context.setResourceName(resourceName);
392-
return this;
393-
}
394-
395372
public Context build() {
396373
return context;
397374
}

fhir-audit/src/main/java/com/ibm/fhir/audit/logging/beans/impl/context/FHIRContext.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,6 @@ public static String generate(FHIRContext obj)
124124
generator.write("purpose", obj.getPurpose());
125125
}
126126

127-
if (obj.getResourceName() != null) {
128-
generator.write("resource_name", obj.getResourceName());
129-
}
130-
131127
if (obj.getStartTime() != null) {
132128
generator.write("start_time", obj.getStartTime());
133129
}
@@ -228,12 +224,6 @@ public static FHIRContext parse(InputStream in)
228224
builder.purpose(purpose);
229225
}
230226

231-
t = jsonObject.get("resource_name");
232-
if (t != null) {
233-
String resourceName = jsonObject.getString("resource_name");
234-
builder.resourceName(resourceName);
235-
}
236-
237227
t = jsonObject.get("start_time");
238228
if (t != null) {
239229
String startTime = jsonObject.getString("start_time");
@@ -395,11 +385,6 @@ public FHIRBuilder requestUniqueId(String requestUniqueId) {
395385
return this;
396386
}
397387

398-
public FHIRBuilder resourceName(String resourceName) {
399-
fhirContext.setResourceName(resourceName);
400-
return this;
401-
}
402-
403388
public FHIRContext build() {
404389
return fhirContext;
405390
}

fhir-audit/src/test/java/com/ibm/fhir/audit/cadf/test/AuditBeansTest.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,6 @@ public void testContextEmptyNull() throws FHIRException, IOException {
130130
assertNull(ctx.getPurpose());
131131
assertNull(ctx.getQueryParameters());
132132
assertNull(ctx.getRequestUniqueId());
133-
assertNull(ctx.getResourceName());
134133
assertNull(ctx.getStartTime());
135134
}
136135

@@ -175,7 +174,6 @@ public void testContext() throws FHIRException, IOException {
175174
builder.purpose("purpose");
176175
builder.queryParameters("queryParameters");
177176
builder.requestUniqueId("requestUniqueId");
178-
builder.resourceName("test");
179177
builder.startTime("startTime");
180178

181179
Context ctx = builder.build();
@@ -204,9 +202,6 @@ public void testContext() throws FHIRException, IOException {
204202
assertNotNull(ctx.getRequestUniqueId());
205203
assertEquals(ctx.getRequestUniqueId(), "requestUniqueId");
206204

207-
assertNotNull(ctx.getResourceName());
208-
assertEquals(ctx.getResourceName(), "test");
209-
210205
assertNotNull(ctx.getStartTime());
211206
assertEquals(ctx.getStartTime(), "startTime");
212207

@@ -236,9 +231,6 @@ public void testContext() throws FHIRException, IOException {
236231
assertNotNull(ctx.getRequestUniqueId());
237232
assertEquals(ctx.getRequestUniqueId(), "requestUniqueId");
238233

239-
assertNotNull(ctx.getResourceName());
240-
assertEquals(ctx.getResourceName(), "test");
241-
242234
assertNotNull(ctx.getStartTime());
243235
assertEquals(ctx.getStartTime(), "startTime");
244236
}
@@ -349,7 +341,6 @@ public void testFHIRContext() throws IOException, FHIRException {
349341
builder.purpose("purpose");
350342
builder.queryParameters("queryParameters");
351343
builder.requestUniqueId("requestUniqueId");
352-
builder.resourceName("test");
353344
builder.startTime("startTime");
354345

355346
builder.clientCertCn("clientCertCn");
@@ -386,9 +377,6 @@ public void testFHIRContext() throws IOException, FHIRException {
386377
assertNotNull(fhirCtx.getRequestUniqueId());
387378
assertEquals(fhirCtx.getRequestUniqueId(), "requestUniqueId");
388379

389-
assertNotNull(fhirCtx.getResourceName());
390-
assertEquals(fhirCtx.getResourceName(), "test");
391-
392380
assertNotNull(fhirCtx.getStartTime());
393381
assertEquals(fhirCtx.getStartTime(), "startTime");
394382

fhir-config/src/main/java/com/ibm/fhir/config/FHIRConfiguration.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ public class FHIRConfiguration {
4848
public static final String PROPERTY_AUDIT_SERVICE_CLASS_NAME = "fhirServer/audit/serviceClassName";
4949
public static final String PROPERTY_AUDIT_SERVICE_PROPERTIES = "fhirServer/audit/serviceProperties";
5050
public static final String PROPERTY_AUDIT_PATIENT_ID_EXTURL = "fhirServer/audit/patientIdExtensionUrl";
51-
public static final String PROPERTY_AUDIT_RESOURCE_NAME_EXTURL = "fhirServer/audit/resourceNameExtensionUrl";
52-
public static final String PROPERTY_UPDATE_CREATE_ENABLED = "fhirServer/persistence/common/updateCreateEnabled";
5351

5452
// Notification config properties
5553
public static final String PROPERTY_NOTIFICATION_RESOURCE_TYPES = "fhirServer/notifications/common/includeResourceTypes";
@@ -59,6 +57,7 @@ public class FHIRConfiguration {
5957
public static final String PROPERTY_KAFKA_CONNECTIONPROPS = "fhirServer/notifications/kafka/connectionProperties";
6058

6159
// Persistence layer properties
60+
public static final String PROPERTY_UPDATE_CREATE_ENABLED = "fhirServer/persistence/common/updateCreateEnabled";
6261
public static final String PROPERTY_PERSISTENCE_FACTORY = "fhirServer/persistence/factoryClassname";
6362
public static final String PROPERTY_DATASOURCES = "fhirServer/persistence/datasources";
6463
public static final String PROPERTY_JDBC_BOOTSTRAP_DB = "fhirServer/persistence/jdbc/bootstrapDb";
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* (C) Copyright IBM Corp. 2019
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package com.ibm.fhir.database.utils.api;
8+
9+
/**
10+
* The name of the object to be created is identical to an existing name.
11+
*/
12+
public class DuplicateNameException extends DataAccessException {
13+
// Generated serial number
14+
private static final long serialVersionUID = 4082017119186491651L;
15+
16+
public DuplicateNameException(Throwable t) {
17+
super(t);
18+
}
19+
20+
public DuplicateNameException(String msg, Throwable t) {
21+
super(msg, t);
22+
}
23+
}

fhir-database-utils/src/main/java/com/ibm/fhir/database/utils/api/IDatabaseTranslator.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,14 @@ public interface IDatabaseTranslator {
5050
*/
5151
boolean isDuplicate(SQLException x);
5252

53+
/**
54+
* Check the exception to see if it is reporting that THE NAME OF THE OBJECT TO BE CREATED
55+
* OR THE TARGET OF A RENAME STATEMENT IS IDENTICAL TO THE EXISTING NAME OF THE OBJECT TYPE
56+
* @param x
57+
* @return
58+
*/
59+
boolean isAlreadyExists(SQLException x);
60+
5361
/**
5462
* Database timed out waiting to get a lock. This is not the same as a deadlock, of course
5563
* @param x

fhir-database-utils/src/main/java/com/ibm/fhir/database/utils/api/DuplicateValueException.java renamed to fhir-database-utils/src/main/java/com/ibm/fhir/database/utils/api/UniqueConstraintViolationException.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@
99
/**
1010
* Translation of a duplicate key or value constraint SQLException.
1111
*/
12-
public class DuplicateValueException extends DataAccessException {
12+
public class UniqueConstraintViolationException extends DataAccessException {
1313

1414
// Generated serial number
1515
private static final long serialVersionUID = -2753101534110619540L;
1616

17-
public DuplicateValueException(Throwable t) {
17+
public UniqueConstraintViolationException(Throwable t) {
1818
super(t);
1919
}
2020

21-
public DuplicateValueException(String msg, Throwable t) {
21+
public UniqueConstraintViolationException(String msg, Throwable t) {
2222
super(msg, t);
2323
}
2424
}

fhir-database-utils/src/main/java/com/ibm/fhir/database/utils/common/CommonDatabaseAdapter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import java.util.logging.Logger;
1717
import java.util.stream.Collectors;
1818

19-
import com.ibm.fhir.database.utils.api.DuplicateValueException;
19+
import com.ibm.fhir.database.utils.api.UniqueConstraintViolationException;
2020
import com.ibm.fhir.database.utils.api.IConnectionProvider;
2121
import com.ibm.fhir.database.utils.api.IDatabaseAdapter;
2222
import com.ibm.fhir.database.utils.api.IDatabaseStatement;
@@ -345,7 +345,7 @@ public int allocateTenant(String adminSchemaName, String schemaName, String tena
345345
AddTenantDAO adder = new AddTenantDAO(adminSchemaName, tenantId, tenantName);
346346
runStatement(adder);
347347
}
348-
catch (DuplicateValueException x) {
348+
catch (UniqueConstraintViolationException x) {
349349
// Concurrent operation, so try again
350350
logger.info("Duplicate value, so try the next one");
351351
tenantId = 0;

fhir-database-utils/src/main/java/com/ibm/fhir/database/utils/db2/Db2Adapter.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.logging.Logger;
2121

2222
import com.ibm.fhir.database.utils.api.DataAccessException;
23+
import com.ibm.fhir.database.utils.api.DuplicateNameException;
2324
import com.ibm.fhir.database.utils.api.IConnectionProvider;
2425
import com.ibm.fhir.database.utils.api.IDatabaseTarget;
2526
import com.ibm.fhir.database.utils.api.ITransaction;
@@ -430,9 +431,17 @@ public boolean checkCompatibility(String adminSchema) {
430431

431432
@Override
432433
public void createFhirSchemas(String schemaName, String adminSchemaName) {
433-
String ddl = "CREATE SCHEMA " + schemaName;
434-
runStatement(ddl);
435-
ddl = "CREATE SCHEMA " + adminSchemaName;
436-
runStatement(ddl);
434+
try {
435+
String ddl = "CREATE SCHEMA " + schemaName;
436+
runStatement(ddl);
437+
} catch (DuplicateNameException e) {
438+
logger.log(Level.WARNING, "The schema '" + schemaName + "' already exists; proceed with caution.");
439+
}
440+
try {
441+
String ddl = "CREATE SCHEMA " + adminSchemaName;
442+
runStatement(ddl);
443+
} catch (DuplicateNameException e) {
444+
logger.log(Level.WARNING, "The schema '" + adminSchemaName + "' already exists; proceed with caution.");
445+
}
437446
}
438447
}

fhir-database-utils/src/main/java/com/ibm/fhir/database/utils/db2/Db2Translator.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
import com.ibm.fhir.database.utils.api.ConnectionDetails;
1313
import com.ibm.fhir.database.utils.api.ConnectionException;
1414
import com.ibm.fhir.database.utils.api.DataAccessException;
15-
import com.ibm.fhir.database.utils.api.DuplicateValueException;
15+
import com.ibm.fhir.database.utils.api.DuplicateNameException;
16+
import com.ibm.fhir.database.utils.api.UniqueConstraintViolationException;
1617
import com.ibm.fhir.database.utils.api.IDatabaseTranslator;
1718
import com.ibm.fhir.database.utils.api.LockException;
1819
import com.ibm.fhir.database.utils.api.UndefinedNameException;
@@ -49,6 +50,12 @@ public boolean isDuplicate(SQLException x) {
4950
return "23505".equals(x.getSQLState());
5051
}
5152

53+
@Override
54+
public boolean isAlreadyExists(SQLException x) {
55+
// SQL-Error: -601, SQL State 42710
56+
return "42710".equals(x.getSQLState());
57+
}
58+
5259
@Override
5360
public boolean isLockTimeout(SQLException x) {
5461
// lock timeout (not deadlock)
@@ -88,7 +95,10 @@ else if (isConnectionError(x)) {
8895
return new ConnectionException(x);
8996
}
9097
else if (isDuplicate(x)) {
91-
return new DuplicateValueException(x);
98+
return new UniqueConstraintViolationException(x);
99+
}
100+
else if (isAlreadyExists(x)) {
101+
return new DuplicateNameException(x);
92102
}
93103
else if (isUndefinedName(x)) {
94104
return new UndefinedNameException(x);
@@ -145,7 +155,7 @@ public String timestampDiff(String left, String right, String alias) {
145155
return String.format("timestampdiff(2, %s, %s)", left, right);
146156
}
147157
else {
148-
return String.format("timestampdiff(2, %s, %s) AS %s", left, right, alias);
158+
return String.format("timestampdiff(2, %s, %s) AS %s", left, right, alias);
149159
}
150160
}
151161

@@ -167,7 +177,7 @@ public String getDriverClassName() {
167177
@Override
168178
public String getUrl(Properties connectionProperties) {
169179
Db2PropertyAdapter adapter = new Db2PropertyAdapter(connectionProperties);
170-
return "jdbc:db2://" + adapter.getHost() + ":" + adapter.getPort() + "/" + adapter.getDatabase();
180+
return "jdbc:db2://" + adapter.getHost() + ":" + adapter.getPort() + "/" + adapter.getDatabase();
171181
}
172182

173183
@Override

0 commit comments

Comments
 (0)