1 /* Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
2 
3    This program is free software; you can redistribute it and/or modify
4    it under the terms of the GNU General Public License, version 2.0,
5    as published by the Free Software Foundation.
6 
7    This program is also distributed with certain software (including
8    but not limited to OpenSSL) that is licensed under separate terms,
9    as designated in a particular file or component or in included license
10    documentation.  The authors of MySQL hereby grant you an additional
11    permission to link the program and your derivative works with the
12    separately licensed software that they have included with MySQL.
13 
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License, version 2.0, for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA */
22 
23 #ifndef DD__PARTITION_VALUE_IMPL_INCLUDED
24 #define DD__PARTITION_VALUE_IMPL_INCLUDED
25 
26 #include <stddef.h>
27 #include <sys/types.h>
28 #include <new>
29 
30 #include "sql/dd/impl/types/weak_object_impl.h"  // dd::Weak_object_impl
31 #include "sql/dd/sdi_fwd.h"
32 #include "sql/dd/string_type.h"
33 #include "sql/dd/types/partition_value.h"  // dd::Partition_value
34 
35 namespace dd {
36 
37 ///////////////////////////////////////////////////////////////////////////
38 
39 class Object_key;
40 class Object_table;
41 class Open_dictionary_tables_ctx;
42 class Partition;
43 class Partition_impl;
44 class Raw_record;
45 class Sdi_rcontext;
46 class Sdi_wcontext;
47 class Weak_object;
48 
49 ///////////////////////////////////////////////////////////////////////////
50 
51 class Partition_value_impl : public Weak_object_impl, public Partition_value {
52  public:
Partition_value_impl()53   Partition_value_impl()
54       : m_max_value(false),
55         m_null_value(false),
56         m_list_num(0),
57         m_column_num(0),
58         m_partition(nullptr) {}
59 
Partition_value_impl(Partition_impl * partition)60   Partition_value_impl(Partition_impl *partition)
61       : m_max_value(false),
62         m_null_value(false),
63         m_list_num(0),
64         m_column_num(0),
65         m_partition(partition) {}
66 
67   Partition_value_impl(const Partition_value_impl &src, Partition_impl *parent);
68 
~Partition_value_impl()69   virtual ~Partition_value_impl() {}
70 
71  public:
72   virtual const Object_table &object_table() const;
73 
74   virtual bool validate() const;
75 
76   virtual bool store_attributes(Raw_record *r);
77 
78   virtual bool restore_attributes(const Raw_record &r);
79 
80   void serialize(Sdi_wcontext *wctx, Sdi_writer *w) const;
81 
82   bool deserialize(Sdi_rcontext *rctx, const RJ_Value &val);
83 
set_ordinal_position(uint)84   void set_ordinal_position(uint) {}
85 
ordinal_position()86   virtual uint ordinal_position() const { return -1; }
87 
88  public:
89   static void register_tables(Open_dictionary_tables_ctx *otx);
90 
91   /////////////////////////////////////////////////////////////////////////
92   // index.
93   /////////////////////////////////////////////////////////////////////////
94 
95   virtual const Partition &partition() const;
96 
97   virtual Partition &partition();
98 
99   /////////////////////////////////////////////////////////////////////////
100   // list_num.
101   /////////////////////////////////////////////////////////////////////////
102 
list_num()103   virtual uint list_num() const { return m_list_num; }
104 
set_list_num(uint list_num)105   virtual void set_list_num(uint list_num) { m_list_num = list_num; }
106 
107   /////////////////////////////////////////////////////////////////////////
108   // column_num.
109   /////////////////////////////////////////////////////////////////////////
110 
column_num()111   virtual uint column_num() const { return m_column_num; }
112 
set_column_num(uint column_num)113   virtual void set_column_num(uint column_num) { m_column_num = column_num; }
114 
115   /////////////////////////////////////////////////////////////////////////
116   // value.
117   /////////////////////////////////////////////////////////////////////////
118 
value_utf8()119   virtual const String_type &value_utf8() const { return m_value_utf8; }
120 
set_value_utf8(const String_type & value)121   virtual void set_value_utf8(const String_type &value) {
122     m_value_utf8 = value;
123   }
124 
125   ////////////////////////////////////////////////////////////////
126   // max_value.
127   /////////////////////////////////////////////////////////////////////////
128 
max_value()129   virtual bool max_value() const { return m_max_value; }
130 
set_max_value(bool max_value)131   virtual void set_max_value(bool max_value) { m_max_value = max_value; }
132 
133   ////////////////////////////////////////////////////////////////
134   // null_value.
135   /////////////////////////////////////////////////////////////////////////
136 
is_value_null()137   virtual bool is_value_null() const { return m_null_value; }
138 
set_value_null(bool is_null)139   virtual void set_value_null(bool is_null) { m_null_value = is_null; }
140 
141   /////////////////////////////////////////////////////////////////////////
142 
143  public:
restore_item(Partition_impl * partition)144   static Partition_value_impl *restore_item(Partition_impl *partition) {
145     return new (std::nothrow) Partition_value_impl(partition);
146   }
147 
clone(const Partition_value_impl & other,Partition_impl * partition)148   static Partition_value_impl *clone(const Partition_value_impl &other,
149                                      Partition_impl *partition) {
150     return new (std::nothrow) Partition_value_impl(other, partition);
151   }
152 
153  public:
154   virtual void debug_print(String_type &outb) const;
155 
156  public:
157   virtual Object_key *create_primary_key() const;
158   virtual bool has_new_primary_key() const;
159 
160  private:
161   // Fields
162   bool m_max_value;
163   bool m_null_value;
164 
165   uint m_list_num;
166   uint m_column_num;
167 
168   String_type m_value_utf8;
169 
170   // References to other objects
171   Partition_impl *m_partition;
172 };
173 
174 ///////////////////////////////////////////////////////////////////////////
175 
176 /**
177   Used to sort Partition_value objects for the same partition first
178   according to list number and then according to the column number.
179 */
180 
181 struct Partition_value_order_comparator {
operatorPartition_value_order_comparator182   bool operator()(const dd::Partition_value *pv1,
183                   const dd::Partition_value *pv2) const {
184     return ((pv1->list_num() < pv2->list_num()) ||
185             (pv1->list_num() == pv2->list_num() &&
186              pv1->column_num() < pv2->column_num()));
187   }
188 };
189 
190 ///////////////////////////////////////////////////////////////////////////
191 
192 }  // namespace dd
193 
194 #endif  // DD__PARTITION_VALUE_IMPL_INCLUDED
195