find() method for Hash_set<>.
Move key function from template parameter to the constructor
This commit is contained in:
parent
3098b6cf5b
commit
7fba8e5164
@ -4542,10 +4542,9 @@ end:
|
|||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" uchar *schema_set_get_key(const uchar *record, size_t *length,
|
extern "C" uchar *schema_set_get_key(const TABLE_LIST *table, size_t *length,
|
||||||
my_bool not_used __attribute__((unused)))
|
my_bool not_used __attribute__((unused)))
|
||||||
{
|
{
|
||||||
TABLE_LIST *table=(TABLE_LIST*) record;
|
|
||||||
*length= table->db_length;
|
*length= table->db_length;
|
||||||
return (uchar*) table->db;
|
return (uchar*) table->db;
|
||||||
}
|
}
|
||||||
@ -4586,7 +4585,7 @@ lock_table_names(THD *thd,
|
|||||||
MDL_request_list mdl_requests;
|
MDL_request_list mdl_requests;
|
||||||
TABLE_LIST *table;
|
TABLE_LIST *table;
|
||||||
MDL_request global_request;
|
MDL_request global_request;
|
||||||
Hash_set<TABLE_LIST, schema_set_get_key> schema_set;
|
Hash_set<TABLE_LIST> schema_set(schema_set_get_key);
|
||||||
ulong org_lock_wait_timeout= lock_wait_timeout;
|
ulong org_lock_wait_timeout= lock_wait_timeout;
|
||||||
/* Check if we are using CREATE TABLE ... IF NOT EXISTS */
|
/* Check if we are using CREATE TABLE ... IF NOT EXISTS */
|
||||||
bool create_table;
|
bool create_table;
|
||||||
@ -4625,7 +4624,7 @@ lock_table_names(THD *thd,
|
|||||||
Scoped locks: Take intention exclusive locks on all involved
|
Scoped locks: Take intention exclusive locks on all involved
|
||||||
schemas.
|
schemas.
|
||||||
*/
|
*/
|
||||||
Hash_set<TABLE_LIST, schema_set_get_key>::Iterator it(schema_set);
|
Hash_set<TABLE_LIST>::Iterator it(schema_set);
|
||||||
while ((table= it++))
|
while ((table= it++))
|
||||||
{
|
{
|
||||||
MDL_request *schema_request= new (thd->mem_root) MDL_request;
|
MDL_request *schema_request= new (thd->mem_root) MDL_request;
|
||||||
|
@ -23,19 +23,19 @@
|
|||||||
A type-safe wrapper around mysys HASH.
|
A type-safe wrapper around mysys HASH.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
template <typename T, my_hash_get_key K>
|
template <typename T>
|
||||||
class Hash_set
|
class Hash_set
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef T Value_type;
|
|
||||||
enum { START_SIZE= 8 };
|
enum { START_SIZE= 8 };
|
||||||
/**
|
/**
|
||||||
Constructs an empty hash. Does not allocate memory, it is done upon
|
Constructs an empty hash. Does not allocate memory, it is done upon
|
||||||
the first insert. Thus does not cause or return errors.
|
the first insert. Thus does not cause or return errors.
|
||||||
*/
|
*/
|
||||||
Hash_set()
|
Hash_set(uchar *(*K)(const T *, size_t *, my_bool))
|
||||||
{
|
{
|
||||||
my_hash_clear(&m_hash);
|
my_hash_clear(&m_hash);
|
||||||
|
m_hash.get_key= (my_hash_get_key)K;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
Destroy the hash by freeing the buckets table. Does
|
Destroy the hash by freeing the buckets table. Does
|
||||||
@ -56,13 +56,19 @@ public:
|
|||||||
*/
|
*/
|
||||||
bool insert(T *value)
|
bool insert(T *value)
|
||||||
{
|
{
|
||||||
my_hash_init_opt(&m_hash, &my_charset_bin, START_SIZE, 0, 0, K, 0, MYF(0));
|
my_hash_init_opt(&m_hash, &my_charset_bin, START_SIZE, 0, 0,
|
||||||
|
m_hash.get_key, 0, MYF(0));
|
||||||
size_t key_len;
|
size_t key_len;
|
||||||
const uchar *key= K(reinterpret_cast<uchar*>(value), &key_len, FALSE);
|
uchar *v= reinterpret_cast<uchar *>(value);
|
||||||
if (my_hash_search(&m_hash, key, key_len) == NULL)
|
const uchar *key= m_hash.get_key(v, &key_len, FALSE);
|
||||||
return my_hash_insert(&m_hash, reinterpret_cast<uchar *>(value));
|
if (find(key, key_len) == NULL)
|
||||||
|
return my_hash_insert(&m_hash, v);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
T *find(const void *key, size_t klen) const
|
||||||
|
{
|
||||||
|
return (T*)my_hash_search(&m_hash, reinterpret_cast<const uchar *>(key), klen);
|
||||||
|
}
|
||||||
/** Is this hash set empty? */
|
/** Is this hash set empty? */
|
||||||
bool is_empty() const { return m_hash.records == 0; }
|
bool is_empty() const { return m_hash.records == 0; }
|
||||||
/** Returns the number of unique elements. */
|
/** Returns the number of unique elements. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user