1 | /* -*- c-basic-offset: 2 -*- */ |
2 | /* |
3 | Copyright(C) 2012-2013 Kouhei Sutou <kou@clear-code.com> |
4 | |
5 | This library is free software; you can redistribute it and/or |
6 | modify it under the terms of the GNU Lesser General Public |
7 | License as published by the Free Software Foundation; either |
8 | version 2.1 of the License, or (at your option) any later version. |
9 | |
10 | This library is distributed in the hope that it will be useful, |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 | Lesser General Public License for more details. |
14 | |
15 | You should have received a copy of the GNU Lesser General Public |
16 | License along with this library; if not, write to the Free Software |
17 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
18 | */ |
19 | |
20 | #ifndef MRN_MULTIPLE_COLUMN_KEY_CODEC_HPP_ |
21 | #define MRN_MULTIPLE_COLUMN_KEY_CODEC_HPP_ |
22 | |
23 | #include <mrn_mysql.h> |
24 | #include <mrn_mysql_compat.h> |
25 | |
26 | #include <groonga.h> |
27 | |
28 | namespace mrn { |
29 | class MultipleColumnKeyCodec { |
30 | public: |
31 | MultipleColumnKeyCodec(grn_ctx *ctx, THD *thread, KEY *key_info); |
32 | ~MultipleColumnKeyCodec(); |
33 | |
34 | int encode(const uchar *mysql_key, uint mysql_key_length, |
35 | uchar *grn_key, uint *grn_key_length); |
36 | int decode(const uchar *grn_key, uint grn_key_length, |
37 | uchar *mysql_key, uint *mysql_key_length); |
38 | uint size(); |
39 | |
40 | private: |
41 | enum DataType { |
42 | TYPE_UNKNOWN, |
43 | TYPE_LONG_LONG_NUMBER, |
44 | TYPE_NUMBER, |
45 | TYPE_FLOAT, |
46 | TYPE_DOUBLE, |
47 | TYPE_DATETIME, |
48 | #ifdef MRN_HAVE_MYSQL_TYPE_DATETIME2 |
49 | TYPE_DATETIME2, |
50 | #endif |
51 | TYPE_BYTE_SEQUENCE, |
52 | TYPE_BYTE_REVERSE, |
53 | TYPE_BYTE_BLOB |
54 | }; |
55 | |
56 | grn_ctx *ctx_; |
57 | THD *thread_; |
58 | KEY *key_info_; |
59 | |
60 | void get_key_info(KEY_PART_INFO *key_part, |
61 | DataType *data_type, uint *data_size); |
62 | |
63 | void encode_number(const uchar *mysql_key, |
64 | uint mysql_key_size, |
65 | bool is_signed, |
66 | uchar *grn_key); |
67 | void decode_number(const uchar *grn_key, |
68 | uint grn_key_size, |
69 | bool is_signed, |
70 | uchar *mysql_key); |
71 | void encode_long_long_int(volatile long long int value, |
72 | uchar *grn_key); |
73 | void decode_long_long_int(const uchar *grn_key, |
74 | long long int *value); |
75 | void encode_float(volatile float value, |
76 | uint value_size, |
77 | uchar *grn_key); |
78 | void decode_float(const uchar *grn_key, |
79 | uint grn_key_size, |
80 | uchar *mysql_key); |
81 | void encode_double(volatile double value, |
82 | uint value_size, |
83 | uchar *grn_key); |
84 | void decode_double(const uchar *grn_key, |
85 | uint grn_key_size, |
86 | uchar *mysql_key); |
87 | void encode_reverse(const uchar *mysql_key, |
88 | uint mysql_key_size, |
89 | uchar *grn_key); |
90 | void decode_reverse(const uchar *grn_key, |
91 | uint grn_key_size, |
92 | uchar *mysql_key); |
93 | void encode_blob(const uchar *mysql_key, |
94 | uint *mysql_key_size, |
95 | Field *field, |
96 | uchar *grn_key); |
97 | }; |
98 | } |
99 | |
100 | #endif // MRN_MULTIPLE_COLUMN_KEY_CODEC_HPP_ |
101 | |