From 964da089e530af26aa929d03d753cb81b5da409e Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko <pmwkaa@gmail.com> Date: Fri, 8 Jun 2012 15:55:27 +0400 Subject: [PATCH] connector-c-librpl: console client refactoring, update fixed --- client/tarantool/CMakeLists.txt | 6 +- client/tarantool/tnt.c | 179 +++++++++----------- connector/c/include/tarantool/tnt_request.h | 11 -- connector/c/tnt/tnt_request.c | 30 ++-- connector/c/tntnet/tnt_net.c | 2 +- connector/c/tntrpl/tnt_xlog.c | 4 +- connector/c/tntrpl/tnt_xlog.h | 0 test/connector_c/rp.c | 20 +-- test/connector_c/tt.c | 20 +-- 9 files changed, 122 insertions(+), 150 deletions(-) delete mode 100644 connector/c/tntrpl/tnt_xlog.h diff --git a/client/tarantool/CMakeLists.txt b/client/tarantool/CMakeLists.txt index a846798e9e..9379d4f0f9 100644 --- a/client/tarantool/CMakeLists.txt +++ b/client/tarantool/CMakeLists.txt @@ -1,5 +1,6 @@ project(tnt_cli) + include(FindCurses) # checking for readline library @@ -13,19 +14,20 @@ endif() set (cli_deps ${READLINE_LIB} ${READLINE_HISTORY_LIB}) +# trying to resolve readline dependencies +# if (CURSES_FOUND) set(cli_deps ${cli_deps} ${CURSES_LIBRARIES}) else() message(FATAL_ERROR "curses library not found.") endif() + find_library(TERMCAP_LIBRARY NAMES "termcap") if (TERMCAP_LIBRARY) set(cli_deps ${cli_deps} ${TERMCAP_LIBRARY}) else() message(FATAL_ERROR "termcap library not found.") endif() -# trying to resolve readline dependencies -# set (cli "tarantool") set (cli_sources tnt.c tnt_admin.c) diff --git a/client/tarantool/tnt.c b/client/tarantool/tnt.c index 5f4482dc13..9d1237d488 100644 --- a/client/tarantool/tnt.c +++ b/client/tarantool/tnt.c @@ -51,80 +51,83 @@ #define DEFAULT_PORT_ADMIN 33015 #define HISTORY_FILE ".tarantool_history" -static int query_reply_handle(struct tnt_stream *t, struct tnt_reply *r) { - switch (r->op) { - case TNT_OP_PING: - printf("Ping "); - break; - case TNT_OP_INSERT: - printf("Insert "); - break; - case TNT_OP_DELETE: - printf("Delete "); - break; - case TNT_OP_UPDATE: - printf("Update "); - break; - case TNT_OP_SELECT: - printf("Select "); - break; - case TNT_OP_CALL: - printf("Call "); - break; - default: - printf("Unknown "); - break; +static char *query_op_type(uint32_t type) { + switch (type) { + case TNT_OP_PING: return "Ping"; + case TNT_OP_INSERT: return "Insert"; + case TNT_OP_DELETE: return "Delete"; + case TNT_OP_UPDATE: return "Update"; + case TNT_OP_SELECT: return "Select"; + case TNT_OP_CALL: return "Call"; } - if (tnt_error(t) != TNT_EOK) { - printf("ERROR, %s\n", tnt_strerror(t)); - return -1; - } else if (r->code != 0) { - printf("ERROR, %s (%s)\n", - ((r->error) ? r->error : ""), tnt_errcode_str(r->code >> 8)); - return -1; + return "Unknown"; +} + +static char *query_op(struct tnt_reply *r) { + return query_op_type(r->op); +} + +static void print_tuple(struct tnt_tuple *tu) { + struct tnt_iter ifl; + tnt_iter(&ifl, tu); + printf("["); + while (tnt_next(&ifl)) { + if (TNT_IFIELD_IDX(&ifl) != 0) + printf(", "); + char *data = TNT_IFIELD_DATA(&ifl); + uint32_t size = TNT_IFIELD_SIZE(&ifl); + if (!isprint(data[0]) && (size == 4 || size == 8)) { + if (size == 4) { + uint32_t i = *((uint32_t*)data); + printf("%"PRIu32, i); + } else { + uint64_t i = *((uint64_t*)data); + printf("%"PRIu64, i); + } + } else { + printf("'%-.*s'", size, data); + } } - printf("OK, %d rows affected\n", r->count); + if (ifl.status == TNT_ITER_FAIL) + printf("<parsing error>"); + printf("]\n"); +} + +static void print_tuple_list(struct tnt_list *l) { struct tnt_iter it; - tnt_iter_list(&it, TNT_REPLY_LIST(r)); + tnt_iter_list(&it, l); while (tnt_next(&it)) { - printf("["); struct tnt_tuple *tu = TNT_ILIST_TUPLE(&it); - struct tnt_iter ifl; - tnt_iter(&ifl, tu); - while (tnt_next(&ifl)) { - if (TNT_IFIELD_IDX(&ifl) != 0) - printf(", "); - char *data = TNT_IFIELD_DATA(&ifl); - uint32_t size = TNT_IFIELD_SIZE(&ifl); - if (!isprint(data[0]) && (size == 4 || size == 8)) { - if (size == 4) { - uint32_t i = *((uint32_t*)data); - printf("%"PRIu32, i); - } else { - uint64_t i = *((uint64_t*)data); - printf("%"PRIu64, i); - } - } else { - printf("'%-.*s'", size, data); - } - } - if (ifl.status == TNT_ITER_FAIL) - printf("<parsing error>"); - printf("]\n"); + print_tuple(tu); } - return 0; +} + +static void +query_reply_show(struct tnt_reply *r) +{ + printf("%s OK, %d rows affected\n", query_op(r), r->count); + print_tuple_list(TNT_REPLY_LIST(r)); } static int -query_reply(struct tnt_stream *t) +query_reply(struct tnt_stream *t, int show_reply) { int rc = -1; struct tnt_iter i; tnt_iter_reply(&i, t); while (tnt_next(&i)) { struct tnt_reply *r = TNT_IREPLY_PTR(&i); - if (query_reply_handle(t, r) == -1) + if (tnt_error(t) != TNT_EOK) { + printf("%s ERROR, %s\n", query_op(r), + tnt_strerror(t)); + goto error; + } else if (r->code != 0) { + printf("%s ERROR, %s (%s)\n", query_op(r), + ((r->error) ? r->error : ""), tnt_errcode_str(r->code >> 8)); goto error; + } + if (show_reply) + query_reply_show(r); } rc = (i.status == TNT_ITER_FAIL) ? -1 : 0; @@ -150,7 +153,7 @@ query(struct tnt_stream *t, char *q) printf("error: %s\n", tnt_strerror(t)); return -1; } - if (query_reply(t) == -1) + if (query_reply(t, 1) == -1) return -1; return 0; } @@ -283,39 +286,27 @@ run_wal_cat(const char *file) tnt_iter_request(&i, &s); while (tnt_next(&i)) { struct tnt_request *r = TNT_IREQUEST_PTR(&i); - switch (r->type) { - case TNT_REQUEST_NONE: - printf("unknown?!\n"); - continue; - case TNT_REQUEST_PING: - printf("Ping:"); - break; - case TNT_REQUEST_INSERT: - printf("Insert:"); - break; - case TNT_REQUEST_DELETE: - printf("Delete:"); - break; - case TNT_REQUEST_UPDATE: - printf("Update:"); + struct tnt_stream_xlog *sx = TNT_SXLOG_CAST(&s); + printf("%s lsn: %"PRIu64", time: %f, len: %"PRIu32"\n", + query_op_type(r->h.type), + sx->hdr.lsn, + sx->hdr.tm, sx->hdr.len); + switch (r->h.type) { + case TNT_OP_INSERT: + print_tuple(&r->r.insert.t); break; - case TNT_REQUEST_CALL: - printf("Call:"); + case TNT_OP_DELETE: + print_tuple(&r->r.delete.t); break; - case TNT_REQUEST_SELECT: - printf("Select:"); + case TNT_OP_UPDATE: + print_tuple(&r->r.update.t); break; } - struct tnt_stream_xlog *sx = TNT_SXLOG_CAST(&s); - printf(" lsn: %"PRIu64", time: %f, len: %"PRIu32"\n", - sx->hdr.lsn, - sx->hdr.tm, sx->hdr.len); } int rc = 0; if (i.status == TNT_ITER_FAIL) { printf("parsing failed: %s\n", tnt_xlog_strerror(&s)); rc = 1; - } tnt_iter_free(&i); tnt_stream_free(&s); @@ -323,7 +314,7 @@ run_wal_cat(const char *file) } static int -run_wal_player(struct tnt_stream *t, const char *file) +run_wal_play(struct tnt_stream *t, const char *file) { struct tnt_stream s; tnt_xlog(&s); @@ -331,28 +322,26 @@ run_wal_player(struct tnt_stream *t, const char *file) tnt_stream_free(&s); return -1; } - int rc = 0; struct tnt_iter i; tnt_iter_request(&i, &s); while (tnt_next(&i)) { struct tnt_request *r = TNT_IREQUEST_PTR(&i); if (t->write_request(t, r) == -1) { printf("failed to write request\n"); - rc = 1; - goto done; + goto error; } + if (query_reply(t, 0) == -1) + goto error; } if (i.status == TNT_ITER_FAIL) { printf("parsing failed: %s\n", tnt_xlog_strerror(&s)); - rc = 1; - goto done; + goto error; } - if (query_reply(t) == -1) - rc = 1; -done: + return 0; +error: tnt_iter_free(&i); tnt_stream_free(&s); - return rc; + return 1; } int @@ -368,7 +357,7 @@ main(int argc, char *argv[]) gopt_option('C', GOPT_ARG, gopt_shorts('C'), gopt_longs("wal-cat"), " <file>", "print xlog file content"), gopt_option('P', GOPT_ARG, gopt_shorts('P'), - gopt_longs("wal-player"), " <file>", "replay xlog file to the specified host"), + gopt_longs("wal-play"), " <file>", "replay xlog file to the specified server"), gopt_option('h', 0, gopt_shorts('h', '?'), gopt_longs("help"), NULL, "display this help and exit")); void *opt = gopt_sort(&argc, (const char**)argv, opt_def); @@ -429,7 +418,7 @@ main(int argc, char *argv[]) /* wal-player mode */ if (wal_player_file) { - int rc = run_wal_player(t, wal_player_file); + int rc = run_wal_play(t, wal_player_file); tnt_stream_free(t); return rc; } diff --git a/connector/c/include/tarantool/tnt_request.h b/connector/c/include/tarantool/tnt_request.h index a52a692c7a..f38bcc4a51 100644 --- a/connector/c/include/tarantool/tnt_request.h +++ b/connector/c/include/tarantool/tnt_request.h @@ -6,16 +6,6 @@ typedef ssize_t (*tnt_request_t)(void *ptr, char *dst, ssize_t size); -enum tnt_request_type { - TNT_REQUEST_NONE, - TNT_REQUEST_PING, - TNT_REQUEST_INSERT, - TNT_REQUEST_DELETE, - TNT_REQUEST_UPDATE, - TNT_REQUEST_CALL, - TNT_REQUEST_SELECT -}; - struct tnt_request_insert { struct tnt_header_insert h; struct tnt_tuple t; @@ -59,7 +49,6 @@ struct tnt_request_select { }; struct tnt_request { - enum tnt_request_type type; struct tnt_header h; union { struct tnt_request_insert insert; diff --git a/connector/c/tnt/tnt_request.c b/connector/c/tnt/tnt_request.c index b336686bb1..27a0231e26 100644 --- a/connector/c/tnt/tnt_request.c +++ b/connector/c/tnt/tnt_request.c @@ -58,24 +58,24 @@ tnt_request_init(struct tnt_request *r) void tnt_request_free(struct tnt_request *r) { - switch (r->type) { - case TNT_REQUEST_INSERT: + switch (r->h.type) { + case TNT_OP_INSERT: tnt_tuple_free(&r->r.insert.t); break; - case TNT_REQUEST_DELETE: + case TNT_OP_DELETE: tnt_tuple_free(&r->r.delete.t); break; - case TNT_REQUEST_CALL: + case TNT_OP_CALL: if (r->r.call.proc) { tnt_mem_free(r->r.call.proc); r->r.call.proc = NULL; } tnt_tuple_free(&r->r.call.t); break; - case TNT_REQUEST_SELECT: + case TNT_OP_SELECT: tnt_list_free(&r->r.select.l); break; - case TNT_REQUEST_UPDATE: + case TNT_OP_UPDATE: tnt_tuple_free(&r->r.update.t); if (r->r.update.ops) { tnt_mem_free(r->r.update.ops); @@ -86,8 +86,7 @@ tnt_request_free(struct tnt_request *r) r->r.update.opv = NULL; } break; - case TNT_REQUEST_PING: - case TNT_REQUEST_NONE: + case TNT_OP_PING: break; } if (r->v) { @@ -128,7 +127,6 @@ tnt_request_insert(struct tnt_request *r, tnt_request_t rcv, void *ptr) r->v[2].iov_base = r->r.insert.t.data; r->v[2].iov_len = r->r.insert.t.size; tnt_mem_free(buf); - r->type = TNT_REQUEST_INSERT; return 0; } @@ -164,7 +162,6 @@ tnt_request_delete(struct tnt_request *r, tnt_request_t rcv, void *ptr) r->v[2].iov_base = r->r.delete.t.data; r->v[2].iov_len = r->r.delete.t.size; tnt_mem_free(buf); - r->type = TNT_REQUEST_DELETE; return 0; } @@ -213,7 +210,6 @@ tnt_request_call(struct tnt_request *r, tnt_request_t rcv, void *ptr) r->v[4].iov_base = r->r.call.t.data; r->v[4].iov_len = r->r.call.t.size; tnt_mem_free(buf); - r->type = TNT_REQUEST_CALL; return 0; error: tnt_tuple_free(&r->r.call.t); @@ -255,7 +251,6 @@ tnt_request_select(struct tnt_request *r, tnt_request_t rcv, void *ptr) goto error; off += size; } - r->type = TNT_REQUEST_SELECT; tnt_mem_free(buf); return 0; error: @@ -302,6 +297,7 @@ tnt_request_update(struct tnt_request *r, tnt_request_t rcv, void *ptr) memset(r->r.update.opv, 0, sizeof(opvsz)); /* allocating ops buffer */ + r->r.update.ops_size = 0; r->r.update.ops = tnt_mem_alloc(size); if (r->r.update.ops == NULL) goto error; @@ -326,6 +322,7 @@ tnt_request_update(struct tnt_request *r, tnt_request_t rcv, void *ptr) p += op->size_enc_len; op->data = p; p += op->size; + r->r.update.ops_size += 4 + 1 + op->size_enc_len + op->size; } /* creating resend io vector */ @@ -343,7 +340,6 @@ tnt_request_update(struct tnt_request *r, tnt_request_t rcv, void *ptr) r->v[3].iov_len = 4; r->v[4].iov_base = r->r.update.ops; r->v[4].iov_len = r->r.update.ops_size; - r->type = TNT_REQUEST_UPDATE; tnt_mem_free(buf); return 0; error: @@ -389,13 +385,9 @@ tnt_request_from(struct tnt_request *r, tnt_request_t rcv, void *ptr, case TNT_OP_CALL: return tnt_request_call(r, rcv, ptr); case TNT_OP_SELECT: return tnt_request_select(r, rcv, ptr); case TNT_OP_UPDATE: return tnt_request_update(r, rcv, ptr); - case TNT_OP_PING: - r->type = TNT_REQUEST_PING; - return 0; - default: - return -1; + case TNT_OP_PING: return 0; } - return 0; + return -1; } /* diff --git a/connector/c/tntnet/tnt_net.c b/connector/c/tntnet/tnt_net.c index 3099b095f8..f79fa10fb9 100644 --- a/connector/c/tntnet/tnt_net.c +++ b/connector/c/tntnet/tnt_net.c @@ -279,7 +279,7 @@ struct tnt_error_desc { static struct tnt_error_desc tnt_error_list[] = { - { TNT_EOK, "OK" }, + { TNT_EOK, "ok" }, { TNT_EFAIL, "fail" }, { TNT_EMEMORY, "memory allocation failed" }, { TNT_ESYSTEM, "system error" }, diff --git a/connector/c/tntrpl/tnt_xlog.c b/connector/c/tntrpl/tnt_xlog.c index d555dae448..487398aed3 100644 --- a/connector/c/tntrpl/tnt_xlog.c +++ b/connector/c/tntrpl/tnt_xlog.c @@ -130,7 +130,7 @@ tnt_xlog_request(struct tnt_stream *s, struct tnt_request *r) /* preparing pseudo iproto header */ struct tnt_header hdr_iproto; hdr_iproto.type = sx->row.op; - hdr_iproto.len = sx->hdr.len; + hdr_iproto.len = sx->hdr.len - sizeof(struct tnt_xlog_row_v11); hdr_iproto.reqid = 0; /* deserializing operation */ @@ -300,7 +300,7 @@ struct tnt_xlog_error_desc { static struct tnt_xlog_error_desc tnt_xlog_error_list[] = { - { TNT_XLOG_EOK, "OK" }, + { TNT_XLOG_EOK, "ok" }, { TNT_XLOG_EFAIL, "fail" }, { TNT_XLOG_EMEMORY, "memory allocation failed" }, { TNT_XLOG_ETYPE, "xlog type mismatch" }, diff --git a/connector/c/tntrpl/tnt_xlog.h b/connector/c/tntrpl/tnt_xlog.h deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/test/connector_c/rp.c b/test/connector_c/rp.c index 21f8a0ab4a..bea11a598c 100644 --- a/test/connector_c/rp.c +++ b/test/connector_c/rp.c @@ -48,28 +48,28 @@ main(int argc, char * argv[]) while (tnt_next(&i)) { struct tnt_request *r = TNT_IREQUEST_PTR(&i); - switch (r->type) { - case TNT_REQUEST_NONE: - printf("unknown?!\n"); - continue; - case TNT_REQUEST_PING: + switch (r->h.type) { + case TNT_OP_PING: printf("ping:"); break; - case TNT_REQUEST_INSERT: + case TNT_OP_INSERT: printf("insert:"); break; - case TNT_REQUEST_DELETE: + case TNT_OP_DELETE: printf("delete:"); break; - case TNT_REQUEST_UPDATE: + case TNT_OP_UPDATE: printf("update:"); break; - case TNT_REQUEST_CALL: + case TNT_OP_CALL: printf("call:"); break; - case TNT_REQUEST_SELECT: + case TNT_OP_SELECT: printf("select:"); break; + default: + printf("unknown?!\n"); + break; } struct tnt_stream_xlog *sx = TNT_SXLOG_CAST(&s); printf(" lsn: %"PRIu64", time: %f, len: %d\n", diff --git a/test/connector_c/tt.c b/test/connector_c/tt.c index 8453589374..ea88ef937b 100644 --- a/test/connector_c/tt.c +++ b/test/connector_c/tt.c @@ -305,9 +305,9 @@ static void tt_tnt_marshal_ping(struct tt_test *test) { tnt_iter_request(&i, &s); TT_ASSERT(tnt_next(&i) == 1); struct tnt_request *r = TNT_IREQUEST_PTR(&i); - TT_ASSERT(r->type == TNT_REQUEST_PING); + TT_ASSERT(r->h.type == TNT_OP_PING); TT_ASSERT(tnt_next(&i) == 1); - TT_ASSERT(r->type == TNT_REQUEST_PING); + TT_ASSERT(r->h.type == TNT_OP_PING); TT_ASSERT(tnt_next(&i) == 0); tnt_iter_free(&i); tnt_stream_free(&s); @@ -326,7 +326,7 @@ static void tt_tnt_marshal_insert(struct tt_test *test) { tnt_iter_request(&i, &s); TT_ASSERT(tnt_next(&i) == 1); struct tnt_request *r = TNT_IREQUEST_PTR(&i); - TT_ASSERT(r->type == TNT_REQUEST_INSERT); + TT_ASSERT(r->h.type == TNT_OP_INSERT); struct tnt_iter *f = tnt_field(NULL, &r->r.insert.t, 0); TT_ASSERT(tnt_field(f, NULL, 0) != NULL); TT_ASSERT(TNT_IFIELD_IDX(f) == 0); @@ -338,7 +338,7 @@ static void tt_tnt_marshal_insert(struct tt_test *test) { TT_ASSERT(*(uint32_t*)TNT_IFIELD_DATA(f) == 123); TT_ASSERT(tnt_next(&i) == 1); r = TNT_IREQUEST_PTR(&i); - TT_ASSERT(r->type == TNT_REQUEST_INSERT); + TT_ASSERT(r->h.type == TNT_OP_INSERT); TT_ASSERT(tnt_field(f, NULL, 0) != NULL); TT_ASSERT(TNT_IFIELD_IDX(f) == 0); TT_ASSERT(TNT_IFIELD_SIZE(f) == 3); @@ -366,7 +366,7 @@ static void tt_tnt_marshal_delete(struct tt_test *test) { tnt_iter_request(&i, &s); TT_ASSERT(tnt_next(&i) == 1); struct tnt_request *r = TNT_IREQUEST_PTR(&i); - TT_ASSERT(r->type == TNT_REQUEST_DELETE); + TT_ASSERT(r->h.type == TNT_OP_DELETE); struct tnt_iter *f = tnt_field(NULL, &r->r.delete.t, 0); TT_ASSERT(tnt_field(f, NULL, 0) != NULL); TT_ASSERT(TNT_IFIELD_IDX(f) == 0); @@ -374,7 +374,7 @@ static void tt_tnt_marshal_delete(struct tt_test *test) { TT_ASSERT(memcmp(TNT_IFIELD_DATA(f), "foo", 3) == 0); TT_ASSERT(tnt_next(&i) == 1); r = TNT_IREQUEST_PTR(&i); - TT_ASSERT(r->type == TNT_REQUEST_DELETE); + TT_ASSERT(r->h.type == TNT_OP_DELETE); TT_ASSERT(tnt_field(f, NULL, 0) != NULL); TT_ASSERT(TNT_IFIELD_IDX(f) == 0); TT_ASSERT(TNT_IFIELD_SIZE(f) == 3); @@ -398,7 +398,7 @@ static void tt_tnt_marshal_call(struct tt_test *test) { tnt_iter_request(&i, &s); TT_ASSERT(tnt_next(&i) == 1); struct tnt_request *r = TNT_IREQUEST_PTR(&i); - TT_ASSERT(r->type == TNT_REQUEST_CALL); + TT_ASSERT(r->h.type == TNT_OP_CALL); TT_ASSERT(strcmp(r->r.call.proc, "box.select") == 0); struct tnt_iter *f = tnt_field(NULL, &r->r.call.t, 0); TT_ASSERT(tnt_field(f, NULL, 0) != NULL); @@ -411,7 +411,7 @@ static void tt_tnt_marshal_call(struct tt_test *test) { TT_ASSERT(*(uint32_t*)TNT_IFIELD_DATA(f) == 123); TT_ASSERT(tnt_next(&i) == 1); r = TNT_IREQUEST_PTR(&i); - TT_ASSERT(r->type == TNT_REQUEST_CALL); + TT_ASSERT(r->h.type == TNT_OP_CALL); TT_ASSERT(strcmp(r->r.call.proc, "box.select") == 0); TT_ASSERT(tnt_field(f, NULL, 0) != NULL); TT_ASSERT(TNT_IFIELD_IDX(f) == 0); @@ -442,7 +442,7 @@ static void tt_tnt_marshal_select(struct tt_test *test) { tnt_iter_request(&i, &s); TT_ASSERT(tnt_next(&i) == 1); struct tnt_request *r = TNT_IREQUEST_PTR(&i); - TT_ASSERT(r->type == TNT_REQUEST_SELECT); + TT_ASSERT(r->h.type == TNT_OP_SELECT); struct tnt_iter il; tnt_iter_list(&il, &r->r.select.l); TT_ASSERT(tnt_next(&il) == 1); @@ -503,7 +503,7 @@ static void tt_tnt_marshal_update(struct tt_test *test) { tnt_iter_request(&i, &s); TT_ASSERT(tnt_next(&i) == 1); struct tnt_request *r = TNT_IREQUEST_PTR(&i); - TT_ASSERT(r->type == TNT_REQUEST_UPDATE); + TT_ASSERT(r->h.type == TNT_OP_UPDATE); TT_ASSERT(r->r.update.opc == 2); struct tnt_iter *f = tnt_field(NULL, &r->r.update.t, 0); TT_ASSERT(tnt_field(f, NULL, 0) != NULL); -- GitLab