in stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/Database.java [116:172]
public JsonRpcResult executeSQL(JsonRpcPeer peer, JSONObject params) {
ExecuteSQLRequest request = mObjectMapper.convertValue(params,
ExecuteSQLRequest.class);
DatabaseDescriptorHolder holder =
mPeerListener.getDatabaseDescriptorHolder(request.databaseId);
try {
return holder.driver.executeSQL(
holder.descriptor,
request.query,
new DatabaseDriver.ExecuteResultHandler<ExecuteSQLResponse>() {
@Override
public ExecuteSQLResponse handleRawQuery() throws SQLiteException {
ExecuteSQLResponse response = new ExecuteSQLResponse();
// This is done because the inspector UI likes to delete rows if you give them no
// name/value list
response.columnNames = Collections.singletonList("success");
response.values = Collections.singletonList("true");
return response;
}
@Override
public ExecuteSQLResponse handleSelect(Cursor result) throws SQLiteException {
ExecuteSQLResponse response = new ExecuteSQLResponse();
response.columnNames = Arrays.asList(result.getColumnNames());
response.values = flattenRows(result, MAX_EXECUTE_RESULTS);
return response;
}
@Override
public ExecuteSQLResponse handleInsert(long insertedId) throws SQLiteException {
ExecuteSQLResponse response = new ExecuteSQLResponse();
response.columnNames = Collections.singletonList("ID of last inserted row");
response.values = Collections.singletonList(String.valueOf(insertedId));
return response;
}
@Override
public ExecuteSQLResponse handleUpdateDelete(int count) throws SQLiteException {
ExecuteSQLResponse response = new ExecuteSQLResponse();
response.columnNames = Collections.singletonList("Modified rows");
response.values = Collections.singletonList(String.valueOf(count));
return response;
}
});
} catch (RuntimeException e) {
LogUtil.e(e, "Exception executing: %s", request.query);
Error error = new Error();
error.code = 0;
error.message = e.getMessage();
ExecuteSQLResponse response = new ExecuteSQLResponse();
response.sqlError = error;
return response;
}
}