Lines Matching refs:cmd

22 	enum dict_protocol_cmd cmd;  member
23 int (*func)(struct dict_connection_cmd *cmd, const char *const *args);
27 const struct dict_cmd_func *cmd; member
45 static int cmd_iterate_flush(struct dict_connection_cmd *cmd);
47 static bool dict_connection_cmd_output_more(struct dict_connection_cmd *cmd);
49 static void dict_connection_cmd_free(struct dict_connection_cmd *cmd) in dict_connection_cmd_free() argument
53 if (dict_iterate_deinit(&cmd->iter, &error) < 0) in dict_connection_cmd_free()
54 e_error(cmd->event, "dict_iterate() failed: %s", error); in dict_connection_cmd_free()
55 i_free(cmd->reply); in dict_connection_cmd_free()
56 if (cmd->uncork_pending) in dict_connection_cmd_free()
57 o_stream_uncork(cmd->conn->conn.output); in dict_connection_cmd_free()
59 if (dict_connection_unref(cmd->conn) && !cmd->conn->destroyed) in dict_connection_cmd_free()
60 connection_input_resume(&cmd->conn->conn); in dict_connection_cmd_free()
61 event_unref(&cmd->event); in dict_connection_cmd_free()
62 i_free(cmd); in dict_connection_cmd_free()
65 static void dict_connection_cmd_remove(struct dict_connection_cmd *cmd) in dict_connection_cmd_remove() argument
70 cmds = array_get(&cmd->conn->cmds, &count); in dict_connection_cmd_remove()
72 if (cmds[i] == cmd) { in dict_connection_cmd_remove()
73 array_delete(&cmd->conn->cmds, i, 1); in dict_connection_cmd_remove()
74 dict_connection_cmd_free(cmd); in dict_connection_cmd_remove()
83 struct dict_connection_cmd *cmd, *const *first_cmdp; in dict_connection_cmds_flush() local
90 cmd = *first_cmdp; in dict_connection_cmds_flush()
92 i_assert(cmd->async_reply_id == 0); in dict_connection_cmds_flush()
95 if (cmd->iter != NULL) in dict_connection_cmds_flush()
96 (void)cmd_iterate_flush(cmd); in dict_connection_cmds_flush()
98 if (cmd->reply == NULL) { in dict_connection_cmds_flush()
103 o_stream_nsend_str(conn->conn.output, cmd->reply); in dict_connection_cmds_flush()
104 dict_connection_cmd_remove(cmd); in dict_connection_cmds_flush()
111 struct dict_connection_cmd *cmd = *_cmd; in dict_connection_cmd_try_flush() local
114 if (cmd->conn->conn.minor_version < DICT_CLIENT_PROTOCOL_UNORDERED_MIN_VERSION) { in dict_connection_cmd_try_flush()
115 dict_connection_cmds_flush(cmd->conn); in dict_connection_cmd_try_flush()
118 i_assert(cmd->async_reply_id != 0); in dict_connection_cmd_try_flush()
119 i_assert(cmd->reply != NULL); in dict_connection_cmd_try_flush()
121 o_stream_nsend_str(cmd->conn->conn.output, t_strdup_printf("%c%u\t%s", in dict_connection_cmd_try_flush()
123 cmd->async_reply_id, cmd->reply)); in dict_connection_cmd_try_flush()
124 dict_connection_cmd_remove(cmd); in dict_connection_cmd_try_flush()
127 static void dict_connection_cmd_async(struct dict_connection_cmd *cmd) in dict_connection_cmd_async() argument
129 if (cmd->conn->conn.minor_version < DICT_CLIENT_PROTOCOL_UNORDERED_MIN_VERSION) in dict_connection_cmd_async()
132 i_assert(cmd->async_reply_id == 0); in dict_connection_cmd_async()
133 cmd->async_reply_id = ++cmd->conn->async_id_counter; in dict_connection_cmd_async()
134 if (cmd->async_reply_id == 0) in dict_connection_cmd_async()
135 cmd->async_reply_id = ++cmd->conn->async_id_counter; in dict_connection_cmd_async()
136 o_stream_nsend_str(cmd->conn->conn.output, t_strdup_printf("%c%u\n", in dict_connection_cmd_async()
137 DICT_PROTOCOL_REPLY_ASYNC_ID, cmd->async_reply_id)); in dict_connection_cmd_async()
141 cmd_stats_update(struct dict_connection_cmd *cmd, struct stats_dist *stats) in cmd_stats_update() argument
148 diff = timeval_diff_usecs(&ioloop_timeval, &cmd->start_timeval); in cmd_stats_update()
156 dict_cmd_reply_handle_stats(struct dict_connection_cmd *cmd, in dict_cmd_reply_handle_stats() argument
160 cmd_stats_update(cmd, stats); in dict_cmd_reply_handle_stats()
162 if (cmd->conn->conn.minor_version < DICT_CLIENT_PROTOCOL_TIMINGS_MIN_VERSION) in dict_cmd_reply_handle_stats()
165 (long)cmd->start_timeval.tv_sec, in dict_cmd_reply_handle_stats()
166 (unsigned int)cmd->start_timeval.tv_usec, in dict_cmd_reply_handle_stats()
172 cmd_lookup_write_reply(struct dict_connection_cmd *cmd, in cmd_lookup_write_reply() argument
179 if (cmd->conn->conn.minor_version < DICT_CLIENT_PROTOCOL_VERSION_MIN_MULTI_OK || in cmd_lookup_write_reply()
198 struct dict_connection_cmd *cmd) in cmd_lookup_callback() argument
202 event_set_name(cmd->event, "dict_server_lookup_finished"); in cmd_lookup_callback()
204 cmd_lookup_write_reply(cmd, result->values, str); in cmd_lookup_callback()
205 e_debug(cmd->event, "Lookup finished"); in cmd_lookup_callback()
207 event_add_str(cmd->event, "key_not_found", "yes"); in cmd_lookup_callback()
209 e_debug(cmd->event, "Lookup finished without results"); in cmd_lookup_callback()
211 event_add_str(cmd->event, "error", result->error); in cmd_lookup_callback()
212 e_error(cmd->event, "Lookup failed: %s", result->error); in cmd_lookup_callback()
216 dict_cmd_reply_handle_stats(cmd, str, cmd_stats.lookups); in cmd_lookup_callback()
219 cmd->reply = i_strdup(str_c(str)); in cmd_lookup_callback()
220 dict_connection_cmd_try_flush(&cmd); in cmd_lookup_callback()
223 static int cmd_lookup(struct dict_connection_cmd *cmd, const char *const *args) in cmd_lookup() argument
228 e_error(cmd->event, "LOOKUP: broken input"); in cmd_lookup()
234 dict_connection_cmd_async(cmd); in cmd_lookup()
235 event_add_str(cmd->event, "key", args[0]); in cmd_lookup()
236 event_add_str(cmd->event, "user", username); in cmd_lookup()
240 dict_lookup_async(cmd->conn->dict, &set, args[0], cmd_lookup_callback, cmd); in cmd_lookup()
261 cmd_iterate_flush_finish(struct dict_connection_cmd *cmd, string_t *str) in cmd_iterate_flush_finish() argument
265 event_set_name(cmd->event, "dict_server_iteration_finished"); in cmd_iterate_flush_finish()
267 if (dict_iterate_deinit(&cmd->iter, &error) < 0) { in cmd_iterate_flush_finish()
268 event_add_str(cmd->event, "error", error); in cmd_iterate_flush_finish()
269 e_error(cmd->event, "dict_iterate() failed: %s", error); in cmd_iterate_flush_finish()
272 event_add_int(cmd->event, "rows", cmd->rows); in cmd_iterate_flush_finish()
273 e_debug(cmd->event, "Iteration finished"); in cmd_iterate_flush_finish()
275 dict_cmd_reply_handle_stats(cmd, str, cmd_stats.iterations); in cmd_iterate_flush_finish()
278 cmd->reply = i_strdup(str_c(str)); in cmd_iterate_flush_finish()
281 static int cmd_iterate_flush(struct dict_connection_cmd *cmd) in cmd_iterate_flush() argument
286 if (cmd->conn->destroyed) { in cmd_iterate_flush()
287 cmd_iterate_flush_finish(cmd, str); in cmd_iterate_flush()
291 if (!dict_connection_flush_if_full(cmd->conn)) in cmd_iterate_flush()
294 while (dict_iterate_values(cmd->iter, &key, &values)) { in cmd_iterate_flush()
295 cmd->rows++; in cmd_iterate_flush()
297 if (cmd->async_reply_id != 0) { in cmd_iterate_flush()
299 str_printfa(str, "%u\t", cmd->async_reply_id); in cmd_iterate_flush()
304 if ((cmd->iter_flags & DICT_ITERATE_FLAG_NO_VALUE) == 0) { in cmd_iterate_flush()
312 o_stream_nsend(cmd->conn->conn.output, str_data(str), str_len(str)); in cmd_iterate_flush()
314 if (!dict_connection_flush_if_full(cmd->conn)) in cmd_iterate_flush()
317 if (dict_iterate_has_more(cmd->iter)) { in cmd_iterate_flush()
322 cmd_iterate_flush_finish(cmd, str); in cmd_iterate_flush()
326 static void cmd_iterate_callback(struct dict_connection_cmd *cmd) in cmd_iterate_callback() argument
328 struct dict_connection *conn = cmd->conn; in cmd_iterate_callback()
340 cmd->uncork_pending = FALSE; in cmd_iterate_callback()
341 if (dict_connection_cmd_output_more(cmd)) { in cmd_iterate_callback()
351 cmd->uncork_pending = TRUE; in cmd_iterate_callback()
356 static int cmd_iterate(struct dict_connection_cmd *cmd, const char *const *args) in cmd_iterate() argument
365 e_error(cmd->event, "ITERATE: broken input"); in cmd_iterate()
368 dict_connection_cmd_async(cmd); in cmd_iterate()
377 event_add_str(cmd->event, "key", args[2]); in cmd_iterate()
378 event_add_str(cmd->event, "user", username); in cmd_iterate()
379 cmd->iter = dict_iterate_init(cmd->conn->dict, &set, args[2], flags); in cmd_iterate()
380 cmd->iter_flags = flags; in cmd_iterate()
382 dict_iterate_set_limit(cmd->iter, max_rows); in cmd_iterate()
383 dict_iterate_set_async_callback(cmd->iter, cmd_iterate_callback, cmd); in cmd_iterate()
384 (void)dict_connection_cmd_output_more(cmd); in cmd_iterate()
422 static int cmd_begin(struct dict_connection_cmd *cmd, const char *const *args) in cmd_begin() argument
429 e_error(cmd->event, "BEGIN: broken input"); in cmd_begin()
436 e_error(cmd->event, "Invalid transaction ID %s", args[0]); in cmd_begin()
439 if (dict_connection_transaction_lookup(cmd->conn, id) != NULL) { in cmd_begin()
440 e_error(cmd->event, "Transaction ID %u already exists", id); in cmd_begin()
444 if (!array_is_created(&cmd->conn->transactions)) in cmd_begin()
445 i_array_init(&cmd->conn->transactions, 4); in cmd_begin()
450 trans = array_append_space(&cmd->conn->transactions); in cmd_begin()
452 trans->conn = cmd->conn; in cmd_begin()
453 trans->ctx = dict_transaction_begin(cmd->conn->dict, &set); in cmd_begin()
477 cmd_commit_finish(struct dict_connection_cmd *cmd, in cmd_commit_finish() argument
483 event_set_name(cmd->event, "dict_server_transaction_finished"); in cmd_commit_finish()
489 event_add_str(cmd->event, "key_not_found", "yes"); in cmd_commit_finish()
494 event_add_str(cmd->event, "write_uncertain", "yes"); in cmd_commit_finish()
495 event_add_str(cmd->event, "error", result->error); in cmd_commit_finish()
501 event_add_str(cmd->event, "error", result->error); in cmd_commit_finish()
507 str_printfa(str, "%c%u", chr, cmd->trans_id); in cmd_commit_finish()
513 dict_cmd_reply_handle_stats(cmd, str, cmd_stats.commits); in cmd_commit_finish()
515 cmd->reply = i_strdup(str_c(str)); in cmd_commit_finish()
518 e_debug(cmd->event, "Transaction finished: %s", result->error); in cmd_commit_finish()
520 e_debug(cmd->event, "Transaction finished"); in cmd_commit_finish()
521 dict_connection_transaction_array_remove(cmd->conn, cmd->trans_id); in cmd_commit_finish()
522 dict_connection_cmd_try_flush(&cmd); in cmd_commit_finish()
526 struct dict_connection_cmd *cmd) in cmd_commit_callback() argument
528 cmd_commit_finish(cmd, result, FALSE); in cmd_commit_callback()
532 struct dict_connection_cmd *cmd) in cmd_commit_callback_async() argument
534 cmd_commit_finish(cmd, result, TRUE); in cmd_commit_callback_async()
538 cmd_commit(struct dict_connection_cmd *cmd, const char *const *args) in cmd_commit() argument
542 if (dict_connection_transaction_lookup_parse(cmd->conn, args[0], &trans) < 0) in cmd_commit()
544 cmd->trans_id = trans->id; in cmd_commit()
545 event_add_str(cmd->event, "user", trans->ctx->set.username); in cmd_commit()
547 dict_connection_cmd_async(cmd); in cmd_commit()
548 dict_transaction_commit_async(&trans->ctx, cmd_commit_callback, cmd); in cmd_commit()
553 cmd_commit_async(struct dict_connection_cmd *cmd, const char *const *args) in cmd_commit_async() argument
557 if (dict_connection_transaction_lookup_parse(cmd->conn, args[0], &trans) < 0) in cmd_commit_async()
559 cmd->trans_id = trans->id; in cmd_commit_async()
560 event_add_str(cmd->event, "user", trans->ctx->set.username); in cmd_commit_async()
562 dict_connection_cmd_async(cmd); in cmd_commit_async()
563 dict_transaction_commit_async(&trans->ctx, cmd_commit_callback_async, cmd); in cmd_commit_async()
568 cmd_rollback(struct dict_connection_cmd *cmd, const char *const *args) in cmd_rollback() argument
572 if (dict_connection_transaction_lookup_parse(cmd->conn, args[0], &trans) < 0) in cmd_rollback()
575 event_add_str(cmd->event, "user", trans->ctx->set.username); in cmd_rollback()
577 dict_connection_transaction_array_remove(cmd->conn, trans->id); in cmd_rollback()
581 static int cmd_set(struct dict_connection_cmd *cmd, const char *const *args) in cmd_set() argument
587 e_error(cmd->event, "SET: broken input"); in cmd_set()
591 if (dict_connection_transaction_lookup_parse(cmd->conn, args[0], &trans) < 0) in cmd_set()
593 event_add_str(cmd->event, "user", trans->ctx->set.username); in cmd_set()
598 static int cmd_unset(struct dict_connection_cmd *cmd, const char *const *args) in cmd_unset() argument
604 e_error(cmd->event, "UNSET: broken input"); in cmd_unset()
608 if (dict_connection_transaction_lookup_parse(cmd->conn, args[0], &trans) < 0) in cmd_unset()
615 cmd_atomic_inc(struct dict_connection_cmd *cmd, const char *const *args) in cmd_atomic_inc() argument
623 e_error(cmd->event, "ATOMIC_INC: broken input"); in cmd_atomic_inc()
627 if (dict_connection_transaction_lookup_parse(cmd->conn, args[0], &trans) < 0) in cmd_atomic_inc()
634 static int cmd_timestamp(struct dict_connection_cmd *cmd, const char *const *args) in cmd_timestamp() argument
644 e_error(cmd->event, "TIMESTAMP: broken input"); in cmd_timestamp()
648 if (dict_connection_transaction_lookup_parse(cmd->conn, args[0], &trans) < 0) in cmd_timestamp()
674 static const struct dict_cmd_func *dict_command_find(enum dict_protocol_cmd cmd) in dict_command_find() argument
678 for (i = 0; cmds[i].cmd != '\0'; i++) { in dict_command_find()
679 if (cmds[i].cmd == cmd) in dict_command_find()
688 struct dict_connection_cmd *cmd; in dict_command_input() local
698 cmd = i_new(struct dict_connection_cmd, 1); in dict_command_input()
699 cmd->conn = conn; in dict_command_input()
700 cmd->event = event_create(cmd->conn->conn.event); in dict_command_input()
701 cmd->cmd = cmd_func; in dict_command_input()
702 cmd->start_timeval = ioloop_timeval; in dict_command_input()
703 array_push_back(&conn->cmds, &cmd); in dict_command_input()
707 if ((ret = cmd_func->func(cmd, args)) <= 0) { in dict_command_input()
708 dict_connection_cmd_remove(cmd); in dict_command_input()
716 struct dict_connection_cmd *cmd; in dict_connection_cmds_try_output_more() local
719 array_foreach_elem(&conn->cmds, cmd) { in dict_connection_cmds_try_output_more()
720 if (cmd->iter == NULL) { in dict_connection_cmds_try_output_more()
722 } else if (cmd_iterate_flush(cmd) == 0) { in dict_connection_cmds_try_output_more()
725 dict_connection_cmd_try_flush(&cmd); in dict_connection_cmds_try_output_more()
744 static bool dict_connection_cmd_output_more(struct dict_connection_cmd *cmd) in dict_connection_cmd_output_more() argument
748 if (cmd->conn->conn.minor_version < DICT_CLIENT_PROTOCOL_TIMINGS_MIN_VERSION) { in dict_connection_cmd_output_more()
749 first_cmdp = array_front(&cmd->conn->cmds); in dict_connection_cmd_output_more()
750 if (*first_cmdp != cmd) in dict_connection_cmd_output_more()
753 return dict_connection_cmds_try_output_more(cmd->conn); in dict_connection_cmd_output_more()