You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ag...@apache.org on 2017/10/26 19:57:47 UTC

[geode] branch feature/GEODE-3781 updated: Support for getting key column info from database.

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

agingade pushed a commit to branch feature/GEODE-3781
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/feature/GEODE-3781 by this push:
     new c9b89a2  Support for getting key column info from database.
c9b89a2 is described below

commit c9b89a25f3d970cda8867745da049ac371ebfe8c
Author: Anil <ag...@pivotal.io>
AuthorDate: Thu Oct 26 12:57:13 2017 -0700

    Support for getting key column info from database.
---
 .../geode/connectors/jdbc/JDBCAsyncWriter.java     |  8 ++-
 .../apache/geode/connectors/jdbc/JDBCManager.java  | 57 +++++++++++++++++++---
 .../jdbc/JDBCAsyncWriterIntegrationTest.java       | 30 +++++++++---
 3 files changed, 79 insertions(+), 16 deletions(-)

diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JDBCAsyncWriter.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JDBCAsyncWriter.java
index 97709cb..804301b 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JDBCAsyncWriter.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JDBCAsyncWriter.java
@@ -20,7 +20,9 @@ import java.util.Properties;
 import org.apache.geode.cache.asyncqueue.AsyncEvent;
 import org.apache.geode.cache.asyncqueue.AsyncEventListener;
 import org.apache.geode.cache.query.internal.DefaultQuery;
+import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.pdx.PdxInstance;
+import org.apache.logging.log4j.Logger;
 
 /*
  * This class provides write behind cache semantics for a JDBC data source using AsyncEventListener.
@@ -29,6 +31,8 @@ import org.apache.geode.pdx.PdxInstance;
  */
 public class JDBCAsyncWriter implements AsyncEventListener {
 
+  static final Logger logger = LogService.getLogger();
+
   private long totalEvents = 0;
 
   private long successfulEvents = 0;
@@ -55,8 +59,8 @@ public class JDBCAsyncWriter implements AsyncEventListener {
           this.manager.write(event.getRegion(), event.getOperation(), event.getKey(), value);
           successfulEvents += 1;
         } catch (RuntimeException ex) {
-          // TODO: need to log exceptions here
-          throw ex;
+          // TODO improve the following logging
+          logger.error("Exception processing event " + event, ex);
         }
       }
     } finally {
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JDBCManager.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JDBCManager.java
index d9a64f6..86980e0 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JDBCManager.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JDBCManager.java
@@ -19,14 +19,11 @@ import java.sql.DatabaseMetaData;
 import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
-import java.sql.Statement;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
@@ -197,6 +194,7 @@ public class JDBCManager {
     // }
     // });
     String query = getQueryString(tableName, columnList, operation);
+    System.out.println("query=" + query);
     Connection con = getConnection();
     try {
       return con.prepareStatement(query);
@@ -221,7 +219,7 @@ public class JDBCManager {
         continue;
       }
       String columnName = mapFieldNameToColumnName(fieldName, tableName);
-      if (columnName.equals(keyColumnName)) {
+      if (columnName.equalsIgnoreCase(keyColumnName)) {
         continue;
       }
       Object columnValue = value.getField(fieldName);
@@ -251,16 +249,31 @@ public class JDBCManager {
       Connection con = getConnection();
       try {
         DatabaseMetaData metaData = con.getMetaData();
-        ResultSet primaryKeys = metaData.getPrimaryKeys(null, null, k);
+        ResultSet tablesRS = metaData.getTables(null, null, "%", null);
+        String realTableName = null;
+        while (tablesRS.next()) {
+          String name = tablesRS.getString("TABLE_NAME");
+          if (name.equalsIgnoreCase(k)) {
+            if (realTableName != null) {
+              throw new IllegalStateException("Duplicate tables that match region name");
+            }
+            realTableName = name;
+          }
+        }
+        if (realTableName == null) {
+          throw new IllegalStateException("no table was found that matches " + k);
+        }
+        ResultSet primaryKeys = metaData.getPrimaryKeys(null, null, realTableName);
         if (!primaryKeys.next()) {
           throw new IllegalStateException(
               "The table " + k + " does not have a primary key column.");
         }
-        if (!primaryKeys.isLast()) {
+        String key = primaryKeys.getString("COLUMN_NAME");
+        if (primaryKeys.next()) {
           throw new IllegalStateException(
               "The table " + k + " has more than one primary key column.");
         }
-        return primaryKeys.getString("COLUMN_NAME");
+        return key;
       } catch (SQLException e) {
         handleSQLException(e);
         return null; // never reached
@@ -276,4 +289,32 @@ public class JDBCManager {
     // TODO: check config for mapping
     return region.getName();
   }
+
+  private void printResultSet(ResultSet rs) {
+    System.out.println("Printing ResultSet:");
+    try {
+      int size = 0;
+      ResultSetMetaData rsmd = rs.getMetaData();
+      int columnsNumber = rsmd.getColumnCount();
+      while (rs.next()) {
+        size++;
+        for (int i = 1; i <= columnsNumber; i++) {
+          if (i > 1)
+            System.out.print(",  ");
+          String columnValue = rs.getString(i);
+          System.out.print(rsmd.getColumnName(i) + ": " + columnValue);
+        }
+        System.out.println("");
+      }
+      System.out.println("size=" + size);
+    } catch (SQLException ex) {
+      System.out.println("Exception while printing result set" + ex);
+    } finally {
+      try {
+        rs.beforeFirst();
+      } catch (SQLException e) {
+        System.out.println("Exception while calling beforeFirst" + e);
+      }
+    }
+  }
 }
diff --git a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JDBCAsyncWriterIntegrationTest.java b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JDBCAsyncWriterIntegrationTest.java
index 2152ad9..88ef4b9 100644
--- a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JDBCAsyncWriterIntegrationTest.java
+++ b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JDBCAsyncWriterIntegrationTest.java
@@ -17,11 +17,7 @@ package org.apache.geode.connectors.jdbc;
 import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
 import static org.assertj.core.api.Assertions.*;
 
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
-import java.sql.Statement;
+import java.sql.*;
 import java.util.Properties;
 import java.util.concurrent.TimeUnit;
 
@@ -85,7 +81,7 @@ public class JDBCAsyncWriterIntegrationTest {
     conn = DriverManager.getConnection(connectionURL);
     stmt = conn.createStatement();
     stmt.execute("Create Table " + regionTableName
-        + " (id varchar(10) primary key, name varchar(10), age int)");
+        + " (id varchar(10) primary key not null, name varchar(10), age int)");
   }
 
   public void closeDB() throws Exception {
@@ -108,6 +104,28 @@ public class JDBCAsyncWriterIntegrationTest {
   }
 
   @Test
+  public void canExecuteSQLOnDataBase() throws Exception {
+    stmt.execute("Insert into " + regionTableName + " values ('1', 'emp1', 10)");
+    stmt.execute("Select * from " + regionTableName);
+    DatabaseMetaData metaData = conn.getMetaData();
+    ResultSet tablesRS = metaData.getTables(null, null, "%", null);
+    String realTableName = null;
+    while (tablesRS.next()) {
+      String name = tablesRS.getString("TABLE_NAME");
+      if (name.equalsIgnoreCase(this.regionTableName)) {
+        if (realTableName != null) {
+          throw new IllegalStateException("Duplicate tables that match region name");
+        }
+        realTableName = name;
+      }
+    }
+    if (realTableName == null) {
+      throw new IllegalStateException("no table was found that matches " + regionTableName);
+    }
+    ResultSet primaryKeys = metaData.getPrimaryKeys(null, null, realTableName);
+  }
+
+  @Test
   public void canInstallJDBCAsyncWriterOnRegion() {
     Region employees = createRegionWithJDBCAsyncWriter(regionTableName, getRequiredProperties());
     PdxInstance pdx1 = cache.createPdxInstanceFactory("Employee").writeString("name", "Emp1")

-- 
To stop receiving notification emails like this one, please contact
['"commits@geode.apache.org" <co...@geode.apache.org>'].