{"action":"created","comment":{"url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/pulls/comments/65654568","id":65654568,"diff_hunk":"@@ -0,0 +1,586 @@\n+package com.github.davidmoten.rx.jdbc;\n+\n+import java.io.InputStream;\n+import java.io.Reader;\n+import java.math.BigDecimal;\n+import java.net.URL;\n+import java.sql.Array;\n+import java.sql.Blob;\n+import java.sql.Clob;\n+import java.sql.Connection;\n+import java.sql.Date;\n+import java.sql.NClob;\n+import java.sql.ParameterMetaData;\n+import java.sql.PreparedStatement;\n+import java.sql.Ref;\n+import java.sql.ResultSet;\n+import java.sql.ResultSetMetaData;\n+import java.sql.RowId;\n+import java.sql.SQLException;\n+import java.sql.SQLWarning;\n+import java.sql.SQLXML;\n+import java.sql.Time;\n+import java.sql.Timestamp;\n+import java.util.Calendar;\n+\n+class PreparedStatementBatch implements PreparedStatement {\n+\n+    private final PreparedStatement ps;\n+    private String sql;\n+    private int keysOption;\n+\n+    PreparedStatementBatch(PreparedStatement ps, String sql, int keysOption) {\n+        this.ps = ps;\n+        this.sql = sql;\n+        this.keysOption = keysOption;\n+    }\n+\n+    public String getSql() {\n+        return sql;\n+    }\n+\n+    public int getKeysOption() {\n+        return keysOption;\n+    }\n+\n+    @Override\n+    public <T> T unwrap(Class<T> iface) throws SQLException {\n+        return ps.unwrap(iface);\n+    }\n+\n+    @Override\n+    public ResultSet executeQuery(String sql) throws SQLException {\n+        return ps.executeQuery(sql);\n+    }\n+\n+    @Override\n+    public ResultSet executeQuery() throws SQLException {\n+        return ps.executeQuery();\n+    }\n+\n+    @Override\n+    public boolean isWrapperFor(Class<?> iface) throws SQLException {\n+        return ps.isWrapperFor(iface);\n+    }\n+\n+    @Override\n+    public int executeUpdate(String sql) throws SQLException {\n+        Batch batch = Batch.get();\n+        if (batch.enabled()) {\n+            Batch.set(batch.setPreparedStatement(this));\n+            ps.addBatch(sql);\n+            batch.addOne();\n+            if (batch.complete()) {\n+                return sum(executeBatch());\n+            } else {\n+                return 0;\n+            }\n+        } else {\n+            return ps.executeUpdate(sql);\n+        }\n+    }\n+\n+    @Override\n+    public int executeUpdate() throws SQLException {\n+        Batch batch = Batch.get();\n+        if (batch.enabled()) {\n+            batch.setPreparedStatement(this);\n+            ps.addBatch();\n+            batch.addOne();\n+            if (batch.complete()) {\n+                return sum(executeBatch());\n+            } else {\n+                return 0;\n+            }\n+        } else {\n+            return ps.executeUpdate();\n+        }\n+    }\n+\n+    private static int sum(int[] values) {\n+        int n = 0;\n+        for (int i = 0; i < values.length; i++) {\n+            n += i;\n+        }\n+        return n;\n+    }\n+\n+    @Override\n+    public void setNull(int parameterIndex, int sqlType) throws SQLException {\n+        ps.setNull(parameterIndex, sqlType);\n+    }\n+\n+    @Override\n+    public void close() throws SQLException {\n+        // don't close if batching because that will happen on connection commit\n+        if (!Batch.get().enabled())\n+            ps.close();\n+    }\n+\n+    @Override\n+    public int getMaxFieldSize() throws SQLException {\n+        return ps.getMaxFieldSize();\n+    }\n+\n+    @Override\n+    public void setBoolean(int parameterIndex, boolean x) throws SQLException {\n+        ps.setBoolean(parameterIndex, x);\n+    }\n+\n+    @Override\n+    public void setByte(int parameterIndex, byte x) throws SQLException {\n+        ps.setByte(parameterIndex, x);\n+    }\n+\n+    @Override\n+    public void setMaxFieldSize(int max) throws SQLException {\n+        ps.setMaxFieldSize(max);\n+    }\n+\n+    @Override\n+    public void setShort(int parameterIndex, short x) throws SQLException {\n+        ps.setShort(parameterIndex, x);\n+    }\n+\n+    @Override\n+    public int getMaxRows() throws SQLException {\n+        return ps.getMaxRows();\n+    }\n+\n+    @Override\n+    public void setInt(int parameterIndex, int x) throws SQLException {\n+        ps.setInt(parameterIndex, x);\n+    }\n+\n+    @Override\n+    public void setMaxRows(int max) throws SQLException {\n+        ps.setMaxRows(max);\n+    }\n+\n+    @Override\n+    public void setLong(int parameterIndex, long x) throws SQLException {\n+        ps.setLong(parameterIndex, x);\n+    }\n+\n+    @Override\n+    public void setFloat(int parameterIndex, float x) throws SQLException {\n+        ps.setFloat(parameterIndex, x);\n+    }\n+\n+    @Override\n+    public void setEscapeProcessing(boolean enable) throws SQLException {\n+        ps.setEscapeProcessing(enable);\n+    }\n+\n+    @Override\n+    public void setDouble(int parameterIndex, double x) throws SQLException {\n+        ps.setDouble(parameterIndex, x);\n+    }\n+\n+    @Override\n+    public int getQueryTimeout() throws SQLException {\n+        return ps.getQueryTimeout();\n+    }\n+\n+    @Override\n+    public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException {\n+        ps.setBigDecimal(parameterIndex, x);\n+    }\n+\n+    @Override\n+    public void setQueryTimeout(int seconds) throws SQLException {\n+        ps.setQueryTimeout(seconds);\n+    }\n+\n+    @Override\n+    public void setString(int parameterIndex, String x) throws SQLException {\n+        ps.setString(parameterIndex, x);\n+    }\n+\n+    @Override\n+    public void setBytes(int parameterIndex, byte[] x) throws SQLException {\n+        ps.setBytes(parameterIndex, x);\n+    }\n+\n+    @Override\n+    public void cancel() throws SQLException {\n+        ps.cancel();\n+    }\n+\n+    @Override\n+    public void setDate(int parameterIndex, Date x) throws SQLException {\n+        ps.setDate(parameterIndex, x);\n+    }\n+\n+    @Override\n+    public SQLWarning getWarnings() throws SQLException {\n+        return ps.getWarnings();\n+    }\n+\n+    @Override\n+    public void setTime(int parameterIndex, Time x) throws SQLException {\n+        ps.setTime(parameterIndex, x);\n+    }\n+\n+    @Override\n+    public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException {\n+        ps.setTimestamp(parameterIndex, x);\n+    }\n+\n+    @Override\n+    public void clearWarnings() throws SQLException {\n+        ps.clearWarnings();\n+    }\n+\n+    @Override\n+    public void setCursorName(String name) throws SQLException {\n+        ps.setCursorName(name);\n+    }\n+\n+    @Override\n+    public void setAsciiStream(int parameterIndex, InputStream x, int length) throws SQLException {\n+        ps.setAsciiStream(parameterIndex, x, length);\n+    }\n+\n+    @Override\n+    public void setUnicodeStream(int parameterIndex, InputStream x, int length)\n+            throws SQLException {\n+        ps.setUnicodeStream(parameterIndex, x, length);\n+    }\n+\n+    @Override\n+    public boolean execute(String sql) throws SQLException {\n+        return ps.execute(sql);\n+    }\n+\n+    @Override\n+    public void setBinaryStream(int parameterIndex, InputStream x, int length) throws SQLException {\n+        ps.setBinaryStream(parameterIndex, x, length);\n+    }\n+\n+    @Override\n+    public ResultSet getResultSet() throws SQLException {\n+        return ps.getResultSet();\n+    }\n+\n+    @Override\n+    public int getUpdateCount() throws SQLException {\n+        return ps.getUpdateCount();\n+    }\n+\n+    @Override\n+    public void clearParameters() throws SQLException {\n+        ps.clearParameters();\n+    }\n+\n+    @Override\n+    public boolean getMoreResults() throws SQLException {\n+        return ps.getMoreResults();\n+    }\n+\n+    @Override\n+    public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException {\n+        ps.setObject(parameterIndex, x, targetSqlType);\n+    }\n+\n+    @Override\n+    public void setFetchDirection(int direction) throws SQLException {\n+        ps.setFetchDirection(direction);\n+    }\n+\n+    @Override\n+    public void setObject(int parameterIndex, Object x) throws SQLException {\n+        ps.setObject(parameterIndex, x);\n+    }\n+\n+    @Override\n+    public int getFetchDirection() throws SQLException {\n+        return ps.getFetchDirection();\n+    }\n+\n+    @Override\n+    public void setFetchSize(int rows) throws SQLException {\n+        ps.setFetchSize(rows);\n+    }\n+\n+    @Override\n+    public int getFetchSize() throws SQLException {\n+        return ps.getFetchSize();\n+    }\n+\n+    @Override\n+    public boolean execute() throws SQLException {\n+        return ps.execute();\n+    }\n+\n+    @Override\n+    public int getResultSetConcurrency() throws SQLException {\n+        return ps.getResultSetConcurrency();\n+    }\n+\n+    @Override\n+    public int getResultSetType() throws SQLException {\n+        return ps.getResultSetType();\n+    }\n+\n+    @Override\n+    public void addBatch(String sql) throws SQLException {\n+        Batch.get().addOne();\n+        ps.addBatch(sql);\n+    }\n+\n+    @Override\n+    public void addBatch() throws SQLException {\n+        Batch.get().addOne();\n+        ps.addBatch();\n+    }\n+\n+    @Override\n+    public void setCharacterStream(int parameterIndex, Reader reader, int length)\n+            throws SQLException {\n+        ps.setCharacterStream(parameterIndex, reader, length);\n+    }\n+\n+    @Override\n+    public void clearBatch() throws SQLException {\n+        Batch.set(Batch.get().reset());","path":"src/main/java/com/github/davidmoten/rx/jdbc/PreparedStatementBatch.java","position":346,"original_position":346,"commit_id":"cc6d162e344baa8869a9f7539f2cd34254fb2627","original_commit_id":"cc6d162e344baa8869a9f7539f2cd34254fb2627","user":{"login":"davidmoten","id":318187,"avatar_url":"https://avatars.githubusercontent.com/u/318187?v=3","gravatar_id":"","url":"https://api.github.com/users/davidmoten","html_url":"https://github.com/davidmoten","followers_url":"https://api.github.com/users/davidmoten/followers","following_url":"https://api.github.com/users/davidmoten/following{/other_user}","gists_url":"https://api.github.com/users/davidmoten/gists{/gist_id}","starred_url":"https://api.github.com/users/davidmoten/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidmoten/subscriptions","organizations_url":"https://api.github.com/users/davidmoten/orgs","repos_url":"https://api.github.com/users/davidmoten/repos","events_url":"https://api.github.com/users/davidmoten/events{/privacy}","received_events_url":"https://api.github.com/users/davidmoten/received_events","type":"User","site_admin":false},"body":"Don't need the `Batch.set`?","created_at":"2016-06-03T04:10:06Z","updated_at":"2016-06-03T04:10:06Z","html_url":"https://github.com/davidmoten/rxjava-jdbc/pull/49#discussion_r65654568","pull_request_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/pulls/49","_links":{"self":{"href":"https://api.github.com/repos/davidmoten/rxjava-jdbc/pulls/comments/65654568"},"html":{"href":"https://github.com/davidmoten/rxjava-jdbc/pull/49#discussion_r65654568"},"pull_request":{"href":"https://api.github.com/repos/davidmoten/rxjava-jdbc/pulls/49"}}},"pull_request":{"url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/pulls/49","id":52985291,"html_url":"https://github.com/davidmoten/rxjava-jdbc/pull/49","diff_url":"https://github.com/davidmoten/rxjava-jdbc/pull/49.diff","patch_url":"https://github.com/davidmoten/rxjava-jdbc/pull/49.patch","issue_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/issues/49","number":49,"state":"open","locked":false,"title":"Make unit test pass","user":{"login":"EmteZogaf","id":1272656,"avatar_url":"https://avatars.githubusercontent.com/u/1272656?v=3","gravatar_id":"","url":"https://api.github.com/users/EmteZogaf","html_url":"https://github.com/EmteZogaf","followers_url":"https://api.github.com/users/EmteZogaf/followers","following_url":"https://api.github.com/users/EmteZogaf/following{/other_user}","gists_url":"https://api.github.com/users/EmteZogaf/gists{/gist_id}","starred_url":"https://api.github.com/users/EmteZogaf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/EmteZogaf/subscriptions","organizations_url":"https://api.github.com/users/EmteZogaf/orgs","repos_url":"https://api.github.com/users/EmteZogaf/repos","events_url":"https://api.github.com/users/EmteZogaf/events{/privacy}","received_events_url":"https://api.github.com/users/EmteZogaf/received_events","type":"User","site_admin":false},"body":"I simply tried to fix any unit test error. I still get an NPE occasionally in [DatabaseAsyncTest#testPushEmptyList](https://github.com/davidmoten/rxjava-jdbc/blob/batch-updates-3/src/test/java/com/github/davidmoten/rx/jdbc/DatabaseTestBase.java#L255-L269), but it's not happening while debugging. Maybe a race condition?\r\n\r\n```\r\njava.lang.RuntimeException: java.sql.SQLException: failed to execute sql=update person set score = score + 1\r\n\tat rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:455)\r\n\tat rx.observables.BlockingObservable.single(BlockingObservable.java:331)\r\n\tat com.github.davidmoten.rx.jdbc.DatabaseTestBase.assertIs(DatabaseTestBase.java:959)\r\n\tat com.github.davidmoten.rx.jdbc.DatabaseTestBase.testPushEmptyList(DatabaseTestBase.java:268)\r\n\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\r\n\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n\tat java.lang.reflect.Method.invoke(Method.java:606)\r\n\tat org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)\r\n\tat org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\r\n\tat org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)\r\n\tat org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)\r\n\tat org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)\r\n\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)\r\n\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)\r\n\tat org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)\r\n\tat org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)\r\n\tat org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)\r\n\tat org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)\r\n\tat org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)\r\n\tat org.junit.runners.ParentRunner.run(ParentRunner.java:363)\r\n\tat org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)\r\n\tat org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)\r\n\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)\r\n\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)\r\n\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)\r\n\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)\r\nCaused by: java.sql.SQLException: failed to execute sql=update person set score = score + 1\r\n\tat com.github.davidmoten.rx.jdbc.QueryUpdateOnSubscribe.performUpdate(QueryUpdateOnSubscribe.java:236)\r\n\tat com.github.davidmoten.rx.jdbc.QueryUpdateOnSubscribe.call(QueryUpdateOnSubscribe.java:86)\r\n\tat com.github.davidmoten.rx.jdbc.QueryUpdateOnSubscribe.call(QueryUpdateOnSubscribe.java:1)\r\n\tat rx.Observable.unsafeSubscribe(Observable.java:7710)\r\n\tat rx.internal.operators.OperatorSubscribeOn$1$1.call(OperatorSubscribeOn.java:62)\r\n\tat rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)\r\n\tat java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)\r\n\tat java.util.concurrent.FutureTask.run(FutureTask.java:262)\r\n\tat java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)\r\n\tat java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)\r\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)\r\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)\r\n\tat java.lang.Thread.run(Thread.java:745)\r\nCaused by: org.h2.jdbc.JdbcSQLException: General error: \"java.lang.NullPointerException\"\r\nGeneral error: \"java.lang.NullPointerException\" [50000-178]\r\n\tat org.h2.message.DbException.getJdbcSQLException(DbException.java:344)\r\n\tat org.h2.message.DbException.get(DbException.java:167)\r\n\tat org.h2.message.DbException.convert(DbException.java:294)\r\n\tat org.h2.message.DbException.toSQLException(DbException.java:267)\r\n\tat org.h2.message.TraceObject.logAndConvert(TraceObject.java:372)\r\n\tat org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:149)\r\n\tat com.github.davidmoten.rx.jdbc.PreparedStatementBatch.executeUpdate(PreparedStatementBatch.java:96)\r\n\tat com.github.davidmoten.rx.jdbc.QueryUpdateOnSubscribe.performUpdate(QueryUpdateOnSubscribe.java:220)\r\n\t... 12 more\r\nCaused by: java.lang.NullPointerException\r\n\tat org.h2.jdbc.JdbcStatement.setExecutingStatement(JdbcStatement.java:1032)\r\n\tat org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:160)\r\n\tat org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:144)\r\n\t... 14 more\r\n\r\n```","created_at":"2015-12-08T14:16:00Z","updated_at":"2016-06-03T04:10:06Z","closed_at":null,"merged_at":null,"merge_commit_sha":"512ea0928e847a065249f038b635e8a6f96c8d6b","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/pulls/49/commits","review_comments_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/pulls/49/comments","review_comment_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/pulls/comments{/number}","comments_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/issues/49/comments","statuses_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/statuses/cc6d162e344baa8869a9f7539f2cd34254fb2627","head":{"label":"EmteZogaf:batch-updates","ref":"batch-updates","sha":"cc6d162e344baa8869a9f7539f2cd34254fb2627","user":{"login":"EmteZogaf","id":1272656,"avatar_url":"https://avatars.githubusercontent.com/u/1272656?v=3","gravatar_id":"","url":"https://api.github.com/users/EmteZogaf","html_url":"https://github.com/EmteZogaf","followers_url":"https://api.github.com/users/EmteZogaf/followers","following_url":"https://api.github.com/users/EmteZogaf/following{/other_user}","gists_url":"https://api.github.com/users/EmteZogaf/gists{/gist_id}","starred_url":"https://api.github.com/users/EmteZogaf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/EmteZogaf/subscriptions","organizations_url":"https://api.github.com/users/EmteZogaf/orgs","repos_url":"https://api.github.com/users/EmteZogaf/repos","events_url":"https://api.github.com/users/EmteZogaf/events{/privacy}","received_events_url":"https://api.github.com/users/EmteZogaf/received_events","type":"User","site_admin":false},"repo":{"id":37195671,"name":"rxjava-jdbc","full_name":"EmteZogaf/rxjava-jdbc","owner":{"login":"EmteZogaf","id":1272656,"avatar_url":"https://avatars.githubusercontent.com/u/1272656?v=3","gravatar_id":"","url":"https://api.github.com/users/EmteZogaf","html_url":"https://github.com/EmteZogaf","followers_url":"https://api.github.com/users/EmteZogaf/followers","following_url":"https://api.github.com/users/EmteZogaf/following{/other_user}","gists_url":"https://api.github.com/users/EmteZogaf/gists{/gist_id}","starred_url":"https://api.github.com/users/EmteZogaf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/EmteZogaf/subscriptions","organizations_url":"https://api.github.com/users/EmteZogaf/orgs","repos_url":"https://api.github.com/users/EmteZogaf/repos","events_url":"https://api.github.com/users/EmteZogaf/events{/privacy}","received_events_url":"https://api.github.com/users/EmteZogaf/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/EmteZogaf/rxjava-jdbc","description":"Efficient execution and functional composition of database calls using jdbc and rx-java Observables","fork":true,"url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc","forks_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/forks","keys_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/teams","hooks_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/hooks","issue_events_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/issues/events{/number}","events_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/events","assignees_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/assignees{/user}","branches_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/branches{/branch}","tags_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/tags","blobs_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/git/refs{/sha}","trees_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/statuses/{sha}","languages_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/languages","stargazers_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/stargazers","contributors_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/contributors","subscribers_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/subscribers","subscription_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/subscription","commits_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/commits{/sha}","git_commits_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/git/commits{/sha}","comments_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/comments{/number}","issue_comment_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/issues/comments{/number}","contents_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/contents/{+path}","compare_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/merges","archive_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/downloads","issues_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/issues{/number}","pulls_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/pulls{/number}","milestones_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/milestones{/number}","notifications_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/labels{/name}","releases_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/releases{/id}","deployments_url":"https://api.github.com/repos/EmteZogaf/rxjava-jdbc/deployments","created_at":"2015-06-10T12:25:56Z","updated_at":"2016-04-06T15:08:58Z","pushed_at":"2016-05-30T08:21:42Z","git_url":"git://github.com/EmteZogaf/rxjava-jdbc.git","ssh_url":"git@github.com:EmteZogaf/rxjava-jdbc.git","clone_url":"https://github.com/EmteZogaf/rxjava-jdbc.git","svn_url":"https://github.com/EmteZogaf/rxjava-jdbc","homepage":null,"size":1029,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"davidmoten:batch-updates","ref":"batch-updates","sha":"474936e8c3918af63d5eec30caf809e25a17dac5","user":{"login":"davidmoten","id":318187,"avatar_url":"https://avatars.githubusercontent.com/u/318187?v=3","gravatar_id":"","url":"https://api.github.com/users/davidmoten","html_url":"https://github.com/davidmoten","followers_url":"https://api.github.com/users/davidmoten/followers","following_url":"https://api.github.com/users/davidmoten/following{/other_user}","gists_url":"https://api.github.com/users/davidmoten/gists{/gist_id}","starred_url":"https://api.github.com/users/davidmoten/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidmoten/subscriptions","organizations_url":"https://api.github.com/users/davidmoten/orgs","repos_url":"https://api.github.com/users/davidmoten/repos","events_url":"https://api.github.com/users/davidmoten/events{/privacy}","received_events_url":"https://api.github.com/users/davidmoten/received_events","type":"User","site_admin":false},"repo":{"id":16662619,"name":"rxjava-jdbc","full_name":"davidmoten/rxjava-jdbc","owner":{"login":"davidmoten","id":318187,"avatar_url":"https://avatars.githubusercontent.com/u/318187?v=3","gravatar_id":"","url":"https://api.github.com/users/davidmoten","html_url":"https://github.com/davidmoten","followers_url":"https://api.github.com/users/davidmoten/followers","following_url":"https://api.github.com/users/davidmoten/following{/other_user}","gists_url":"https://api.github.com/users/davidmoten/gists{/gist_id}","starred_url":"https://api.github.com/users/davidmoten/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidmoten/subscriptions","organizations_url":"https://api.github.com/users/davidmoten/orgs","repos_url":"https://api.github.com/users/davidmoten/repos","events_url":"https://api.github.com/users/davidmoten/events{/privacy}","received_events_url":"https://api.github.com/users/davidmoten/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/davidmoten/rxjava-jdbc","description":"Efficient execution and functional composition of database calls using jdbc and rx-java Observables","fork":false,"url":"https://api.github.com/repos/davidmoten/rxjava-jdbc","forks_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/forks","keys_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/teams","hooks_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/hooks","issue_events_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/issues/events{/number}","events_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/events","assignees_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/assignees{/user}","branches_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/branches{/branch}","tags_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/tags","blobs_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/git/refs{/sha}","trees_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/statuses/{sha}","languages_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/languages","stargazers_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/stargazers","contributors_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/contributors","subscribers_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/subscribers","subscription_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/subscription","commits_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/commits{/sha}","git_commits_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/git/commits{/sha}","comments_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/comments{/number}","issue_comment_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/issues/comments{/number}","contents_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/contents/{+path}","compare_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/merges","archive_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/downloads","issues_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/issues{/number}","pulls_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/pulls{/number}","milestones_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/milestones{/number}","notifications_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/labels{/name}","releases_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/releases{/id}","deployments_url":"https://api.github.com/repos/davidmoten/rxjava-jdbc/deployments","created_at":"2014-02-09T08:07:31Z","updated_at":"2016-06-02T14:11:26Z","pushed_at":"2016-06-01T01:12:51Z","git_url":"git://github.com/davidmoten/rxjava-jdbc.git","ssh_url":"git@github.com:davidmoten/rxjava-jdbc.git","clone_url":"https://github.com/davidmoten/rxjava-jdbc.git","svn_url":"https://github.com/davidmoten/rxjava-jdbc","homepage":null,"size":1095,"stargazers_count":324,"watchers_count":324,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":42,"mirror_url":null,"open_issues_count":17,"forks":42,"open_issues":17,"watchers":324,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/davidmoten/rxjava-jdbc/pulls/49"},"html":{"href":"https://github.com/davidmoten/rxjava-jdbc/pull/49"},"issue":{"href":"https://api.github.com/repos/davidmoten/rxjava-jdbc/issues/49"},"comments":{"href":"https://api.github.com/repos/davidmoten/rxjava-jdbc/issues/49/comments"},"review_comments":{"href":"https://api.github.com/repos/davidmoten/rxjava-jdbc/pulls/49/comments"},"review_comment":{"href":"https://api.github.com/repos/davidmoten/rxjava-jdbc/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/davidmoten/rxjava-jdbc/pulls/49/commits"},"statuses":{"href":"https://api.github.com/repos/davidmoten/rxjava-jdbc/statuses/cc6d162e344baa8869a9f7539f2cd34254fb2627"}}}}
{"actor":{"display_login":"davidmoten"}}