diff --git a/appengine-java8/postgres/README.md b/appengine-java8/cloudsql-postgres/README.md similarity index 95% rename from appengine-java8/postgres/README.md rename to appengine-java8/cloudsql-postgres/README.md index a787ceeff18..82588983f11 100644 --- a/appengine-java8/postgres/README.md +++ b/appengine-java8/cloudsql-postgres/README.md @@ -1,6 +1,6 @@ # Postgre SQL sample for Google App Engine J8 - + Open in Cloud Shell This sample demonstrates how to use [PostgreSql](https://cloud.google.com/sql/) on Google App diff --git a/appengine-java8/postgres/pom.xml b/appengine-java8/cloudsql-postgres/pom.xml similarity index 97% rename from appengine-java8/postgres/pom.xml rename to appengine-java8/cloudsql-postgres/pom.xml index 40d16e2af3a..b9a0eaea38a 100644 --- a/appengine-java8/postgres/pom.xml +++ b/appengine-java8/cloudsql-postgres/pom.xml @@ -48,7 +48,6 @@ - com.google.appengine appengine-api-1.0-sdk diff --git a/appengine-java8/postgres/src/main/java/com/example/appengine/postgresql/PostgreSqlServlet.java b/appengine-java8/cloudsql-postgres/src/main/java/com/example/appengine/postgresql/PostgreSqlServlet.java similarity index 58% rename from appengine-java8/postgres/src/main/java/com/example/appengine/postgresql/PostgreSqlServlet.java rename to appengine-java8/cloudsql-postgres/src/main/java/com/example/appengine/postgresql/PostgreSqlServlet.java index ba2ac4442ff..430c0894c76 100644 --- a/appengine-java8/postgres/src/main/java/com/example/appengine/postgresql/PostgreSqlServlet.java +++ b/appengine-java8/cloudsql-postgres/src/main/java/com/example/appengine/postgresql/PostgreSqlServlet.java @@ -17,12 +17,8 @@ package com.example.appengine.postgresql; import com.google.common.base.Stopwatch; - import java.io.IOException; import java.io.PrintWriter; -import java.net.Inet4Address; -import java.net.Inet6Address; -import java.net.InetAddress; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; @@ -31,7 +27,6 @@ import java.sql.Timestamp; import java.util.Date; import java.util.concurrent.TimeUnit; - import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @@ -42,7 +37,7 @@ @SuppressWarnings("serial") // With @WebServlet annotation the webapp/WEB-INF/web.xml is no longer required. @WebServlet(name = "PostgreSQL", - description = "PostgreSQL: Write low order IP address to PostgreSQL", + description = "PostgreSQL: Write timestamps of visitors to PostgreSQL", urlPatterns = "/postgresql") public class PostgreSqlServlet extends HttpServlet { @@ -52,11 +47,11 @@ public class PostgreSqlServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { - final String createTableSql = "CREATE TABLE IF NOT EXISTS visits ( visit_id SERIAL NOT NULL, " - + "user_ip VARCHAR(46) NOT NULL, ts timestamp NOT NULL, " + final String createTableSql = "CREATE TABLE IF NOT EXISTS visits ( " + + "visit_id SERIAL NOT NULL, ts timestamp NOT NULL, " + "PRIMARY KEY (visit_id) );"; - final String createVisitSql = "INSERT INTO visits (user_ip, ts) VALUES (?, ?);"; - final String selectSql = "SELECT user_ip, ts FROM visits ORDER BY ts DESC " + final String createVisitSql = "INSERT INTO visits (ts) VALUES (?);"; + final String selectSql = "SELECT ts FROM visits ORDER BY ts DESC " + "LIMIT 10;"; String path = req.getRequestURI(); @@ -67,55 +62,34 @@ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOExc PrintWriter out = resp.getWriter(); resp.setContentType("text/plain"); - // store only the first two octets of a users ip address - String userIp = req.getRemoteAddr(); - InetAddress address = InetAddress.getByName(userIp); - if (address instanceof Inet6Address) { - // nest indexOf calls to find the second occurrence of a character in a string - // an alternative is to use Apache Commons Lang: StringUtils.ordinalIndexOf() - userIp = userIp.substring(0, userIp.indexOf(":", userIp.indexOf(":") + 1)) + ":*:*:*:*:*:*"; - } else if (address instanceof Inet4Address) { - userIp = userIp.substring(0, userIp.indexOf(".", userIp.indexOf(".") + 1)) + ".*.*"; - } - Stopwatch stopwatch = Stopwatch.createStarted(); try (PreparedStatement statementCreateVisit = conn.prepareStatement(createVisitSql)) { conn.createStatement().executeUpdate(createTableSql); - statementCreateVisit.setString(1, userIp); - statementCreateVisit.setTimestamp(2, new Timestamp(new Date().getTime())); + statementCreateVisit.setTimestamp(1, new Timestamp(new Date().getTime())); statementCreateVisit.executeUpdate(); try (ResultSet rs = conn.prepareStatement(selectSql).executeQuery()) { stopwatch.stop(); out.print("Last 10 visits:\n"); while (rs.next()) { - String savedIp = rs.getString("user_ip"); String timeStamp = rs.getString("ts"); - out.println("Time: " + timeStamp + " Addr: " + savedIp); + out.println("Visited at time: " + timeStamp); } - out.println("Elapsed: " + stopwatch.elapsed(TimeUnit.MILLISECONDS)); } } catch (SQLException e) { throw new ServletException("SQL error", e); } + out.println("Query time (ms):" + stopwatch.elapsed(TimeUnit.MILLISECONDS)); } @Override public void init() throws ServletException { + String url = System.getProperty("postgresql"); + log("connecting to: " + url); try { - String url = System.getProperty("postgresql"); - log("connecting to: " + url); - try { - Class.forName("org.postgresql.Driver"); - conn = DriverManager.getConnection(url); - } catch (ClassNotFoundException e) { - throw new ServletException("Error loading JDBC Driver", e); - } catch (SQLException e) { - throw new ServletException("Unable to connect to PostGre", e); - } - - } finally { - // Nothing really to do here. + conn = DriverManager.getConnection(url); + } catch (SQLException e) { + throw new ServletException("Unable to connect to PostgreSQL", e); } } } diff --git a/appengine-java8/postgres/src/main/webapp/WEB-INF/appengine-web.xml b/appengine-java8/cloudsql-postgres/src/main/webapp/WEB-INF/appengine-web.xml similarity index 100% rename from appengine-java8/postgres/src/main/webapp/WEB-INF/appengine-web.xml rename to appengine-java8/cloudsql-postgres/src/main/webapp/WEB-INF/appengine-web.xml diff --git a/appengine-java8/postgres/src/main/webapp/WEB-INF/web.xml b/appengine-java8/cloudsql-postgres/src/main/webapp/WEB-INF/web.xml similarity index 100% rename from appengine-java8/postgres/src/main/webapp/WEB-INF/web.xml rename to appengine-java8/cloudsql-postgres/src/main/webapp/WEB-INF/web.xml diff --git a/appengine-java8/cloudsql/pom.xml b/appengine-java8/cloudsql/pom.xml index 4c613de18d7..ccca59c0ed2 100644 --- a/appengine-java8/cloudsql/pom.xml +++ b/appengine-java8/cloudsql/pom.xml @@ -48,7 +48,6 @@ - com.google.appengine appengine-api-1.0-sdk @@ -78,8 +77,9 @@ com.google.cloud.sql - mysql-socket-factory - 1.0.4 + + mysql-socket-factory + 1.0.5 diff --git a/appengine-java8/cloudsql/src/main/java/com/example/appengine/cloudsql/CloudSqlServlet.java b/appengine-java8/cloudsql/src/main/java/com/example/appengine/cloudsql/CloudSqlServlet.java index 5e30119ade7..09822cc0c65 100644 --- a/appengine-java8/cloudsql/src/main/java/com/example/appengine/cloudsql/CloudSqlServlet.java +++ b/appengine-java8/cloudsql/src/main/java/com/example/appengine/cloudsql/CloudSqlServlet.java @@ -44,7 +44,8 @@ // [START example] @SuppressWarnings("serial") // With @WebServlet annotation the webapp/WEB-INF/web.xml is no longer required. -@WebServlet(name = "CloudSQL", description = "CloudSQL: Write low order IP address to Cloud SQL", +@WebServlet(name = "CloudSQL", + description = "CloudSQL: Write timestamps of visitors to Cloud SQL", urlPatterns = "/cloudsql") public class CloudSqlServlet extends HttpServlet { Connection conn; @@ -52,12 +53,13 @@ public class CloudSqlServlet extends HttpServlet { @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { - final String createTableSql = "CREATE TABLE IF NOT EXISTS visits ( visit_id INT NOT NULL " - + "AUTO_INCREMENT, user_ip VARCHAR(46) NOT NULL, timestamp DATETIME NOT NULL, " - + "PRIMARY KEY (visit_id) )"; - final String createVisitSql = "INSERT INTO visits (user_ip, timestamp) VALUES (?, ?)"; - final String selectSql = "SELECT user_ip, timestamp FROM visits ORDER BY timestamp DESC " - + "LIMIT 10"; + + final String createTableSql = "CREATE TABLE IF NOT EXISTS visits ( " + + "visit_id SERIAL NOT NULL, ts timestamp NOT NULL, " + + "PRIMARY KEY (visit_id) );"; + final String createVisitSql = "INSERT INTO visits (ts) VALUES (?);"; + final String selectSql = "SELECT ts FROM visits ORDER BY ts DESC " + + "LIMIT 10;"; String path = req.getRequestURI(); if (path.startsWith("/favicon.ico")) { @@ -67,37 +69,24 @@ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOExc PrintWriter out = resp.getWriter(); resp.setContentType("text/plain"); - // store only the first two octets of a users ip address - String userIp = req.getRemoteAddr(); - InetAddress address = InetAddress.getByName(userIp); - if (address instanceof Inet6Address) { - // nest indexOf calls to find the second occurrence of a character in a string - // an alternative is to use Apache Commons Lang: StringUtils.ordinalIndexOf() - userIp = userIp.substring(0, userIp.indexOf(":", userIp.indexOf(":") + 1)) + ":*:*:*:*:*:*"; - } else if (address instanceof Inet4Address) { - userIp = userIp.substring(0, userIp.indexOf(".", userIp.indexOf(".") + 1)) + ".*.*"; - } - Stopwatch stopwatch = Stopwatch.createStarted(); try (PreparedStatement statementCreateVisit = conn.prepareStatement(createVisitSql)) { conn.createStatement().executeUpdate(createTableSql); - statementCreateVisit.setString(1, userIp); - statementCreateVisit.setTimestamp(2, new Timestamp(new Date().getTime())); + statementCreateVisit.setTimestamp(1, new Timestamp(new Date().getTime())); statementCreateVisit.executeUpdate(); try (ResultSet rs = conn.prepareStatement(selectSql).executeQuery()) { stopwatch.stop(); out.print("Last 10 visits:\n"); while (rs.next()) { - String savedIp = rs.getString("user_ip"); - String timeStamp = rs.getString("timestamp"); - out.print("Time: " + timeStamp + " Addr: " + savedIp + "\n"); + String timeStamp = rs.getString("ts"); + out.println("Visited at time: " + timeStamp); } - out.println("Elapsed: " + stopwatch.elapsed(TimeUnit.MILLISECONDS)); } } catch (SQLException e) { throw new ServletException("SQL error", e); } + out.println("Query time (ms):" + stopwatch.elapsed(TimeUnit.MILLISECONDS)); } @Override diff --git a/appengine-java8/pom.xml b/appengine-java8/pom.xml index f626dc0da1b..3b3b23e92d4 100644 --- a/appengine-java8/pom.xml +++ b/appengine-java8/pom.xml @@ -41,6 +41,7 @@ appidentity bigtable cloudsql + cloudsql-postgres datastore datastore-indexes datastore-indexes-exploding @@ -62,7 +63,6 @@ metadata multitenancy oauth2 - postgres pubsub requests remote-client