From d57c61959c5e5b661892ae6f65cfdefbac671ecb Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Mon, 14 Dec 2009 04:34:16 +0000 Subject: [PATCH] https://sourceforge.net/tracker/?func=detail&aid=2913965&group_id=176962&atid=879335 - add api to support the use of database specific paging feature to return a subset of the query result. --- .../org/compiere/db/AdempiereDatabase.java | 17 +++++++- base/src/org/compiere/db/DB_Oracle.java | 8 ++++ base/src/org/compiere/db/DB_PostgreSQL.java | 41 +++++++++---------- .../compiere/dbPort/Convert_PostgreSQL.java | 2 + 4 files changed, 46 insertions(+), 22 deletions(-) diff --git a/base/src/org/compiere/db/AdempiereDatabase.java b/base/src/org/compiere/db/AdempiereDatabase.java index 3ac3e42228..7acc0ae848 100644 --- a/base/src/org/compiere/db/AdempiereDatabase.java +++ b/base/src/org/compiere/db/AdempiereDatabase.java @@ -301,6 +301,21 @@ public interface AdempiereDatabase * Default sql use to test whether a connection is still valid */ public final static String DEFAULT_CONN_TEST_SQL = "SELECT Version FROM AD_System"; - + + /** + * Is the database have sql extension that return a subset of the query result + * @return boolean + */ + public boolean isPagingSupported(); + + /** + * modify sql to return a subset of the query result + * @param sql + * @param start + * @param end + * @return + */ + public String addPagingSQL(String sql, int start, int end); + } // AdempiereDatabase diff --git a/base/src/org/compiere/db/DB_Oracle.java b/base/src/org/compiere/db/DB_Oracle.java index 153bdfdb82..ce62e17424 100644 --- a/base/src/org/compiere/db/DB_Oracle.java +++ b/base/src/org/compiere/db/DB_Oracle.java @@ -1108,6 +1108,14 @@ public class DB_Oracle implements AdempiereDatabase public boolean isQueryTimeoutSupported() { return true; } + + public String addPagingSQL(String sql, int start, int end) { + String newSql = "SELECT * FROM (" + sql + ") WHERE ROWNUM BETWEEN " + start + " AND " + end; + return newSql; + } + public boolean isPagingSupported() { + return true; + } } // DB_Oracle diff --git a/base/src/org/compiere/db/DB_PostgreSQL.java b/base/src/org/compiere/db/DB_PostgreSQL.java index c55fa7e0ec..f7f3b086c5 100755 --- a/base/src/org/compiere/db/DB_PostgreSQL.java +++ b/base/src/org/compiere/db/DB_PostgreSQL.java @@ -84,16 +84,17 @@ public class DB_PostgreSQL implements AdempiereDatabase /** Cached Database Name */ private String m_dbName = null; - private String m_userName = null; - /** Connection String */ + private String m_userName = null; + + /** Connection String */ private String m_connectionURL; - private boolean m_supportAlias = false; - /** Logger */ private static CLogger log = CLogger.getCLogger (DB_PostgreSQL.class); - private static int m_maxbusyconnections = 0; + private static int m_maxbusyconnections = 0; + + public static final String NATIVE_MARKER = "NATIVE_"+Database.DB_POSTGRESQL+"_KEYWORK"; /** * Get Database Name @@ -791,21 +792,19 @@ public class DB_PostgreSQL implements AdempiereDatabase return false; } + /** + * Implemented using the limit and offset feature. use 1 base index for start and end parameter + * @param sql + * @param start + * @param end + */ + public String addPagingSQL(String sql, int start, int end) { + String newSql = sql + " " + NATIVE_MARKER + "LIMIT " + ( end - start + 1 ) + + " " + NATIVE_MARKER + "OFFSET " + (start - 1); + return newSql; + } - - /* - public boolean getSupportAlias() - { - - if (s_driver == null) - { - s_driver = new org.postgresql.Driver(); - if(s_driver.getVersion().indexOf("PostgreSQL 8.2") != -1) - return true; - - } - return false; - - }*/ - + public boolean isPagingSupported() { + return true; + } } // DB_PostgreSQL diff --git a/base/src/org/compiere/dbPort/Convert_PostgreSQL.java b/base/src/org/compiere/dbPort/Convert_PostgreSQL.java index dfdf9783b8..df186ba804 100644 --- a/base/src/org/compiere/dbPort/Convert_PostgreSQL.java +++ b/base/src/org/compiere/dbPort/Convert_PostgreSQL.java @@ -22,6 +22,7 @@ import java.util.Vector; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.compiere.db.DB_PostgreSQL; import org.compiere.model.MSysConfig; import org.compiere.util.CLogger; import org.compiere.util.DB; @@ -107,6 +108,7 @@ public class Convert_PostgreSQL extends Convert_SQL92 { String statement = replaceQuotedStrings(sqlStatement, retVars); statement = convertWithConvertMap(statement); + statement = statement.replace(DB_PostgreSQL.NATIVE_MARKER, ""); String cmpString = statement.toUpperCase(); boolean isCreate = cmpString.startsWith("CREATE ");