This is an automated email from the ASF dual-hosted git repository.
stariy95 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git
The following commit(s) were added to refs/heads/master by this push:
new a4dd27097 CAY-2992 dbimport: support posgres drivers newer than 42.7.4
a4dd27097 is described below
commit a4dd27097f11a6200ca269f06167e6dbbae4344e
Author: ntimofeev <[email protected]>
AuthorDate: Wed Aug 19 16:02:53 2026 +0300
CAY-2992 dbimport: support posgres drivers newer than 42.7.4
---
RELEASE-NOTES.txt | 1 +
.../cayenne/dbsync/reverse/dbload/DbLoader.java | 16 +++
.../dbsync/reverse/dbload/DbLoaderTest.java | 139 +++++++++++++++++++++
.../dbsync/reverse/dbload/ExportedKeyLoaderIT.java | 12 +-
pom.xml | 2 +-
5 files changed, 160 insertions(+), 10 deletions(-)
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index e77def223..c302b95fd 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -37,6 +37,7 @@ CAY-2985 DataDomain init and structure cleanup
CAY-2986 Cgen to run unconditionally
CAY-2987 DataNode to own PkGenerator
CAY-2989 Upgrade MCP SDK to 2.0
+CAY-2992 dbimport: support posgres drivers newer than 42.7.4
Bug Fixes:
diff --git
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoader.java
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoader.java
index 90e53eef4..f352a81bc 100644
---
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoader.java
+++
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoader.java
@@ -21,6 +21,8 @@ package org.apache.cayenne.dbsync.reverse.dbload;
import org.apache.cayenne.dba.DbAdapter;
import org.apache.cayenne.dbsync.naming.ObjectNameGenerator;
import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.Procedure;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
@@ -82,9 +84,23 @@ public class DbLoader {
for(AbstractLoader loader : loaders) {
loader.load(metaData, loadedData);
}
+
+ if (!adapter.supportsCatalogsOnReverseEngineering()) {
+ stripCatalogs(loadedData);
+ }
+
return loadedData;
}
+ static void stripCatalogs(DataMap map) {
+ for (DbEntity entity : map.getDbEntities()) {
+ entity.setCatalog(null);
+ }
+ for (Procedure procedure : map.getProcedures()) {
+ procedure.setCatalog(null);
+ }
+ }
+
//// Utility methods that better be moved somewhere ////
/**
diff --git
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoaderTest.java
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoaderTest.java
new file mode 100644
index 000000000..fa7f15be6
--- /dev/null
+++
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoaderTest.java
@@ -0,0 +1,139 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cayenne.dbsync.reverse.dbload;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
+import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
+import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
+import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.Procedure;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.*;
+
+public class DbLoaderTest {
+
+ private static final String CATALOG = "test_catalog";
+ private static final String SCHEMA = "test_schema";
+ private static final String TABLE = "ARTIST";
+ private static final String PROCEDURE = "TEST_PROCEDURE";
+
+ @Test
+ public void loadWithoutCatalogs() throws SQLException {
+ DataMap map = load(false);
+
+ assertEquals(1, map.getDbEntities().size());
+ assertEquals(1, map.getProcedures().size());
+
+ DbEntity entity = map.getDbEntity(TABLE);
+ assertNotNull(entity);
+ assertNull(entity.getCatalog());
+ assertEquals(SCHEMA, entity.getSchema());
+
+ Procedure procedure = map.getProcedure(PROCEDURE);
+ assertNotNull(procedure);
+ assertNull(procedure.getCatalog());
+ assertEquals(SCHEMA, procedure.getSchema());
+ }
+
+ @Test
+ public void loadWithCatalogs() throws SQLException {
+ DataMap map = load(true);
+
+ assertEquals(1, map.getDbEntities().size());
+ assertEquals(1, map.getProcedures().size());
+
+ DbEntity entity = map.getDbEntity(TABLE);
+ assertNotNull(entity);
+ assertEquals(CATALOG, entity.getCatalog());
+ assertEquals(SCHEMA, entity.getSchema());
+
+ Procedure procedure = map.getProcedure(PROCEDURE);
+ assertNotNull(procedure);
+ assertEquals(CATALOG, procedure.getCatalog());
+ assertEquals(SCHEMA, procedure.getSchema());
+ }
+
+ private DataMap load(boolean supportsCatalogs) throws SQLException {
+ DbAdapter adapter = mock(DbAdapter.class);
+
+ when(adapter.tableTypeForTable()).thenReturn("TABLE");
+ when(adapter.tableTypeForView()).thenReturn("VIEW");
+
when(adapter.supportsCatalogsOnReverseEngineering()).thenReturn(supportsCatalogs);
+
+ ResultSet tables = tablesResultSet();
+ ResultSet procedures = proceduresResultSet();
+ ResultSet columns = emptyResultSet();
+ ResultSet primaryKeys = emptyResultSet();
+ ResultSet exportedKeys = emptyResultSet();
+ ResultSet procedureColumns = emptyResultSet();
+
+ DatabaseMetaData metaData = mock(DatabaseMetaData.class);
+ when(metaData.getTables(any(), any(), any(),
any())).thenReturn(tables);
+ when(metaData.getColumns(any(), any(), any(),
any())).thenReturn(columns);
+ when(metaData.getPrimaryKeys(any(), any(),
any())).thenReturn(primaryKeys);
+ when(metaData.getExportedKeys(any(), any(),
any())).thenReturn(exportedKeys);
+ when(metaData.getProcedures(any(), any(),
any())).thenReturn(procedures);
+ when(metaData.getProcedureColumns(any(), any(), any(),
any())).thenReturn(procedureColumns);
+
+ Connection connection = mock(Connection.class);
+ when(connection.getMetaData()).thenReturn(metaData);
+
+ DbLoaderConfiguration config = new DbLoaderConfiguration();
+ config.setFiltersConfig(FiltersConfig.create(null, null,
TableFilter.everything(),
+ new PatternFilter().include(".*")));
+
+ return new DbLoader(adapter, connection, config, null, new
DefaultObjectNameGenerator()).load();
+ }
+
+ private static ResultSet tablesResultSet() throws SQLException {
+ ResultSet rs = mock(ResultSet.class);
+ when(rs.next()).thenReturn(true, false);
+ when(rs.getString("TABLE_NAME")).thenReturn(TABLE);
+ when(rs.getString("TABLE_CAT")).thenReturn(CATALOG);
+ when(rs.getString("TABLE_SCHEM")).thenReturn(SCHEMA);
+ when(rs.getString("TABLE_TYPE")).thenReturn("TABLE");
+ return rs;
+ }
+
+ private static ResultSet proceduresResultSet() throws SQLException {
+ ResultSet rs = mock(ResultSet.class);
+ when(rs.next()).thenReturn(true, false);
+ when(rs.getString("PROCEDURE_NAME")).thenReturn(PROCEDURE);
+ when(rs.getString("PROCEDURE_CAT")).thenReturn(CATALOG);
+ when(rs.getString("PROCEDURE_SCHEM")).thenReturn(SCHEMA);
+ when(rs.getShort("PROCEDURE_TYPE")).thenReturn((short)
DatabaseMetaData.procedureNoResult);
+ return rs;
+ }
+
+ private static ResultSet emptyResultSet() {
+ return mock(ResultSet.class);
+ }
+}
diff --git
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/ExportedKeyLoaderIT.java
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/ExportedKeyLoaderIT.java
index 7f2d188c0..22aa3664e 100644
---
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/ExportedKeyLoaderIT.java
+++
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/ExportedKeyLoaderIT.java
@@ -46,25 +46,19 @@ public class ExportedKeyLoaderIT extends BaseLoaderIT {
String schema = connection.getSchema();
DbEntity artist = getDbEntity("ARTIST");
- if(adapter.supportsCatalogsOnReverseEngineering()) {
- artist.setCatalog(catalog);
- }
+ artist.setCatalog(catalog);
artist.setSchema(schema);
DbAttribute artistId = new DbAttribute("ARTIST_ID");
artist.addAttribute(artistId);
DbEntity gallery = getDbEntity("GALLERY");
- if(adapter.supportsCatalogsOnReverseEngineering()) {
- gallery.setCatalog(catalog);
- }
+ gallery.setCatalog(catalog);
gallery.setSchema(schema);
DbAttribute galleryId = new DbAttribute("GALLERY_ID");
gallery.addAttribute(galleryId);
DbEntity painting = getDbEntity("PAINTING");
- if(adapter.supportsCatalogsOnReverseEngineering()) {
- painting.setCatalog(catalog);
- }
+ painting.setCatalog(catalog);
painting.setSchema(schema);
DbAttribute paintingId = new DbAttribute("PAINTING_ID");
DbAttribute paintingArtistId = new DbAttribute("ARTIST_ID");
diff --git a/pom.xml b/pom.xml
index 825c31887..7a5f1e002 100644
--- a/pom.xml
+++ b/pom.xml
@@ -65,7 +65,7 @@
<mssql.jdbc.version>12.10.2.jre11</mssql.jdbc.version>
<mysql.connector.version>9.5.0</mysql.connector.version>
<ojdbc.version>21.8.0.0</ojdbc.version>
- <postgres.jdbc.version>42.7.2</postgres.jdbc.version>
+ <postgres.jdbc.version>42.7.13</postgres.jdbc.version>
<sqlite.jdbc.version>3.46.0.1</sqlite.jdbc.version>
<sybase.driver.version>12</sybase.driver.version>