You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@empire-db.apache.org by de...@apache.org on 2022/03/07 11:49:17 UTC

[empire-db] branch master updated: EMPIREDB-195 PostgreSQL Sequence Handling

This is an automated email from the ASF dual-hosted git repository.

derjan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/empire-db.git


The following commit(s) were added to refs/heads/master by this push:
     new c806898  EMPIREDB-195 PostgreSQL Sequence Handling
c806898 is described below

commit c80689836e131c1d3eee6c707937e86ee780313d
Author: Jan Glaubitz <ja...@glaubitz.org>
AuthorDate: Mon Mar 7 12:49:00 2022 +0100

    EMPIREDB-195 PostgreSQL Sequence Handling
---
 .../dbms/postgresql/DBMSHandlerPostgreSQL.java     | 77 ++++++++++------------
 1 file changed, 35 insertions(+), 42 deletions(-)

diff --git a/empire-db/src/main/java/org/apache/empire/dbms/postgresql/DBMSHandlerPostgreSQL.java b/empire-db/src/main/java/org/apache/empire/dbms/postgresql/DBMSHandlerPostgreSQL.java
index 396dfec..8fbc386 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/postgresql/DBMSHandlerPostgreSQL.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/postgresql/DBMSHandlerPostgreSQL.java
@@ -25,7 +25,6 @@ import java.util.GregorianCalendar;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.commons.StringUtils;
 import org.apache.empire.data.DataType;
 import org.apache.empire.db.DBColumn;
@@ -37,7 +36,6 @@ import org.apache.empire.db.DBObject;
 import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.DBTable;
 import org.apache.empire.db.DBTableColumn;
-import org.apache.empire.db.exceptions.QueryNoResultException;
 import org.apache.empire.db.expr.column.DBValueExpr;
 import org.apache.empire.dbms.DBMSFeature;
 import org.apache.empire.dbms.DBMSHandler;
@@ -269,23 +267,15 @@ public class DBMSHandlerPostgreSQL extends DBMSHandlerBase
     @Override
     public Object getNextSequenceValue(DBDatabase db, String seqName, int minValue, Connection conn)
     { 
-        // Use PostgreSQL Sequences
-        StringBuilder sql = new StringBuilder(80);
-        sql.append("SELECT nextval('");
-        db.appendQualifiedName(sql, seqName, null);
-        sql.append("')");
-        // Query next sequence value
-        String sqlCmd = sql.toString();
-        if (log.isDebugEnabled())
-            log.debug("Executing: " + sqlCmd);
-        Object val = querySingleValue(sqlCmd, null, DataType.UNKNOWN, conn);
-        if (ObjectUtils.isEmpty(val))
-        {   // Error!
-            log.error("getNextSequenceValue: Invalid sequence value for sequence " + seqName);
-            throw new QueryNoResultException(sqlCmd);
-        }
-        // Done
-        return val;
+		// Use PostgreSQL Sequences
+		String sqlCmd = "SELECT nextval(?)";
+		Object[] sqlParams = { seqName };
+		Object val = querySingleValue(sqlCmd, sqlParams, DataType.INTEGER, conn);
+		if (val == null)
+		{
+			log.error("getNextSequenceValue: Invalid sequence value for sequence " + seqName);
+		}
+		return val;
     }
 
     /**
@@ -296,12 +286,14 @@ public class DBMSHandlerPostgreSQL extends DBMSHandlerBase
     {
         String seqName = StringUtils.toString(column.getDefaultValue());
         if (StringUtils.isEmpty(seqName))
+        {
             throw new InvalidArgumentException("column", column);
+        }
         StringBuilder sql = new StringBuilder(80);
         sql.append("nextval('");
-        column.getDatabase().appendQualifiedName(sql, seqName, null);
+        column.getDatabase().appendQualifiedName(sql, seqName, false);
         sql.append("')");
-        return new DBValueExpr(column.getDatabase(), sql.toString(), DataType.UNKNOWN);
+        return new DBValueExpr(column.getDatabase(), sql.toString(), DataType.INTEGER);
     }
 
     /**
@@ -481,29 +473,30 @@ public class DBMSHandlerPostgreSQL extends DBMSHandlerBase
                 log.info("Initial sequence name for {} is {}", name, col.getDefaultValue());
             }
         }
-        // Query from database     
-        ResultSet rset = null;
-        try {
-            String sql = "SELECT column, seqname from ???";
-            rset = executeQuery(sql, null, false, conn);
-            while (rset.next())
-            {
-                String colName = rset.getString(1); // 1 = first column
-                String seqName = rset.getString(2); // 2 = second column
-                DBTableColumn col = identiyColumns.get(colName);
-                if (col!=null)
-                    col.setDefaultValue(seqName);  // set the sequence name
-                else
-                    log.warn("Table column {} not found.", colName);
-            }
+        // Query from database
+        if (conn == null)
+        {
+        	// no connection, no way to ask database
+        	return;
         }
-        catch (SQLException e)
-        {   // Don't know what to do
-            log.error("Failed to query Postgres Sequence names: "+e.getMessage(), e);
-        } finally {
-            if (rset!=null)
-                this.closeResultSet(rset);
+        for (DBTableColumn col : identiyColumns.values())
+        {
+        	String seqName = getSequenceName(col, conn);
+        	col.setDefaultValue(seqName);  // set the sequence name
         }
+
     }
     
+	private String getSequenceName(DBTableColumn column, Connection conn)
+	{
+		// Use find PostgreSQL auto-generated sequence
+		String sqlCmd = "SELECT pg_get_serial_sequence(?, ?)";
+		Object[] sqlParams = { column.getRowSet().getName().toLowerCase(), column.getName().toLowerCase() };
+		String seqName = StringUtils.toString(querySingleValue(sqlCmd, sqlParams, DataType.VARCHAR, conn));
+		if (seqName == null) { // Error!
+			log.error("getNextSequenceName: Invalid sequence value for column " + column.getName());
+		}
+		return seqName;
+	}
+    
 }