29
29
#include < cstdlib>
30
30
#include < memory>
31
31
#include < new>
32
+ #include < string_view>
32
33
33
34
#include " mysql/my_loglevel.h"
34
35
#include " mysql/strings/collations.h"
@@ -545,28 +546,36 @@ class Charset_loader : public MY_CHARSET_LOADER {
545
546
void *read_file (const char *, size_t *) override { return nullptr ; }
546
547
};
547
548
548
- template < typename Key>
549
- using Hash = std::unordered_map<Key, CHARSET_INFO *> ;
549
+ using id_hash_map = mysql::collation_internals::id_hash_map;
550
+ using sv_hash_map = mysql::collation_internals::sv_hash_map ;
550
551
551
- template <typename Key>
552
- CHARSET_INFO *find_in_hash (const Hash<Key> &hash, Key key) {
552
+ CHARSET_INFO *find_in_hash (const sv_hash_map &hash, std::string_view key) {
553
+ auto it = hash.find ((key));
554
+ return it == hash.end () ? nullptr : it->second ;
555
+ }
556
+
557
+ CHARSET_INFO *find_in_hash (const id_hash_map &hash, unsigned key) {
553
558
auto it = hash.find (key);
554
559
return it == hash.end () ? nullptr : it->second ;
555
560
}
556
561
557
- CHARSET_INFO *find_collation_in_hash (const Hash<std::string> &hash,
558
- const std::string & key) {
562
+ CHARSET_INFO *find_collation_in_hash (const sv_hash_map &hash,
563
+ std::string_view key) {
559
564
return find_in_hash (hash, key);
560
565
}
561
566
562
- CHARSET_INFO *find_cs_in_hash (const Hash<std::string> &hash,
563
- const mysql::collation::Name &key) {
564
- auto it = hash.find (key ());
567
+ CHARSET_INFO *find_cs_in_hash (const sv_hash_map &hash, std::string_view key) {
568
+ auto it = hash.find (key);
565
569
return it == hash.end () ? nullptr : it->second ;
566
570
}
567
571
568
- template <typename Key>
569
- bool add_to_hash (Hash<Key> *hash, Key key, CHARSET_INFO *cs) {
572
+ bool add_to_hash (id_hash_map *hash, unsigned key, CHARSET_INFO *cs) {
573
+ // return !hash->insert({key, cs}).second;
574
+ (*hash)[key] = cs;
575
+ return false ;
576
+ }
577
+
578
+ bool add_to_hash (sv_hash_map *hash, std::string key, CHARSET_INFO *cs) {
570
579
// return !hash->insert({key, cs}).second;
571
580
(*hash)[key] = cs;
572
581
return false ;
@@ -639,7 +648,8 @@ Collations::~Collations() {
639
648
CHARSET_INFO *Collations::find_by_name (const mysql::collation::Name &name,
640
649
myf flags, MY_CHARSET_ERRMSG *errmsg) {
641
650
return safe_init_when_necessary (
642
- find_collation_in_hash (m_all_by_collation_name, name ()), flags, errmsg);
651
+ find_collation_in_hash (m_all_by_collation_name, name.to_string_view ()),
652
+ flags, errmsg);
643
653
}
644
654
645
655
CHARSET_INFO *Collations::find_by_id (unsigned id, myf flags,
@@ -650,31 +660,36 @@ CHARSET_INFO *Collations::find_by_id(unsigned id, myf flags,
650
660
CHARSET_INFO *Collations::find_primary (const mysql::collation::Name &cs_name,
651
661
myf flags, MY_CHARSET_ERRMSG *errmsg) {
652
662
return safe_init_when_necessary (
653
- find_cs_in_hash (m_primary_by_cs_name, cs_name), flags, errmsg);
663
+ find_cs_in_hash (m_primary_by_cs_name, cs_name.to_string_view ()), flags,
664
+ errmsg);
654
665
}
655
666
656
667
CHARSET_INFO *Collations::find_default_binary (
657
668
const mysql::collation::Name &cs_name, myf flags,
658
669
MY_CHARSET_ERRMSG *errmsg) {
659
- return safe_init_when_necessary (find_cs_in_hash (m_binary_by_cs_name, cs_name),
660
- flags, errmsg);
670
+ return safe_init_when_necessary (
671
+ find_cs_in_hash (m_binary_by_cs_name, cs_name.to_string_view ()), flags,
672
+ errmsg);
661
673
}
662
674
663
675
unsigned Collations::get_collation_id (
664
676
const mysql::collation::Name &name) const {
665
- CHARSET_INFO *cs = find_collation_in_hash (m_all_by_collation_name, name ());
677
+ CHARSET_INFO *cs =
678
+ find_collation_in_hash (m_all_by_collation_name, name.to_string_view ());
666
679
return cs ? cs->number : 0 ;
667
680
}
668
681
669
682
unsigned Collations::get_primary_collation_id (
670
683
const mysql::collation::Name &name) const {
671
- CHARSET_INFO *cs = find_cs_in_hash (m_primary_by_cs_name, name);
684
+ CHARSET_INFO *cs =
685
+ find_cs_in_hash (m_primary_by_cs_name, name.to_string_view ());
672
686
return cs ? cs->number : 0 ;
673
687
}
674
688
675
689
unsigned Collations::get_default_binary_collation_id (
676
690
const mysql::collation::Name &name) const {
677
- CHARSET_INFO *cs = find_cs_in_hash (m_binary_by_cs_name, name);
691
+ CHARSET_INFO *cs =
692
+ find_cs_in_hash (m_binary_by_cs_name, name.to_string_view ());
678
693
return cs ? cs->number : 0 ;
679
694
}
680
695
@@ -719,7 +734,8 @@ CHARSET_INFO *Collations::unsafe_init(CHARSET_INFO *cs,
719
734
bool Collations::add_internal_collation (CHARSET_INFO *cs) {
720
735
assert (cs->number != 0 );
721
736
722
- std::string const normalized_name{mysql::collation::Name{cs->m_coll_name }()};
737
+ const std::string normalized_name{
738
+ mysql::collation::Name{cs->m_coll_name }.to_string_view ()};
723
739
724
740
if (add_to_hash (&m_all_by_collation_name, normalized_name, cs) ||
725
741
add_to_hash (&m_all_by_id, cs->number , cs)) {
@@ -746,7 +762,7 @@ bool Collations::add_internal_collation(CHARSET_INFO *cs) {
746
762
747
763
CHARSET_INFO *Collations::find_by_name_unsafe (
748
764
const mysql::collation::Name &name) {
749
- return find_collation_in_hash (m_all_by_collation_name, name ());
765
+ return find_collation_in_hash (m_all_by_collation_name, name. to_string_view ());
750
766
}
751
767
752
768
} // namespace mysql::collation_internals
0 commit comments