| 437 | } |
| 438 | |
| 439 | static struct command_result *refresh_complete(struct command *cmd, |
| 440 | struct db_query *dbq) |
| 441 | { |
| 442 | struct sql *sql = sql_of(cmd->plugin); |
| 443 | char *errmsg; |
| 444 | int err, num_cols; |
| 445 | size_t num_rows; |
| 446 | struct json_stream *ret; |
| 447 | |
| 448 | num_cols = sqlite3_column_count(dbq->stmt); |
| 449 | |
| 450 | /* We normally hit an error immediately, so return a simple error then */ |
| 451 | ret = NULL; |
| 452 | num_rows = 0; |
| 453 | errmsg = NULL; |
| 454 | |
| 455 | while ((err = sqlite3_step(dbq->stmt)) == SQLITE_ROW) { |
| 456 | if (!ret) { |
| 457 | ret = jsonrpc_stream_success(cmd); |
| 458 | json_array_start(ret, "rows"); |
| 459 | } |
| 460 | json_array_start(ret, NULL); |
| 461 | for (size_t i = 0; i < num_cols; i++) { |
| 462 | /* The returned value is one of |
| 463 | * SQLITE_INTEGER, SQLITE_FLOAT, SQLITE_TEXT, |
| 464 | * SQLITE_BLOB, or SQLITE_NULL */ |
| 465 | switch (sqlite3_column_type(dbq->stmt, i)) { |
| 466 | case SQLITE_INTEGER: { |
| 467 | s64 v = sqlite3_column_int64(dbq->stmt, i); |
| 468 | json_add_s64(ret, NULL, v); |
| 469 | break; |
| 470 | } |
| 471 | case SQLITE_FLOAT: { |
| 472 | double v = sqlite3_column_double(dbq->stmt, i); |
| 473 | json_add_primitive_fmt(ret, NULL, "%f", v); |
| 474 | break; |
| 475 | } |
| 476 | case SQLITE_TEXT: { |
| 477 | const char *c = (char *)sqlite3_column_text(dbq->stmt, i); |
| 478 | if (!utf8_check(c, strlen(c))) { |
| 479 | json_add_str_fmt(ret, NULL, |
| 480 | "INVALID UTF-8 STRING %s", |
| 481 | tal_hexstr(tmpctx, c, strlen(c))); |
| 482 | errmsg = tal_fmt(cmd, "Invalid UTF-8 string row %zu column %zu", |
| 483 | num_rows, i); |
| 484 | } else |
| 485 | json_add_string(ret, NULL, c); |
| 486 | break; |
| 487 | } |
| 488 | case SQLITE_BLOB: |
| 489 | json_add_hex(ret, NULL, |
| 490 | sqlite3_column_blob(dbq->stmt, i), |
| 491 | sqlite3_column_bytes(dbq->stmt, i)); |
| 492 | break; |
| 493 | case SQLITE_NULL: |
| 494 | json_add_primitive(ret, NULL, "null"); |
| 495 | break; |
| 496 | default: |
no test coverage detected