Skip to content

Commit 970aca8

Browse files
authored
Merge pull request #236 from shanexu/master
fix sending mutiple queries with single query bug, closes #214
2 parents 5d11e5f + 94bd9e2 commit 970aca8

File tree

4 files changed

+96
-11
lines changed

4 files changed

+96
-11
lines changed

src/main/java/org/influxdb/dto/Query.java

+26
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package org.influxdb.dto;
22

3+
import com.google.common.base.Charsets;
4+
5+
import java.io.UnsupportedEncodingException;
6+
import java.net.URLEncoder;
7+
38
/**
49
* Represents a Query against Influxdb.
510
*
@@ -39,6 +44,13 @@ public String getCommand() {
3944
return this.command;
4045
}
4146

47+
/**
48+
* @return url encoded command
49+
*/
50+
public String getCommandWithUrlEncoded() {
51+
return encode(this.command);
52+
}
53+
4254
/**
4355
* @return the database
4456
*/
@@ -81,4 +93,18 @@ public boolean equals(Object obj) {
8193
return false;
8294
return true;
8395
}
96+
97+
/**
98+
* Encode a command into {@code x-www-form-urlencoded} format.
99+
* @param command
100+
* the command to be encoded.
101+
* @return a encoded command.
102+
*/
103+
public static String encode(String command) {
104+
try {
105+
return URLEncoder.encode(command, Charsets.UTF_8.toString());
106+
} catch (UnsupportedEncodingException e) {
107+
throw new RuntimeException(e);
108+
}
109+
}
84110
}

src/main/java/org/influxdb/impl/InfluxDBImpl.java

+9-6
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@
4949
public class InfluxDBImpl implements InfluxDB {
5050
static final okhttp3.MediaType MEDIA_TYPE_STRING = MediaType.parse("text/plain");
5151

52+
private static final String SHOW_DATABASE_COMMAND_ENCODED = Query.encode("SHOW DATABASES");
53+
5254
private final InetAddress hostAddress;
5355
private final String username;
5456
private final String password;
@@ -316,10 +318,10 @@ public QueryResult query(final Query query) {
316318
Call<QueryResult> call;
317319
if (query.requiresPost()) {
318320
call = this.influxDBService.postQuery(this.username,
319-
this.password, query.getDatabase(), query.getCommand());
321+
this.password, query.getDatabase(), query.getCommandWithUrlEncoded());
320322
} else {
321323
call = this.influxDBService.query(this.username,
322-
this.password, query.getDatabase(), query.getCommand());
324+
this.password, query.getDatabase(), query.getCommandWithUrlEncoded());
323325
}
324326
return execute(call);
325327
}
@@ -330,7 +332,7 @@ public QueryResult query(final Query query) {
330332
@Override
331333
public QueryResult query(final Query query, final TimeUnit timeUnit) {
332334
return execute(this.influxDBService.query(this.username, this.password, query.getDatabase(),
333-
TimeUtil.toTimePrecision(timeUnit), query.getCommand()));
335+
TimeUtil.toTimePrecision(timeUnit), query.getCommandWithUrlEncoded()));
334336
}
335337

336338
/**
@@ -343,15 +345,16 @@ public void createDatabase(final String name) {
343345
if (this.version().startsWith("0.")) {
344346
createDatabaseQueryString = String.format("CREATE DATABASE IF NOT EXISTS \"%s\"", name);
345347
}
346-
execute(this.influxDBService.postQuery(this.username, this.password, createDatabaseQueryString));
348+
execute(this.influxDBService.postQuery(this.username, this.password, Query.encode(createDatabaseQueryString)));
347349
}
348350

349351
/**
350352
* {@inheritDoc}
351353
*/
352354
@Override
353355
public void deleteDatabase(final String name) {
354-
execute(this.influxDBService.postQuery(this.username, this.password, "DROP DATABASE \"" + name + "\""));
356+
execute(this.influxDBService.postQuery(this.username, this.password,
357+
Query.encode("DROP DATABASE \"" + name + "\"")));
355358
}
356359

357360
/**
@@ -360,7 +363,7 @@ public void deleteDatabase(final String name) {
360363
@Override
361364
public List<String> describeDatabases() {
362365
QueryResult result = execute(this.influxDBService.query(this.username,
363-
this.password, "SHOW DATABASES"));
366+
this.password, SHOW_DATABASE_COMMAND_ENCODED));
364367
// {"results":[{"series":[{"name":"databases","columns":["name"],"values":[["mydb"]]}]}]}
365368
// Series [name=databases, columns=[name], values=[[mydb], [unittest_1433605300968]]]
366369
List<List<Object>> databaseNames = result.getResults().get(0).getSeries().get(0).getValues();

src/main/java/org/influxdb/impl/InfluxDBService.java

+6-5
Original file line numberDiff line numberDiff line change
@@ -43,21 +43,22 @@ public Call<ResponseBody> writePoints(@Query(U) String username,
4343

4444
@GET("/query")
4545
public Call<QueryResult> query(@Query(U) String username, @Query(P) String password, @Query(DB) String db,
46-
@Query(EPOCH) String epoch, @Query(Q) String query);
46+
@Query(EPOCH) String epoch, @Query(value = Q, encoded = true) String query);
4747

4848
@GET("/query")
4949
public Call<QueryResult> query(@Query(U) String username, @Query(P) String password, @Query(DB) String db,
50-
@Query(Q) String query);
50+
@Query(value = Q, encoded = true) String query);
5151

5252
@POST("/query")
5353
public Call<QueryResult> postQuery(@Query(U) String username, @Query(P) String password, @Query(DB) String db,
54-
@Query(Q) String query);
54+
@Query(value = Q, encoded = true) String query);
5555

5656
@GET("/query")
57-
public Call<QueryResult> query(@Query(U) String username, @Query(P) String password, @Query(Q) String query);
57+
public Call<QueryResult> query(@Query(U) String username, @Query(P) String password,
58+
@Query(value = Q, encoded = true) String query);
5859

5960
@POST("/query")
6061
public Call<QueryResult> postQuery(@Query(U) String username,
61-
@Query(P) String password, @Query(Q) String query);
62+
@Query(P) String password, @Query(value = Q, encoded = true) String query);
6263

6364
}

src/test/java/org/influxdb/dto/QueryTest.java

+55
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,14 @@
22

33
import static org.assertj.core.api.Assertions.assertThat;
44

5+
import com.google.common.base.Charsets;
6+
import com.google.common.primitives.Chars;
57
import org.junit.Test;
68

9+
import java.io.UnsupportedEncodingException;
10+
import java.net.URLDecoder;
11+
import java.nio.charset.Charset;
12+
713

814
/**
915
* Test for the Query DTO.
@@ -34,4 +40,53 @@ public void testEqualsAndHashCode() {
3440
assertThat(queryA0.hashCode()).isEqualTo(queryA1.hashCode());
3541
assertThat(queryA0.hashCode()).isNotEqualTo(queryB0.hashCode());
3642
}
43+
44+
/**
45+
* Test encode does what it is supposed to do.
46+
*/
47+
@Test
48+
public void testEncode() throws UnsupportedEncodingException {
49+
String queryString1 = "SELECT * FROM cpu";
50+
String queryString2 = "SELECT * FROM cpu;SELECT * FROM cpu";
51+
52+
String encodedQueryString1 = Query.encode(queryString1);
53+
String encodedQueryString2 = Query.encode(queryString2);
54+
55+
assertThat(decode(encodedQueryString1)).isEqualTo(queryString1);
56+
assertThat(decode(encodedQueryString2)).isEqualTo(queryString2);
57+
assertThat(encodedQueryString2).doesNotContain(";");
58+
}
59+
60+
/**
61+
* Test getCommandWithUrlEncoded does what it is supposed to do.
62+
*/
63+
@Test
64+
public void testGetCommandWithUrlEncoded() throws UnsupportedEncodingException {
65+
String queryString1 = "CREATE DATABASE \"testdb\"";
66+
String queryString2 = "SELECT * FROM cpu;SELECT * FROM cpu;";
67+
String queryString3 = "%3B%2B%";
68+
String queryString4 = "non_escape";
69+
String database = "testdb";
70+
71+
Query query1 = new Query(queryString1, database);
72+
Query query2 = new Query(queryString2, database);
73+
Query query3 = new Query(queryString3, database);
74+
Query query4 = new Query(queryString4, database);
75+
76+
assertThat(query1.getCommandWithUrlEncoded()).isNotEqualTo(query1.getCommand());
77+
assertThat(decode(query1.getCommandWithUrlEncoded())).isEqualTo(query1.getCommand());
78+
79+
assertThat(query2.getCommandWithUrlEncoded()).isNotEqualTo(query2.getCommand());
80+
assertThat(decode(query2.getCommandWithUrlEncoded())).isEqualTo(query2.getCommand());
81+
82+
assertThat(query3.getCommandWithUrlEncoded()).isNotEqualTo(query3.getCommand());
83+
assertThat(decode(query3.getCommandWithUrlEncoded())).isEqualTo(query3.getCommand());
84+
85+
assertThat(query4.getCommandWithUrlEncoded()).isEqualTo(query4.getCommand());
86+
assertThat(decode(query4.getCommandWithUrlEncoded())).isEqualTo(query4.getCommand());
87+
}
88+
89+
private static String decode(String str) throws UnsupportedEncodingException {
90+
return URLDecoder.decode(str, Charsets.UTF_8.toString());
91+
}
3792
}

0 commit comments

Comments
 (0)