components/mysql_server/my_metadata.cc (78 lines of code) (raw):

/* Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "components/mysql_server/my_metadata.h" my_metadata::my_metadata() {} my_metadata::my_metadata(my_metadata &other) : data(other.data) {} my_metadata::const_iterator::const_iterator( my_unordered_string_to_string_map::const_iterator iter, my_unordered_string_to_string_map *data_arg) : my_unordered_string_to_string_map::const_iterator(iter), data(data_arg) {} /** Gets pointer to structure the iterator is iterating over. */ my_unordered_string_to_string_map* my_metadata::const_iterator::get_data() { return data; } /** Checks if iterator is pointing behind the end element. */ bool my_metadata::const_iterator::is_at_end() { return (*static_cast<my_unordered_string_to_string_map::const_iterator *>( this)) == data->cend(); } /** Sets a value for the name specified. Adds to the metadata list if absent. Copies the data into the structure, original values don't need to be around after this function is called. @param name The name string of the metadata pair to be added. @param value The value string of the metadata pair. @return Status of performed operation @retval false success @retval true failure */ bool my_metadata::set_value(const char* name, const char* value) { try { my_string key_str= name; my_string value_str= value; my_unordered_string_to_string_map::iterator it= data.find(key_str); if (it != data.end()) { it->second= value_str; } else { data.emplace(std::move(key_str), std::move(value_str)); } return false; } catch (...) { } return true; } /** Gets value for the name specified. The value is unmodified if not found. Doesn't copy the result value, so it requires synchronization to prevent other threads to modify structure. @param name The name string of the metadata pair. @param [out] value The value string of the metadata pair. @return Status of performed operation @retval false success @retval true failure */ bool my_metadata::get_value(const char* name, const char** value) { try { my_unordered_string_to_string_map::const_iterator iter= data.find( my_string(name)); if (iter == data.end()) { return true; } *value= iter->second.c_str(); return false; } catch (...) { } return true; } /** Creates an iterator over the metadata. Positions on the first value. @return Reference to the iterator created. */ my_metadata::const_iterator my_metadata::create_iterator() { return my_metadata::const_iterator(data.begin(), &data); } /** Frees an iterator over the metadata. Iterator must be allocated through create_iterator(); @param iter Pointer to the iterator to release. @return Status of performed operation @retval false success @retval true failure */ bool my_metadata::release_iterator(const_iterator* iter) { try { delete iter; return false; } catch (...) { } return true; }