| 693 | } |
| 694 | |
| 695 | void |
| 696 | dbcontext::cmd_find_internal(dbcallback_i& cb, const prep_stmt& pst, |
| 697 | ha_rkey_function find_flag, const cmd_exec_args& args) |
| 698 | { |
| 699 | const bool debug_out = (verbose_level >= 100); |
| 700 | bool need_resp_record = true; |
| 701 | char mod_op = 0; |
| 702 | const string_ref& mod_op_str = args.mod_op; |
| 703 | if (mod_op_str.size() != 0) { |
| 704 | if (!for_write_flag) { |
| 705 | return cb.dbcb_resp_short(2, "readonly"); |
| 706 | } |
| 707 | mod_op = mod_op_str.begin()[0]; |
| 708 | need_resp_record = mod_op_str.size() > 1 && mod_op_str.begin()[1] == '?'; |
| 709 | switch (mod_op) { |
| 710 | case 'U': /* update */ |
| 711 | case 'D': /* delete */ |
| 712 | case '+': /* increment */ |
| 713 | case '-': /* decrement */ |
| 714 | break; |
| 715 | default: |
| 716 | if (debug_out) { |
| 717 | fprintf(stderr, "unknown modop: %c\n", mod_op); |
| 718 | } |
| 719 | return cb.dbcb_resp_short(2, "modop"); |
| 720 | } |
| 721 | } |
| 722 | lock_tables_if(); |
| 723 | if (lock == 0) { |
| 724 | return cb.dbcb_resp_short(1, "lock_tables"); |
| 725 | } |
| 726 | if (pst.get_table_id() >= table_vec.size()) { |
| 727 | return cb.dbcb_resp_short(2, "tblnum"); |
| 728 | } |
| 729 | TABLE *const table = table_vec[pst.get_table_id()].table; |
| 730 | /* keys */ |
| 731 | if (pst.get_idxnum() >= table->s->keys) { |
| 732 | return cb.dbcb_resp_short(2, "idxnum"); |
| 733 | } |
| 734 | KEY& kinfo = table->key_info[pst.get_idxnum()]; |
| 735 | if (args.kvalslen > kinfo.user_defined_key_parts) { |
| 736 | return cb.dbcb_resp_short(2, "kpnum"); |
| 737 | } |
| 738 | uchar *const key_buf = DENA_ALLOCA_ALLOCATE(uchar, kinfo.key_length); |
| 739 | size_t invalues_idx = 0; |
| 740 | size_t kplen_sum = prepare_keybuf(args, key_buf, table, kinfo, invalues_idx); |
| 741 | /* filters */ |
| 742 | uchar *filter_buf = 0; |
| 743 | if (args.filters != 0) { |
| 744 | const size_t filter_buf_len = calc_filter_buf_size(table, pst, |
| 745 | args.filters); |
| 746 | filter_buf = DENA_ALLOCA_ALLOCATE(uchar, filter_buf_len); |
| 747 | if (!fill_filter_buf(table, pst, args.filters, filter_buf, |
| 748 | filter_buf_len)) { |
| 749 | return cb.dbcb_resp_short(2, "filterblob"); |
| 750 | } |
| 751 | } |
| 752 | /* handler */ |
nothing calls this directly
no test coverage detected