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