|
43 | 43 | import java.util.Map;
|
44 | 44 | import java.util.TimeZone;
|
45 | 45 |
|
| 46 | +import static org.elasticsearch.common.collect.Lists.newLinkedList; |
| 47 | + |
46 | 48 | /**
|
47 | 49 | * Simple river source.
|
48 | 50 | * <p/>
|
@@ -383,21 +385,22 @@ private void executeCallable(SQLCommand command) throws Exception {
|
383 | 385 | if (!command.getParameters().isEmpty()) {
|
384 | 386 | bind(statement, command.getParameters());
|
385 | 387 | }
|
386 |
| - if (!command.getResults().isEmpty()) { |
387 |
| - register(statement, command.getResults()); |
| 388 | + if (!command.getRegister().isEmpty()) { |
| 389 | + register(statement, command.getRegister()); |
388 | 390 | }
|
389 | 391 | boolean hasRows = statement.execute();
|
390 | 392 | RiverMouthKeyValueStreamListener<Object, Object> listener = new RiverMouthKeyValueStreamListener<Object, Object>()
|
391 | 393 | .output(context.getRiverMouth());
|
392 |
| - if (!hasRows) { |
393 |
| - // merge from registered params |
394 |
| - merge(statement, command, listener); |
395 |
| - } else { |
| 394 | + if (hasRows) { |
| 395 | + logger.debug("callable execution created result set"); |
396 | 396 | while (hasRows) {
|
397 |
| - // merge result set |
| 397 | + // merge result set, but use register |
398 | 398 | merge(statement.getResultSet(), listener);
|
399 | 399 | hasRows = statement.getMoreResults();
|
400 | 400 | }
|
| 401 | + } else { |
| 402 | + // no result set, merge from registered params only |
| 403 | + merge(statement, command, listener); |
401 | 404 | }
|
402 | 405 | } finally {
|
403 | 406 | close(statement);
|
@@ -442,17 +445,22 @@ public void merge(ResultSet results, KeyValueStreamListener listener)
|
442 | 445 | @SuppressWarnings({"unchecked"})
|
443 | 446 | public void merge(CallableStatement statement, SQLCommand command, KeyValueStreamListener listener)
|
444 | 447 | throws SQLException, IOException {
|
445 |
| - Map<String, Object> map = command.getResults(); |
| 448 | + Map<String, Object> map = command.getRegister(); |
446 | 449 | if (map.isEmpty()) {
|
| 450 | + // no register given, return without doing anything |
447 | 451 | return;
|
448 | 452 | }
|
449 |
| - List<String> keys = new LinkedList<String>(); |
450 |
| - List<Object> values = new LinkedList<Object>(); |
| 453 | + List<String> keys = newLinkedList(); |
| 454 | + List<Object> values = newLinkedList(); |
451 | 455 | for (Map.Entry<String, Object> entry : map.entrySet()) {
|
452 |
| - keys.add(entry.getKey()); |
453 |
| - Map<String, Object> m = (Map<String, Object>) entry.getValue(); |
454 |
| - values.add(statement.getObject((Integer) m.get("pos"))); |
| 456 | + String k = entry.getKey(); |
| 457 | + Map<String, Object> v = (Map<String, Object>) entry.getValue(); |
| 458 | + Integer pos = (Integer) v.get("pos"); // the parameter position of the value |
| 459 | + String field = (String) v.get("field"); // the field for indexing the value (if not key name) |
| 460 | + keys.add(field != null ? field : k); |
| 461 | + values.add(statement.getObject(pos)); |
455 | 462 | }
|
| 463 | + logger.trace("merge callable statement result: keys={} values={}", keys, values); |
456 | 464 | listener.keys(keys);
|
457 | 465 | listener.values(values);
|
458 | 466 | listener.end();
|
@@ -532,11 +540,18 @@ public SimpleRiverSource register(CallableStatement statement, Map<String, Objec
|
532 | 540 | return this;
|
533 | 541 | }
|
534 | 542 | for (Map.Entry<String, Object> me : values.entrySet()) {
|
535 |
| - // { "fieldname" : { "pos": n, "type" : "VARCHAR" }, ... } |
| 543 | + // { "key" : { "pos": n, "type" : "VARCHAR", "field" : "fieldname" }, ... } |
536 | 544 | Map<String, Object> m = (Map<String, Object>) me.getValue();
|
537 | 545 | Integer n = (Integer) m.get("pos");
|
538 | 546 | String type = (String) m.get("type");
|
539 |
| - register(statement, n, type); |
| 547 | + if (n != null && type != null) { |
| 548 | + logger.info("n={} type={}", n, toJDBCType(type)); |
| 549 | + try { |
| 550 | + statement.registerOutParameter(n, toJDBCType(type)); |
| 551 | + } catch (Throwable t) { |
| 552 | + logger.warn("can't register out parameter " + n + " of type " + type); |
| 553 | + } |
| 554 | + } |
540 | 555 | }
|
541 | 556 | return this;
|
542 | 557 | }
|
@@ -938,10 +953,6 @@ private void bind(PreparedStatement statement, int i, Object value) throws SQLEx
|
938 | 953 | }
|
939 | 954 | }
|
940 | 955 |
|
941 |
| - private void register(CallableStatement statement, Integer pos, String type) throws SQLException { |
942 |
| - statement.registerOutParameter(pos, toJDBCType(type)); |
943 |
| - } |
944 |
| - |
945 | 956 | /**
|
946 | 957 | * Parse of value of result set
|
947 | 958 | *
|
|
0 commit comments