Repository: trafodion
Updated Branches:
  refs/heads/master dd184e01d -> 923f0a919


[TRAFODION-3250] optimize get/set schema


Project: http://git-wip-us.apache.org/repos/asf/trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafodion/commit/018f5efb
Tree: http://git-wip-us.apache.org/repos/asf/trafodion/tree/018f5efb
Diff: http://git-wip-us.apache.org/repos/asf/trafodion/diff/018f5efb

Branch: refs/heads/master
Commit: 018f5efbd234ca7b1fe1fadada21c58db1d64c3e
Parents: 7e94e79
Author: Aven <shengchen...@esgyn.cn>
Authored: Fri Dec 21 01:02:16 2018 +0800
Committer: Aven <shengchen...@esgyn.cn>
Committed: Fri Dec 21 01:02:16 2018 +0800

----------------------------------------------------------------------
 .../jdbc/t4/CONNECTION_CONTEXT_def.java         |  10 +-
 .../trafodion/jdbc/t4/InterfaceConnection.java  |  38 +++++--
 .../trafodion/jdbc/t4/InterfaceStatement.java   |  29 ++++-
 .../jdbc/t4/OUT_CONNECTION_CONTEXT_def.java     |  10 +-
 .../org/trafodion/jdbc/t4/TrafT4Connection.java | 113 ++++++-------------
 5 files changed, 110 insertions(+), 90 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafodion/blob/018f5efb/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/CONNECTION_CONTEXT_def.java
----------------------------------------------------------------------
diff --git 
a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/CONNECTION_CONTEXT_def.java
 
b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/CONNECTION_CONTEXT_def.java
index 9f5c0ed..f8e9701 100644
--- 
a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/CONNECTION_CONTEXT_def.java
+++ 
b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/CONNECTION_CONTEXT_def.java
@@ -27,7 +27,7 @@ import java.nio.charset.UnsupportedCharsetException;
 class CONNECTION_CONTEXT_def {
        String datasource = "";
        String catalog = "";
-       String schema = "";
+    private String schema = "";
        String location = "";
        String userRole = "";
 
@@ -147,4 +147,12 @@ class CONNECTION_CONTEXT_def {
 
                clientVersionList.insertIntoByteArray(buf);
        }
+
+    public String getSchema() {
+        return schema;
+    }
+
+    public void setSchema(String schema) {
+        this.schema = schema;
+    }
 }

http://git-wip-us.apache.org/repos/asf/trafodion/blob/018f5efb/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceConnection.java
----------------------------------------------------------------------
diff --git 
a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceConnection.java 
b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceConnection.java
index 6cd0601..d23d615 100644
--- 
a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceConnection.java
+++ 
b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceConnection.java
@@ -96,6 +96,7 @@ class InterfaceConnection {
        static final short SQL_ATTR_ACCESS_MODE = 101;
        static final short SQL_ATTR_AUTOCOMMIT = 102;
        static final short SQL_TXN_ISOLATION = 108;
+       static final short SET_SCHEMA = 1001; // this value is follow server 
side definition
 
        // spj proxy syntax support
        static final short SPJ_ENABLE_PROXY = 1040;
@@ -217,7 +218,7 @@ class InterfaceConnection {
        private CONNECTION_CONTEXT_def getInContext(T4Properties t4props) {
                inContext = new CONNECTION_CONTEXT_def();
                inContext.catalog = t4props.getCatalog();
-               inContext.schema = t4props.getSchema();
+        inContext.setSchema(t4props.getSchema());
                inContext.datasource = t4props.getServerDataSource();
                inContext.userRole = t4props.getRoleName();
                inContext.cpuToUse = t4props.getCpuToUse();
@@ -417,13 +418,34 @@ class InterfaceConnection {
                return userDesc.userName;
        }
 
-       String getSchema() {
-               if (outContext != null) {
-                       return outContext.schema;
-               } else {
-                       return inContext.schema;
-               }
-       }
+    String getSchema() {
+        if (outContext != null) {
+            return outContext.getSchema();
+        } else {
+            return inContext.getSchema();
+        }
+    }
+
+    void setSchemaDirect(String schema) {
+        outContext.setSchema(schema);
+    }
+    void setSchema(TrafT4Connection conn, String schema) throws SQLException {
+        if (t4props_.t4Logger_.isLoggable(Level.FINEST) == true) {
+            Object p[] = T4LoggingUtilities.makeParams(conn.props_, schema);
+            String temp = "Setting connection schema = " + schema;
+            t4props_.t4Logger_.logp(Level.FINEST, "InterfaceConnection", 
"setSchema", temp, p);
+        }
+        if (schema == null || schema.length() == 0) {
+            return;
+        }
+        setConnectionAttr(conn, SET_SCHEMA, 0, schema);
+        setSchemaDirect(schema);
+        if (t4props_.t4Logger_.isLoggable(Level.FINEST) == true) {
+            Object p[] = T4LoggingUtilities.makeParams(conn.props_, schema);
+            String temp = "Setting connection schema = " + schema + " is 
done.";
+            t4props_.t4Logger_.logp(Level.FINEST, "InterfaceConnection", 
"setSchema", temp, p);
+        }
+    }
 
        void setLocale(Locale locale) {
                this.locale = locale;

http://git-wip-us.apache.org/repos/asf/trafodion/blob/018f5efb/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceStatement.java
----------------------------------------------------------------------
diff --git 
a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceStatement.java 
b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceStatement.java
index f5958de..d9d7c2c 100644
--- 
a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceStatement.java
+++ 
b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceStatement.java
@@ -33,6 +33,8 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Locale;
 import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 class InterfaceStatement {
        InterfaceConnection ic_;
@@ -1403,8 +1405,9 @@ class InterfaceStatement {
            else if (er.returnCode == TRANSPORT.SQL_SUCCESS || er.returnCode == 
TRANSPORT.SQL_SUCCESS_WITH_INFO
                                || er.returnCode == TRANSPORT.NO_DATA_FOUND) {
                        Arrays.fill(stmt.batchRowCount_, -2); // fill with 
success
-                       if (er.errorList != null) // if we had errors with 
valid rowIds,
-                       // update the array
+
+                       // if we had errors with valid rowIds, update the array
+                       if (er.errorList != null)
                        {
                                for (int i = 0; i < er.errorList.length; i++) {
                                        int row = er.errorList[i].rowId - 1;
@@ -1414,7 +1417,15 @@ class InterfaceStatement {
                                        }
                                }
                        }
-                       
+
+            // Sometimes users may set schema through stmt.exec("set schema 
xx") instead of
+            // conn.setSchema("xx"), so there need to update local schema when 
it success
+            if (this.sqlQueryType_ == TRANSPORT.SQL_SET_SCHEMA) {
+                String schema = extractSchema(sqlString);
+                System.out.println("extract schema : "+schema);
+                ic_.setSchemaDirect(schema);
+            }
+
                        //set the statement mode as the command succeeded
                        if (sqlStmtType_ == TRANSPORT.TYPE_QS_OPEN) {
                                this.ic_.setMode(InterfaceConnection.MODE_WMS);
@@ -1492,7 +1503,17 @@ class InterfaceStatement {
            }
        }
 
-       protected void setTransactionStatus(TrafT4Connection conn, String sql) {
+    private String extractSchema(String sqlString) {
+        String schemaRegex = 
"(SET)\\s+(SCHEMA)\\s+([a-zA-Z0-9]+\\s*\\.)\\s*([a-zA-Z0-9]+)\\s*";
+        Pattern pattern = Pattern.compile(schemaRegex);
+        Matcher m = pattern.matcher(sqlString.toUpperCase());
+        while (m.find()) {
+            return m.group(m.groupCount());
+        }
+        return "";
+    }
+
+    protected void setTransactionStatus(TrafT4Connection conn, String sql) {
                short tranStatus = getTransactionStatus(sql);
                if(tranStatus == TRANSPORT.TYPE_BEGIN_TRANSACTION){
                        conn.setBeginTransaction(true);

http://git-wip-us.apache.org/repos/asf/trafodion/blob/018f5efb/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/OUT_CONNECTION_CONTEXT_def.java
----------------------------------------------------------------------
diff --git 
a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/OUT_CONNECTION_CONTEXT_def.java
 
b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/OUT_CONNECTION_CONTEXT_def.java
index b7b07dc..5ad2aae 100644
--- 
a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/OUT_CONNECTION_CONTEXT_def.java
+++ 
b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/OUT_CONNECTION_CONTEXT_def.java
@@ -38,7 +38,7 @@ class OUT_CONNECTION_CONTEXT_def {
 
        String computerName;
        String catalog;
-       String schema;
+    private String schema;
 
        int optionFlags1;
        int optionFlags2;
@@ -94,4 +94,12 @@ class OUT_CONNECTION_CONTEXT_def {
                        }
                }
        }
+
+    public String getSchema() {
+        return schema;
+    }
+
+    public void setSchema(String schema) {
+        this.schema = schema;
+    }
 }

http://git-wip-us.apache.org/repos/asf/trafodion/blob/018f5efb/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4Connection.java
----------------------------------------------------------------------
diff --git 
a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4Connection.java 
b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4Connection.java
index ce7c980..bae5a37 100644
--- a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4Connection.java
+++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4Connection.java
@@ -258,35 +258,16 @@ public class TrafT4Connection extends 
PreparedStatementManager implements java.s
                return ic_.getCatalog();
        }
 
-       public String getSchema() throws SQLException {
-               if (props_.t4Logger_.isLoggable(Level.FINE) == true) {
-                       Object p[] = T4LoggingUtilities.makeParams(props_);
-                       props_.t4Logger_.logp(Level.FINE, "TrafT4Connection", 
"getSchema", "", p);
-               }
-               
-               Statement s = null;
-               ResultSet rs = null;
-               String sch = null;
-               
-               try {
-                       s = this.createStatement();
-                       rs = s.executeQuery("SHOWCONTROL DEFAULT SCHEMA, match 
full, no header");
-                       rs.next();
-                       sch = rs.getString(1);
-                       if(sch.charAt(0) != '\"' && sch.indexOf('.') != -1) {
-                               sch = sch.substring(sch.indexOf('.') + 1);
-                       }
-               }catch(SQLException e) {
-                       sch = ic_.getSchema();
-               }finally {
-                       if(rs != null)
-                               rs.close();
-                       if(s != null)
-                               s.close();
-               }
-               
-               return sch;
-       }
+    public String getSchema() throws SQLException {
+        if (props_.t4Logger_.isLoggable(Level.FINE) == true) {
+            Object p[] = T4LoggingUtilities.makeParams(props_);
+            props_.t4Logger_.logp(Level.FINE, "TrafT4Connection", "getSchema", 
"", p);
+        }
+
+        validateConnection();
+
+        return ic_.getSchema();
+    }
 
        public int getHoldability() throws SQLException {
                if (props_.t4Logger_.isLoggable(Level.FINE) == true) {
@@ -1922,54 +1903,34 @@ public class TrafT4Connection extends 
PreparedStatementManager implements java.s
                return null;
        }
 
-       public void setSchema(String schema) throws SQLException {
-            if (props_.t4Logger_.isLoggable(Level.FINE) == true) {
-                Object p[] = T4LoggingUtilities.makeParams(props_, schema);
-                props_.t4Logger_.logp(Level.FINE, "TrafT4Connection", 
"setSchema", "", p);
-            }
-            if (props_.getLogWriter() != null) {
-                LogRecord lr = new LogRecord(Level.FINE, "");
-                Object p[] = T4LoggingUtilities.makeParams(props_, schema);
-                lr.setParameters(p);
-                lr.setSourceClassName("TrafT4Connection");
-                lr.setSourceMethodName("setSchema");
-                T4LogFormatter lf = new T4LogFormatter();
-                String temp = lf.format(lr);
-                props_.getLogWriter().println(temp);
+    public void setSchema(String schema) throws SQLException {
+        if (props_.t4Logger_.isLoggable(Level.FINE) == true) {
+            Object p[] = T4LoggingUtilities.makeParams(props_, schema);
+            props_.t4Logger_.logp(Level.FINE, "TrafT4Connection", "setSchema", 
"", p);
+        }
+        if (props_.getLogWriter() != null) {
+            LogRecord lr = new LogRecord(Level.FINE, "");
+            Object p[] = T4LoggingUtilities.makeParams(props_, schema);
+            lr.setParameters(p);
+            lr.setSourceClassName("TrafT4Connection");
+            lr.setSourceMethodName("setSchema");
+            T4LogFormatter lf = new T4LogFormatter();
+            String temp = lf.format(lr);
+            props_.getLogWriter().println(temp);
+        }
+        clearWarnings();
+        if (_isClosed() == true) {
+            throw TrafT4Messages.createSQLException(props_, null, 
"invalid_connection", null);
+        }
+        if (schema != null) {
+            try {
+                ic_.setSchema(this, schema);
+            } catch (TrafT4Exception se) {
+                performConnectionErrorChecks(se);
+                throw se;
             }
-            clearWarnings();
-            if (_isClosed() == true) {
-                throw TrafT4Messages.createSQLException(props_, null, 
"invalid_connection", null);
-            }
-            if (schema != null && !"".equals(schema)) {
-                Statement stmt = null;
-                try {
-                    stmt = createStatement();
-                    stmt.execute("set schema " + schema);
-                } catch (TrafT4Exception se) {
-                    performConnectionErrorChecks(se);
-                    throw se;
-                } finally {
-                    if (stmt != null) {
-                        try {
-                            stmt.close();
-                        } catch (Exception e) {
-                            if (props_.getLogWriter() != null) {
-                                LogRecord lr = new LogRecord(Level.WARNING, 
"");
-                                Object p[] = 
T4LoggingUtilities.makeParams(props_, e.getMessage());
-                                lr.setParameters(p);
-                                lr.setSourceClassName("TrafT4Connection");
-                                lr.setSourceMethodName("setSchema");
-                                T4LogFormatter lf = new T4LogFormatter();
-                                String temp = lf.format(lr);
-                                props_.getLogWriter().println(temp);
-                            }
-                        }
-                    }
-                }
-            }
-
-       }
+        }
+    }
 
        public void abort(Executor executor) throws SQLException {
                if (ic_.getT4Connection().getInputOutput() != null) {

Reply via email to